关注网络安全
和行业未来

【转载】NSA被攻后续:详解如何利用“魔法字节”及思科漏洞

日前,一个叫做“影子经纪人”的神秘在线组织宣称从一个叫做“方程式组织”的黑客团队窃取了美国的“网络武器”。这些“网络武器”包括大约十几个据信被美国国家安全局(NSA)攻击过的漏洞。本博客中,我会分析这些来自Cisco漏洞的shellcode以及它的幕后行为。

Shellcode分析

Shellcode是当发现一个漏洞后计算出的一段代码。它是攻击者想要在目标计算机上运行的实际指令。这里的Shellcode来自Cisco SNMP(CVE-2016-6366)漏洞。在这个Cisco ASA系统的漏洞下,有一个包含所有被列举出的版本的shellcode。本博客所用的是8.2.1版。image04-1

Shellcode extracted:

“bfa5a5a5a5b8d8a5a5a531f8bba5a581ac31fbb9a5b5a5a531f9baa2a5a5a531fa

cd80eb14bff00e240931c9b104fcf3a4e90c0000005eebece8f8ffffff31c040c3”

+ “bfa5a5a5a5b8d8a5a5a531f8bba575a3ad31fbb9a5b5a5a531f9baa2a5a5a531

facd80eb14bf10d7060831c9b104fcf3a4e90c0000005eebece8f8ffffff31c040c3c3”

这些十六进制数很难读懂,所以我们需要把它们转换成汇编语言。第二行如下所示。

image03

在Linux系统中(Cisco ASA是基于Linux系统的),整数0x80指一个带有存储在寄存器eax、ebx、ecx、edx中的参数的系统调用。在这段shellcode的第二行中,从偏移量0x0到0x21的代码段是一个系统调用,使eax=0x7d,ebx= 0x806d000,ecx=0x1000,edx= 0x7。当使用一个系统调用时,寄存器eax被用来指明哪个系统调用被调用了。在Linux中0x7d代表系统调用“sys_mprotect”。image06

“sys_mprotect”更改调用进程的内存页的保护机制。在这个例子中,shellcode将进程权限地址由0x806d000+0x1000改为0x7,也就是改为RWX权限(读、写、执行)。

其余的shellcode只是简单地将十六进制字符串“31C040C3”写入地址0x806d710。该地址被系统调用“sys_mprotect”设置为可写。在偏移量0x39处还有一个小把戏,这是一个调用指令。调用指令将下一个指令的地址推入寄存器ESP(在这个例子中是31C040C3的地址)然后shellcode将那个地址取出至寄存器ESI(后面会用到)。这个把戏可以让攻击者在不知道源地址的情况下执行一个“memcpy”调用。

Shellcode的第一行在地址0x9240ef0写入十六进制字符串“31C040C3”。我猜测第一行可能是用来加密第二行以绕过IDS检测的。在我的测试中,把第一行设成无操作,这个攻击仍然有效。

更改权限时绕过IDS监测

我见过很多很多IDS监测规则,如:“content:”|bf a5 a5 a5 a5 b8 d8 a5 a5 a5 31 f8 bb a5|”。这类IDS规则试图匹配“sys_mprotect”部分,但是根本不起作用。攻击者有无数种方法把eax设为0x7d。例如用0x00和0x7d做异或运算就得到0x7d,或者只是执行mov eax,0x7d就可以了。实际上,我认为基于样式的IDS不能抓取漏洞,因为攻击者能把所有的十六进制数改成完全不同的内容,达到同样的效果。

每个版本的Cisco ASA系统的固件都有一个与0x806d710相似的地址。8.3.1版是0x806dd30,8.4.1版是0x8083890。我把这些地址叫做“魔法字节”。

魔法字节

这些“魔法字节”带有魔力的部分是什么呢?首先,我们在先前的博客ThreatPROTECT提到过,它们能够让攻击者以任何用户名和密码登录,并获得最高权限。image05

这与其他已知由NSA发起的攻击类似,这意味着我们所分析的shellcode很可能也是由NSA制造的。它与去年发现的Juniper ScreenOS系统的后门很相似。该后门的口令“<<< %s(un=’%s’) = %u”允许攻击者以任何用户名登录设备。但我们的“魔法字节”可比它高明多了。

Cisco提供了一个叫做Cisco ASDM的管理员客户端工具。该工具是用来监视Cisco ASA设备的,有良好的图形接口。管理员利用这个工具可以看到当前有多少人正在访问系统以及他们使用的访问方式(如SSH或ASDM)。image08

可以从截图中看到,在“当前已连接安全Shell会话”窗口下有一个连接。该工具会给出客户端的IP地址、用户名和SID。

“魔法字节”设置好以后,任何人都能用任何用户名和密码登录。管理员能进行监视并得知某些人正在攻击设备吗?image07

我打赌你现在能看到一部分“魔法字节”,因为上一个问题的答案是“不”——这个漏洞的攻击者对ASDM是隐身的。

Cisco还提供具有另一种功能的工具,能让管理员追踪该设备发送和接收SSH/Telnet请求数量。image01

如果攻击者编制好“魔法字节”并通过ssh连接到设备,管理员至少应能看到这一事件。

好吧,但实际上管理员却看不到,这是由于“魔法字节”的缘故。image00

当我从ssh退出登录并将“魔法字节”还原后,在管理控制台中没有认证请求被记录下来。好像没有人登录过一样。当“魔法字节”被设置好后,ASDM客户端的其他性能都表现正常,只有日志不太一样。不仅如此,你甚至不能再登录了。这种级别的攻击行为是标志性的NSA攻击。image02

我认为攻击者在Cisco固件中不会需要比这些“魔法字节”更好的地址了——不需要记住那些写死的长密码(如在Juniper ScreenOS系统中),而且这样一来,完全无法被追踪。Cisco一不小心把太多的性能放在一起,正因如此,这让攻击者的工作变得更为简单。当人们谈到缓冲区溢出0-day漏洞时,我认为我们需要更多地为这些“魔法字节”担忧,因为找到下一个Cisco漏洞后他们会首先尝试这种攻击。

结论

“影子经纪人”披露ASA的0-day漏洞后,Cisco已经为其发布了一个补丁。这个补丁能抵御SNMP 0-day攻击。但我不知道他们在后台是否解决了“魔法字节”的问题。如果没有漏洞可以利用的话,触发这些能够阻止ssh和telnet会话登录和其他监视性能的“魔法字节”就不那么容易了。

来源:Qualys Blog

评论 抢沙发