漏洞介绍
该漏洞允许远程攻击者通过 urn 执行任意操作系统命令:到 /htdocs/cgibin
中 ssdpcgi()
中的 M-SEARCH 方法,因为 REMOTE_PORT 处理不当。urn: service/device
的值使用 strstr 函数进行检查,该函数允许攻击者连接由 shell 元字符分隔的任意命令。
漏洞影响
D-Link DIR-859 1.05 和 1.06B01 Beta01 设备
漏洞等级
严重
环境搭建
在 kali 中下载 FirmAE
运行仿真固件
-
这个固件是千镜杯赛题,iot 部分下载得到 DIR.zip,解压后得到
DIR859Ax_FW106b01_beta01.bin
-
用 FirmAE 将固件运行起来。
-
用binwalk提取文件系统
模拟攻击
网上已有该漏洞poc,可直接利用。
poc
因为是未授权漏洞,所以可以使用poc直接打
漏洞原理
- 分析exp知漏洞点在
ssdpcgi()
中发现了远程执行代码漏洞,供应商已经创建了一个修补程序来修复该漏洞。使用HTTP_ST为攻击向量。 - ida分析
cgbin
中的ssdpcgi_main
函数。
分析函数后,知道我们需要完成以下步骤来利用此漏洞。 - 必须在 ST 变量中发送值
urn:
,以达到其他条件而不执行返回。 - 检查是否发送了两个字符串
device
或service
中的一个。这样,我们已经可以验证漏洞的存在,因为strstr()
函数允许连接命令。 - 该字符串作为参数发送到
lxmldbc_system()
。
查看堆栈
查看lxmldbc_system()
函数
发现这些字符串未过滤便直接传给了lxmldbc_system
函数并作为参数带入。
因此我们可以控制这些值或将其他值连接到现有值,例如REMOTE_PORT=13;ls
和 SERVER_ID=1;ls
,则这些值使用 vsnprintf() 存储在缓冲区中,以格式化最终命令。
返回后,格式化的命令将存储在记录 s0=buffer
所指向的缓冲区中,该缓冲区将是系统 (s0) 函数的参数。转储(内存)也与结构一样显示。当注入的命令被以字符串的格式引用时。我们便得到了触发了命令注入。
这样,我们只要构造包头为
IP="127.0.0.1"
PORT="1337"
METHOD=”M-SEARCH”
URI="/"
HTTP_ST="urn:device:1;{cmd}"
REMOTE_PORT="13"
SERVER_ID="1"
即可任意命令执行。
解决方案
升级固件至1.06B01 Beta01以上。