ICMP隐蔽隧道从入门到精通
概述
众所周知传统socket隧道已极少,tcp、upd大量被防护系统拦截,dns、icmp、http/https等难于禁止的协议(固然还有各类xx over dns/icmp/http,后续再讲)已成为黑客控制隧道的主流。
本文从技术原理、实现方式、检测防护等多个维度解释隐蔽性最强的icmp隧道的相关知识,但不深刻探讨编程实现,仅做为一篇科普文章,因此用了“从入门到精通”这个标题,原本就是科普(〃’▽’〃),请大神绕过!谢谢!!php
起源
提及icmp其实要从最先的免费上网提及。
当年互联网刚刚兴起的时候,上网费是很贵的,难说一不当心上个网就能咱们穷学生倾家荡产!后来聪明的同窗开始研究技术,虽然咱们的网络断了(不是拨号那种 没法得到ip的,须要有ip),可是ping ip仍是能够的,因而就利用icmp隧道将访问转发到本身的一台放置在公网代理,利用代理中转访问公网,实现免费上网,虽然速率不高,可是免费嘛。
了解了起源,知道他的由来了,咱们就好奇了,这技术是怎么回事?最后为啥又成了黑客用的隐蔽隧道呢,其实正所谓技术本无罪,只是看被什么人用罢了。咱们主要关注技术原理便可。html
技术原理
怎么能够实现这种神奇的通讯呢,这就要从协议这个东西的基本原理提及,打开rfc(https://www.rfc-editor.org/search/rfc_search_detail.php)查询ping使用的icmp协议查看详情RFC792
https://www.rfc-editor.org/info/rfc792
https://www.rfc-editor.org/rfc/rfc792.txt
你会发现icmp协议的结构以下:
其中0~31是各类协议头部,那剩下的呢?固然就是data了!本来默认ping传输的是:
windows系统,默认传输32bytes,内容是abcdefghijklmnopqrstuvwabcdefghi,共32byteslinux 系统,稍显复杂,默认Data传输的是48bytes,在Date以前多了一个Timestamp from icmp data头,占用8bytes,如e5 0d 44 5b 00 00 00 00(Jul 10, 2018 09:37:41.000000000 CST),详情以下:
一、%%%%,4个%在0~f间变化,发送和返回相同,不一样发送返回不一样(笔者未深刻研究规律和表明内容),占用2个bytes
二、090000000000,前两位%%在变更,同一次ping操做,不管发送接收多少包,此数值不变,下一次ping则此值会变更(笔者未深刻研究规律和表明内容),占用6bytes
三、101112131415161718191a1b1c1d1e1f20(规律是从10开始的16进制递增,一直到20),占用17bytes
四、!”#$%&’()+,-./01234567,占用23bytes通过简单的分析确认,windows固定传输的是abcdefghijklmnopqrstuvwabcdefghi,linux固定传输的是!”#$%&’()+,-./01234567,那咱们可否改变这些data填充咱们本身的数据呢? 答案是固然是能够!
这就是icmp隐蔽隧道的原理:替换Data部分。windows简单,替换后解决checksum便可,linux稍复杂,替换后要还要知足原有的其余规律(笔者主要领域是windows,有兴趣的读者能够研究下),防止链路上的设备对错误包进行抛弃处理。
此外,还有一点须要补充,ping的包大小,也就是data大小是能够修改的,如修改成1024bytes,以windows为例:则,从包体看效果以下,可见规律仍是同样,重复罢了。
最后,还有一个关键问题!
你发送了修改了data的数据,对方的系统可否正常处理你的畸形ping数据呢?还有对方回包的畸形ping应答数据,你自身可否处理呢?很明显,标准的 windows系统和linux系统是没法处理畸形data的数据的,因此咱们还需本身的ping发送和应答程序替代系统的自己的ping。那么接下来, 咱们就来看看各类畸形ping处理工具,也便是icmp隧道工具。python
工具实现
这里咱们不用虚拟机演示,避免只是演示不能实践的窘境!
笔者一开始接触icmp shell时,参考各类用虚拟机演示的文章,发现用虚拟机ok可是真实环境不行,因此踩坑后为了让你们不踩,咱们采用真实的公网vps+内网终端演示,环境:
一、vps为linux,内网终端为windows;
二、vps没法ping通内网终端的内网ip;
三、内网终端能够ping通公网独立ip的vps.
好,说明完,咱们看看怎么实现:linux
icmp.sh
先说这个,是由于这个包括一个通用的icmp server端(前面说过,这个是必须的),能够被其余方式的被控端复用,下载在github找便可,操做以下git
正如前面说的,咱们的server端要替代系统自己的ping的应答程序,要不shell不稳定(现象是一直提刷屏,没法交互输入),先关闭系统的ping应答,方法以下(恢复系统应答则=0):
而后就能够启动咱们本身的icmp应答程序了
第一个ip为vps的ip,是独立的公网ip,建议用***便可
第二个ip是agent的公网ip,但这个所谓的公网ip有玄机,严格说这个ip应该是server端看到的ip,为了获得这个ip能够从内网终端ping这个vps,在vps用tcpdump icmp获取这个ip,而后填写。以下:
若是您要用这个server做为您本身的木马组件则要自动断定,建议anget木马程序弹shell以前,先ping一下server(调整独特ping大小,次数等,防止server误判),server根据ping自动启动server配置。shell
按照github上这个工具做者的文章,以下:
这个ip就是公网的vps的ip了。这样在server端就能够获取到shell了
数据包分析,课件windows替换了data,大小增大到113编程
powershell icmp
同上
agent端
ip仍是sever的ip,我们的vps的ip,获取shell,没有乱码,因此笔者仍是喜欢powershell这个神器!
meterpreter
虽然写了这个,是由于笔者认为它应该有icmp的反弹shell,可是居然没找到,也许是寻找方法不对,有知道的同窗麻烦留言,感谢!
icmptunnel、ptunnel等
主要用做xx over icmp使用,相对复杂,可是可让传统的tcp、udp木马再次有用武之地,后续探讨。
固然除了以上还有不少其余工具,如linux下的PRISM(也支持mac、安卓)等等,还有不少人本身的写的python实现,能够说是现有工具已经遍地开花,那就更别说专业黑客在本身的代码中直接实现的了,因此对抗icmp隧道迫在眉睫!
检测和防护
明白了原理,也模拟了工具的使用,那么防护和检测就简单,只须要禁止ping就能够彻底屏蔽此类隐蔽隧道风险,但若是要考虑用户体验,那就只有解析 包体了,而后作否认断定,也就是说只要ping的data不是标准的windows、linux的data包体(标准大包为合法)内容,则断定非法,报警 拦截便可。
不过笔者没研究除了windows、linux之外系统ping的实现,如macos、安卓各个版本、各个网络设备等,建议安全防护者先解析包体,而后分析合法data,造成白data清单,最终再作“否”断定。
最后的思考
咱们这里只探讨最多见的ping(ICMP类型为0和8),那icmp的其余类型是否能够外传、交互shell?继续研究!