D-Link的命令注入漏洞CVE-2022-26258复现

0x00前言

第一个路由器CVE复现,开始我的路由器挖洞之旅,比较简单

0x01 漏洞信息

  • CVE编号: CVE-2022-26258

  • 漏洞描述:D-Link DIR-820L 1.05B03 was discovered to contain remote command execution (RCE) vulnerability via HTTP POST to get set ccp.

    D-Link DIR-820L 1.05B03 被发现包含通过 HTTP POST 获取设置 ccp 的远程命令执行 (RCE) 漏洞。

  • 设备型号:D-Link DIR-820L

  • 固件版本:1.05B03

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

  • 固件地址:http://www.dlinktw.com.tw/techsupport/download.ashx?file=2663

  • 测试环境:Ubuntu 18.04

根据漏洞描述可得到几个关键词:远程命令执行、/lan.jsp页面、Device Name 参数、HTTP、POST、get set cpp。

0x02前置知识

0x02.0 SOAP

SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。

或者更简单地说:SOAP 是用于访问网络服务的协议

0x02.1 ASP

ASP 文件可包含文本、HTML 标签和脚本。ASP 文件中的脚本可在服务器上执行。

0x03环境搭建

关于环境的搭建,我选择的是firmAE的环境搭建工具,具体的配置在我的另一篇文章里面,这里就不赘述了

将对应的下载好的固件放到./firmwares目录下,然后用下面的命令去跑即可模拟成功,但是第一跑的话模拟会很慢,所以建议多等一会,10-30分钟都可能

1
2
3
4
sudo ./run.sh  -r DIR-820L  ./firmwares/DIR820LA1_FW105B03.bin 
# -r 表示运行模式
# DIR-820L表示对应的设备型号为DIR-820L
# ./firmwares/DIR820LA1_FW105B03.bin 固件的路径

