命令注入漏洞CVE-2023-27216复现

命令注入漏洞CVE-2023-27216复现

伯爵的信仰 看雪学苑 2023-08-24 17:59

◆CVE编号:CVE-2023-27216

◆漏洞描述:An issue found in D-Link DSL-3782 v.1.03 allows remote authenticated users to execute arbitrary code as root via the network settings page.

◆设备型号:D-Link DSL-3782

◆固件版本:DSL-3782_A1_EU_1.01

◆厂商官网:
http://www.dlink.com.cn/

◆固件地址:
https://media.dlink.eu/support/products/dsl/dsl-3782/driver_software/dsl-3782_a1_eu_1.01_07282016.zip

固件解包:

模拟固件:


通过查看DSL-3782的官方文档可知默认密码为:admin

根据漏洞描述披露的信息:在网络设置页面有一个需要认证的命令执行,并且是root权限。那么直接固件模拟,看一下网络设置页面的信息:

尝试更改一下其中数据,并点击Save,此时burpsuite抓到的数据包内容为:

根据数据包内容可知Save的数据提交到了/cgi-bin/New_GUI/Set/Network.asp
,在文件系统中查找该文件并查看其内容:

由文件内容和数据包的内容可知:网页输入的Router IP Address、Subnet Mask
的内容会分别被作为lan_ip1、lan_netmask1
的值POST到/cgi-bin/New_GUI/Set/Network.asp
。在Network.asp
中将Lan_Entry0
中IP、netmask
的值分别设定为lan_ip1、lan_netmask1
,即用户传入的Router IP Address、Subnet Mask
内容最终会传递到Lan_Entry0
的IP、netmask
中。此时查找一下含Lan_Entry0
的文件:

结合查找到的内容和之前分析CVE-2022-34527的信息可知漏洞点应该是在userfs/bin/cfg_manager
中。将该文件拿到IDA中分析并结合关键词IP、netmask
定位到关键代码并进行分析,在分析过程中会遇到字符串解析不正确和函数不识别问题,需要手动修复。修复方式:

◆字符串:在显示不正确的起始地址处按下U(Undefine),然后按下A。

◆函数:在函数起始地址处按下P。

通过上面代码可知:cfg_manager向/etc/lanconfig.sh
文件中写入了可被前端控制的输入信息:IP(Router IP Address)、netmask(Subnet Mask),并将该文件设定为可读可写可执行。通过查看该文件的引用发现最终该文件会被system
执行,并且为root权限。

现在我们已经知道了从mxmlFindElement
函数获取到Entry0
,再使用mxmlElementGetAttr
函数获取IP或netmask的值到写入/etc/lanconfig.sh
的过程中不存在对输入内容的检查。从mxmlFindElement
和mxmlElementGetAttr
这两个函数名称可知是从一个xml文件中获取的数据。现在还需要确认从/cgi-bin/New_GUI/Set/Network.asp
提交到写入xml文件这一过程中是否存在输入检查。通过分析找到该文件:

现在验证一下自定义的输入能否原封不动的写入到该文件中,使用FirmAE调试模式模拟固件,更改数据包发送后,用其提供的shell辅助查看/tmp/var/romfile.cfg
文件中内容:

可以看到此时IP的内容即为更改的数据。顺便查看一下此时/etc/lanconfig.sh
文件内容:

到这里整个漏洞分析算是基本完成了,大致的流程是:用户输入的数据被POST到/cgi-bin/New_GUI/Set/Network.asp
,通过TCWebApi_Set将数据保存到Lan_Entry中,然后传递到cfg-manager,cfg-manager将其保存到/tmp/var/romfile.cfg
文件中,最后通过mxmlElementGetAttr
获取数据将其写入文件/etc/lanconfig.sh
,最终被system
执行。

在查看数据包时发现POST的数据是需要session的,因此选择使用Intercept on拦截数据包修改后发送。修改后POST的数据为:

使用nc连接成功,取得shell。

执行poc后,使用成功取得shell:

命令注入漏洞通常造成的原因相同:没有对前端输入数据检测或者检测不充分。这个命令注入漏洞和之前复现的几个略微不同的地方在于前端输入的数据最后是写到一个脚本文件中,通过给该文件添加执行权限,最终被system函数执行。

参考文章


https://github.com/FzBacon/CVE-2023-27216_D-Link_DSL-3782_Router_command_injection/blob/master/CVE-2023-27216_D-Link_DSL-3782_Router_command_injection.md

看雪ID:伯爵的信仰

https://bbs.kanxue.com/user-home-882513.htm

*本文为看雪论坛优秀文章,由 伯爵的信仰 原创,转载请注明来自看雪社区

#往期推荐

1、在 Windows下搭建LLVM 使用环境

2、深入学习smali语法

3、安卓加固脱壳分享

4、Flutter 逆向初探

5、一个简单实践理解栈空间转移

6、记一次某盾手游加固的脱壳与修复

球分享

球点赞

球在看