ICMP Tunnel监测

作为一个攻击者,在攻击过程中面临着两个挑战。

  1. 突破网络中障碍。

2. 在秘密模式下执行不同的操作,不那么容易被检测到。

Tunnel就是能够很好的解决这两个挑战。

Tunnel 通常是将在一个协议中封装另一个网络协议的有效载荷,具体可参考:

https://en.m.wikipedia.org/wiki/Tunneling_protocola

常见的Tunnel 有:ICMP TunnelSSH TunnelDNS TunnelHTTP Tunnel

本文主要讲解ICMP tunnel相关内容。

  1. ICMP协议

ICMP(Internet控制消息协议)是Internet协议套件中的支持协议。网络设备使用它来发送错误消息和操作信息。最知名且可能是最常用的ICMP消息是Ping消息。ICMP报文格式如图1

img

常用的ICMP ping命令,Ping从网络中的一个节点发送到另一个节点。它由第2层和第3层报头(OSI模块定义的MAC和IP报头)和特殊ICMP数据包构建而成。

img

img

img

通常ICMP 默认的有效载荷数据为ASCII字符“abcdefghijklmnopqrstuvwabcdefghi”,也有其他的载荷字符串。

2. ICMP Tunnel示例

常用的ICMP Tunnel工具有:

icmpsh: https://github.com/inquisb/icmpsh

icmptunnel: https://github.com/jamesbarlow/icmptunnel

icmpshell:http://sourceforge.net/projects/icmpshell/

示例:利用icmptunnel建立icmp Tunnel

服务端:

img

客户端:

img

即可建立2端之间的ICMP 隧道。可以用来连接SSH,可以用来用来建立socks连接等等。

如HTTP协议,

img

建立SSH连接:

img

在ICMP协议中夹带了SSH会话的内容:

img

利用ICMP Tunnel建立的SSH连接,在两个会话中是看不到ssh协议的,也没有相关的TCP会话。这样能够做到比较隐蔽。

img

  1. ICMP Tunnel检测

  2. 数据包大小

常规的ICMP 包大小差不多一致,在为ASCII字符串“abc…”的情况下为74左右,在为ASCII字符串为“123456…”的情况下为98左右。而在使用ICMP Tunnel的情况下,如利用ICMP tunnel进行SSH连接,在初始连接的状态下数据包大小能到达1500+以上。所以可以通过数据包大小来进行判断。

在TSA端,可以建立简单的规则如图2:

img

该规则很简单的利用数据包长度,协议为ICMP,比较粗略,会存在漏报,但一旦报警就是准确的。

在没有规则的情况下,则可以利用TSA端的ICMP日志列表,查看ICMP日志。如图3:

img

然后利用ICMP日志中的负载长度从大到小进行排序,如图4:

img

然后定位负载长度排名前面的会话,如图5:

img

​ 定位之后,选择ICMP会话,进行下载,然后研判确认。

  1. ICMP 包类型

在部分ICMP Tunnel不会有很长的负载长度的情况下,如图6:

img

​ 包大小符合正常的ICMP数据包大小。如果通过数据包大小来进行判断就存在了漏报,常规的ICMP内容常规为:回显请求类型为8-请求应答类型为0,如图7:

img

如果如果2个IP之间的ICMP会话的类型都是0(请求应答),这种情况就可能存在问题。如图8

img

img

3. 数据包大小差,会话次数

利用powershell建立的ICMP Tunnel从数据包大小,请求应答等都很正常。如图9:

img

​ 在正常的ICMP ping包中,相同的IP在ICMP会话中,请求和相应大小是一致的,如图10:

img

而在非正常的ICMP请求中,由于需要执行命令,命令长度不一致导致了包大小不一致。命令响应内容不一致也导致了包大小的不一致。如图11:

img

如图11可以数据包大小最大和数据包大小最小之间包大小相差很大。可以利用代码进行处理(代码还没写。)

也可以将导出的ICMP日志文件,利用代码统计单位时间内的ICMP会话次数。

抛砖引玉,如果有其他思路欢迎交流。

未完待续。

posted @ 2021-06-19 16:38  行者·无疆  阅读(279)  评论(0编辑  收藏  举报