将本次给出的文件同样的办法解压,提取后得到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