Nginx解析漏洞复现以及哥斯拉连接Webshell实践
目录
- 1. 环境
- 2. 过程
- 2.1 vulhub镜像拉取
- 2.2 漏洞利用
- 2.3 webshell上传
- 2.4 哥斯拉Webshell连接
- 3. 原理分析
- 4. 踩坑
- 4.1 Webshell连接不上
1. 环境
kali linux
docker+vulhub
nginx(1.19.6)+php(7.4.15)
2. 过程
2.1 vulhub镜像拉取
vulhub安装的话去官网上有安装教程
https://vulhub.org/
安装好之后进入到对应的目录下
运行docker-compose up -d
完成之后docker ps -a
可以查看容器信息
2.2 漏洞利用
正常访问80端口,是一个文件上传点,后面webshell就可以走这里上传
再去看看官网给出的示例,访问http://192.168.197.128/uploadfiles/nginx.png
使用Burpsuite抓包看看返回值,发现图片后加了一句phpinfo
访问http://192.168.197.128/uploadfiles/nginx.png/.php
添加/.php后会被解析成php文件,漏洞的成因下面会说,到这里的话vulhub官网上的漏洞已经复现完成了,下面的内容主要是使用哥斯拉连接Webshell。
2.3 webshell上传
哥斯拉地址:https://github.com/BeichenDream/Godzilla/releases/tag/v1.00-godzilla
这里就不多介绍了,主要功能就是生成Webshell,连接Webshell(废话),流量加密通信,以及后续的Shell管理。
点击管理-生成就可以生成Shell,密码的话就是通信时候的参数名称,密钥的话就是加密通信的密钥,这两个参数可以自定义,需要记好,后续连接webshell时需要提供。有效载荷的话就选择PHP。
输个文件名选择目录就可以生成了
生成结果如下
查看Webshell内容
Webshell生成好了之后下面就是上传了
①首先直接修改文件后缀上传
上传失败,后缀与MIME的值都没用
②制作图片
既然后缀与MIME都不管用,那应该就是校验的文件头(既然存在解析漏洞,其他的各种绕过就不去试了),直接做一个图片木马
生成图片内容如下
直接上传图片,返回路径
2.4 哥斯拉Webshell连接
点击目标-添加,把之前的配置再输一遍就行,注意url这里填的的存在解析漏洞的路径,也就是/.php,这里使用http代理,走8080端口,这样就可以用Burpsuite抓包了。
配置完之后右键点击进入,就连上了(实际情况在这里猛踩坑)
成功界面如下
到这里的话流程就走完了,拿到了Webshell,下一步就开始提权了,那就是另外的一回事了。
3. 原理分析
这一漏洞是因为Nginx中php配置不当造成的,与Nginx版本无关
①cgi.fix_pathinfo=1
这个参数值为1,表示开启,即当解析遇到不存在的路径时,就会去掉该项,继续依次解析,所以当aaa.jpg/.php
被解析时,便会去掉/.php
,继续解析aaa.jpg
。
②security.limit_extensions = .php .jpg
这个参数限制了可执行文件的后缀,默认只允许执行.php文件,配置不当的话就会执行jpg文件。
4. 踩坑
4.1 Webshell连接不上
开心上传Webshell后,竟然连不上去,用Burpsuite抓包查看报了这个错误,具体的原因没有深究,百度了一下解决方法就是修改php.ini配置文件中的session.auto_start = 1
之前的phpinfo内有相关路径(/usr/local/etc/php/conf.d/php.ini)
docker exec -t -i nginx_parsing_vulnerability_php_1
进入php容器
进去之后发现conf.d目录下没有php.ini文件,然后把上级目录下的php.ini-development这个文件拷贝过去
cp php.ini-development /usr/local/etc/php/conf.d/php.ini
拷贝过去之后准备编辑文件,发现docker没有vim,然后一顿操作apt-get update
,apt-get install vim
把vim装好
修改其中的session.auto_start = 1
(修改完之后准备开心连Webshell时,突然想起来这个配置要更新一下,但是之前很少使用docker,也不晓得怎么重启容器内环境,就手贱docker restart了php容器,至此前面的所有工作全部白费,再重来一遍)
由于安装的是php-fpm,支持USER2信号,这个信号用于重新加载配置文件
容器内部执行
kill -USR2 10
容器外部执行
docker exec -it nginx_parsing_vulnerability_php_1 ps aux
docker exec -it nginx_parsing_vulnerability_php_1 kill -USR2 10
这里的10
这个值是PID,使用ps aux|grep php
查看,这里又出现了一个问题,docker内也没有ps,所以想要在容器内部执行这条命令的话需要apt-get install procps
安装一下,如果是在容器外部执行命令的话应该没这个问题
这里看到PID就是10,然后执行kill -USR2 10
到这里的话配置就更新完毕
再次返回Bursuite发包查看返回信息,发现之前的WARNING变成了NOTICE
再次使用哥斯拉就可以连上Webshell了