achnouri/TwoMillion-Machine
GitHub: achnouri/TwoMillion-Machine
一份记录 HackTheBox TwoMillion 靶机完整渗透过程的 Writeup,涵盖从 JavaScript 反混淆到 CVE-2023-0386 内核提权的全攻击链。
Stars: 0 | Forks: 0
### 关于靶机
###### TwoMillion 是一台简单难度的 Linux 靶机,发布是为了庆祝 HackTheBox 用户数突破 200 万。该靶机包含一个旧版本的 HackTheBox 平台,其中带有旧的邀请码破解机制。破解邀请码后,即可在平台上创建账户。利用该账户可以枚举各种 API endpoint,其中一个可用于将用户提升为 Administrator。拥有管理员权限后,用户可以在管理员 VPN 生成 endpoint 中执行命令注入,从而获取系统 shell。随后会发现一个包含数据库凭据的 .env 文件,由于密码重用,攻击者可以以 admin 用户身份登录该靶机。最后发现系统内核已过时,可以利用 CVE-2023-0386 获取 root shell。
#### 扫描结果
|端口| 服务 | 详情 |
|-|-|-|
|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/hosts` 文件中
### 路径发现
我使用 **gobuster** 对 `2million.htb` 进行了路径发现
在枚举过程中,我发现了 `/invite` endpoint

访问 `/invite` 页面后

在检查页面时,我注意到它加载了一个名为 `inviteapi.min.js` 的 **Javascript file**,其中包含混淆代码: ``` 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`](https://thanhle.io.vn/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` 格式进行响应
### 生成邀请码及 ROT13 解密 我前往浏览器控制台并执行了 `makeInviteCode()`
我注意到数据使用 `ROT13` 密码进行了加密
解密后,我发现了 `/api/v1/invite/generate` endpoint,随后生成了邀请码
**Base64 解密**
**密钥**
输入密钥 `2F4BN-YI8OH-B0SCL-L8OE6` 并成功通过验证
**注册**

**主页**

**访问页面**
该网站上没有多少页面能正常工作,访问页面是其中最有趣的地方

**API Endpoint 枚举**
我通过点击 `connection pack` 按钮上传了 vpn 文件,并拦截了该 `GET request`

随后,我执行了带有 verbose 和 silent 选项的 **curl request**,以枚举可用的 `API endpoint`


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

## Web 应用垂直提权:将当前标准用户提升为管理员
在发现了带有 `Content-Type: application/json` 和 `required parameters` 的正确 `PUT request` 格式后,我成功将我的用户提升为了管理员








## OS 命令注入 **我将 `;whoami;` 注入到了 username 字段中,我怀疑存在 `exec()` 或 `system()` php 函数。这些函数常见于仅限管理员使用的功能中,并且通常缺乏适当的过滤** 例如,存在漏洞的代码可能长这样: ``` $username = $json->username; exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn"); ``` 该 endpoint `POST /api/v1/admin/vpn/generate` 存在漏洞,**OS 命令注入**执行成功


## 初始访问:通过 OS 命令注入获取 Reverse Shell(base64 绕过) #### 对 payload 进行编码以绕过限制 由于应用程序存在阻止特殊字符的限制,我将 reverse shell payload 命令编码为 base64 格式以绕过该限制
#### 注入编码后的 payload 我将 payload 注入到 `username parameter` 中,通过管道传递给 `base64 -d` | `bash` 进行解码和执行:
#### Netcat 监听器
#### 获取初始访问权限 payload 成功执行,返回了一个作为 `www-data user` 的 reverse shell
## 横向移动 我尝试使用各种技术从 **www-data user** 向 **admin user** 进行 **横向移动** 在检查 `/var/www/html` 目录时,我发现了一个包含 **数据库凭据** 的 `.env` 文件:
发现的密码被成功**重用**,通过 `SSH` 和 `MySQL` 进行身份验证 **SSH**
**MySQL**
## OS 权限提升 在以 admin 用户身份获得初始访问权限后,我执行了系统枚举以识别潜在的权限提升向量 我尝试了 SUID 二进制文件、capabilities、sudo 权限、cron jobs 等所有最常见的提权技巧,但都没起作用。因此我检查了用于 PATH 劫持或包含敏感信息的**环境变量**,并发现指向 `/var/mail/admin` 的 `MAIL variable`
我查看了邮件内容,注意到管理员曾被警告修补内核以防范 `OverlayFS/FUSE vulnerability`
内核版本
操作系统版本
内核从未更新过,证实管理员忽略或忘记了安全警告 内核枚举显示版本为 `5.15.70-051570-generic`,该版本易受 `CVE-2023-0386` **OverlayFS/FUSE 本地权限提升**的影响 在确认漏洞后,我开始寻找公开的 POC exploit 我克隆了 POC,并将其传输到目标机器 随后我执行了该 POC,并成功获得了 root 访问权限

