作者:景琇
提取固件并分析
binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin
查看/usr/etc/init.d/rcS
#Web server
if [ ! -d "/var/boaroot/html/" ] || [ ! -d "/var/boaroot/cgi-bin/" ]; then
/userfs/bin/boa -c /boaroot -d &
/bin/rm -rf /var/boaroot
else
/userfs/bin/boa -c /var/boaroot -d &
fi
说明boa为web server。
定位漏洞点
查询资料,官网说漏洞点出在cfg_manager的byte_4C0160中,使用IDA寻找一下。
进入sub_474c78,v0 = system(byte_4C0160);中使用system进行命令执行。
但是无法判断byte_4C0160是否为用户可控,寻找byte_4C0160的赋值点,查看byte_4C0160的调用。
addiu $s2,$v0,(byte_4c0160-0x4c0000)是MIPS的相加指令,即$s2=$v0+(byte_4c0160-0x4c0000),跟进查看。
.text:00474BD8 addiu $s2, $v0, (byte_4C0160 - 0x4C0000)
.text:00474BDC move $a0, $s2
.text:00474BE0 move $a1, $zero
.text:00474BE4 jalr $t9 ; memset
.text:00474BE8 li $a2, 0x80
.text:00474BEC li $v0, 0x70 # 'p'
.text:00474BF0 beq $s0, $v0, loc_474C58
.text:00474BF4 lw $gp, 0x10($sp)
.text:00474BF8 la $t9, sprintf
.text:00474BFC lui $a1, 0x4A # 'J'
.text:00474C00 move $a0, $s2
.text:00474C04 li $a1, aTracerouteNM10 # "traceroute -n -m 10 -w 2 %s > /tmp/var/"...
.text:00474C08 jalr $t9 ; sprintf
.text:00474C0C move $a2, $s1
.text:00474C10 lw $gp, 0x10($sp)
.text:00474C14
.text:00474C14 loc_474C14: # CODE XREF: .text:00474C70↓j
.text:00474C14 la $t9, pthread_create
.text:00474C18 li $a2, sub_474C78
根据这段汇编,可以看到byte_4c0160传值给了$s2,然后给了$a0,然后调用了sprintf,然后通过pthread_create调用了我们发现调用system函数的sub_474c78。
更多内容请在文末“阅读原文”跳转查看
原文始发于微信公众号(IOTsec Zone):D-Link DSL-3782 代码注入漏洞CVE-2022-34527分析