1. 前言
近期复现了一款D-Link DIR-830LA1路由器的远程命令执行漏洞,该漏洞由ncc2二进制文件中的DDNS功能引起。由于ncc2服务对输入内容的过滤不够严谨,导致了该漏洞的产生。
2. 影响版本
1 | D-link DIR-810L |
3. 实验环境
1 | Ubuntu 18.04 |
固件下载地址:
1 | https://drivers.softpedia.com/dyn-postdownload.php/5f58803973ccf4f86b4839573996c445/62665f2a/7654b/0/1 |
4. 固件模拟
Github下载FirmAE,按照帮助文档下载即可。
1 | git clone --recursive https://github.com/pr0v3rbs/FirmAE |
运行download.sh脚本的时候有可能会下载不下来,可以手动copy download.sh脚本中的下载链接,手动下载后复制到对应FirmAE/binaries
目录下。
1 | sudo ./run.sh -r 830LA1 ../DIR830LA1_FW100B07.bin |
(ps:第一次模拟某个固件会要很久,多等等就好了)
5. 漏洞分析
使用binwalk
分离DIR830LA1_FW100B07.bin
文件
由于我们已经事先确定是ncc2服务的DDNS功能导致的问题,我们只需在分离出的文件中搜索和DDNS相关的二进制应用即可。
1 | grep -r "ddns" |
copy出ncc2,用IDA 32位打开
根据exp可知,漏洞由ddns中的hostname、username触发,因此可以直接使用IDA的strings搜索功能确定漏洞位置。
双击跟随,F5反编译。在doCheck
函数中调用了get_entry_value_name
获取传递的ddnsHostName、ddnsUsername、ddnsPassword
,同时没有对传入的参数进行校验,从而导致了我们的命令执行漏洞。
get_entry_value_name
主要由两部分组成,将GLOBAL_OFFSET_TABLE
全局变量内存地址中的值加载到寄存器中,然后进行函数的调用来最终实现我们参数的传递。
回到doCheck
继续往下看,对传入的参数进行格式化处理后,调用system函数执行命令。
知道了参数的传入方式,我们继续向上查看doCheck
函数被调用方式。
在callback_ccp_ddns_check
中找到了我们需要的东西。从图中可以看出,想要执行doCheck
函数,ccp_act
传递的值应该为doCheck
。因此我们构造payload的时候,传递的参数要以ccp_act
开始,同时将我们的ddnsHostName、ddnsUsername、ddnsPassword
参数写在payload中,进行执行命令。
6. 漏洞复现
开启模拟器并登陆
打开Burp抓包,构造payload
访问1.html
成功执行ls /
命令
7. POC
构造payload时需要注意,该漏洞需要登陆才可以实现命令执行漏洞,因此在poc中应存在cookie进行认证。
1 | POST /ddns_check.ccp HTTP/1.1 |
发布时间: 2022-08-02
最后更新: 2023-07-21
本文标题: D-Link_DIR-830LA1命令执行漏洞(CVE-2021-45382)
本文链接: https://foxcookie.github.io/2022/08/02/D-Link_DIR-830LA1命令执行漏洞/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!