## 攻击链 | 阶段 | 技术 | 目标 | 结果 | |-------|-----------|--------|--------| | **1. 侦察** | 端口扫描 | 22 (SSH), 80 (HTTP) | 发现服务 | | | 路径发现 | `/invite` | 找到邀请页面 | | | JS 反混淆 | `inviteapi.min.js` | 暴露 API endpoint | | **2. 初始访问** | 邀请码生成 | `POST /api/v1/invite/generate` | 获取有效的邀请码 | | | 注册 | `POST /api/v1/user/register` | 创建标准用户 | | **3. Web 提权** | API 枚举 | `GET /api/v1` | 发现管理员 endpoint | | | 垂直提升 | `PUT /api/v1/admin/settings/update` | `is_admin: 0 -> 1` | | **4. 系统访问** | 命令注入 | `POST /api/v1/admin/vpn/generate` | `username=test;id;` | | | Reverse Shell | Base64 编码的 payload | 获取 `www-data` shell | | **5. 横向移动** | 文件发现 | `/var/www/html/.env` | `admin:SuperDuperPass123` | | | SSH 密码重用 | `ssh admin@2million.htb` | 获取 `admin` 用户访问权限 | | **6. Root 提权** | 内核枚举 | `uname -r` -> `5.15.70` | 确定 CVE-2023-0386 | | | 邮件警告 | `/var/mail/admin` | 确认 OverlayFS/FUSE | | | 执行 Exploit | `./fuse && ./exp` | 获取 root shell |
#### 参考资源 [CVE-2023-0386](https://securitylabs.datadoghq.com/articles/overlayfs-cve-2023-0386/) - [CVE-2023-0386](https://red.infiltr8.io/redteam/privilege-escalation/linux/kernel-exploits/overlayfs-exploits/cve-2023-0386-overlayfs) - [OS Command Injection](https://github.com/achnouri/WebSec-OS-CommandInjection)
**免责声明:** 该靶机是在授权的渗透测试环境下完成攻破的
### 路径发现
我使用 **gobuster** 对 `2million.htb` 进行了路径发现
在枚举过程中,我发现了 `/invite` endpoint

访问 `/invite` 页面后

