网络靶场实战-RouterOS漏洞分析(CVE-2022-45315)
本環(huán)境是蛇矛實驗室基于"火天網演攻防演訓靶場"進行搭建,通過火天網演中的環(huán)境構建模塊,可以靈活的對目標網絡進行設計和配置,并且可以快速進行場景搭建和復現(xiàn)驗證工作。火天網演中,內置大量固件設備,包含大型網絡設備及物聯(lián)網設備,可以靈活選取進行測試驗證。
背景
MikroTik RouterOS是一種路由操作系統(tǒng),是基于Linux核心開發(fā),兼容x86 PC的路由軟件,并通過該軟件將標準的PC電腦變成專業(yè)路由器,在軟件的開發(fā)和應用上不斷的更新和發(fā)展,軟件經歷了多次更新和改進,使其功能在不斷增強和完善。特別在無線、認證、策略路由、帶寬控制和防火墻過濾等功能上有著非常突出的功能,其極高的性價比,受到許多網絡人士的青睞。12月初,MikroTik爆出倆個越界訪問高危漏洞,在這一小節(jié)中,我們了解一下MikroTik RouterOS的消息機制,并以CVE-2022-45315為例進行簡單分析。
環(huán)境搭建
????在開始前,從靶場場景中調用MikroTik RouterOS的環(huán)境。具體的本地環(huán)境搭建方式,這里不再贅述。本小節(jié)中RouterOS的調用的測試版本為6.47
????通過靶場拓撲編輯器配置好ip后,我們可以通過ip地址來訪問web管理界面,我們還可以在登錄界面下載winbox進行連接管理,winbox管理操作與webfig相同。
前置基礎
如何ROOT
????默認情況下,MikroTik RouterOS安裝好之后僅支持RouterOS命令,沒有提供任何shell命令來查看系統(tǒng)內部信息和文件信息。對于安全研究人員來說,這種情況下進行漏洞分析無疑是個巨大的挑戰(zhàn),所以我們需要對路由器進行root,進而方便對系統(tǒng)進行操作和調試等等。
????在6.44版本之前,我們可以使用Jacob Baines提供的工具Cleaner Wrasse(https://github.com/tenable/routeros/tree/master/cleaner_wrasse)進行root,該工具利用倆個cve漏洞,給路由器植入了一個"后門"。通過這個工具可以很方便的root。但是在6.44版本之后,官方已經修復了倆個漏洞,所以該方法不再適用。但是好在眾多RouterOS研究人員開發(fā)了新的root方法。眾多方法的開發(fā)原理都是基于開啟"devel"隱藏后門。例如Margin Research團隊提供了新root方法(https://margin.re/2022/06/pulling-mikrotik-into-the-limelight/)和工具(https://github.com/MarginResearch/FOISted),以及其他研究者開發(fā)的方法(https://ufo.stealien.com/2022-06-01/how-to-root-your-routeros-v7-virtual-machine)。
????選擇任意一種方法進行root便可以獲得到shell。此時我們可以查看系統(tǒng)信息和文件系統(tǒng)等等,那么現(xiàn)在我們就可以正常進行安全研究以及測試了。
消息傳遞和處理
????在通過web管理界面和winbox管理界面進行管理路由器時,我們抓包發(fā)現(xiàn)MikroTik RouterOS通信過程被加密。好在我們可以通過一些方法或者工具進行解密(https://github.com/tenable/routeros)。wireshark通信包裹Content-Type頭中的msg意為該請求nova message。
????解密后的nova message有倆種形式,分別為偽json形式和二進制流形式。倆種形式的message傳遞信息的意思是等同的。下面例子中(來自于https://www.youtube.com/watch?v=fkigIlDe6vs),我們可以看到nova message的偽json形式,message中包含了幾個鍵值對,key的高亮色前置符號表示了value的類型。例如小寫的b代表是布爾類型,小寫的s表示是字符串,小寫的u表示是32位的整數(shù)。小寫的m意思是nova message消息本身的類型,同樣類型的大寫表示這是一個數(shù)組消息,例如大寫B(tài)表示布爾類型數(shù)組,大寫M表示nova message數(shù)組,并且在nova message中消息可以相互嵌套。
????這里面key在消息傳遞過程中具有特殊含義,其中比較重要幾個含義為,如ff0001表示sys_to,其意思是該消息要發(fā)送到哪里。ff0002表示sys_from,其意思為該消息是由哪里發(fā)送過來的。而ff0007表示要執(zhí)行的command。
????那么不同的前置符號加上key對應的value同樣具有特殊含義,例如上面例子中Uff0001的value為[13 , 7],其含義為要發(fā)送的地址為一個32位整數(shù)數(shù)組(routeros中通常一個數(shù)組包含2個元素),13和7的意義分別為程序id和handler id。簡明理解一下這個過程,可以類比在一個經典的tcp/ip交互過程中,我們通常需要源地址和目的地址,并且他們都包含了ip和port。那么這里的ip即為程序id,port即為對應的handler id。Uff0002:[70,1]的含義為一條消息從[70,1]發(fā)送出來。類似這倆個例子,其他key對應的value也是一樣,uff0007:0xfe000d中ff0007表示sys_cmd,其對應command的32位整數(shù),根據(jù)上圖對照表中,這里為get函數(shù)。
???那么什么是程序id和handler id呢?在RouterOS中有一個叫/nova/etc/loader/system.x3的二進制文件,里面記錄了所有的程序的信息,該文件同樣是加密過后的。我們可以通過工具進行分析,下圖中展示了所有nova程序對應的程序id。
??? handler id我們需要在對應的程序中找到,例如本小節(jié)中的漏洞程序snmp中,handler id我們可以通過routeros中的工具進行查找,也可以逆向分析nv::Looper::addHandler函數(shù)進行發(fā)現(xiàn),其中handler id有4,5,1,2四個。
????此時我們把上面的信息串聯(lián)起來就組成了程序間消息傳遞機制(IPC,inter-process communication)。以下圖為例,我們簡單了解一下程序間消息傳遞的過程。
????請求過程如圖中藍色部分,假設foo程序要向bar(id為34)程序中的sub(sub為handler,id為50)發(fā)送消息,foo構建好包含SYS_TO:[34,50]和SYS_FROM:[]的nova message,并調用相關函數(shù)將其發(fā)送給loader程序,然后loader程序根據(jù)SYS_TO數(shù)組中value的第一個item將其傳遞給bar程序中,在這個過程中,loader會給foo程序注冊一個隨機id(這里為12)。并且在傳遞消息的過程中,它會刪除SYS_TO消息數(shù)組中的第一個item,并在SYS_FROM數(shù)組中添加foo的程序id。bar程序根據(jù)當前SYS_TO消息數(shù)組中value的第一個item(此時為50),將其轉發(fā)給sub handler。同樣的,這個過程中它會刪除當前SYS_TO消息數(shù)組中的第一個item。sub接收到消息后,發(fā)現(xiàn)SYS_TO為空,便會直接處理消息。
????響應過程如圖中黃色部分,sub處理完消息后進行響應,此時sub會直接翻轉SYS_TO和SYS_FROM的消息數(shù)組value構建nova message,此時SYS_TO:[12]和SYS_FROM:[]。sub將消息發(fā)送給bar程序,隨后bar程序會插入sub的id到SYS_FROM數(shù)組中,并將消息發(fā)送給loader程序,loader根據(jù)SYS_FROM識別出源地址為bar程序,并且根據(jù)SYS_TO識別出目標程序為foo。隨后,loader程序插入bar的程序id到SYS_FROM消息數(shù)組中,并刪除了SYS_TO消息數(shù)組value中的第一個item。處理完畢后將消息發(fā)送給foo程序。foo程序發(fā)現(xiàn)SYS_TO為空,直接進行處理,至此整個消息傳遞過程結束。知道了整個過程后,如果我們想要手動模擬向程序發(fā)送消息,通過使用(https://github.com/tenable/routeros)工具,我們就可以同樣構建出相同的nova message。
????篇幅有限,無法精確描述每一個步驟,所以細節(jié)方面大家可以自行查找資料或者進行逆向分析。現(xiàn)在我們了解了整個消息傳遞的過程后,接下來我們就可以開始漏洞分析了。
漏洞分析
????該漏洞為越界訪問漏洞,漏洞點在Item::regenerateKeys函數(shù)中,漏洞成因是v2變量由參數(shù)傳入為用戶可控,當攻擊者輸入一個精確計算的數(shù)值時,28乘v2變量后加上0x8074B84就變得攻擊者可控。若v2變量為負值,則直接導致后續(xù)指令訪問v3為不可訪問地址,導致程序崩潰。
????用戶可控參數(shù)的賦值情況如下,Item::setConfig函數(shù)通過調用nv::message::get<nv::u32_id>函數(shù),獲取用戶傳進來的32位整數(shù)(函數(shù)中的第2個參數(shù)即為傳入id)。隨后以該值作為參數(shù)傳入漏洞函數(shù)中。
????那么用戶的消息是如何傳進來觸發(fā)的呢?當snmp接收到用戶傳來的消息后,snmp的Looper從SYS_TO的第一個item中識別出了handler的id。并將其發(fā)送給對應handler進行處理。在漏洞觸發(fā)過程中,snmpLooper識別出了handler id為1,隨后將SYS_TO消息數(shù)組value的第一個item去除,并轉給對應handler處理。下圖中hander id為1的instance為CommuityKeep。
????下圖中的off_8073828即為handler 1的vtable。在處理用戶命令消息時,nv::Handler::handle函數(shù)比較傳入命令的value值并調用nv::Handler::handleCmd函數(shù)對用戶傳入command進行處理。經過動態(tài)調試后發(fā)現(xiàn),程序調用了sub_805F386函數(shù)進行相關處理。
????隨后在sub_805F386函數(shù)中,函數(shù)調用了sub_805F2FC函數(shù),該函數(shù)將off_8073220 vtable(Item::setConfig函數(shù)在其中)被傳遞給了a1并作為參數(shù)傳給了vector_base::vector_base函數(shù)。隨后調用了libubox.so庫中的AMap::cmdAddObj函數(shù)對用戶傳入addObj命令進行處理, 該函數(shù)調用了Item::setConfig觸發(fā)了用戶消息value的賦值。隨后便進入Item::regenerateKeys函數(shù)觸發(fā)了漏洞。
????動態(tài)調試過程如下,routeros中啟動gdbserver并attach snmp進程。gdb遠程調試運行后,發(fā)送poc消息。程序斷在了sub_805F386函數(shù),其實此時stack的分布也能看出sub_805F386由AMap::cmdAddObj函數(shù)調用,并且backtrace中的函數(shù)調用和我們的分析相同。
????隨后進入sub_805F2FC函數(shù),運行后觸發(fā)斷點0x806ddfc。
????賦值過程如下,此時eax即為我們傳進來id為20的value數(shù)據(jù)。0x806dec2指令便會將取出數(shù)據(jù)存入(this + 6)地址中。
????進入Item::regenerateKeys函數(shù)后,EDI(28*v2)后將與0x8074B84相加。
????相加后的v3變量如下,在snmp程序中,程序地址為0x8048000-0x809a000,此時EDI的值已經越界。程序下一條指令便是取出[edi+4]的內容,所以程序往下運行便會崩潰。
????程序已經崩潰。在整個漏洞觸發(fā)過程中,(this + 6)地址中值為負值,若為精確數(shù)值,我們便可精確控制Item::regenerateKeys中的v3變量,進行后續(xù)exp利用。
漏洞復現(xiàn)
????routerOS正常運行狀態(tài)下的snmp程序
????運行poc,發(fā)送msg成功后
??? snmp程序崩潰并重啟。
????此漏洞明確可以在routeros中通過rop攻擊調用dlopen函數(shù)打開上傳so庫的方法進行獲得shell,危害較大。
總結
????這一小節(jié),我們簡單了解了MikroTik routerOS的消息傳遞機制,以及學習了越界訪問漏洞的原理。
蛇矛實驗室成立于2020年,致力于安全研究、攻防解決方案、靶場對標場景仿真復現(xiàn)及技戰(zhàn)法設計與輸出等相關方向。團隊核心成員均由從事安全行業(yè)10余年經驗的安全專家組成,團隊目前成員涉及紅藍對抗、滲透測試、逆向破解、病毒分析、工控安全以及免殺等相關領域。
總結
以上是生活随笔為你收集整理的网络靶场实战-RouterOS漏洞分析(CVE-2022-45315)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度路书实现车辆轨迹动态回放功能-jav
- 下一篇: android蓝牙BLE 有源码 有视频