網(wǎng)絡(luò)設(shè)備處在計(jì)算機(jī)網(wǎng)絡(luò)中的節(jié)點(diǎn)位置,一臺(tái)網(wǎng)絡(luò)設(shè)備往往連接著很多臺(tái)PC或其他網(wǎng)絡(luò)設(shè)備。和攻擊難度越來(lái)越大的PC電腦相比,網(wǎng)絡(luò)設(shè)備的防護(hù)很脆弱,并且如果獲取到一臺(tái)網(wǎng)絡(luò)設(shè)備的權(quán)限,因?yàn)槠湮恢玫谋憷凸δ苌系奶攸c(diǎn),可以獲取到與其相連的PC的網(wǎng)絡(luò)流量,并且可以做到不被PC用戶察覺。
近些年以來(lái),關(guān)于網(wǎng)絡(luò)設(shè)備的漏洞披露和攻擊的報(bào)道日益增多,一方面是因?yàn)楣粽唛_始從網(wǎng)絡(luò)設(shè)備入手進(jìn)行攻擊,另一方面人們逐漸開始重視網(wǎng)絡(luò)設(shè)備的安全。
表1-1:近年有關(guān)網(wǎng)絡(luò)設(shè)備的安全事件
根據(jù)近3年的CVE數(shù)目,可以看出漏洞大多歸類于拒絕服務(wù)漏洞,剩下的就是繞過認(rèn)證、過濾等安全機(jī)制的漏洞和其他類型的漏洞。
網(wǎng)絡(luò)設(shè)備的漏洞多為網(wǎng)絡(luò)協(xié)議的漏洞,而網(wǎng)絡(luò)協(xié)議的漏洞多為內(nèi)存破壞的漏洞,內(nèi)存破壞的漏洞大都?xì)w類于拒絕服務(wù)。
思科IOS是一個(gè)體積很大的二進(jìn)制程序直接運(yùn)行在主CPU上,如果發(fā)生異常,內(nèi)存破壞,或是CPU被持續(xù)占用都會(huì)導(dǎo)致設(shè)備重啟。
思科ASA是在嵌入式linux系統(tǒng)上運(yùn)行著lina_monitor和lina,當(dāng)lina出現(xiàn)異常的時(shí)候,lina_monitor負(fù)責(zé)重啟設(shè)備。
早公開的關(guān)于網(wǎng)絡(luò)設(shè)備漏洞利用的研究是2002年Felix ‘FX’ Lindner和FtR的“Attacking networked embedded systems”,作者演示思科IOS漏洞利用的可行性。
2005年,Michael Lynn先公開地演示了可靠的利用思科IOS的緩沖區(qū)溢出漏洞。
2007年,Gyan Chawdhary和Varun Uppal公開了gdb調(diào)試思科IOS shellcode的辦法,并給出了2種shellcode的演示和代碼。
2008年,F(xiàn)elix ‘FX’ Lindner開發(fā)了思科IOS取證工具CIR。
2011年,SebasEan Muniz, Alfredo Ortega演示了思科IOS fuzzing。以及Ang Cui, JaEn Kataria, Salvatore J. Stolfo提出了通用思科IOS漏洞利用的方法。
2012年,F(xiàn)elix ‘FX’ Lindner展示了華為路由器的安全問題。
2015年,George Nosenko演示了shellcode在內(nèi)存中執(zhí)行tcl腳本。
圖2-1:研究思路
1.官網(wǎng)下載
2.Tftp,ftp,http,scp等方式從設(shè)備上下載
3.從flash,cf等存儲(chǔ)模塊中讀取
4.網(wǎng)上服務(wù)器的分享
固件解包的目的:
1.解出要分析的程序
2.解出模擬時(shí)需要的文件
ASA固件解包
圖2-2:ASA固件格式示意
圖2中,vmlinuz是壓縮的linux內(nèi)核,initrd是系統(tǒng)引導(dǎo)過程中掛載的臨時(shí)根文件系統(tǒng),通過字符串“Direct booting from floppy is no longer supported”和“rootfs.img”確定vmlinuz和initrd的起始地址。
IOS解包7z提取壓縮鏡像中的系統(tǒng)文件。
圖2-3:壓縮鏡像中的系統(tǒng)文件
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"
然后配置網(wǎng)橋可以使模擬的ASA與外界通信。
IOS的dynamips模擬
使用dynamips gdb mod,因?yàn)閮?nèi)置了gdb stub,可以用來(lái)調(diào)試IOS系統(tǒng)。
dynamips -Z 1234 -P 3600 -j -s slot:f0/0:linux_eth0 C36XX.BIN
其中-Z是待連接的端口,-P是模擬的硬件平臺(tái),-s的內(nèi)容是指將Cisco設(shè)備的f0/0接口映射到linux的eth0,是解包后的鏡像。
采用qemu模擬網(wǎng)絡(luò)設(shè)備的運(yùn)行,ida遠(yuǎn)程attach的方式進(jìn)行網(wǎng)絡(luò)設(shè)備的調(diào)試。
圖2-4:IDA attach qemu示意圖
首先,將asa防火墻鏡像進(jìn)行解包,提取出內(nèi)核文件和打包的文件系統(tǒng),就可以開始模擬asa防火墻了。
接著,配置虛擬網(wǎng)橋和TAP設(shè)備使模擬的系統(tǒng)能夠和宿主機(jī)通信。
然后,ida遠(yuǎn)程gdb debugger attach到qemu宿主機(jī)ip。
ASA防火墻內(nèi)置gdbserver,在主機(jī)上使用gdb通過串口可以控制遠(yuǎn)端的gdbserver調(diào)試ASA防火墻的lina進(jìn)程。
圖2-5:gdb調(diào)試ASA設(shè)備示意圖
ASA防火墻默認(rèn)不啟動(dòng)gdbserver,需要修改鏡像中的內(nèi)核參數(shù),將quiet loglevel=0 auto改為rdinit=/bin/sh。
由于ASA防火墻會(huì)對(duì)鏡像進(jìn)行校驗(yàn),所以修改的鏡像無(wú)法直接通過tftp傳入設(shè)備存儲(chǔ),ASA使用CF卡作為存儲(chǔ)設(shè)備,可以通過用CF卡讀卡器直接將鏡像寫入CF卡中的方式繞過校驗(yàn),因?yàn)锳SA沒有對(duì)CF中的鏡像進(jìn)行校驗(yàn)。
設(shè)備啟動(dòng)后,會(huì)直接進(jìn)入linux shell,使用sed命令修改/asa/scripts/rcS中的gdbserver參數(shù),然后啟動(dòng)/sbin/init程序,停在等待調(diào)試的狀態(tài)。
主機(jī)gdb遠(yuǎn)程串口連接gdbserver開始調(diào)試。
●Debug命令(IOS & ASA)
Eg:debug crypto ikev2 protocol 可以顯示出ikev2協(xié)議過程中失敗的原因。
●Show crashinfo(ASA),more flash:crashinfo_xxx(IOS)顯示奔潰信息
● console log(IOS) 開啟console上的log顯示
使用GNS3搭建網(wǎng)絡(luò)模擬環(huán)境,可以通過GNS3自帶對(duì)網(wǎng)絡(luò)線路的數(shù)據(jù)抓取功能,調(diào)用wireshark抓包,也可以使用模擬設(shè)備自帶的抓包功能抓取數(shù)據(jù),之后導(dǎo)出到host主機(jī)。抓取數(shù)據(jù)包的主要目的是為了了解協(xié)議的通訊過程,以及通訊的每個(gè)步驟的數(shù)據(jù)包構(gòu)成。
圖2-6:vm1與vm2通過IPSec連接拓?fù)鋱D
在IKEv2的協(xié)議中,通信雙方協(xié)商由3個(gè)交換來(lái)完成,分別為初始交換(Initial Exchange)、建立子交換(CREATE_CHILD_SA_Exchange)和信息交換(Information Exchange)
圖2-7:ikev2通信數(shù)據(jù)包
思科IKEv2 fragment頭部結(jié)構(gòu)如下:
圖2-8:IKEv2分片頭部結(jié)構(gòu)
IKEv2 Configuration Attributes payload結(jié)構(gòu)如下:
圖2-9:IKEv2配置屬性結(jié)構(gòu)
cve-2016-1287是思科ASA軟件的IKEv1和IKEv2代碼中的整數(shù)溢出漏洞,ASA軟件在添加ikev2 分片隊(duì)列的時(shí)候,只檢測(cè)了新的重組隊(duì)列長(zhǎng)度的上限是否大于0x7FFF,而新的重組隊(duì)列長(zhǎng)度 = 分片長(zhǎng)度 + 重組隊(duì)列長(zhǎng)度– 8,是可能為負(fù)的,下溢新的重組隊(duì)列長(zhǎng)度能繞過檢查。
1、newre_len = frag_len + re_len – 8
2、if newre_len <= 0x7fff:
3、把分片加入到重組隊(duì)列
1、分配的重組隊(duì)列長(zhǎng)度 + 8的空間給重組緩沖區(qū)。
re_buff = malloc(final_re_len + 8)
把每個(gè)分片的載荷拷貝到從重組緩沖區(qū)的地址+ 4開始的緩沖區(qū)內(nèi)。
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 分片報(bào)文頭部中的length < 8,相當(dāng)于payload長(zhǎng)度為負(fù)數(shù),因此malloc分配的空間不足,導(dǎo)致了溢出。
在執(zhí)行ikev2_add_rcv_frag()之前,要能夠完成初始交換并且ikev2報(bào)文載荷中含有Vendor ID : Fragment,否則不會(huì)執(zhí)行ikev2_add_rcv_frag()。
圖2-10:ikev2_parse_frag_payload函數(shù)
在處理Vendor ID的函數(shù)中的相關(guān)代碼:
圖2-11:ikev2_parse_vid_payload函數(shù)
完成初始交換后,fragment header的length = 1即可觸發(fā)漏洞。
圖2-12:poc
漏洞利用的過程如下圖所示:
圖2-13:漏洞利用過程
主要思路是先布局堆,用大小為100h的堆塊填充堆里的空隙。發(fā)送100h的分片包,可以得到2塊連續(xù)的130h的堆塊,分別是IKEv2 daemon分配的100h和分片解析時(shí)分配的100h。
數(shù)據(jù)包處理完畢,第一個(gè)130h的堆會(huì)被釋放掉,當(dāng)漏洞觸發(fā)時(shí),會(huì)分配100h的堆塊來(lái)處理數(shù)據(jù)包,而之前100h的空隙都被填充了,所以130h的堆塊被拆分成100h和30h,使大小為100h,30h,130h堆塊依次排布。
然后100h的堆塊發(fā)生溢出,改變30h的大小為60h,相當(dāng)于30h的數(shù)據(jù)是130h的頭部,30h是free堆塊,故新的60h也是free的。
當(dāng)100h用后釋放的時(shí)候會(huì)與60h合并成160h,此時(shí)160h,100h依次排布。
重新分配大小為160h的堆塊,使160h重用,偽造出新的30h和130h的頭部。
在釋放堆塊的時(shí)候觸發(fā)2次write 4,第一次是130h這個(gè)堆塊被釋放,因?yàn)檫@個(gè)堆塊開始的時(shí)候存放的就是一個(gè)分片的數(shù)據(jù),之后堆塊頭被改后,一直沒有被釋放,直到重新構(gòu)造出頭部后,再次收到新的攻擊數(shù)據(jù)包后,釋放,第二次是30h和130h合并是產(chǎn)生的,劫持ikev2_add_rcv_frag()中使用的函數(shù)指針到一個(gè)固定的地址,在,跳轉(zhuǎn)到后一個(gè)數(shù)據(jù)包中的shellcode。
Shellcode的作用是獲取linux shell,先調(diào)用start_loopback_proxy()開啟socksv5代理,接下來(lái)就是經(jīng)典的connect-back shellcode。
圖2-14:緩存不一致
設(shè)備的CPU有2個(gè)分開的緩存:指令緩存和數(shù)據(jù)緩存。memcpy()寫入的數(shù)據(jù)經(jīng)過數(shù)據(jù)緩存存入內(nèi)存中,但是指令緩存并未更新,返回的位置的代碼未發(fā)生變化。
解決辦法是先執(zhí)行能夠刷新緩存或者關(guān)閉緩存的函數(shù),將內(nèi)存的值讀入指令緩存中,在跳轉(zhuǎn)到shellcode的位置。
2009年,F(xiàn)X的演講提出使用功能上的不變特征來(lái)解決二進(jìn)制的多樣性。例如enable密碼輸入錯(cuò)誤時(shí),會(huì)回顯“%Bad Secrets”這個(gè)字符串,通過搜索這個(gè)字符串可以找到相關(guān)函數(shù)的位置,而不是通過硬編碼地址。
2011年,Ang Cui在演講中提出FX的方法存在運(yùn)行時(shí)間過長(zhǎng)的問題,會(huì)觸發(fā)watchdog。并提出了一種中斷劫持的shellcode,來(lái)實(shí)現(xiàn)通用可靠的IOS利用。
網(wǎng)絡(luò)設(shè)備的安全措施相對(duì)于PC非常簡(jiǎn)單,高端設(shè)備才逐漸的增加上,低端設(shè)備可以說(shuō)有了漏洞,利用起來(lái)就非常簡(jiǎn)單了。不過正因?yàn)榫W(wǎng)絡(luò)設(shè)備的漏洞主要出現(xiàn)在協(xié)議上,而設(shè)備系統(tǒng)的代碼非常的穩(wěn)定,所以發(fā)現(xiàn)漏洞的難度很大,出現(xiàn)漏洞的位置是協(xié)議的“邊角”部位或是一些較新的協(xié)議。對(duì)于網(wǎng)絡(luò)設(shè)備而言提權(quán)漏洞非常少見,因?yàn)榫W(wǎng)絡(luò)設(shè)備的管理命令行提供非常受限的輸入接口。