
From deobfuscating code.js to 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 存在漏洞,操作系统命令注入 已成功执行



由于应用程序存在阻止特殊字符的限制,我对反向 Shell 的 payload 命令进行了 base64 编码,以绕过该限制

我将 payload 注入 username parameter,并通过管道传递给 base64 -d | bash 进行解码和执行:


payload 执行成功,以 www-data user 身份返回了一个反向 Shell

我尝试使用多种技术,从 www-data 用户 向 admin 用户 进行横向移动
在检查 /var/www/html 目录时,我发现了一个包含 数据库凭据 的 .env 文件:

发现的密码被成功复用,以通过 SSH 和 MySQL 进行身份验证
SSH

MySQL

在以 admin 用户获得初始访问权限后,我进行了系统枚举,以识别潜在的权限提升向量
我尝试了所有最常用的权限提升技巧,如 SUID 二进制文件、capabilities、sudo 权限、cron 作业,但都不起作用。于是我检查了环境变量,寻找 PATH 劫持或敏感变量,并发现了一个指向 /var/mail/admin 的 MAIL variable

我去查看了邮件内容,注意到管理员曾被警告修补内核以防范 OverlayFS/FUSE vulnerability

内核版本

操作系统版本

内核从未更新,证实管理员忽视或忘记了安全警告
内核枚举显示版本为 5.15.70-051570-generic,该版本存在 CVE-2023-0386 OverlayFS/FUSE 本地权限提升漏洞
确认漏洞后,我着手获取公开的 POC 漏洞利用代码
我克隆了 POC,并将其传输到目标机器
随后我执行了它,并成功获得了 root 访问权限


CVE-2023-0386 - CVE-2023-0386 - 操作系统命令注入
免责声明: 该机器是在经授权的渗透测试环境中完成 root 的。
| 阶段 | 技术 | 目标 | 结果 |
|---|
| 1. 侦察 | 端口扫描 | 22 (SSH), 80 (HTTP) | 服务发现 |
| 路径发现 | /invite | 发现邀请页面 | |
| JS 反混淆 | inviteapi.min.js | 暴露了 API 端点 | |
| 2. 初始访问 | 邀请码生成 | POST /api/v1/invite/generate | 有效的邀请码 |
| 注册 | POST /api/v1/user/register | 创建标准用户 | |
| 3. Web 权限提升 | API 枚举 | GET /api/v1 | 发现管理员端点 |
| 垂直权限提升 | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. 系统访问 | 命令注入 | POST /api/v1/admin/vpn/generate | username=test;id; |
| 反向 Shell | Base64 编码的 payload | www-data shell | |
| 5. 横向移动 | 文件发现 | /var/www/html/.env | admin:SuperDuperPass123 |
| SSH 复用 | ssh [email protected] | 获取 admin 用户访问权限 | |
| 6. Root 权限提升 | 内核枚举 | uname -r -> 5.15.70 | 识别出 CVE-2023-0386 |
| 邮件警告 | /var/mail/admin | 确认 OverlayFS/FUSE | |
| 漏洞利用执行 | ./fuse && ./exp | Root shell |