使用 Proxychains 进行动态端口转发

网络安全Beginner
立即练习

简介

在渗透测试和红队行动中,你经常会攻陷一台面向公众的服务器,并发现它能够访问你从攻击机无法直接到达的内部网络。为了攻击这些内部系统,你需要一种将流量通过受控服务器进行路由的方法。这种技术被称为「枢纽(Pivoting)」。

枢纽的核心在于改变观察点。你不再仅仅从原始机器的网络位置进行测试,而是利用一台受控主机作为新的观察和访问点。

最强大且常见的枢纽技术之一是使用 SSH 动态端口转发来创建 SOCKS 代理,并结合名为 proxychains 的工具。这种组合允许你将几乎任何外部网络工具(如 Nmap、Nikto 或 Metasploit)无缝地通过受控主机进行路由。

在本实验中,我们将模拟一个场景:你拥有对运行在 Docker 容器中的专用枢纽主机的 SSH 访问权限。同一个私有 Docker 网络中的第二个容器托管着一个隐藏的内部 Web 服务。该服务没有直接暴露给 LabEx 虚拟机,因此你必须通过 SSH 枢纽主机访问它。你将学习如何设置 SSH 动态端口转发、配置 proxychains,并使用它通过枢纽主机访问该隐藏服务。

设置 SSH 动态端口转发 (-D)

在此步骤中,你将建立到容器化枢纽主机的 SSH 连接,并创建一个本地 SOCKS 代理。

动态端口转发允许你在攻击机上指定一个本地端口。SSH 客户端将监听此端口,每当应用程序连接到该端口时,连接就会通过安全的 SSH 通道转发到 SSH 服务器。随后,SSH 服务器充当代理,将流量转发到其最终目的地。

这比单端口转发更灵活,因为 SOCKS 代理可以通过一个隧道承载许多不同的目标请求。

为了进行设置,我们在 SSH 命令中使用 -D 标志。我们还将使用其他几个标志,以确保连接在后台平稳运行。

实验环境已为你创建了一个私钥 ~/project/pivot_key,并将枢纽主机的 SSH 服务暴露在本地端口 2222 上。在终端中运行以下命令,在本地端口 9050 上创建 SOCKS 代理:

ssh -f -D 9050 -q -C -N \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

让我们拆解一下该命令中使用的标志。-D 9050 标志指定了动态端口转发,并将本地监听端口设置为 9050。-q 标志代表静默模式,用于抑制警告和诊断消息。-C 标志请求对所有数据进行压缩,这可以加快连接速度。-N 标志指示 SSH 不要执行远程命令,这在仅进行端口转发时非常有用。-f 标志在身份验证后将 SSH 客户端发送到后台,以便你可以继续使用当前的终端会话。-o StrictHostKeyChecking=no 和 -o UserKnownHostsFile=/dev/null 选项防止首次连接时的主机密钥提示中断实验流程。-i 标志告诉 SSH 使用哪个私钥,-p 2222 则告诉它连接到枢纽主机容器,而不是 LabEx 虚拟机的默认 SSH 服务。

运行命令后,你可以使用 ss 命令(用于转储套接字统计信息)来验证端口是否已打开并处于监听状态。

ss -tuln | grep 9050

你应该看到类似以下的输出,表明你的机器现在正在监听 9050 端口:

tcp   LISTEN 0      128        127.0.0.1:9050       0.0.0.0:*
tcp   LISTEN 0      128            [::1]:9050          [::]:*

配置 Proxychains (/etc/proxychains.conf)

在此步骤中,你将检查 proxychains 的配置。

虽然你现在已经在 9050 端口上运行了 SOCKS 代理,但大多数命令行工具(如 Nmap)本身并不知道如何通过 SOCKS 代理路由流量。这就是 proxychains 的用武之地。它是一个强制给定应用程序发出的任何 TCP 连接都通过代理进行路由的工具。

在实践中,proxychains 将单次手动测试的隧道扩展为跨多种工具的可复用操作工作流。

