思科设备漏洞研究与利用

来源:互联网 发布:lol全皮肤软件 编辑:程序博客网 时间:2024/04/26 15:31

一、    研究背景

1.1     研究网络设备的原因

路由器、防火墙、交换机等网络设备是整个互联网世界的联系纽带,占据着非常重要的地位,是计算机网络的一个一个节点。网络设备的安全性尤为重要,目前来看各个国家和地区针对PC和移动端的安全都提到了非常重视的高度,但是网络设备由于其隐藏后端不可见的特点,导致对其安全性的认识不足,出现各种漏洞利用和攻击行为,一旦控制网络设备,其连接的各种终端设备都将暴露在攻击者的面前,导致重要数据和资料泄漏,造成严重的网络安全事件。

最近几年,有关于网络设备的漏洞披露和攻击的报道日益增多,一方面是攻击者开始从网络设备入手进行攻击,另一方面人们逐渐开始重视网络设备的安全。

表1-1:近年有关网络设备的安全事件

时间事件2014-04思科(cisco)和瞻博(juniper)发现存在heartbleed漏洞(CVE-2014-0160)2014-11卡巴斯基实验室发布报告披露黑暗能量(BlackEnergy)可以攻击Linux系统和思科(cisco)路由器2015-09火眼(fireeye)发布了有关思科(cisco)路由器SYNful Knock后门的报告2015-10安全公司volexity的Steven Adair发现了攻击思科(cisco)web vpn的案例2015-12                                                            瞻博(juniper)发现漏洞: 万能密码登录设备(CVE-2015-7755)、可解密VPN流量(CVE-2015-7756)2016-01@esizkur 发现飞塔防火墙(Fortigate)存在ssh未声明账户漏洞(CVE-2016-5125)2016-08方程式针对防火墙攻击的工具泄露

面对越来越多的网络设备层的攻击行为,作为致力于建设中国互联网网络安全的一份子,团队对部分网络设备的漏洞利用进行大量的研究和分析。在网络设备的漏洞分析和漏洞利用方面着手进行网络攻防对抗研究。  

1.2     网络设备漏洞特点

表1-2:2014.10-2016.6,思科防火墙asa系统出现过的漏洞数目

