OneShell

I fight for a brighter tomorrow

0%

CVE-2015-2049 Dlink 93XL任意文件上传

CVE-2015-2049 Dlink 93XL 任意文件上传

漏洞分析

CVE-2015-2049 是发生在设备 Dlink 931L 上 1.04 版本的任意文件上传漏洞,漏洞允许通过认证的用户上传一个可执行脚本到指定目录,如果将目录设置到系统目录中,就会覆盖掉原有的系统文件,进而实现代码执行。该固件版本还被用于其他 Dlink 93X 系列 IP 摄像头,因此其他也可能存在此漏洞。

此次漏洞复现采用的固件是 Dlink 931l 1.04 版本固件,固件下载地址见参考链接。

存在漏洞的程序依旧是后端服务器 alphapd,通过分析 exploit.db 上的 exp,可以得到大概原理。
漏洞函数调用链通过调试如下,大概的流程就是保存文件并通过格式化字符串,然后通过 system 函数更改文件权限为 a+rwx。

1
2
3
4
5
6
7
8
► f 0 0x42b6bc uploadfile+844
f 1 0x42ce94 websCgibinProcessor+1724
f 2 0x41573c websUrlProcessRequest+428
f 3 0x409a34 websReadEvent+920
f 4 0x40af24 websSocketEvent+140
f 5 0x4137f4 websSocketEventProcess+680
f 6 0x406df0 httpd_main+232
f 7 0x407620 main+772

存在任意文件上传的 uri 是 uploadfile.htm,选择上传文件路径和上传文件,点击 Upload File,会调用 setFileUpload。如下是上传文件并保存到 /tmp/test.sh 中。
undifined
undifined
undifined

环境搭建

在 main 函数中可以根据初始化流程来手动创建一些启动需要的文件。初始化流程是:读取相关 pid 文件、解析 SSL Key、从 nvram 中读取 IPAddress、最后根据 IP 和 port 启动 http 服务。SSL Key 解析不是非必要的,用 QEMU 模拟的时候如果报错可以忽略。

那么首先手动创建相关的 pid 文件:

1
2
3
4
5
mkdir ./var/run
# 创建 alphapd pid 文件
touch ./var/run/alphapd.pid
# 创建 nvramd pid 文件
touch ./var/run/nvramd.pid

然后根据 websStartupServer 启动流程,IP 地址是先从 getSysInfoLong 函数中获取,该函数通过读取 /dev/gpio 设备,仿真条件下没有该设备,读取会失败无法执行。那么手动对函数流程进行 patch,执行完 getSysInfoLong 后 v3 = 0,然后跳转到 inet_ntoa 处执行,就会解析处 IP 地址为 0.0.0.0,然后在本地启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int __fastcall websStartupServer(int a1) {
...
v3 = getSysInfoLong(30);
if ( !v3
&& (v4 = (const char *)nvram_bufget(0, "IPAddress"),
trace(0, "Can't get lan ip from sysinfo!\n"),
v3 = inet_addr(v4),
v3 == -1) )
{
trace(0, "failed to convert %s to binary ip data", v4);
result = -1;
}
else
{
v5 = inet_ntoa(v3);
...
result = websOpenListen(a1);
}
return result;
}

patch 如下:
undifined
服务启动成功:
undifined
undifined

漏洞复现

然后最终的调试还是在 qemu-system-mipsel 搭建的 debian 虚拟机中进行的,原因如下:

  1. qemu-mipsel-static 的调试不能进入子进程追踪,设置了 set follow-fork-mode child 也不行

  2. qemu-mipsel-static 搭建的 server 上传的文件属性无可执行,如下是使用 kali 搭建的 server 上传文件后的属性

undifined
漏洞复现没有什么可说的了,前面已经在漏洞分析过程使用 burpsuite 抓包然后上传文件,调试使用重放就行。
感兴趣的话可以看看 MSF 里面是如何利用该漏洞的,思路就是使用文件上传覆盖掉一些可开机自启的文件,然后实现命令执行。

小结

漏洞原理简单,搭建环境简单,没有什么难度。

参考链接