曲速未來 表示|對(duì)家庭自動(dòng)化的“洞察力”揭示了簡(jiǎn)單物聯(lián)網(wǎng)產(chǎn)品中的漏洞區(qū)塊鏈

                  曲速未來安全區(qū) 2018-09-06 02:49
                  分享到:
                  導(dǎo)讀

                  據(jù)區(qū)塊鏈安全咨詢公司曲速未來表示:發(fā)現(xiàn)軟件和硬件中的安全問題,用以幫助他們的開發(fā)人員為企業(yè)和消費(fèi)者提供更安全的產(chǎn)品。對(duì)WemoInsightSmartPlug的研究導(dǎo)致在libUPnPHndlr.so庫(kù)中發(fā)現(xiàn)了未報(bào)告的緩沖區(qū)溢出。

                  物聯(lián)網(wǎng)有望讓我們的生活更輕松。想要遠(yuǎn)程打開和關(guān)閉燈和設(shè)備并在線監(jiān)控它們?“智能插頭”是一種Wi-Fi連接的電源插座,是一種簡(jiǎn)單的方法。但是,如果物聯(lián)網(wǎng)設(shè)備沒有得到妥善保護(hù),它們就會(huì)變成攻擊媒介。


                  據(jù)區(qū)塊鏈安全咨詢公司 曲速未來 表示:發(fā)現(xiàn)軟件和硬件中的安全問題,是用以幫助他們的開發(fā)人員為企業(yè)和消費(fèi)者提供更安全的產(chǎn)品。根據(jù)最近調(diào)查的Belkin生產(chǎn)的消費(fèi)品。對(duì)Wemo Insight Smart Plug的研究導(dǎo)致在libUPnPHndlr.so庫(kù)中發(fā)現(xiàn)了未報(bào)告的緩沖區(qū)溢出。此缺陷CVE-2018-6692允許攻擊者執(zhí)行遠(yuǎn)程代碼。


                  此漏洞是否可以導(dǎo)致有用的攻擊?智能插頭本身的影響很小。攻擊者可能會(huì)關(guān)閉交換機(jī),或者最壞情況下可能會(huì)使交換機(jī)過載。但如果插頭與其他設(shè)備聯(lián)網(wǎng),則潛在威脅會(huì)增加。插件現(xiàn)在可以成為更大攻擊的入口點(diǎn)。


                  發(fā)現(xiàn)漏洞 


                  網(wǎng)絡(luò)或遠(yuǎn)程漏洞比本地漏洞更危險(xiǎn),因此仔細(xì)研究了在本地網(wǎng)絡(luò)上監(jiān)聽的UPnP端口。用一個(gè)正在開發(fā)的UPnP模糊器工具,開始模糊打開的UPnP端口,同時(shí)監(jiān)控Wemo上的UART接口。過了一會(huì)兒,就可以看到了UART界面的崩潰。


                  11:37:16.702 stuntsx0x46ac6 STUN客戶端事務(wù)銷毀

                  將發(fā)送SIGSEGV發(fā)送到wemoApp以獲得對(duì)

                  464d4945的無效寫訪問(epc == 2ac1fb58,ra == 2ac1fccc)

                  Cpu 0 

                  堆棧:2a0000d0 FFFFFFFE 31d2e6f0 31d2e770 31d2e76f 31d2e6f0 31d2e6f0 31d2e770 

                  00000000 31d2e604 00000000 00000000 2ac77d40 00000000 4f464751 4a484d4c

                  4e444241 47454f49 50464658 45414d42 43445044 464d4945 5552414c 46495048

                  4b524141 41445a4f 44534e4a 4e4e494c 44434357 494a4855 44515455 44494b45 

                  55584a44 584e4f52 545a5247 51545954 595a4c42 4e594a45 484f5158 46474944 


                  呼叫追蹤:


                  在多次重復(fù)并密切觀察實(shí)驗(yàn)后確定崩潰是由以下數(shù)據(jù)包引起的:


                  POST/upnp/control/basicevent1 HTTP/1.1

                  主機(jī):192.168.225.183:49154

                  User-Agent:python-requests / 2.9.1

                  接受:* / *

                  連接:keep-alive

                  SOAPAction:“urn:Belkin:service:basicevent:1 #UpdateInsightHomeSettings“

                  Content-Type:text/xml

                  Accept-Encoding:gzip,deflate

                  Content-Length:3253



                  由于空間原因,一些有效載荷已被刪除。(“EnergyPerUnitCostVersion”中的原始數(shù)據(jù)為2,828個(gè)字符。)在檢查崩潰數(shù)據(jù)和數(shù)據(jù)包之后,這似乎是標(biāo)準(zhǔn)緩沖區(qū)溢出,其中數(shù)據(jù)被覆蓋到堆棧上。接著繼續(xù)模糊測(cè)試,現(xiàn)在專注于“EnergyPerUnitCost”字段,發(fā)現(xiàn)只需要32個(gè)字符就可以使應(yīng)用程序崩潰。


                  雖然崩潰轉(zhuǎn)儲(chǔ)可以提供了很多好的信息,但仍然有很多是不知道的。例如,崩潰發(fā)生在“WemoApp”中并可以提供了一個(gè)偏移量,但這個(gè)庫(kù)的基地址是什么?什么被覆蓋在堆棧上?如果在運(yùn)行期間無法訪問應(yīng)用程序,則很難回答這些問題。因?yàn)樵谶@之前獲得了文件系統(tǒng),所以就可以靜態(tài)分析WemoApp二進(jìn)制文件;但仍然無法輕易確定崩潰的確切位置。


                  要回答這些問題,需要采取兩種途徑之一。可以虛擬化Wemo固件或二進(jìn)制文件以繼續(xù)測(cè)試;或者如果可以確定UART接口上的root密碼,就有可能在設(shè)備上進(jìn)行調(diào)試。通常,虛擬化固件并不簡(jiǎn)單,有時(shí)會(huì)導(dǎo)致測(cè)試結(jié)果不準(zhǔn)確。最好在設(shè)備上進(jìn)行調(diào)試。通過我們?cè)趥刹爝^程中發(fā)現(xiàn)的所有信息,發(fā)現(xiàn)似乎可以繞過root密碼。(也有嘗試虛擬化WemoApp-但沒有成功。)


                  繞過root密碼


                  從提取的文件系統(tǒng)中,我們了解到Wemo運(yùn)行嵌入式Linux系統(tǒng)OpenWRT,用戶帳戶信息保存在標(biāo)準(zhǔn)的/etc/passwd或/etc/shadow文件中。我們從/etc/passwd中提取了root密碼的哈希值,并將其提交給了一個(gè)破解平臺(tái)。這種方法在合理的時(shí)間內(nèi)證明是無效的。


                  使用“dd”和binwalk提供的信息來提取固件二進(jìn)制文件的正確部分以進(jìn)行重新打包。


                  有了新的固件二進(jìn)制文件,將使用XI Breakout板和flashrom將固件寫入板上的閃存芯片。重啟設(shè)備后,就可以使用新密碼登錄。


                  分析崩潰


                  通過Wemo上的root訪問,可以在UPnP模糊測(cè)試期間收集有關(guān)崩潰的更多信息。首先,是需要編譯為此特定體系結(jié)構(gòu)執(zhí)行更深入分析所需的工具。使用GPL,首先為設(shè)備編譯了gdbserver和gdb。Wemo有大量已安裝的工具,例如“wget”,這使得添加文件變得簡(jiǎn)單。從/tmp目錄下載并執(zhí)行了這些工具。


                  經(jīng)過大量嘗試后,但無法直接或遠(yuǎn)程使用設(shè)備運(yùn)行g(shù)db。因此,將gdbserver與Interactive Disassembler Pro結(jié)合使用,進(jìn)行所有調(diào)試。連接調(diào)試器后,又發(fā)送導(dǎo)致崩潰的數(shù)據(jù)包并查看崩潰的確切位置。地址0x2AC15B98發(fā)生分段故障。從Linux“proc”目錄的內(nèi)存布局中,可以確定他的內(nèi)存地址位于庫(kù)libUPnPHndlr.so中。

                  2abf3000-2ac4d000 r-xp 00000000 1f:02 82/rom/lib/libUPnPHndlr.so

                  由于崩潰是由UPnP數(shù)據(jù)包引起的,因此在此庫(kù)中查找崩潰是合乎邏輯的。使用基址0x2abf3000,最后計(jì)算出IDA中靜態(tài)分析的偏移量為0x22b98。


                  因?yàn)殚_發(fā)人員將二進(jìn)制文件保留為未剝離狀態(tài),所以可以將此函數(shù)命名為TokenParser。分段錯(cuò)誤發(fā)生在分支指令處;但是,在MIPS中,延遲指令在分支發(fā)生之前執(zhí)行。因此,0x22B9C處的指令導(dǎo)致崩潰。這里,應(yīng)用程序嘗試加載存儲(chǔ)在$ v1中的地址,并將其放在$ v0中。看一下寄存器,還發(fā)現(xiàn)XML標(biāo)簽“EnergyPerUnitCostVersion”中的數(shù)據(jù)包在$ v1中,導(dǎo)致“無效寫訪問”分段錯(cuò)誤。

                  在靜態(tài)分析函數(shù)之后,它似乎將數(shù)據(jù)從一個(gè)部分復(fù)制到另一個(gè)部分,對(duì)于0x7C或“|”字符看三次。如果它永遠(yuǎn)不會(huì)找到“|”,它會(huì)一直復(fù)制到靜態(tài)定義的緩沖區(qū)中。為了完全理解為什么會(huì)發(fā)生覆蓋,逐步完成函數(shù)時(shí)看一下堆棧:



                  當(dāng)函數(shù)將數(shù)據(jù)復(fù)制到堆棧時(shí),它最終會(huì)復(fù)制原始緩沖區(qū)的地址。一旦該地址被覆蓋,該函數(shù)就會(huì)嘗試以新值寫入下一個(gè)字節(jié),在這種情況下是無效地址。這種溢出為攻擊者提供了兩個(gè)可利用的向量:寫入什么地方條件允許攻擊者將數(shù)據(jù)寫入內(nèi)存中的任意位置;通過繼續(xù)覆蓋堆棧上的數(shù)據(jù),攻擊者可以覆蓋$ RA寄存器或返回調(diào)用函數(shù)的地址,從而為攻擊者提供對(duì)執(zhí)行流程的控制。


                  編寫漏洞利用


                  了解了漏洞那怎么利用它呢?因?yàn)檫@是一個(gè)標(biāo)準(zhǔn)的緩沖區(qū)溢出,只需要回答兩個(gè)問題。堆棧上有多少可用空間,是否有任何“壞”字節(jié)無法進(jìn)入堆棧?了解到只有91個(gè)字節(jié)可以寫入堆棧。


                  下一步是確定是否存在任何“壞”字節(jié)。在運(yùn)行一些測(cè)試之后,注意到了只有ASCII字符才能進(jìn)入堆棧。在執(zhí)行易受攻擊的代碼之前,數(shù)據(jù)包由開源XML解析器“mxml”解析。該庫(kù)遵循允許標(biāo)記之間僅存在ASCII和Unicode字符的標(biāo)準(zhǔn)。


                  這個(gè)標(biāo)準(zhǔn)對(duì)于shellcode和面向返回的編程(ROP)技術(shù)都是非常有問題的,因?yàn)閮?nèi)存地址和shellcode都傾向于使用大多數(shù)不可讀的字符。我們可以使用幾種技術(shù)來對(duì)抗堆棧中的房間; 但是,由于對(duì)將通過XML清理過程的字符進(jìn)行嚴(yán)格限制,最好使用已加載到內(nèi)存中的函數(shù)。一種不需要廣泛shellcode的方法是使用“return to libc”攻擊來執(zhí)行系統(tǒng)命令。由于系統(tǒng)調(diào)用通常將字符串作為參數(shù),因此可能會(huì)通過過濾器。因?yàn)閃emo不使用地址空間布局隨機(jī)化,所以如果使用ROP,理論上可以調(diào)用系統(tǒng)而無需通過XML過濾器傳遞額外的shellcode。


                  這仍然是一個(gè)重大挑戰(zhàn):只有包含完全ASCII字符的地址才能通過XML過濾器。這極大地限制了尋找可用小工具的可能性。使用IDA來查看libc和系統(tǒng)加載到內(nèi)存中的位置,并找到了兩個(gè)實(shí)現(xiàn):在地址0x2B0C0FD4的libuClibc-0.9.33.2.so中; 在libpthread-0.9.33.2.so中,地址為0x2AD104F4。但是,這些地址都不符合通過XML過濾器的要求。因此,即使可以創(chuàng)建ROP鏈,也無法僅在數(shù)據(jù)包中發(fā)送系統(tǒng)地址。


                  具有錯(cuò)誤字符的地址不是利用開發(fā)的新問題。最常見的旁路之一是使用加法或減法ROP小工具在寄存器中創(chuàng)建所需的地址并調(diào)用該寄存器。然而,再次,由于XML過濾器,我們面臨著可以將哪些操作數(shù)用于此加法或減法方程的限制。


                  在研究了內(nèi)存布局之后,發(fā)現(xiàn)了libuClibc-0.9.33.2.so位于一個(gè)內(nèi)存位置,其地址可以繞過XML過濾器。很幸運(yùn),這是一個(gè)大型庫(kù),提供了一個(gè)不錯(cuò)的地址列表,因?yàn)樗沁@樣一個(gè)空間中唯一的庫(kù)。使用工具使可用的內(nèi)存地址提取所有可能的ROP小工具,并確定加法或減法公式是否可以僅使用將繞過過濾器的值調(diào)用內(nèi)存中找到的兩個(gè)系統(tǒng)調(diào)用之一。libuClibc-0.9.33.2.so中的系統(tǒng)地址0x2B0C0FD4沒有任何可用的操作數(shù)。但是,0x2AD104F4確實(shí)如此。還發(fā)現(xiàn)了幾個(gè)“防過濾”操作數(shù),當(dāng)加在一起時(shí)等于0x2AD104F4。



                  使用工具輸出來繞過過濾器以構(gòu)建ROP鏈的所有可能的ROP小工具,它使用加法指令為系統(tǒng)創(chuàng)建最終地址并將其存儲(chǔ)在$ s0中。添加后,另一個(gè)小工具將系統(tǒng)地址移動(dòng)到$t9并調(diào)用system。最后一個(gè)小工具還將可以從堆棧控制的地址移動(dòng)到保存系統(tǒng)調(diào)用參數(shù)的寄存器中。整個(gè)ROP鏈只包含三個(gè)小工具,可輕松適應(yīng)緩沖區(qū)溢出提供的堆棧空間。



                  有效載荷 


                  通過發(fā)現(xiàn)可以調(diào)用系統(tǒng)的有效ROP鏈,但必須決定應(yīng)該調(diào)用哪個(gè)系統(tǒng)。因?yàn)橄到y(tǒng)以root身份執(zhí)行,所以是可以完全控制設(shè)備。區(qū)塊鏈安全咨詢公司 曲速未來 研究表明該設(shè)備安裝了許多Linux命令。之前使用wget將gdbserver復(fù)制到設(shè)備。攻擊者還可以從系統(tǒng)調(diào)用wget來下載并執(zhí)行任何腳本。更進(jìn)一步探索了已安裝的應(yīng)用程序并發(fā)現(xiàn)了NetCat,它可能允許攻擊者編寫腳本來創(chuàng)建反向shell。攻擊者可以使用wget下載腳本,并執(zhí)行包含NetCat命令的腳本以創(chuàng)建反向shell。測(cè)試并證明這是一種簡(jiǎn)單有效的方法,以root身份打開反向shell。攻擊者可以選擇許多其他方法來利用此漏洞并執(zhí)行代碼。


                  結(jié)論 


                  諸如CVE-2018-6692之類的發(fā)現(xiàn)強(qiáng)調(diào)了所有設(shè)備上安全編碼實(shí)踐的重要性。從安全角度來看,物聯(lián)網(wǎng)設(shè)備經(jīng)常被忽視;這可能是因?yàn)樵S多用于看似無害的目的,例如簡(jiǎn)單的家庭自動(dòng)化。但是,這些設(shè)備運(yùn)行操作系統(tǒng)并且需要與臺(tái)式計(jì)算機(jī)一樣多的保護(hù)。根據(jù)發(fā)現(xiàn)的漏洞可能成為攻擊者進(jìn)入并破壞整個(gè)業(yè)務(wù)網(wǎng)絡(luò)所需的立足點(diǎn)。


                  區(qū)塊鏈安全咨詢公司 曲速未來 的一個(gè)目標(biāo)是在當(dāng)今復(fù)雜且不斷發(fā)展的環(huán)境中識(shí)別和闡明各種威脅。通過分析和負(fù)責(zé)任的披露,引導(dǎo)產(chǎn)品制造商采取更全面的安全態(tài)勢(shì)。




                  使用 設(shè)備 地址 發(fā)現(xiàn) 系統(tǒng)
                  分享到:

                  1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
                  2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
                  3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。