Nginx解析漏洞复现以及哥斯拉连接Webshell实践

Nginx解析漏洞复现以及哥斯拉连接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 updateapt-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了

posted @ 2021-03-03 16:27  Snowieee  阅读(3334)  评论(2编辑  收藏  举报