在检查页面时,我注意到它加载了一个名为 `inviteapi.min.js` 的 **Javascript file**,其中包含混淆代码: ``` 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`](https://thanhle.io.vn/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` 格式进行响应
### 生成邀请码及 ROT13 解密 我前往浏览器控制台并执行了 `makeInviteCode()`

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

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

**Base64 解密**

**密钥**
输入密钥 `2F4BN-YI8OH-B0SCL-L8OE6` 并成功通过验证

**注册**

**主页**

**访问页面**
该网站上没有多少页面能正常工作,访问页面是其中最有趣的地方

**API Endpoint 枚举**
我通过点击 `connection pack` 按钮上传了 vpn 文件,并拦截了该 `GET request`

随后,我执行了带有 verbose 和 silent 选项的 **curl request**,以枚举可用的 `API endpoint`


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


## Web 应用垂直提权:将当前标准用户提升为管理员
在发现了带有 `Content-Type: application/json` 和 `required parameters` 的正确 `PUT request` 格式后,我成功将我的用户提升为了管理员









## OS 命令注入 **我将 `;whoami;` 注入到了 username 字段中,我怀疑存在 `exec()` 或 `system()` php 函数。这些函数常见于仅限管理员使用的功能中,并且通常缺乏适当的过滤** 例如,存在漏洞的代码可能长这样: ``` $username = $json->username; exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn"); ``` 该 endpoint `POST /api/v1/admin/vpn/generate` 存在漏洞,**OS 命令注入**执行成功



## 初始访问:通过 OS 命令注入获取 Reverse Shell(base64 绕过) #### 对 payload 进行编码以绕过限制 由于应用程序存在阻止特殊字符的限制,我将 reverse shell payload 命令编码为 base64 格式以绕过该限制

#### 注入编码后的 payload 我将 payload 注入到 `username parameter` 中,通过管道传递给 `base64 -d` | `bash` 进行解码和执行:

#### Netcat 监听器

#### 获取初始访问权限 payload 成功执行,返回了一个作为 `www-data user` 的 reverse shell

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

发现的密码被成功**重用**,通过 `SSH` 和 `MySQL` 进行身份验证 **SSH**
**MySQL**
## OS 权限提升 在以 admin 用户身份获得初始访问权限后,我执行了系统枚举以识别潜在的权限提升向量 我尝试了 SUID 二进制文件、capabilities、sudo 权限、cron jobs 等所有最常见的提权技巧,但都没起作用。因此我检查了用于 PATH 劫持或包含敏感信息的**环境变量**,并发现指向 `/var/mail/admin` 的 `MAIL variable`

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

内核版本

操作系统版本

内核从未更新过,证实管理员忽略或忘记了安全警告 内核枚举显示版本为 `5.15.70-051570-generic`,该版本易受 `CVE-2023-0386` **OverlayFS/FUSE 本地权限提升**的影响 在确认漏洞后,我开始寻找公开的 POC exploit 我克隆了 POC,并将其传输到目标机器 随后我执行了该 POC,并成功获得了 root 访问权限


## 攻击链 | 阶段 | 技术 | 目标 | 结果 | |-------|-----------|--------|--------| | **1. 侦察** | 端口扫描 | 22 (SSH), 80 (HTTP) | 发现服务 | | | 路径发现 | `/invite` | 找到邀请页面 | | | JS 反混淆 | `inviteapi.min.js` | 暴露 API endpoint | | **2. 初始访问** | 邀请码生成 | `POST /api/v1/invite/generate` | 获取有效的邀请码 | | | 注册 | `POST /api/v1/user/register` | 创建标准用户 | | **3. Web 提权** | API 枚举 | `GET /api/v1` | 发现管理员 endpoint | | | 垂直提升 | `PUT /api/v1/admin/settings/update` | `is_admin: 0 -> 1` | | **4. 系统访问** | 命令注入 | `POST /api/v1/admin/vpn/generate` | `username=test;id;` | | | Reverse Shell | Base64 编码的 payload | 获取 `www-data` shell | | **5. 横向移动** | 文件发现 | `/var/www/html/.env` | `admin:SuperDuperPass123` | | | SSH 密码重用 | `ssh admin@2million.htb` | 获取 `admin` 用户访问权限 | | **6. Root 提权** | 内核枚举 | `uname -r` -> `5.15.70` | 确定 CVE-2023-0386 | | | 邮件警告 | `/var/mail/admin` | 确认 OverlayFS/FUSE | | | 执行 Exploit | `./fuse && ./exp` | 获取 root shell |
#### 参考资源 [CVE-2023-0386](https://securitylabs.datadoghq.com/articles/overlayfs-cve-2023-0386/) - [CVE-2023-0386](https://red.infiltr8.io/redteam/privilege-escalation/linux/kernel-exploits/overlayfs-exploits/cve-2023-0386-overlayfs) - [OS Command Injection](https://github.com/achnouri/WebSec-OS-CommandInjection)
**免责声明:** 该靶机是在授权的渗透测试环境下完成攻破的
标签:CISA项目, CSV导出, StruQ, 安全渗透, 客户端加密, 提权, 数据可视化, 网络安全, 隐私保护