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

固件分析

 
我们可以从上面的网站把固件下载一下
notion image
这里直接下A1的这个16.07.26A1就行,
 
下载的内容如下
notion image
这个后缀为trx的就是我们要复现的固件,这里我们可以用binwalk这个工具对其就行分析
这里看出这是一个压缩后的文件我们解压一下
notion image
 
之后我们要看这个固件使用的什么架构,这里可以直接看/bin/busybox这个文件的性质从而得出固件的基本信息
notion image
这个固件使用的是32位mips小端。并且没有开任何保护。
 

固件模拟

这里我们可以用firmeAE模拟对大部分固件进行模拟运行
关于使用 FirmAE模拟固件
FirmAE的工作模式分为5种:-c检查是否能模拟、-a漏洞分析、-r固件模拟的运行、-d用户级的调试、-b内核级的调试。
其中,<firmware>是固件路径,<brand>是固件的牌子,这个可以随意写。
notion image
想这样出现两个true就说明模拟成功,我们可以直接通过访问192.168.0.1
notion image
这里初始账号和密码都是admin,
在上面的选项中我们可以选择2,从而直接进入这个固件内部进行分析
notion image
 
此时我们可以来看这个模拟后的启动项都有那些
notion image
 
这里我们重点关注jhttpd这个,说明这个固件的web服程序是通过jhttpd起的。
 

web启动项

在上面的解包的程序中我们可以看见有一个init的可执行文件,还是个软连接,指向sbin/rc文件
notion image
init 文件是 Linux 系统(包括嵌入式 Linux 固件)中最核心的启动脚本或程序之一。它是用户空间(user space)启动的第一个程序,其作用是初始化系统环境并启动所有用户态的服务。 此时我们在看看/etc_ro文件里的inittab文件,这里是用于配置系统初始化过程的一个配置文件
notion image
 
说明程序启动了rcS文件,再继续看rcS文件
notion image
 
在rcS文件里面我们启动了goahead、nvram_daemon和telnetd文件。
但是通过我们的对固件的检索,我们并没有找到goahead和nvram_daemon文件。所以也就是说,这个rcS只是启动了一个telnetd。
在上面的分析我们知到,我们的web服务是jhttpd。但是我们并没有看到这些文件对它进行启动。
我们对这个web服务进行检索一下
 
notion image
 
我们发现了我们上面分析的rc二进制文件(就是init软连接的这个)
我们再进一步检索这个文件。
notion image
 
我们好像看到了这个文件对“jhttpd”的启动相关的内容。
我们可以对这个二进制文件进行具体的启动逻辑分析
 

漏洞分析

这里我们根据描述来看我们知道了受影响的函数是msp_info_htm
我们对这个进行检索
notion image
那么很明显漏洞在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 这里就是漏洞地址
     
    notion image
    然后在软件上打开拦截,抓到这个包,将其发送到repeater中,点开这个页面
    notion image
    notion image
    此时我们这个发送过去
    notion image
    可以看到其相应的与我们的页面内容一样,
    我们就可以用对其进行修改,get传参,首先向用flag传入cmd
    notion image
    可以看到符合上面的预测,由于没有cmd值,显示的为not cmd
    我们就可以加上cmd传参,并加上命令
    notion image
    此时我们使用了
    但是并没有直接反馈ls的内容而是no order,please ,我们可以看一看这是那里的内容
    notion image
    那就是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等命令,方便我们后续利用。 这里应该是无回显,我们换个命令执行试试。
     
    这里我们其实就可以在之前的模拟内部
    notion image
    这里其实就可以看到,程序把命令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
    这里可以先测试一下
    notion image
    很好ls的放入了文件中,那我们就可以在软件中进行测试
    notion image
     
    很明显这里就成功拿到的shell,这里的ls我们就可以进行任意命令替换执行。
    notion image
    这里要执行的是cat flag ,我们传参就要传cat%20flag 这里的%20在执行时就会被替换为空格' '
    exp
     
    这里虽然比较简单但是还是有比较多要学的知识点的,于是花了不少的时间进行学习才复现出这个cve的。这里还有一个每有学到的点在于如何gdb动调这个程序,这里暂时没有学到,后面还是要补一下。
     
    放两个比较好的文章看看
     
     

    gdb调试

    这里先简单记录一下如何启动,总感觉有的地方不是很明白。
     
    先创建一个文件
    notion image
    这里以为我们是用firmAE模拟的固件所以要使用远程调试进行操作。
     
    notion image
    这里在模拟成功后选择4,我们要调试的为jhttpd服务,
    notion image
    这样就成功将jhttpd服务附加到gdb-multiarch中,这里的192.168.0.1:1337就是上面程序中的那部分,之后在运行那个文件
    notion image
    然后就可以进行调试了。
    CVE-2024-39226复现2025能源安全wp
    Loading...