写作本文的初衷,是在探索 Cobalt Strike 的 C2 隐蔽上线、与 Beacon 通信的过程中,遇到了一些涉及内网机器出网刺探、隧道技术的地方。比如,一般来说 Cobalt Strike 的团队服务器,也就是通常来讲的 C2 一般都开在公网上,这样可以便于团队成员的合作。但是为了避免团队服务器被反制、反捅,我们可以把团队服务器开在本地,借助 SSH 隧道与公网 VPS 之间进行流量转发,这样可以提高我们团队服务器的行为安全。又比如、我们可以通过多级反代,在目标受害机器跟真实的团队服务器中间建立一条隐蔽通道,这样可以增加溯源反制成本。又或者,我们可以加入一些域名前置的方法,或者结合以上两种方法构建更复杂的 Beacon 和 listener 之间的通信路线,当然是在时延可被接受的前提下。
于是我想做一点关于探测内网连通性的总结。在真实的项目中,我也遇到过需要探测内网连通性的场景。探测分为两个方面:
- 探测内网中的机器到外网的连通性,也就是通常说的能否正常出网、通过什么协议出网
- 探测内网机器之间的连通性
不仅要探测内网中的机器跟外网的连通性,也要探测一些内网机器之间的连通性。比如,一些 172
开头的办公区机器,很显然它不具备与外网之间的连通性,但是它与 DMZ 中的某台边缘机器是否相通?某个内网中如果具备多种不同的内网段、某台机器具有多个网卡,某台可出网的被控机器和这些内网机器之间是否相通?
探测内网机器能否出网很容易理解,因为要跟 C2 通信。但是探测内网机器之间的连通性有什么作用呢?
假设这样一个场景,当前我们已经拿到了目标内网中的一台机器的 beacon,然后又通过其它方式获取了了同内网下的另一台 windows 机器的本地 administrator 密码,并且这台机器的 smb[445 端口]能正常 通信。但是,因为某些设置,这台 windows 机器并不能正常访问外网,也就是说没法再正常的反弹 beacon shell 了。在这种情况下,我依然可以通过当前仅有的这个 beacon shell 把内网那台不能正常访问外网的机器也一块给带出来。比如在 Cobalt Strike 中可以借助 windows/beacon_smb/bind_pipe
监听器,这是一个专门为多层内网正向级联而设计的监听器。
但是这样在内网中借助已控 Beacon 去带出其他纯内网机器的 Beacon shell 的前提是,我们需要对内网环境有更多的了解。所有的 bind 都有个最大的问题就是目标系统各种防火墙的问题,如果目标系统直接阻断了 445 端口通信,很显然就 bind 不过去了。
上面这个例子比较特殊,smb 不属于 7 层协议。这里举这个例子主要是想说明:探测内网机器的连通性,我们主要是探测哪些协议被防火墙允许。
在内网渗透中,「通道构建」是非常重要的一环。包括:常规出网刺探,常规 HTTP 脚本代理,正反向 tcp 端口转发,正反向 socks 4a/5 代理,SSH 加密隧道利用,DNS 隧道利用,ICMP 隧道利用, GRE 隧道利用,基于各类 WEV 服务的正向端口复用等等......
在本文中,主要介绍常规出网探测。只有了解了这个,在后面的构建隐藏通信隧道这些环节,才能根据实际网络情况来选择合适的工具。
C2 要跟内网目标机器之间进行数据传输,要经过防火墙。防火墙会允许一些协议,禁止一些协议,所以我们要先探测协议开放情况以及端口开放情况:
内网连通性判断:
1、ICMP 协议
ping
命令
2、 TCP 协议
nc
命令
3、 HTTP 协议
curl
命令
4、 DNS 协议
nslookup
命令dig
命令
隐藏通信隧道技术:
1、网络层隧道
- IPv6 隧道
- ICMP 隧道
2、 传输层隧道:
- TCP(可能被拦截)
- UDP(可能被拦截)
3、 应用层隧道:
- SSH
- HTTP
- DNS(基本都开放)
主要就是我想用我的 C2 对此目标进行命令与控制,使用要探测 C2 机器和目标机器之间的连通性。在实际情况中,可能通过代理进内网,不过基本操作是一样的。
假设我的攻击机器(或者C2) IP 为:192.168.168.101
在测试机器中:
shell ping -n 1 -a 192.168.168.101
如上图 ICMP 协议不通。
探测是否出外网更简单,直接 ping 外网网站:
ping www.baidu.com
可以使用 curl
命令,这是一个命令行下的文件传输工具,可以用于上传或下载,支持包括 HTTP、FTP、HTTPS 等多种协议。
假设 C2 在80端口开了个 HTTP 网页服务:
curl 192.168.168.101:80
探测目标对外网的 HTTP 协议连通性也很简单:
curl www.baidu.com:80
HTTP 通说明 TCP 一定通,HTTP 不通再看 TCP 是不是通。
比如在 C2 上用 SimpleHttpServer 在 8080 端口开一个服务器(这里,Http 用的是 tcp 的80端口),然后使用 NC 探测(nc 默认探测 TCP,加上 -u
参数探测 UDP):
nc -zv 192.168.168.101 80
注:
-z
参数:zero-I/O mode [used for scanning]
如果可以连通,那么就可以使用 TCP 下的隧道穿透工具。
探测 DNS 协议连通性使用两个工具:nslookup
和 dig
。
探测对外连通性:
nslookup www.baidu.com 1.1.1.2 #指定内网中的DNS服务器
nslookup www.baidu.com 8.8.8.8
nslookup www.baidu.com 233.6.6.6 #指定阿里DNS服务器
nslookup www.baidu.com #不指定DNS服务器,使用默认DNS服务器
dig www.baidu.com #不指定DNS
dig @233.6.6.6 www.baidu.com #指定(阿里)DNS
DNS 协议一般都通。
总之探测了内网的连通性,之后才能使用协议对应的隧道搭建工具。
比如 Ipv6 隧道,ICMP 隧道,ICMP 隧道工具有 PingTunnel
、icmptunnel
、Icmpsh
、powershell icmp
等。
拓展资料:
- Intranet Space - Dns Tunneling,倾旋的博客,倾旋,2018年12月18日
参考资料:
- 红队 [ 蓝军 ] 完整战术 生命周期 简述,MITRE | ATT&CK 中文站,Klion,2019年2月15日
- 内网通道构建入门实战,MITRE | ATT&CK 中文站,Klion,2019年2月20日