欢迎来到兴华永恒!加入收藏设为首页
您当前所在位置:首页 > 技术专栏 > 专业发布
技术专栏

网络设备漏洞分析技术研究




一、 研究背景


1.1 研究网络设备的原因 



网络设备处在计算机网络中的节点位置,一台网络设备往往连接着很多台PC或其他网络设备。和攻击难度越来越大的PC电脑相比,网络设备的防护很脆弱,并且如果获取到一台网络设备的权限,因为其位置的便利和功能上的特点,可以获取到与其相连的PC的网络流量,并且可以做到不被PC用户察觉。

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


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


QQ截图20160907095052.png


1.2 网络设备漏洞的特点

6.png

根据近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 研究思路


3.png

图2-1:研究思路


2.2 固件获取


1.官网下载

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

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

4.网上服务器的分享


2.3 固件解包


固件解包的目的:

1.解出要分析的程序

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

ASA固件解包

4.png

4.png

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


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

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


5.png

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


2.4 系统模拟


ASA的qemu模拟

1. qemu-img create FLASH 512M

2.  qemu-system-i386 -s -m 512 -nographic -icount auto -hda FLASH -kernel vmlinuz -initrd initrd -hdachs 980,16,32 -append "ide_generic.probe_mask=0x01 ide_core.chs=0.0:980,16,32 auto nousb console=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与外界通信。 

IOS的dynamips模拟

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

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

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


2.5 网络设备调试


2.5.1 模拟调试


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


7.png

图2-4:IDA attach qemu示意图



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

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

然后,ida远程gdb debugger attach到qemu宿主机ip。


2.5.2 真机调试


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



8.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 设备调试命令


●Debug命令(IOS & ASA)

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

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

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



2.6 模拟环境数据获取


使用GNS3搭建网络模拟环境,可以通过GNS3自带对网络线路的数据抓取功能,调用wireshark抓包,也可以使用模拟设备自带的抓包功能抓取数据,之后导出到host主机。抓取数据包的主要目的是为了了解协议的通讯过程,以及通讯的每个步骤的数据包构成。


9.png


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


 


2.7 CVE-2016-1287


2.7.1 IKEV2 协议


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


10.png


图2-7:ikev2通信数据包


思科IKEv2 fragment头部结构如下:


11.png


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


IKEv2 Configuration Attributes payload结构如下:


12.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、把分片加入到重组队列

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

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()。


blob.png



图2-10:ikev2_parse_frag_payload函数


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


blob.png

图2-11:ikev2_parse_vid_payload函数


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


blob.png


图2-12:poc

2.7.4  漏洞利用


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

blob.png


图2-13:漏洞利用过程


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

blob.png


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

blob.png


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


blob.png


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


blob.png

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


blob.png


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

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


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


2.8.1 缓存不一致


blob.png


图2-14:缓存不一致

 

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

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


2.8.2 系统镜像的多样性



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

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


三、 总结


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




在线咨询 周一至周五
09:00-18:00