漏洞简介
问题存在于“/cgi-bin/nas_sharing.cgi”脚本中,影响其 HTTP GET 请求处理程序组件。 导致该漏洞(编号为 CVE-2024-3273)的两个主要问题是通过硬编码帐户(用户名:“messagebus”和空密码)造成的后门以及通过“system”参数的命令注入问题。 任何攻击者都可以在设备上远程执行命令。
影响范围
DNS-320L 版本1.11、版本1.03.0904.2013、版本1.01.0702.2013 DNS-325 版本1.01 .DNS-327L 版本1.09,版本1.00.0409.2013
DNS-340L 版本1.08
分析的固件环境
DLINK_DNS-340L_1.08b01(1.01.0502.2018)
复现过程
解包固件
1 | iot@research:~/Desktop$ binwalk -Me '/home/iot/Desktop/DLINK_DNS-340L_1.08b01(1.01.0502.2018)/DLINK_DNS-340L_1.08b01(1.01.0502.2018)' |

找到问题文件在squashfs-root/squashfs-root/cgi/nas-sharing.cgi

分析文件内容
在ida中反编译分析
cgi文件入口通常为cgimain

由于漏洞的关键是后门账户的无授权访问,所以我们可以搜索关键字符串如’passwd’来找到发生漏洞的关键配置位置

代码分析
cgiFormString(“system”, s_2, 4096, v2, s_1[0], s_1[1]);
v3 = system(command)向http请求中获取system参数命令执行
只要能通过账号验证就能直接在http请求中执行system获取更高权限
账户验证中则进行了例外的硬编码账户匹配
sub_1E1CC中
1 | while ( 1 ) |
1 | s2 = (const char *)*((_DWORD *)dbg + 1); // 从dbg+4位置获取字符串 |
结合result = strcmp(s1, s2);if ( !result )程序从dbg中匹配用户名,如果用户名匹配则直接身份认证成功,根据匹配结尾的注释sshd可以知道硬编码用户名可能存在于dbg和sshd之间或者就在两个数据段

测试硬编码用户脚本
1 | #!/bin/sh |

找到并测试成功的用户名为messagebus和sshd
修复方案
移除硬编码账户
输入验证和白名单
更新固件