(ASA2014.10-2014.1220152016.1-2016.6Dos994Bypass131其他831

表1-3:2014.1-2016.5,思科ios系统出现过的漏洞数目

(CISCO IOS)201420152016.1-2016.5Dos326815Bypass230其他732

根据近3年的CVE数目,可以看出漏洞大多归类于拒绝服务漏洞,其余是绕过认证、过滤等安全机制的漏洞和其他类型的漏洞。

网络设备的漏洞多为网络协议的漏洞,而网络协议的漏洞多为内存破坏的漏洞,内存破坏的漏洞大都归类于拒绝服务。

思科IOS是一个体积很大的二进制程序直接运行在主CPU上,如果发生异常,内存破坏,或是CPU被持续占用都会导致设备重启。

思科ASA是在嵌入式linux系统上运行着lina_monitor和lina,当lina出现异常的时候,lina_monitor负责重启设备。

1.3     研究历史

最早公开的关于网络设备漏洞利用的研究是2002年Felix ‘FX’ Lindner和FtR的“Attacking networked embedded systems”,作者演示思科IOS漏洞利用的可行性。

2005年,Michael Lynn最先公开地演示了可靠的利用思科IOS的缓冲区溢出漏洞。

2007年,Gyan Chawdhary和Varun Uppal公开了gdb调试思科IOS shellcode的办法,并给出了2种shellcode的演示和代码。

2008年,Felix ‘FX’ Lindner开发了思科IOS取证工具CIR。

2011年,SebasEan Muniz, Alfredo Ortega演示了思科IOS fuzzing。以及Ang Cui,JaEn Kataria, Salvatore J. Stolfo提出了通用思科IOS漏洞利用的方法。

2012年,Felix ‘FX’ Lindner展示了华为路由器的安全问题。

2015年,George Nosenko演示了shellcode在内存中执行tcl脚本。

二、研究内容

2.1     研究思路

Clipboard Image.png

图2-1:研究思路

2.2     固件获取

1.        官网下载

2.        Tftp,ftp,http,scp等方式从设备上下载

3.        从flash,cf等存储模块中读取

4.        安全研究者分享

2.3     固件解包

固件解包的目的:

1.       解出要分析的程序

2.       解出模拟时需要的文件

2.3.1 ASA固件解包

Clipboard Image.png

图2-2:ASA固件格式示意

图2中,vmlinuz是压缩的linux内核,initrd是系统引导过程中挂载的临时根文件系统,通过字符串“Direct booting from floppy is no longer supported”和“rootfs.img”确定vmlinuz和initrd的起始地址。

2.3.2 IOS解包

Clipboard Image.png

图2-3:压缩镜像中的系统文件

7z提取压缩镜像中的系统文件。

2.4     系统模拟

2.4.1 ASA的qemu模拟

1.        qemu-img create FLASH 512M

2.        qemu-system-i386 -s -m 512-nographic -icount auto -hda FLASH -kernel vmlinuz -initrd -hdachs 980,16,32-append "ide_generic.probe_mask=0x01 ide_core.chs=0.0:980,16,32 auto nousbconsole=ttyS0,9600 bigphysarea=65536 no-hlt"

-net "nic,vlan=0,macaddr=00:00:ab:cd:ef:01,model=pcnet"

-net "tap,vlan=0,script=no,ifname=tap0"

-net"nic,vlan=1,macaddr=00:00:ab:cd:ef:02,model=pcnet"

-net "user,vlan=1,net=172.16.1.0/24"

然后配置网桥可以使模拟的ASA与外界通信。

2.4.2 IOS的dynamips模拟

使用dynamips gdb mod,因为内置了gdb stub,可以用来调试IOS系统。

dynamips -Z 1234 -P 3600 -j -s slot:f0/0:linux_eth0C36XX.BIN

其中-Z是待连接的端口,-P是模拟的硬件平台,-s的内容是指将Cisco设备的f0/0接口映射到linux的eth0,最后是解包后的镜像。

 2.5    网络设备调试

2.5.1    模拟调试

采用qemu模拟网络设备的运行,ida远程attach的方式进行网络设备的调试。

Clipboard Image.png

图2-4:IDA attach qemu示意图

         首先,将asa防火墙镜像进行解包,提取出内核文件和打包的文件系统,就可以开始模拟asa防火墙了。

         接着,配置虚拟网桥和TAP设备使模拟的系统能够和宿主机通信。

         最后,ida远程gdb debuggerattach到qemu宿主机ip。

2.5.2    真机调试

ASA防火墙内置gdbserver,在主机上使用gdb通过串口可以控制远端的gdbserver调试ASA防火墙的lina进程。

Clipboard Image.png

图2-5:gdb调试ASA设备示意图

ASA防火墙默认不启动gdbserver,需要修改镜像中的内核参数,将quiet loglevel=0 auto改为rdinit=/bin/sh。 

由于ASA防火墙会对镜像进行校验,所以修改的镜像无法直接通过tftp传入设备存储,ASA使用CF卡作为存储设备,可以通过用CF卡读卡器直接将镜像写入CF卡中的方式绕过校验,因为ASA没有对CF中的镜像进行校验。

设备启动后,会直接进入linux shell,使用sed命令修改/asa/scripts/rcS中的gdbserver参数,然后启动/sbin/init程序,最终停在等待调试的状态。

主机gdb远程串口连接gdbserver开始调试。

2.5.3    设备调试命令

l  Debug命令(IOS & ASA)

       Eg:debug cryptoikev2 protocol 可以显示出ikev2协议过程中失败的原因。

l  Show crashinfo(ASA),more flash:crashinfo_xxx(IOS)显示奔溃信息

l  console log(IOS)开启console上的log显示

2.6     模拟环境数据包获取

使用GNS3搭建网络模拟环境,可以通过GNS3自带对网络线路的数据抓取功能,调用wireshark抓包,也可以使用模拟设备自带的抓包功能抓取数据,之后导出到host主机。

Clipboard Image.png

图2-6:vm1与vm2通过IPSec连接拓扑图

         抓取数据包的主要目的是为了了解协议的通讯过程,以及通讯的每个步骤的数据包构成。

2.7    CVE-2016-1287    

2.7.1    IKEV2协议

在IKEv2的协议中,通信双方协商由3个交换来完成,分别为初始交换(Initial Exchange)、建立子交换(CREATE_CHILD_SA_Exchange)和信息交换(InformationExchange)。

Clipboard Image.png

图2-7:ikev2通信数据包

 思科IKEv2 fragment头部结构如下:

Clipboard Image.png

图2-8:IKEv2分片头部结构

IKEv2 Configuration Attributes payload结构如下:

Clipboard Image.png

图2-9:IKEv2配置属性结构

2.7.2    漏洞成因

cve-2016-1287是思科ASA软件的IKEv1和IKEv2代码中的整数溢出漏洞,ASA软件在添加ikev2 分片队列的时候,只检测了新的重组队列长度的上限是否大于0x7FFF,而新的重组队列长度 =分片长度 + 重组队列长度– 8,是可能为负的,下溢新的重组队列长度能绕过检查

1.newre_len = frag_len + re_len – 8  

2.if newre_len <= 0x7fff:  

3.       把分片加入到重组队列

          分配最终的重组队列长度 +8的空间给重组缓冲区。

1.re_buff = malloc(final_re_len + 8)  

         把每个分片的载荷拷贝到从重组缓冲区的地址+ 4开始的缓冲区内。

1.offset = 0

2.while True:

3.        fragment = get_from_re_ queue()

4.        frag_payload = fragment->payload

5.        payload_len = fragment->length - 8

6.        memcpy(re_buff  + offset + 4,frag_payload ,payload_len)  

7.        Offset += payload_len

    如果思科IKEV2 分片报文头部中的length< 8,相当于payload长度为负数,因此malloc分配的空间不足,导致了溢出。

    2.7.3    POC实现

    在执行ikev2_add_rcv_frag()之前,要能够完成初始交换并且ikev2报文载荷中含有Vendor ID : Fragment,否则不会执行ikev2_add_rcv_frag()。

    Clipboard Image.png

    图2-10:ikev2_parse_frag_payload函数

     在处理Vendor ID的函数中的相关代码:

    Clipboard Image.png

    图2-11:ikev2_parse_vid_payload函数

             完成初始交换后,fragment header的length = 1即可触发漏洞。

    Clipboard Image.png

    图2-12:poc

    2.7.4    漏洞利用

    漏洞利用的过程如下图所示:

    Clipboard Image.png

    图2-13:漏洞利用过程

    主要思路是先布局堆,用大小为100h的堆块填充堆里的空隙。发送100h的分片包,可以得到2块连续的130h的堆块,分别是IKEv2daemon分配的100h和分片解析时分配的100h。

    Clipboard Image.png

    数据包处理完毕,第一个130h的堆会被释放掉,当漏洞触发时,会分配100h的堆块来处理数据包,而之前100h的空隙都被填充了,所以130h的堆块被拆分成100h和30h,使大小为100h,30h,130h堆块依次排布。

    Clipboard Image.png

    然后100h的堆块发生溢出,改变30h的大小为60h,相当于30h的数据是130h的头部,30h是free堆块,故新的60h也是free的。

    Clipboard Image.png 

     当100h用后释放的时候会与60h合并成160h,此时160h,100h依次排布。

    Clipboard Image.png

    重新分配大小为160h的堆块,使160h重用,伪造出新的30h和130h的头部。

    Clipboard Image.png

    最后在释放堆块的时候触发2次write 4,第一次是130h这个堆块被释放,因为这个堆块开始的时候存放的就是一个分片的数据,之后堆块头被改后,一直没有被释放,直到重新构造出头部后,再次收到新的攻击数据包后,最终释放,第二次是30h和130h合并是产生的,劫持ikev2_add_rcv_frag()中使用的函数指针到一个固定的地址,在,跳转到最后一个数据包中的shellcode。

    Shellcode的作用是获取linux shell,先调用start_loopback_proxy()开启socksv5代理,接下来就是经典的connect-backshellcode.  

    2.8     漏洞利用时存在的问题和解决   

    2.8.1    缓存不一致

    Clipboard Image.png

    图2-14:缓存不一致

     

    设备的CPU有2个分开的缓存:指令缓存和数据缓存。memcpy()写入的数据经过数据缓存存入内存中,但是指令缓存并未更新,返回的位置的代码未发生变化。

    解决办法是先执行能够刷新缓存或者关闭缓存的函数,将内存的值读入指令缓存中,在跳转到shellcode的位置。 

    2.8.2    系统镜像的多样性

    2009年,FX的演讲提出使用功能上的不变特征来解决二进制的多样性。例如enable密码输入错误时,会回显“%Bad Secrets”这个字符串,通过搜索这个字符串可以找到相关函数的位置,而不是通过硬编码地址。

    2011年,Ang Cui在演讲中提出FX的方法存在运行时间过长的问题,会触发watchdog。并提出了一种中断劫持的shellcode,来实现通用可靠的IOS利用。

    三、    总结

    网络设备的安全措施相对于PC非常的简单,高端的设备才逐渐的增加上,低端设备可以说有了漏洞,利用起来就非常简单了。不过正因为网络设备的漏洞主要出现在协议上,而设备系统的代码非常的稳定,所以发现漏洞的难度很大,出现漏洞的位置是协议的“边角”部位或是一些较新的协议。对于网络设备而言提权漏洞非常少见,因为网络设备的管理命令行提供非常受限的输入接口。

    参考资料

    1.        AttackingNetwork Embedded System Felix ‘FX’ Lindner 2002

    2.        The Holy Grail Cisco IOSShellcode And Exploitation Techniques Michael Lynn 2005

    3.        CiscoIOS Shellcodes Gyan Chawdhary, Varun Uppal 2007

    4.        CiscoIOS – Attack & Defense. The State of the Art Felix ’FX’ Lindner 2008

    5.        RouterExploitation Felix ’FX’ Lindner 2009

    6.        Fuzzingand Debugging Cisco IOS SebasEan Muniz, Alfredo Ortega 2011

    7.        Killing the Myth ofCisco IOS Diversity Ang Cui, JaEn Kataria, Salvatore J. Stolfo 2011

    8.        BreakingBricks and Plumbing Pipes:Cisco ASA a Super Mario Adventure AlecStuart-Muirk 2014

    9.        Cisco IOS shellcode:all-in-oneGeorge Nosenko 2015

    10.    Executemy packet David Barksdale,Jordan Gruskovnjak,Alex Wheeler 2016

    11.    http://7200emu.hacki.at

    *本文由兴华永恒(北京)科技有限责任公司墨侠团队完成,墨侠团队是致力于信息安全服务、威胁情报、APT防御等方向的专业安全团队,转载请注明来自FreeBuf(FreeBuf.com)

    0 0
    原创粉丝点击