把一台被攻陷的靶机桥接靶机当成跳板,去摸生产网里另一台机器——这事儿我在一次内部演练里干过。靶机桥接当时靶机是靶机桥接台老旧的Windows Server 2008,打完补丁没重启,靶机桥接MS17-010一打一个准。靶机桥接拿到SYSTEM权限后,靶机桥接我没急着扫内网,靶机桥接先看它有几张网卡。靶机桥接ipconfig一敲,靶机桥接两张:一张172.16.1.0/24,靶机桥接是靶机桥接演练用的攻击网;另一张10.10.20.0/24,直接通着办公区。靶机桥接这就是靶机桥接靶机桥接的起点——它自己成了路由器。
很多人以为桥接是靶机桥接网络设备的事,跟渗透测试没关系。靶机桥接错了。靶机桥接的本质是流量转发,而你在靶机上能做的事,比在交换机上多得多。我见过最糙的做法是直接开Windows的ICS(Internet连接共享),把两张网卡桥起来,然后攻击机改路由,把10.10.20.0/24的下一跳指向靶机的172.16.1.x地址。能通,但ICS会改靶机IP,有时候把攻击机的连接也掐了。更稳的是用route add命令加一条静态路由,再开注册表里的IPEnableRouter=1。重启网卡服务,靶机就开始转发流量了。整个过程不用装任何第三方工具,系统自带。
Linux靶机更顺手。一台Ubuntu 18.04的靶机,拿到root后,sysctl -w net.ipv4.ip_forward=1,然后iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE。攻击机把默认网关指向靶机的eth0地址,内网就通了。如果只想转发特定端口,比如只打10.10.20.5的445,那就用socat或者rinetd做端口转发,比开整条路由隐蔽。我有次只转发了3389,从攻击机连靶机的172.16.1.100:13389,实际落到10.10.20.5:3389,流量日志里只看到靶机跟目标机器的RDP握手,攻击机的IP根本没出现在目标网段。
桥接之后最麻烦的是DNS和工具代理。攻击机上的nmap、msf、cobalt strike,默认都走本地网络栈。你改了路由,它们能通,但有些工具会校验目标IP跟本地网卡是否同网段。msf的auxiliary/scanner系列还好,exploit模块有时候会报“target not reachable”。解决办法是在msf里setg Proxies socks5:172.16.1.100:1080,让靶机跑个socks代理。或者更直接,在攻击机上开proxychains,把工具流量全塞进socks隧道。我习惯用frp或者chisel在靶机上起反向socks,这样连靶机都不需要公网IP,攻击机主动连出来就行。
有个细节容易翻车:靶机桥接后,它的默认路由可能还指着原来的网关。你从攻击机访问10.10.20.0/24,回包会走靶机的默认路由,而不是回到攻击机。结果就是SYN过去了,SYN-ACK回不来。得在靶机上加一条路由:route add 172.16.1.0 mask 255.255.255.0 172.16.1.1,或者Linux下ip route add 172.16.1.0/24 via 172.16.1.1 dev eth0。别小看这一步,我卡了半小时才反应过来。
最后说个真实案例。某次红队评估,边界打下一台DMZ的Web服务器,双网卡,一张公网一张内网。我们没动防火墙,直接在Web服务器上开了socks5,用proxychains连内网的Jenkins。Jenkins的脚本控制台能执行Groovy,反手弹了个shell到Web服务器的内网口。整条链路里,防火墙只看到Web服务器跟Jenkins的HTTP流量,攻击机的IP从头到尾没进过内网。靶机桥接不是炫技,是让被攻陷的机器替你走路。走得好,你连内网扫描器都不用开。