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 | ► f 0 0x42b6bc uploadfile+844 |
存在任意文件上传的 uri 是 uploadfile.htm,选择上传文件路径和上传文件,点击 Upload File,会调用 setFileUpload。如下是上传文件并保存到 /tmp/test.sh 中。
环境搭建
在 main 函数中可以根据初始化流程来手动创建一些启动需要的文件。初始化流程是:读取相关 pid 文件、解析 SSL Key、从 nvram 中读取 IPAddress、最后根据 IP 和 port 启动 http 服务。SSL Key 解析不是非必要的,用 QEMU 模拟的时候如果报错可以忽略。
那么首先手动创建相关的 pid 文件:
1 | mkdir ./var/run |
然后根据 websStartupServer 启动流程,IP 地址是先从 getSysInfoLong 函数中获取,该函数通过读取 /dev/gpio 设备,仿真条件下没有该设备,读取会失败无法执行。那么手动对函数流程进行 patch,执行完 getSysInfoLong 后 v3 = 0,然后跳转到 inet_ntoa 处执行,就会解析处 IP 地址为 0.0.0.0,然后在本地启动。
1 | int __fastcall websStartupServer(int a1) { |
patch 如下:
服务启动成功:
漏洞复现
然后最终的调试还是在 qemu-system-mipsel 搭建的 debian 虚拟机中进行的,原因如下:
qemu-mipsel-static 的调试不能进入子进程追踪,设置了 set follow-fork-mode child 也不行
qemu-mipsel-static 搭建的 server 上传的文件属性无可执行,如下是使用 kali 搭建的 server 上传文件后的属性
漏洞复现没有什么可说的了,前面已经在漏洞分析过程使用 burpsuite 抓包然后上传文件,调试使用重放就行。
感兴趣的话可以看看 MSF 里面是如何利用该漏洞的,思路就是使用文件上传覆盖掉一些可开机自启的文件,然后实现命令执行。
小结
漏洞原理简单,搭建环境简单,没有什么难度。