从反混淆 code.js 到获取 root 权限,CVE-2023-0386
| 端口 | 服务 | 详细信息 |
|---|---|---|
| 22/tcp | ssh | syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | http | syn-ack ttl 63 nginx 2million.htb |
我将 2million.htb 添加到了我的 /etc/hots 文件中
我使用 gobuster 对 2million.htb 进行了路径发现
在枚举过程中,我发现了 /invite 端点
在访问 /invite 页面后

在检查页面时,我注意到它加载了一个名为 inviteapi.min.js 的 JavaScript 文件,其中包含混淆代码:
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,{}))
我使用 de4js 对代码进行了反混淆,得到了以下可读的 JavaScript:

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)
}
})
}
makeInviteCode():生成一个新的邀请码
verefyInviteCode(code):检查代码是否有效
为了进一步理解,我拦截了验证请求:

该 API 使用 JSON 响应
我打开浏览器控制台并执行了 makeInviteCode()

我注意到数据使用 ROT13 密码进行了加密

解密后,我发现了端点 /api/v1/invite/generate,随后我生成了邀请码

Base64 解密

密钥
密钥 2F4BN-YI8OH-B0SCL-L8OE6 被输入并成功接受

注册

首页

访问页面
这个站点上能正常工作的页面不多,而访问页面才是真正有趣的地方

API 端点枚举
我通过点击 connection pack 按钮上传了 VPN 文件,并拦截了 GET request

然后我执行了一个带有 verbose 和 silent 选项的 curl 请求,以枚举可用的 API endpoints


服务器响应了 JSON 格式的 API 端点列表
管理员拥有 3 个支持 GET、POST 和 PUT 方法的 API 端点
当我尝试使用管理员端点 /api/v1/admin/vpn/generate 生成管理员密钥时,由于我不是管理员,密钥未能生成,第一个管理员端点 /api/v1/admin/auth 证实了这一点


在发现带有 Content-Type: application/json 和 required parameters 的正确 PUT request 格式后,我成功将自己的用户提升为管理员









我将 ;whoami; 注入到用户名字段中,我怀疑问题出在 exec() 或 system() PHP 函数上,这些函数常见于仅限管理员的功能,且通常缺乏适当的清理措施
例如,易受攻击的代码可能如下所示:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
该端点 POST /api/v1/admin/vpn/generate 存在漏洞,操作系统命令注入 已成功执行


