網絡設備處在計算機網絡中的節點位置,一臺網絡設備往往連接著很多臺PC或其他網絡設備。和攻擊難度越來越大的PC電腦相比,網絡設備的防護很脆弱,并且如果獲取到一臺網絡設備的權限,因為其位置的便利和功能上的特點,可以獲取到與其相連的PC的網絡流量,并且可以做到不被PC用戶察覺。
近些年以來,關于網絡設備的漏洞披露和攻擊的報道日益增多,一方面是因為攻擊者開始從網絡設備入手進行攻擊,另一方面人們逐漸開始重視網絡設備的安全。
表1-1:近年有關網絡設備的安全事件
根據近3年的CVE數目,可以看出漏洞大多歸類于拒絕服務漏洞,剩下的就是繞過認證、過濾等安全機制的漏洞和其他類型的漏洞。
網絡設備的漏洞多為網絡協議的漏洞,而網絡協議的漏洞多為內存破壞的漏洞,內存破壞的漏洞大都歸類于拒絕服務。
思科IOS是一個體積很大的二進制程序直接運行在主CPU上,如果發生異常,內存破壞,或是CPU被持續占用都會導致設備重啟。
思科ASA是在嵌入式linux系統上運行著lina_monitor和lina,當lina出現異常的時候,lina_monitor負責重啟設備。
早公開的關于網絡設備漏洞利用的研究是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:研究思路
1.官網下載
2.Tftp,ftp,http,scp等方式從設備上下載
3.從flash,cf等存儲模塊中讀取
4.網上服務器的分享
固件解包的目的:
1.解出要分析的程序
2.解出模擬時需要的文件
ASA固件解包
圖2-2:ASA固件格式示意
圖2中,vmlinuz是壓縮的linux內核,initrd是系統引導過程中掛載的臨時根文件系統,通過字符串“Direct booting from floppy is no longer supported”和“rootfs.img”確定vmlinuz和initrd的起始地址。
IOS解包7z提取壓縮鏡像中的系統文件。
圖2-3:壓縮鏡像中的系統文件
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,是解包后的鏡像。
采用qemu模擬網絡設備的運行,ida遠程attach的方式進行網絡設備的調試。
圖2-4:IDA attach qemu示意圖
首先,將asa防火墻鏡像進行解包,提取出內核文件和打包的文件系統,就可以開始模擬asa防火墻了。
接著,配置虛擬網橋和TAP設備使模擬的系統能夠和宿主機通信。
然后,ida遠程gdb debugger attach到qemu宿主機ip。
ASA防火墻內置gdbserver,在主機上使用gdb通過串口可以控制遠端的gdbserver調試ASA防火墻的lina進程。
圖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開始調試。
●Debug命令(IOS & ASA)
Eg:debug crypto ikev2 protocol 可以顯示出ikev2協議過程中失敗的原因。
●Show crashinfo(ASA),more flash:crashinfo_xxx(IOS)顯示奔潰信息
● console log(IOS) 開啟console上的log顯示
使用GNS3搭建網絡模擬環境,可以通過GNS3自帶對網絡線路的數據抓取功能,調用wireshark抓包,也可以使用模擬設備自帶的抓包功能抓取數據,之后導出到host主機。抓取數據包的主要目的是為了了解協議的通訊過程,以及通訊的每個步驟的數據包構成。
圖2-6:vm1與vm2通過IPSec連接拓撲圖
在IKEv2的協議中,通信雙方協商由3個交換來完成,分別為初始交換(Initial Exchange)、建立子交換(CREATE_CHILD_SA_Exchange)和信息交換(Information Exchange)
圖2-7:ikev2通信數據包
思科IKEv2 fragment頭部結構如下:
圖2-8:IKEv2分片頭部結構
IKEv2 Configuration Attributes payload結構如下:
圖2-9:IKEv2配置屬性結構
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分配的空間不足,導致了溢出。
在執行ikev2_add_rcv_frag()之前,要能夠完成初始交換并且ikev2報文載荷中含有Vendor ID : Fragment,否則不會執行ikev2_add_rcv_frag()。
圖2-10:ikev2_parse_frag_payload函數
在處理Vendor ID的函數中的相關代碼:
圖2-11:ikev2_parse_vid_payload函數
完成初始交換后,fragment header的length = 1即可觸發漏洞。
圖2-12:poc
漏洞利用的過程如下圖所示:
圖2-13:漏洞利用過程
主要思路是先布局堆,用大小為100h的堆塊填充堆里的空隙。發送100h的分片包,可以得到2塊連續的130h的堆塊,分別是IKEv2 daemon分配的100h和分片解析時分配的100h。
數據包處理完畢,第一個130h的堆會被釋放掉,當漏洞觸發時,會分配100h的堆塊來處理數據包,而之前100h的空隙都被填充了,所以130h的堆塊被拆分成100h和30h,使大小為100h,30h,130h堆塊依次排布。
然后100h的堆塊發生溢出,改變30h的大小為60h,相當于30h的數據是130h的頭部,30h是free堆塊,故新的60h也是free的。
當100h用后釋放的時候會與60h合并成160h,此時160h,100h依次排布。
重新分配大小為160h的堆塊,使160h重用,偽造出新的30h和130h的頭部。
在釋放堆塊的時候觸發2次write 4,第一次是130h這個堆塊被釋放,因為這個堆塊開始的時候存放的就是一個分片的數據,之后堆塊頭被改后,一直沒有被釋放,直到重新構造出頭部后,再次收到新的攻擊數據包后,釋放,第二次是30h和130h合并是產生的,劫持ikev2_add_rcv_frag()中使用的函數指針到一個固定的地址,在,跳轉到后一個數據包中的shellcode。
Shellcode的作用是獲取linux shell,先調用start_loopback_proxy()開啟socksv5代理,接下來就是經典的connect-back shellcode。
圖2-14:緩存不一致
設備的CPU有2個分開的緩存:指令緩存和數據緩存。memcpy()寫入的數據經過數據緩存存入內存中,但是指令緩存并未更新,返回的位置的代碼未發生變化。
解決辦法是先執行能夠刷新緩存或者關閉緩存的函數,將內存的值讀入指令緩存中,在跳轉到shellcode的位置。
2009年,FX的演講提出使用功能上的不變特征來解決二進制的多樣性。例如enable密碼輸入錯誤時,會回顯“%Bad Secrets”這個字符串,通過搜索這個字符串可以找到相關函數的位置,而不是通過硬編碼地址。
2011年,Ang Cui在演講中提出FX的方法存在運行時間過長的問題,會觸發watchdog。并提出了一種中斷劫持的shellcode,來實現通用可靠的IOS利用。
網絡設備的安全措施相對于PC非常簡單,高端設備才逐漸的增加上,低端設備可以說有了漏洞,利用起來就非常簡單了。不過正因為網絡設備的漏洞主要出現在協議上,而設備系統的代碼非常的穩定,所以發現漏洞的難度很大,出現漏洞的位置是協議的“邊角”部位或是一些較新的協議。對于網絡設備而言提權漏洞非常少見,因為網絡設備的管理命令行提供非常受限的輸入接口。