type
status
date
slug
summary
tags
category
icon
password
DI-8100是一款D-LINK旗下的上网行为管理认证路由器
下载链接:
作为我入门iot复现的第一个cve,这其中必然还是有一部分是我不熟悉的东西,但还是要写一下这个复现过程,用于记录一下。
以下是对该漏洞的描述
固件分析
我们可以从上面的网站把固件下载一下

这里直接下A1的这个16.07.26A1就行,
下载的内容如下

这个后缀为trx的就是我们要复现的固件,这里我们可以用binwalk这个工具对其就行分析
这里看出这是一个压缩后的文件我们解压一下

之后我们要看这个固件使用的什么架构,这里可以直接看/bin/busybox这个文件的性质从而得出固件的基本信息

这个固件使用的是32位mips小端。并且没有开任何保护。
固件模拟
这里我们可以用firmeAE模拟对大部分固件进行模拟运行
关于使用 FirmAE模拟固件
FirmAE的工作模式分为5种:
-c
检查是否能模拟、-a
漏洞分析、-r
固件模拟的运行、-d
用户级的调试、-b
内核级的调试。其中,
<firmware>
是固件路径,<brand>
是固件的牌子,这个可以随意写。
想这样出现两个true就说明模拟成功,我们可以直接通过访问192.168.0.1

这里初始账号和密码都是admin,
在上面的选项中我们可以选择2,从而直接进入这个固件内部进行分析

此时我们可以来看这个模拟后的启动项都有那些

这里我们重点关注jhttpd这个,说明这个固件的web服程序是通过jhttpd起的。
web启动项
在上面的解包的程序中我们可以看见有一个init的可执行文件,还是个软连接,指向sbin/rc文件

init
文件是 Linux 系统(包括嵌入式 Linux 固件)中最核心的启动脚本或程序之一。它是用户空间(user space)启动的第一个程序,其作用是初始化系统环境并启动所有用户态的服务。
此时我们在看看/etc_ro文件里的inittab文件,这里是用于配置系统初始化过程的一个配置文件
说明程序启动了rcS文件,再继续看rcS文件

在rcS文件里面我们启动了goahead、nvram_daemon和telnetd文件。
但是通过我们的对固件的检索,我们并没有找到goahead和nvram_daemon文件。所以也就是说,这个rcS只是启动了一个telnetd。
在上面的分析我们知到,我们的web服务是jhttpd。但是我们并没有看到这些文件对它进行启动。
我们对这个web服务进行检索一下

我们发现了我们上面分析的rc二进制文件(就是init软连接的这个)
我们再进一步检索这个文件。

我们好像看到了这个文件对“jhttpd”的启动相关的内容。
我们可以对这个二进制文件进行具体的启动逻辑分析
漏洞分析
这里我们根据描述来看我们知道了受影响的函数是msp_info_htm
我们对这个进行检索

那么很明显漏洞在jhttpd这个程序中,我们对其具体分析
以上就是这个固件的具体漏洞函数,这里我们可以分析出来,漏洞点在与
而v10这是由v16复制而来,而程序中要出现这个v16我们就要满足
parm
的值为cmd
,这里才进入到对v10赋值的地方,然后v16的值我们要通过cmd
进行传参,从而到达任意命令执行这里传参的格式如
如果你看见
httpd_get_parm(a1, "xxx")
,就说明你必须使用 GET 参数进行数据传输。- 因为这个函数是专门从 URL 中的 查询字符串 里提取 key-value 参数的。
- 所以你一定要写成:
- 如果你不加
?
,那服务器就不知道你要传参数。完整请求格式是固定的:
- 其中的&用于多个变量与参数的传递间隔
具体流程
这里我们使用
BurpSuite
这个软件进行抓包,这里最好我们直接使用其自带的浏览器进行访问,我们访问
http://192.168.0.1/msp_info.htm
这里就是漏洞地址
然后在软件上打开拦截,抓到这个包,将其发送到repeater中,点开这个页面


此时我们这个发送过去

可以看到其相应的与我们的页面内容一样,
我们就可以用对其进行修改,get传参,首先向用flag传入cmd

可以看到符合上面的预测,由于没有cmd值,显示的为
not cmd
我们就可以加上cmd传参,并加上命令

此时我们使用了
但是并没有直接反馈ls的内容而是
no order,please
,我们可以看一看这是那里的内容
那就是wys文件里的内容,我们在回来看程序
这里我们可以看到v16就是我们传入的ls,于是程序就会先执行
wys ls > /tmp/msp.info 2>&1
,这个命令的作用就是执行 wys
这个文件的 ls
参数,并将执行结果(包括正常输出和错误信息)写入 /tmp/msp.info
文件中。
那这就说明,这串命令
wys %s > /tmp/msp.info 2>&1
已经成功执行了,调用了wys。这里我们进系统查看wys程序,发现他是一个类似busybox的程序,我们在实际利用中,要多注意这种程序。例如可能里面的wget等命令,方便我们后续利用。
这里应该是无回显,我们换个命令执行试试。
这里我们其实就可以在之前的模拟内部

这里其实就可以看到,程序把命令
wys ls > /tmp/msp.info 2>&1
的执行结果放到了/tmp/msp.info
文件,那么/tmp/msp.info
文件就是页面的内容,并且导致了我们的system(ls)
执行没有结果此时我们就可以考虑在ls之前加上一个shell 管道符
|
使其成为wys |ls > /tmp/msp.info 2>&1
这个命令的真实含义是:
把 wys 命令的输出作为 ls 命令的输入,再把 ls 的输出重定向到 /tmp/msp.info。
但注意:
- 这里的
ls
是单独运行的,它并没有接收到wys
的命令行为参数。
- 你只是执行了一个正常的
ls
命令,和wys
没有关系。
- 所以实际执行的是:
这样就可以绕过wys文件直接执行ls
这里可以先测试一下

很好ls的放入了文件中,那我们就可以在软件中进行测试

很明显这里就成功拿到的shell,这里的ls我们就可以进行任意命令替换执行。

这里要执行的是
cat flag
,我们传参就要传cat%20flag
这里的%20在执行时就会被替换为空格' '
。exp
这里虽然比较简单但是还是有比较多要学的知识点的,于是花了不少的时间进行学习才复现出这个cve的。这里还有一个每有学到的点在于如何gdb动调这个程序,这里暂时没有学到,后面还是要补一下。
放两个比较好的文章看看
gdb调试
这里先简单记录一下如何启动,总感觉有的地方不是很明白。
先创建一个文件

这里以为我们是用firmAE模拟的固件所以要使用远程调试进行操作。

这里在模拟成功后选择4,我们要调试的为jhttpd服务,

这样就成功将jhttpd服务附加到gdb-multiarch中,这里的192.168.0.1:1337就是上面程序中的那部分,之后在运行那个文件

然后就可以进行调试了。
- 作者:wgiegie
- 链接:https://tangly1024.com/article/2403ecc9-5160-8096-9e0d-de78401a4b62
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。