[image-20231215113144547](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

当出现两个ture即是模拟成功

访问一下

[image-20231215113530502](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)成功运行

0x04分析固件

0x04.0 固件解包分析

先用binwalk将该固件解压,然后由CVE描述可以知道涉及,/lan.jsp页面、Device Name 参数、HTTP、POST、get set cpp,这几个关键词

于是我们分析就知道关键的还是lan.jsp,Device Name参数和get set cpp这几个关键

于是先去查看WWW/lan.asp,并找到DeviceName和get set ccp

[image-20231215135629788](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

找到了get_set.ccp的调用,简单分析一下就是这个get_set.cpp是用于处理我们用copyDataToDataModelFormat();函数得到的参数的,简单看一下这函数

[image-20231215135829637](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

可以从这个函数里面看出来就是对输入的数据进行拼接成一个字符串。

其中就有我们的漏洞字符串的lan_device_name,对该字符串的处理就在get_set.ccp中了。

通过lan.asp源码可知在DEVICE_NAME处填入的参数会被拼接到paramStr中,然后函数copyDataToDataModelFormat将paramStr返回为提交参数传给submitParam.arg,传递的URL为get_set.ccp。这里应该是一个POST请求提交数据。现在在文件系统中找一下关键词get_set

1
grep -r "get_set"

[image-20231215140739016](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

很多asp和js文件匹配到了,也有部分二进制问题匹配到了,先看一下二进制的文件,会少一点

[image-20231215140845416](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

可以看到匹配了这些文件

1
2
3
4
匹配到二进制文件 squashfs-root/sbin/ncc2
匹配到二进制文件 squashfs-root/lib/libapmib.so
匹配到二进制文件 squashfs-root/bin/smbd
匹配到二进制文件 squashfs-root/bin/flash
  • bin/smbd程序是Samba服务器的一部分,它允许路由器用户与Windows客户端共享文件和打印机。Samba服务器是一个开源软件,它实现了SMB/CIFS协议,这是Windows操作系统使用的文件和打印机共享协议。bin/smbd程序是Samba服务器的核心组件之一,它提供了文件和打印机共享的功能。
  • bin/flash程序允许用户升级路由器固件,以获取最新的功能和安全补丁。它还可以用于还原路由器的出厂设置,以便在出现问题时恢复路由器的正常运行。
  • sbin/ncc2程序主要用于配置路由器的网络设置和管理路由器的各种功能。通过ncc2程序,用户可以轻松地设置无线网络、防火墙、端口转发等功能,使路由器的使用更加便捷和高效。
  • lib/libapmib.so是D-Link路由器系统中的一个库文件,它包含了许多重要的API和函数,用于实现路由器的各种功能。用户可以通过调用这些API和函数来访问和配置路由器的网络设置、无线网络、防火墙、端口转发等功能。

0x04.1 抓包分析

现在我们还是不知道去分析哪个文件最好,于是我们抓一下包试试,

[image-20231215114406328](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

可以看到这里的数据和我们前面的那个ASP的数据是一样的,于是可以知道那个ASP便是实现了将信息拼接到一起然后POST传参给get_set.ccp这个URL,于是我们看一下和网络有关的那个二进制文件

0x04.2 二进制文件分析

简单分析了一下ncc2文件,发现还是比较复杂的,由网上的wp知道关键代码如下

[image-20231215142857440](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

这里用到DEVICE_NMAE的就是_system这个函数,v4和Obj是同一个,于是上面的hasInjectionString()函数便是对输入进行了判断,然后发现hasInjectionString函数和_system函数都是外部函数,于是去查看一下

1
2
grep -r _system
grep -r hasInjectionString

[image-20231215143351972](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

然后发现两个函数都在squashfs-root/lib/libleopard.so出现过,于是我们分析一下这个文件里面的那些函数

[image-20231215144008899](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

_system函数是将字符串拼接后执行

[image-20231215144224897](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

hasInjectionString根据代码和函数名,判断该函数是用于检测是否有字符串注入的。

也就是说这里会去执行flash set DEVICE_NAME 参数这串代码

通过伪代码可知过滤的字符仅5种,过滤不完全,因此我们可以使用其他字符比如换行(%0a)来注入执行命令。%0a也就是\n

0x05复现漏洞

分析出来可以知道是Device Name存在漏洞,可以有执行效果,于是我们抓包修改对应的名字即可

[image-20231215114223023](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

修改对应字段为

1
lanHostCfg_DeviceName_1.1.1.0=%0atelnetd -l /bin/sh -p 7080 -b 0.0.0.0%0a

含义为:启动一个telnet服务器并在端口7080上监听所有网络接口。该命令可以让远程用户通过telnet协议登录到该服务器并在/bin/sh shell中执行命令。以下是每个选项的解释:

  • telnetd: 启动telnet服务器的程序
  • -l /bin/sh: 指定登录后执行的shell程序为/bin/sh
  • -p 7080: telnet服务器监听的端口号为7080
  • -b 0.0.0.0: telnet服务器监听所有网络接口(IP地址为0.0.0.0)
  • %0a为换行的ASCII码。

[image-20231215114406328](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

使用nc进行连接,即可成功连接

[image-20231215114536516](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

0x06 发现的其他漏洞点

由于是因为字符串过滤不完全导致的命令注入,可以猜想所有HTTP POST且有可能执行的地方都可能存在这个漏洞。在路由后台中发现有一个ping测试页面:

[image-20231215145816347](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

通过抓包改包测试,发现同样存在RCE漏洞,且该漏洞并非存在于CVE所描述的get set ccp而是ping ccp。

在进一步测试中发现直接在ping处输入%0atelnetd -l /bin/sh -p 7080 -b 0.0.0.0%0a即可获得shell:

0x07 复现总结

该漏洞的原因是因为程序对页面参数的过滤不够完整,导致攻击者可以进行绕过,从而达到命令执行的后果

在复现这个漏洞中发现2022年刚披露的信息和2023年有所不同,2022年的描述更具体,2023的变得模糊一些。刚开始以为是为了保护厂商,避免提示太明显容易被利用。后来在复现过程中发现应该是后续被验证漏洞点不仅仅是/lan.jsp页面、Device Name 参数,其他参数也存在同样的漏洞,所以2023的描述范围扩大为HTTP POST 的get set ccp。如果是这样那么现在发现不仅是get set ccp中存在漏洞点,ping ccp中同样存在。顺便提一下,去厂商的网站查了一下漏洞补丁,在补丁中hasInjectionString的过滤内容修改为:

[image-20231215145931796](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

0x08参考链接

https://bbs.kanxue.com/thread-278045.htm#msg_header_h3_2

https://www.cnblogs.com/zhuangzhouQAQ/p/16219690.html

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-26258