proxychains 的配置文件位于 /etc/proxychains4.conf。对于本实验,代理条目应指向 127.0.0.1 端口 9050 上的 SOCKS5 代理,这与我们刚刚创建的 SSH 动态端口转发相匹配。

让我们查看配置文件的底部以确认此设置。使用 tail 命令打印文件的最后 10 行:

tail -n 10 /etc/proxychains4.conf

你应该看到类似以下的输出:

[ProxyList]
## add proxy here ...
## meanwile
## defaults set to "tor"
socks5  127.0.0.1 9050

[ProxyList] 部分是定义代理的地方。socks5 127.0.0.1 9050 这一行告诉 proxychains 将流量通过本地端口 9050 进行路由。由于我们的 SSH -D 命令恰好在此端口上创建了代理,因此在更新协议类型后无需进行其他配置。

如果你需要使用不同的端口或不同类型的代理,可以使用 nano 等文本编辑器编辑此文件。

测试 SOCKS 代理

在此步骤中,你将通过访问隐藏的内部 Web 服务来测试代理设置是否正常工作。

请记住,有一个 Web 服务运行在 172.30.0.20:80 的隐藏内部容器上。在现实场景中,这代表了一个无法从外部互联网直接访问的内部内网站点。

要使用 proxychains,只需在要运行的工具命令前加上 proxychains4 即可。让我们使用 curl 来获取网页。

运行以下命令:

proxychains4 curl http://172.30.0.20

当你执行此操作时,proxychains 会拦截 curl 发出的网络请求,并通过端口 9050 上的 SSH SOCKS 代理进行隧道传输。随后,枢纽主机向内部 Docker 网络上的 172.30.0.20:80 发起请求并返回结果。

你应该看到类似以下的输出:

[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  172.30.0.20:80  ...  OK
Secret Internal Data: You have successfully pivoted

OK 消息表明代理连接成功,最后一行显示了来自内部 Web 服务器的机密数据。

通过枢纽运行外部工具

在最后一步中,你将使用更高级的外部工具 Nmap,通过已建立的枢纽扫描内部网络。

在使用 proxychains 配合 Nmap 时,需要了解一些重要的技术限制。SOCKS 代理仅支持完整的 TCP 连接。它们不支持 ICMP(ping)或半开放式 SYN 扫描(Nmap 在使用 sudo 运行时默认使用此扫描方式)。

因此,当通过 proxychains 运行 Nmap 时,必须强制其使用完整的 TCP 连接扫描(TCP Connect scan)并禁用 ping 发现。

运行以下 Nmap 命令以扫描端口 80 上的内部 Web 服务:

proxychains4 nmap -sT -Pn -p 80 172.30.0.20

让我们拆解一下这里使用的 Nmap 标志。-sT 标志强制执行 TCP 连接扫描,这是必须的,因为 SOCKS 代理无法处理原始数据包或 SYN 扫描。-Pn 标志禁用主机发现(ping);由于 SOCKS 代理无法路由 ICMP 回显请求,如果省略此标志,Nmap 会错误地认为主机已宕机。最后,-p 80 标志指定了要扫描的确切端口。

你将看到 proxychains 记录了连接尝试,随后是 Nmap 的扫描结果:

[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
Starting Nmap 7.91 ( https://nmap.org ) at 2024-01-01 12:00 UTC
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  172.30.0.20:80  ...  OK
Nmap scan report for 172.30.0.20
Host is up (0.0020s latency).

PORT     STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

这证实了你可以成功地将复杂的安全工具通过受控主机进行路由,从而与内部网络段进行交互。

总结

恭喜!你已成功完成了「使用 Proxychains 进行动态端口转发」实验。

在本实验中,你学习了如何使用 SSH 动态端口转发 (-D) 创建本地 SOCKS 代理。你还学习了如何理解和检查 proxychains 的配置。此外,你成功地通过代理路由了基本的 HTTP 请求以访问隐藏的内部服务。最后,你通过利用 TCP 连接扫描 (-sT) 和禁用 ping 发现 (-Pn),使 Nmap 等高级扫描工具能够通过 SOCKS 代理正常工作。

这些枢纽技术是在渗透测试和安全评估期间导航复杂网络环境的基本技能。