




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、ARM 程序的漏洞挖掘CodeSafe實驗室 eackAbout me eack 奇安信 CodeSafe實驗室,IoT漏洞挖掘 Xman 2017屆 夏季南京營學(xué)員 2019 補天白帽大會,2019 BCS大會,speaker 2019 補天杯IoT破解大賽 CTF 業(yè)余愛好者,Aurora & De1taCTF中的ARM程序 IoT中的ARM程序目錄ARM基礎(chǔ)知識 ARM簡介搭建ARM PWN環(huán)境ARM程序的漏洞挖掘思路與實踐 ARM匯編詳解安裝gdbserver 因為鏡像版本太舊,官方的更新源中已經(jīng)沒有合適版本的軟件包,解決方法是替換更新源,替換成官方的存檔更新源 nano /etc/a
2、pt/sources.list:然后 apt-get update 更新, apt-get install gdbserver 安裝ARM架構(gòu)版本:https:/en.W/wiki/List_of_ARM_microarchitecturesARM參考手冊:/help/topic/com.arm.doc.dui0068b/index.htmlARM匯編工具:/software/binutils學(xué)習(xí)網(wǎng)站: (樹莓派+qemu)練習(xí)題:/azeria-labs/ARM-challenges /xairy/easy-linux-pwn/電子書:The Definite Guide to ARM Ex
3、ploitation學(xué)習(xí)資料CTF中的ARMARM 32 LSB,statically linked,strippedARM 32NX enabled,No PIE一個簡單的打字游戲,超長的輸入導(dǎo)致棧溢出思路:程序僅開啟了NX,且是靜態(tài)鏈接,可以直接利用 rop 構(gòu)造 system(“/bin/sh”) 。程序在編譯時去除了符號,使用 rizzo、bindiff 等工具恢復(fù)部分符號system:0 x10BA8構(gòu)造ROP0 x00020904 : pop r0, r4, pcpadding 的長度 - cyclicpaddingpaddinggadgets/bin/shjunksystem f
4、rame pointer return addressfor i in range(112, 113): payload = a * i + p32(0 x20904) + p32(0 x6c384) * 2 + p32(0 x110B4)paddingpaddinggadgets/bin/shjunksystem 0 x20904 0 x6c384 0 x100b4ARM 64ARM 32 LSB, dynamically linked,strippedNX enabled,No PIE安裝 aarch64 的匯編器:$ sudo apt search binutils| grep aarc
5、h64$ sudo apt-get install binutils-aarch64-linux-gnu安裝 aarch64 的 libc:$ sudo apt-cache search libc6- | grep arm“$ sudo apt install libc6-arm64-cross首先找到輸入點,首先會通過 read() 將用戶輸入寫入到 unk_411068 所在的bss段,然后再向棧上寫入而在 sub_4007F0 函數(shù)中向棧上寫入時,目標(biāo)緩沖區(qū) v1 是一個 int64 類型的變量,在棧上僅分配 8 bytes 的內(nèi)存空間,而通過 read 向這塊內(nèi)存寫入了 512 byt
6、es,明顯會導(dǎo)致棧溢出:程序開啟了 NX,常規(guī)思路是 ROP,在 plt 表中尋找可以覆蓋的函數(shù):int mprotect (const void *start, size_t len, int port)把從 start 開始的,長度為 len 的內(nèi)存區(qū)的保護屬性修改為 port 指定的值:PROT_READ:表示內(nèi)存段內(nèi)的內(nèi)容可寫PROT_WRITE:表示內(nèi)存段的內(nèi)容可讀PROT_EXEC:表示內(nèi)存段中的內(nèi)容可執(zhí)行PROT_NONE:便是內(nèi)存段中的內(nèi)容無法訪問需要注意,指定的內(nèi)存區(qū)間必須包含整個內(nèi)存頁(4K),區(qū)間開始的地址 start 必須是一個內(nèi)存頁的起始地址,并且區(qū)間長度 len 必
7、須是頁大小的整數(shù)倍利用:1、通過第一個 read 操作向 bss 段中寫入 shellcode(不可執(zhí)行)2、通過第二次 read 操作溢出構(gòu)造 rop 鏈,調(diào)用 mprotect 設(shè)置可執(zhí)行3、通過 rop 跳轉(zhuǎn)到 bss 段執(zhí)行 shellcode簡單的 gadget 工具:objdump、ROPEME、Ropper、ROPgadget、rp+在這個程序中,涉及到 aarch64 傳參的方式,需要控制三個參數(shù) x0、x1、x2,程序本身的函數(shù)中找不到可用 rop 鏈,而我們也不知道目標(biāo)服務(wù)器上 libc.so 的版本,所以我們采用通用 gadget,這種技術(shù)也叫 ret2csu通常,在調(diào)用
8、了 libc.so 的程序中,都會用到 _libc_csu_init() 這個函數(shù)來對libc進行初始化通用Gadget:X29X30X19X20X21X22 mprotectplt X1 X2X23X240X30 X0 loc_4008ACret到loc_4008CC后布局棧,然后ret到X30寄存器的值即loc_4008AC,然后call mprotect(0 x411000, 0 x1000, 5),然后判斷X19和X20是否相等,因為我們提前布置好了所以會繼續(xù)往下執(zhí)行到ret,返回到shellcode處qemu-user模式模擬:$ sudo qemu-aarch64 -g 1234
9、-L /usr/aarch64-linux-gnu ./baby_arm-g 參數(shù):在本地開啟指定調(diào)試端口-L 參數(shù):指向程序依賴的共享庫pwndbg遠程連接端口調(diào)試:$ gdb-multiarch ./baby_armpwndbg target remote :1234.下斷點pwndbg continueIOT中的ARMTenda AC15路由器ARM 32 LSB,dynamically linked,strippedNX enabled固件分析maininitWebswebsOpenServerwebsUrlHandlerDefineR7WebsSecurityHandlerwebsF
10、ormHandlerListening request websOpenListenwebsAcceptwebs_Tenda_CGI_BIN_HandlerwebsDefaultHandler/goform /cgi-binwebsGetInputwebsParseRequestwebsUrlHandlerRequestwebsUrlHandlerParse authorization Set request handlerCall request handlerCall backConnectCfm設(shè)置服務(wù)的基礎(chǔ)配置開始監(jiān)聽用戶請求,設(shè)置對應(yīng)的處理函數(shù)backinitWebswebsUrlH
11、andlerDefinewebsUrlHandlerDefine(“”, 0, 0, R7WebsSecurityHandler, 1);backbackwebsUrlHandlerRequestsscanf 函數(shù)從用戶請求 Cookie 中,格式化獲取 password 參數(shù)值,并寫入到固定長度為 0 x80 的緩沖區(qū) pcookie中,未控制可寫入大小,導(dǎo)致棧溢出R7WebsSecurityHandlerint sscanf(const char *str, const char *format, mixed var1, mixed var2.)str:源字符串,函數(shù)檢索數(shù)據(jù)的源forma
12、t:格式化 %*widthh|l|I64|Ltype| | t|n|非%符號varn:目標(biāo)緩沖區(qū)sscanf 函數(shù)和 scanf 函數(shù)類似,都是用于輸入,但后者是以 stdin 為輸入源,前者是以固定字符串為輸入源“%*=” 從數(shù)據(jù)源截取“=”之后的字符串“%;*” 從數(shù)據(jù)源截取“;”之前的字符串“%*=%;*” 合起來,就是截取“=”和“s”之間的字符串,即password的值sscanf 函數(shù)url 的值不能為空url 不能為“/” ,或長度不超過 1url 不能是上面的任意一個路徑或請求滿足上面的條件進入到 if 執(zhí)行,url 不能為“/index.html”構(gòu)造POCGET /gofo
13、rm/execCommand HTTP/1.1Host: x.x.x.xUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1Cookie: password=“A”*501sudo chroot . ./qemu-arm-static -g 1234
14、./bin/httpdqemu-user模擬Patch啟動 qemu 虛擬機scp 上傳本地提取的文件系統(tǒng)到虛擬機chroot 運行程序(添加br0繞過check_network)進程附加到 gdbserverqemu-system模擬gdb調(diào)試gdb-multiarch /httpd_patchtarget remote :在調(diào)用 sscanf 處 0 x2dd44 下斷點發(fā)送 payload程序最后崩潰在websRedirectOpCookie()函數(shù)中,因為讀取到了非法地址ASLR = 0, NX enabled利用:ROPsystem_libc_offset = 0 x5A270lib
15、c_base_addr = puts_addr - puts_libc_offset = 0 xf65e5000ROPgadget -binary libc.so.0 -only “pop”ROPgadget -binary libc.so.0 | grep “mov”查找 gadgets:總體思路:先將system pop到r3,再將 sp中的cmd參數(shù)放到r0 paddingpop r3, pcsystemmov r0, sp; blx r3cmdPC SP 1. 覆蓋RET地址paddingpop r3, pcsystemmov r0, sp; blx r3cmdPC SP 2. pop
16、 sp to r3r3 = addr_systempaddingpop r3, pcsystemmov r0, sp; blx r3cmdPC SP 3. pop sp to cppc = addr_mov r0,sp;blx r3paddingpop r3, pcsystemmov r0, sp; blx r3cmdPC SP 4. mov sp to r0r0 = cmd5. blx r3 system(cmd)棧布局如下sudo chroot ./qemu-arm-static strace g 1234 ./httpd_patchgdb下可以看到 pc blx r3 和 r3、r0 的
17、值A(chǔ)SLR = 1, NX enabled利用:ROP + 暴破libc基址觀察libc基址變化位數(shù),多此查看預(yù)估變化的大概范圍注意,qemu-user模式下,httpd單進程無法暴破,進程每重啟一次,libc就會發(fā)生改變ARM 32 LSB,dynamically linked,strippedNX enabled,randomize_va_space = 1 Huawei 某路由器main函非常簡單明了,主要依次執(zhí)行了這幾個函數(shù):固件分析etm_init_envetm_initializeetm_configureetm_startfprintf(stderr,fail_format,va
18、r) 初始化環(huán)境變量初始化http路由設(shè)置配置文件,etm.ini、etm_cfg啟動服務(wù)打印錯誤信息failfailfailfail通過 http_request_parse 處理用戶請求etm_startparse_server_addr(const char *)etm_system_info66, &v12, &v14);lc_start(int)&v12, v14); / 啟動服務(wù)license_start(); / 監(jiān)聽用戶請求服務(wù)的交互rc_start(&remote_ctrl);http_request_handler 主要是做一些http數(shù)據(jù)的處理http_request_p
19、arse大致的邏輯: 第一處漏洞在處理login請求的函數(shù)http_request_login中snprintf 信息泄露 混淆了 snprintf 和 sprintf 的返回值 Sprintf 的返回值是最終格式化 buf 的 size,但 snprintf 有點不同,他返回的打印字符數(shù),是在假設(shè)沒有第二個參數(shù) size 限制的情況下統(tǒng)計的 而在程序流走向的 LAB_000a7964 中 程序?qū)?snprintf 的返回值當(dāng)作 HTTP 響應(yīng)包的實際長度傳入 em_comm_send 函數(shù)中 但事實上,HTTP響應(yīng)包的實際長度會受到 snprintf 的第二個參數(shù) 0 x100 的限制,而
20、snprintf 返回的這個值是不受這個限制統(tǒng)計的 最終,這個 size 會被傳入到 em_socket_send 函數(shù)中,作為 buf 的長度,在堆上分配一塊過大的(超過0 x100)內(nèi)存空間,從而可以泄露出堆上的數(shù)據(jù) 而這部分泄露的數(shù)據(jù)中包含了 libc 上的地址,可以在接收到的返回報文中看到這個 _malloc_state 是 libc 中 bss 段上的一個全局變量:泄露出的 _malloc_state+52 的真實地址 bss 段上 _malloc_state+52 的 libc 偏移地址 = libc 基址 第二處漏洞同樣是在處理 login 的這部分代碼中,是在解析用戶 logi
21、n 請求時,會將 cookie 中的一些參數(shù)值保存到 etm.ini 配置文件中 通過 http_get_cookie_item 函數(shù)獲取到 cookie 中的 usernick 和 jumpkey 參數(shù)的值 然后通過 set_huiyuan_info 和set_huiyuan_check_info 將其保存至 etm_cfg 中,最終,setting_flush 函數(shù)將 etm_cfg 指針指向的數(shù)據(jù)按 ini 格式寫入到 etm.ini 文件ini 配置文件注入 具體來看他保存的方式,沒有做任何特殊字符的過濾,直接遍歷 etm_cfg 指針,按每行拼接的方式寫入到配置文件 ini 是一種初
22、始化配置文件的格式,有多個 Section 組成,每個 Section 中又包含了多個鍵值對,鍵值對之間通過換行符進行分隔。 此時,寫入到 ini 文件中的鍵值是我們可控的,那么如果我們輸入換行符,將會注入一段新的鍵值對或者 Section,舉個例子:正常情況下,cookie = “isvip=0; jumpkey=A; usernick=B; userid=1”ini配置文件中的內(nèi)容:注入后,cookie=isvip=0; jumpkey=Annlicensenserver_addr=; usernick=B; userid=1ini配置文件中的內(nèi)容:第三處漏洞在 license_start
23、 函數(shù)中,這個函數(shù)由 http_request_parse 調(diào)用:這個函數(shù)調(diào)用了 parse_server_addr 來解析 etm.ini 中的 server_addr 但這里的兩個拷貝函數(shù)都存在溢出的問題。 首先,memcpy 的拷貝長度是由 a1的輸入決定的,與目標(biāo)緩沖區(qū) v4d的大小沒有限制關(guān)系 其次,strcpy 的兩個參數(shù)都沒有做長度的限制,其中,a1是從 ini 中讀取的 server_addr,a2 是上層函數(shù)中棧上的一個內(nèi)存地址strcpy 棧溢出 把默認(rèn)的配置文件改掉后,怎么讓程序去重新解析他呢?因為ini配置文件在etm程序運行之初就得到了解析(mian 函數(shù)中的 etm
24、_configure()) etm服務(wù)還存在一處未授權(quán)接口 stophunter ,可以重置服務(wù) 當(dāng)我們訪問 /stophunter 后服務(wù)被重置,etm_monitor.sh 腳本檢測到 bin/etm 進程的停止,會重啟進程,然后加載被我們注入過的 ini 配置文件,然后觸發(fā)棧溢出qemu-user 模擬運行:$ sudo cp $(which qemu-arm-static) .$ sudo chroot . ./qemu-arm-static -g 1234 ./bin/etm -system_path=/etc -disk_cfg=/etc/thunder_mounts.cfg -etm_cfg=/etc/etm.ini -log_cfg=/etc/log.ini -pid_file=/etc/xunlei.pid -license=1411260001000003p000624lcubiwszdi3fs2og66qgdb調(diào)試:$ gdb-mul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同范本咨詢電話
- 小門店合伙合同范本
- 廠房柱子出售合同范本
- 半掛車購車合同范本
- 合伙健身創(chuàng)業(yè)合同范本
- 辦公供貨合同范本
- 產(chǎn)后修復(fù)項目合同范本
- 凈化車間保養(yǎng)合同范本
- 合同范本 logo位置
- 合同范本編制能力
- 兆歐表的使用課稿
- 自然辯證法概論-第4章(2018新大綱)
- 第四課探索認(rèn)識的奧秘(導(dǎo)學(xué)案)- 高中政治統(tǒng)編版必修四 哲學(xué)與文化
- 讀書分享小巴掌童話PPT
- 正常人體結(jié)構(gòu)題庫(含答案)
- 液氨儲罐安全操作規(guī)程
- 郵輪面試英語PPT完整全套教學(xué)課件
- 保險銷售代理人個人月工作計劃
- 現(xiàn)代文學(xué)-《為奴隸的母親》課件
- 站內(nèi)軌道電路電碼化課件2
- 破碎機械設(shè)備
評論
0/150
提交評論