dir-859远程命令执行漏洞

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dir-859远程命令执行漏洞相关的知识,希望对你有一定的参考价值。

将本次给出的文件同样的办法解压,提取后得到bin文件,将其放入firmayne根目录
输入下图的命令提取文件系统,-b后面指定的内容可以随意,-nk后面是bin文件的名称
在这里插入图片描述

然后获取架构信息并保存在数据库中,注意上图的tag为4,大家在操作时要注意自己机器上上条命令的结果
在这里插入图片描述

制作镜像文件生成文件系统
在这里插入图片描述

自动生成配置,仿真网卡信息
在这里插入图片描述

运行固件
在这里插入图片描述

打开浏览器(可能需要稍等一会儿)
在这里插入图片描述

至此说明环境模拟成功

接下来切换到win上,使用ghidra进行分析
注意ghidra需要的是jdk11,下载后默认安装即可
来到ghidra文件夹
双击bat文件
在这里插入图片描述

首先file->new project创建一个新工程,然后导入文件
在这里插入图片描述

接着双击进入即可
在这里插入图片描述

在右侧搜索genacgi_main
在这里插入图片描述

中间是汇编,右侧显示的就是genacgi_main的伪代码
在伪代码的窗口往下翻
在这里插入图片描述

这里注意到请求的uri形式为?service=这样子的,继续往下走
在这里插入图片描述

注意到调用了很多次getenv来获取环境变量
这意味着如果我们需要调试的话,需要在终端通过export设置环境变量
继续往下
在这里插入图片描述

看到危险函数sprintf了,这里它设置了一个包含所有值的缓冲区acStacck552,这是重点分析的地方。可以看出,sprintf()用于连接多个变量的值,填充这个缓冲区,设置要传递的新变量,其中SHELL_FILE将以格式%s_%d.sh进行传递,主要用于为新的shell脚本命名
之后是调用xmldbc_ephp
跟入xmldbc_ephp,双击即可
在这里插入图片描述

调用了FUN_0041420c
在这里插入图片描述

跟入FUN_0041372c
在这里插入图片描述

这里的关键是调用了connect
跟入FUN_00413810
在这里插入图片描述

可以看到是调用了send
也就是说spinrtf之后通过xmldbc ephp()将acStack552这个缓冲区中包含的数据发送到php。
根据前面在sprintf处伪码中看到的,缓冲区中的数据经过xmldbc_ephp处理后,由php文件run.NOTIFY.php进行处理
也就是说缓冲区的数据走向是这样子的:acStack552->xmldbc_ephp->FUN_0041420c-> FUN_0041372c(connect)-> FUN_00413810(send)-》run.NOTIFY.php
找到该文件
在这里插入图片描述

查看内容
在这里插入图片描述

前面提到设置环境变量,如果REQUEST_METHOD设置为SUBSCRIBE,则会调用GENA_subscribe_new,并传递cgibin程序中genacgi_main()函数获得的变量,还包括变量SHELL_FILE
在这里插入图片描述

GENA_subscribe_new()定义在 gena.php:
在这里插入图片描述

在其中定位到GENA_subscribe_new
在这里插入图片描述

注意到GENA_subscribe_new传递 $shell_file 到 GENA_notify_init函数,也是shell_file最终被处理的地方
同样在该文件下定位到GENA_notify_init
在这里插入图片描述

上图标出了涉及shell_file的位置
看到调用了fwrite()创建新文件,该函数被调用了两次
第一次调用fwrite时,创建文件,shell_file的组成回到cgibin文件可以看到
在这里插入图片描述

其值由local_220,_var4组成,_var4是getpid()的返回值,而local_220是我们可控的
也就是说,从我们控制的SHELL_FILE变量中取其名称,并连接getpid()的返回值
那么请求的uri应该是这样子的:http://IP:PORT/*?service=file_name
第二次调用fwrite()向文件中添加删除命令"rm -f ".KaTeX parse error: Undefined control sequence: \\n at position 13: shell_file."\\̲n̲" 这里就是漏洞触发点:进行攻…command`),将其注入。在脚本执行 rm 命令时因遇到反引号而失败,继续执行引号里面的系统命令,从而达到远程命令执行漏洞的触发。
所以,只要控制好 "/gena.cgi?service=shell_file"中 shell_file的内容为反引号包裹的系统命令,就可以触发漏洞

接下来漏洞利用的时候我们尝试开启telnet服务
完整的exp在1.py
在这里插入图片描述

在模拟攻击前,我们先nmap扫一下
在这里插入图片描述

可以看到,此时还没有开启telnet
接下来运行脚本
在这里插入图片描述

输入ip
然后再扫一遍
在这里插入图片描述

此时看到telnet开放了
我们就可以telner连上去,拿到shell
在这里插入图片描述

参考:
1.https://medium.com/@s1kr10s/d-link-dir-859-rce-unautenticated-cve-2019-17621-en-d94b47a15104

以上是关于dir-859远程命令执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章

远程漏洞远程代码执行漏洞的二三事

远程代码执行漏洞是啥意思

struts2远程命令执行漏洞S2-045

openssh 远程代码执行漏洞 怎么解决

华为路由器远程命令执行漏洞复现(CVE-2017-17215)

华为路由器远程命令执行漏洞复现(CVE-2017-17215)