固件分析流程
固件分析流程通常包括固件提取、固件分析、文件系统提取、文件系统加载、文件系统分析五项。
固件提取
1.硬件设备提取,个人操作的话,这种需要资金支持
2.官网下载,这种比较直接,去官网下载固件包
固件分析
官网下载固件
https://eu.dlink.com/
先使用binwalk提取
Bin walk GitHub 直接下载
./binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin
从中也可以看出一些信息,比如它的内核版本是linux 2.6.36
查看解压的文件
那么先不着急分析,既然得到了文件系统,可能有源码,也可能存在硬编码,账号信息等等
find . -name "*.conf"
那么就可以依次查看有没有敏感信息之类的。
漏洞分析
D-Link DSL-3782存在命令注入漏洞,该漏洞源于管理页面存在命令注入点。目前没有详细的漏洞细节提供。
搜管理相关的文件吧
find . -name "*manager*"
又因为是命令执行 所以涉及的函数可能是system exec 之类的。
搜索资料,它是在函数 byte_4C0160 处
推荐一个网站,可以将二进制文件全部转化为c语言,缺点就是不完整,他会把一些函数当作16进制数据,也不能跳转分析,
https://dogbolt.org/
直接搜byte_4C0160
那么还是使用IDA进行分析
搜索函数sub_474c78
f5查看伪代码
v0 = system(byte_4C0160); 存在system函数用来执行命令
输入x 获取交叉引用次数,就是谁调用他了
在x86汇编里,add是相加,在mips中 addiu也是加,这个汇编指令就是 v0+byte_xxxx 的值给v2
.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,s2给a0,然后t9 执行sprintf,然后t9 加载pthread_create指令,然后加载函数sub_474C78
查看c代码
f5没反应,在此处按p修复代码块
主要关注28,29行,byte参数由 v9传递,然后再去调用start_routine
如果a1和a2可控,v9就就会被执行,然后就会执行start_routine,start_routine函数又和sub_474C78一样
目的是为了执行sub_474c78函数的功能,这里设置了三个参数,api参数,有三个
tcapi_set("Diagnostics_Entry", "Result", "0");
故参数来自于前端api。
所以这个攻击链大致如下
sub_474c78 中存在system函数,函数的数据是byte_4c0160带入,执行命令
sub_474AC8函数中的byte_4c0160数据由v9传递,v9 由a1,a2控制
a1 a2 由start_routine函数中tcapi_set语句控制
参数再由前端Diagnostics.asp页面中产生的
参考文章:https://www.iotsec-zone.com/article?id=240