ICMP隐蔽隧道从入门到精通

概述

众所周知传统socket隧道已极少,tcp、upd大量被防御系统拦截,dns、icmp、http/https等难于禁止的协议(当然还有各种xx over dns/icmp/http,后续再讲)已成为黑客控制隧道的主流。
本文从技术原理、实现方式、检测防御等多个维度解释隐蔽性最强的icmp隧道的相关知识,但不深入探讨编程实现,仅作为一篇科普文章,所以用了“从入门到精通”这个标题,本来就是科普(〃’▽’〃),请大神绕过!谢谢!!

起源

说起icmp其实要从最早的免费上网说起。
当年互联网刚刚兴起的时候,上网费是很贵的,难说一不小心上个网就能我们穷学生倾家荡产!后来聪明的同学开始研究技术,虽然我们的网络断了(不是拨号那种 无法获得ip的,需要有ip),但是ping ip还是可以的,于是就利用icmp隧道将访问转发到自己的一台放置在公网代理,利用代理中转访问公网,实现免费上网,虽然速率不高,但是免费嘛。

了解了起源,知道他的由来了,我们就好奇了,这技术是怎么回事?最后为啥又成了黑客用的隐蔽隧道呢,其实正所谓技术本无罪,只是看被什么人用罢了。我们主要关注技术原理即可。

技术原理

怎么可以实现这种神奇的通信呢,这就要从协议这个东西的基本原理说起,打开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,共32bytes
linux 系统,稍显复杂,默认Data传输的是48bytes,在Date之前多了一个Timestamp from icmp data头,占用8bytes,如e5 0d 44 5b 00 00 00 00(Jul 10, 2018 09:37:41.000000000 CST),详情如下:
1、%%%%,4个%在0~f间变化,发送和返回相同,不同发送返回不同(笔者未深入研究规律和代表内容),占用2个bytes
2、090000000000,前两位%%在变动,同一次ping操作,无论发送接收多少包,此数值不变,下一次ping则此值会变动(笔者未深入研究规律和代表内容),占用6bytes
3、101112131415161718191a1b1c1d1e1f20(规律是从10开始的16进制递增,一直到20),占用17bytes
4、!”#$%&’()+,-./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隧道工具。

工具实现

这里我们不用虚拟机演示,避免只是演示不能实践的窘境!
笔者一开始接触icmp shell时,参考各种用虚拟机演示的文章,发现用虚拟机ok但是真实环境不行,所以踩坑后为了让大家不踩,我们采用真实的公网vps+内网终端演示,环境:
1、vps为linux,内网终端为windows;
2、vps无法ping通内网终端的内网ip;
3、内网终端可以ping通公网独立ip的vps.
好,说明完,我们看看怎么实现:

icmp.sh

先说这个,是因为这个包括一个通用的icmp server端(前面说过,这个是必须的),可以被其他方式的被控端复用,下载在github找即可,操作如下

server端

正如前面说的,我们的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配置。

agent端

按照github上这个工具作者的文章,如下:

这个ip就是公网的vps的ip了。这样在server端就可以获取到shell了

数据包分析,课件windows替换了data,大小增大到113

powershell icmp

server端

同上

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?继续研究!

转自:https://blog.csdn.net/qq_27446553/article/details/81166980

隐匿攻击-ICMP的更多相关文章

  1. Firewalld防火墙与ICMP攻击

    原文地址:http://www.excelib.com/article/293/show 提到ICMP大家应该都很熟悉,可能有人会说:不就是ping吗?但是说到ICMP攻击以及相关防御措施可能就有的人 ...

  2. ICMP和重定向攻击

    目录 ICMP数据报格式 smurf攻击 ICMP重定向攻击 基于libpcap的sniffer raw socket 定义包头 解析数据包 重定向 ICMP数据报格式 https://zhuanla ...

  3. Linux网络编程--洪水攻击详解

    洪水攻击详解 ①注解:洪水攻击(FLOOD ATTACK)是指利用计算机网络技术向目标主机发送大量无用的数据报文,使得目标主机忙于处理无用的数据报文而无法提供正常服务的网络行为. 主要原理:利用了网络 ...

  4. 20169202 2016-2017-2《TCP/IP协议攻击》实验总结--十一周

    APR缓存中毒(ARP cache poisoning) 实验原理 ARP缓存是ARP协议的重要组成部分.ARP协议运行的目标就是建立MAC地址和IP地址的映射,然后把这一映射关系保存在ARP缓存中, ...

  5. TCP/IP网络协议攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 这部分涉及: ARP缓存欺骗攻击 ICMP重定向攻击 SYN FLOOD ...

  6. DDOS常见攻击类型和防御措施

    DDOS 攻击类型: SYN Flood 攻击 ACK Flood 攻击 UDP Flood 攻击 ICMP Flood 攻击 Connection Flood 攻击 HTTP Get 攻击 UDP ...

  7. DDOS攻击攻击种类和原理

    DoS攻击.DDoS攻击和DRDoS攻击相信大家已经早有耳闻了吧!DoS是Denial of Service的简写,就是拒绝服务,而DDoS就是Distributed Denial of Servic ...

  8. Red Team远程控制软件

    开源远程管理控制 https://github.com/malwaredllc/byob 僵尸网络生成框架 https://github.com/panda-re/lava 大规模向程序中植入恶意程序 ...

  9. 实验 Attacks on TCP/IP Protocols

    ------- 转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html ------- 1 实验目的 进行这个实验的目的 ...

随机推荐

  1. PowerShell (407) Proxy Authentication Required

    $Client = New-Object -TypeName System.Net.WebClient $Client.Proxy.Credentials = [System.Net.Credenti ...

  2. Android(java)学习笔记77:Android中assets文件夹资源的访问

    Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件 ...

  3. FW 数据库迁移之从oracle 到 MySQL

    方式一: 手动方式导入导出 手动的方式导入, 就是操作步骤会比较繁琐一些. 对Table 的结构和数据: 1. 使用 SQL Developer 把 oracle 的 table 的schema 和 ...

  4. 运行自己的shell脚本

    shell脚本可以直接./**.sh,也可以bash **.sh 我用./**.sh运行自己写的一个脚本,会出现如下的错误: bnrc@bnrc:~$ ./pixel.sh bash: ./pixel ...

  5. Bootstrap 弹出框(Popover)插件

    Bootstrap 弹出框(Popover)插件与Bootstrap 提示工具(Tooltip)插件类似,提供了一个扩展的视图,用户只需要把鼠标指针悬停到元素上面即可.弹出框的内容完全由Bootstr ...

  6. nodejs 爬虫

    参考了各位大大的,然后自己写了个爬虫 用到的modules:utils.js     ---    moment module_url.js var http = require("http ...

  7. Math类小结

    package com.swift; public class MathDemo { public static void main(String[] args) { // TODO Auto-gen ...

  8. 解决使用Application Loader上传ipa提示“上传appstore失败”

    试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...

  9. 自己写一个Promise

    参考Promise 的  官方规范  https://promisesaplus.com/ Promise 其实就是一个状态机 它只有两种状态变化 pending    =>   fulfill ...

  10. 【转载】SQLServer中char、varchar、nchar、nvarchar的区别:

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...