PHP2Shell 加内核提权串成一条链,25 台 PAN-OS 防火墙被拿下
Dream Research 复原的这次行动里,一个未认证的 HTTPS 请求就串起了 PHP2Shell 代码执行和内核提权。19,000 台暴露在公网的 PAN-OS 防火墙被筛到 240 台,24 台植入 webshell,其中两台属于同一家美国政府相关机构,反向 SSH 隧道随即打进内网和 Active Directory。
中文
复制

更新于 2026 年 10 月 29 日。
自发现以来,Dream 研究团队一直在分享进展,并与受影响防火墙的厂商 Palo Alto Networks 合作调查。更多信息见 Palo Alto Networks 网站。本文也已补充了更多细节。
定制的 PHP2Shell 漏洞利用链结合内核本地提权,在野攻陷多个版本的 Palo Alto Networks PAN-OS 防火墙
10 月 25 日,Dream 研究人员发现了疑似中国 AI 辅助行动的痕迹,该行动攻陷了 25 台服务器,其中包括美国某政府相关环境中的系统。攻击者将 PHP2Shell 与一个内核提权漏洞结合,入侵暴露在外的系统。
受影响设备运行的是特定版本的 Palo Alto Networks PAN-OS。
被利用的入口是 PAN-OS 管理 Web 服务器,GlobalProtect 门户也由它承载。Palo Alto Networks 的 Unit 42 已独立验证了攻击者的工具与战果,Palo Alto Networks 正在各受影响分支上发布修复后的 PAN-OS 版本。
拿下防火墙后,攻击者随即对 Active Directory 发起攻击。回收的痕迹证实了凭据窃取与目录枚举行为。
这起行动说明,一个暴露的管理接口可以成为进入组织身份基础设施的通道。对政府防御方而言,发现漏洞只是开始,真正的挑战在于从识别存在漏洞的系统,延伸到理解并遏制入侵所打开的那条访问路径。
以下研究借助 Dream 的自主网络研究产品 Hero 进行主动威胁狩猎而完成。
发现
Dream 研究人员识别出一次完整的攻击行动,其中包括对 PHP2Shell 漏洞利用链(CVE-2026-109618/CVE-2026-109619)的定制武器化,搭配 Fragnesia 内核提权(CVE-2026-46300)、目标清单、利用日志,以及约 40 个定制后渗透脚本。
这次发现的入侵痕迹来自一场攻击行动,该行动已在美国、日本、台湾和韩国取得 25 台 PAN-OS 防火墙与管理服务器的 root 权限。拿到 root 之后,攻击者将目标锁定在美国一个政府相关环境中的三台特定服务器上。
这些痕迹还原出一条完整的行动链路:从实验室环境中的漏洞开发开始,到最终持久驻留在美国某政府机构的内部 Active Directory 域中。
攻击中的 AI 使用
我们还在攻击基础设施中发现了一些 AI 辅助工具的迹象:
-
安装了 Claude Code
-
一个名为 aiscan 的 AI 驱动攻击性安全平台,配置了中国的大模型 DeepSeek 和 Kimi
-
存在中国侦察平台 FOFA 的 API key
我们没有直接证据表明 AI 工具被专门用于编写漏洞利用代码或后渗透脚本,但约 40 个脚本在代码结构、注释风格和一致性上高度相似,说明开发过程有 AI 辅助。不过,这次行动看起来并不属于完全自主的国家级攻击。
漏洞利用:两个漏洞串成一次请求
攻击者开发了两个独立的漏洞利用,并将它们串联起来,只需一个 HTTP 请求、无需任何凭据,就能在任意运行存在漏洞版本的、面向互联网的 PAN-OS 防火墙上取得 root 权限。
PHP2Shell(CVE-2026-109618 / CVE-2026-109619)的远程代码执行
我们提取到的实现是一个定制的非公开版本,并非任何已知公开 PHP2Shell 漏洞利用的拷贝。它沿用了相同的底层思路,但看起来是独立开发、专门针对 PAN-OS 定制的。
该漏洞针对的是 PAN-OS 管理 Web 服务器(appweb)上 PHP 的 session.upload_progress 机制。PAN-OS 使用 PHP 8.0.30,内存上限设置得很高,正好为攻击的内存破坏阶段创造了条件。
攻击分四个阶段协同完成:
-
A1 内存耗尽(约 383MB): 攻击者用精心构造的 multipart POST 请求淹没服务器,每个请求都带有超长文件名和 session 进度数据。这会把 PHP 的内存分配器推到极限,迫使系统进入可预测的内存布局。
-
B1 信息泄露: 第二个请求利用从 A1 中获取的过期会话 ID 长度发起伪造,触发越界读取。服务器的
Set-Cookie响应头带出了泄露的指针值,攻击者由此获得运行进程中libphp.so的基地址。 -
A2 过期引用布置(约 500MB): 再施加一轮内存压力,初始化一个会话,使
http_session_vars成为一个存活的zend_reference,然后触发第二次 OOM,留下mod_data=NULL,制造出一个攻击者可在 B2 中伪造的过期引用。 -
B2 代码执行: 最后一个请求在被释放的内存区域中伪造了一个 PHP HashTable 条目。伪造条目的
pDestructor回调指向zif_system(PHP 的system()函数),其数据指向一段 shell 命令字符串。PHP 的清理处理器遍历 HashTable 时调用这个伪造的析构函数,即以nobody用户身份执行任意命令。
Fragnesia(CVE-2026-46300)的内核提权
拿到 nobody 权限的代码执行还不够,因为 SELinux 限制了 httpd_t 修改系统文件。为完成提权,攻击者又串入第二个漏洞利用:XFRM ESP-in-TCP 子系统中的一个 Linux 内核漏洞。
Fragnesia 利用 page-cache 写入覆盖 /etc/pam.d/su,把其中的认证规则替换为 pam_permit.so(全部放行)。由于该 PAM 文件只有 774 字节,漏洞利用采用逐字节拼接的变体来精确写入。覆盖完成后,su root 无需密码即可成功。
两个漏洞利用都在同一个 B2 HTTP 请求中执行。整条攻击链从建立未认证的 HTTPS 连接,到获得可持久化的 root webshell,在 15 分钟内完成。
实验环境:规模化版本画像
这个漏洞利用不是一次性的即发即弃载荷。它需要精确的内存偏移,而这些偏移在不同 PAN-OS 版本之间各不相同,包括 zval_ptr_dtor 的地址、zif_system 的地址、HashTable 结构体大小,以及控制各阶段堆布局的内存几何参数。
在恢复出的产物中,我们找到了 11 个 JSON 版本画像文件,每个测试过的 PAN-OS 版本对应一个。
| PAN-OS 分支 | PHP | Profile | 说明 |
|---|---|---|---|
| 11.1 | 7.4.33 | 2 个 provisional | PHP 7.4 在实验室中已验证以 nobody 身份实现 RCE,但完整攻击链尚未校准(基础构建加一个热修复变体) |
| 12.1、12.2 | 8.0.30 | 1 个 calibrated,8 个 provisional | 一个基础 profile 已完整通过实验室测试;其余 profile 沿用其内存布局,或与相邻构建共享偏移量 |
每个 profile 都包含从对应版本的 libphp.so 二进制中提取的精确偏移量,以及每个库的 SHA256 哈希、ELF build ID,还有经过实验室测试调校的精确内存布局参数(chunk 大小、填充次数、排空次数、spray 偏移量)。
“calibrated”与“provisional”两类 profile 的区别值得注意。calibrated 意味着攻击者已针对该版本的运行中 VM 测试过漏洞利用,并确认内存布局可用。provisional 意味着偏移量是从二进制中算出来的,但尚未在真实实例上验证。
攻击活动漏斗:从发现 19,000 个到实际利用 25 个

漏洞利用工具已经就绪,针对 9 个可利用版本也准备好了对应的 profile,攻击者随即发起了一轮目标明确的行动,整个流程层层收窄:
阶段 1:全网发现(19,000 个目标)
攻击者使用 FOFA,一个类似 Shodan 的中国互联网资产搜索引擎,找出了全球约 19,000 台暴露在互联网上的 PAN-OS 防火墙。这些设备的管理界面直接对公网开放,可以通过证书指纹和 HTTP 响应特征识别出来。
阶段 2:版本探测(5,000 台存活)
攻击者用自写的版本扫描器,以 200 个并发线程扫描全部 19,000 个目标,确认哪些设备实际在线、运行的是哪个 PAN-OS 版本。约 5,000 台返回了版本信息。
阶段 3:按地区和版本筛选(240 个目标)
从这 5,000 台存活设备中,攻击者只保留位于美国、日本、台湾和韩国的服务器,再进一步筛选出与漏洞利用 profile 匹配的版本(运行 PHP 8.0.30 的 PAN-OS 12.1 和 12.2 分支)。最终目标清单为 240 台防火墙。
美国、日本、台湾和韩国正是中国国家背景网络行动在太平洋方向上的四个主要战略对手和情报目标,这说明背后可能是国家行为体在操作。
阶段 4:自动化利用(24 台拿到 root)
这 240 个目标被送入一个自动化批处理程序,每次利用 5 台,每个目标超时 1800 秒(30 分钟)。每成功一台,批处理程序会:
-
执行完整的 PHP2Shell + Fragnesia 攻击链
-
在防火墙上一个可公开访问的目录里植入 103 字节的 PHP root webshell(
/unauth/php/change_password.php) -
通过 webshell 执行
id,确认已获得 root -
把目标的主机名和 IP 记入成功清单 CSV
-
转向下一个目标
到这一步,已有 24 台防火墙被成功拿下 root。
阶段 5:分诊(2 台防火墙被优先处理)
24 台已拿到 root 的防火墙中,有 22 台攻击者除了植入 webshell 之外什么都没做。没有持久化,没有隧道,也没有任何后渗透工具。这些服务器实际上处于已被控制、暂时搁置的状态,攻击者随时可以通过 webshell 回来。
两台看似针对同一目标的服务器越过了这一阶段,且似乎都属于同一个美国政府附属环境。
阶段 6:转向(从防火墙转向域)
在 24 台已被 root 的防火墙中,有两台属于一个美国政府附属机构。从第一台防火墙提取的运行配置显示出暗示政府隶属关系的特征:CAC(Common Access Card)认证、特定的命名前缀,以及标准化的政府风格资产命名。配置文件包含该组织的完整内部网络拓扑:域控制器、一台中央防火墙管理服务器、一台 Keycloak SSO 服务器、一个 GitLab 实例、GlobalProtect VPN 网关,以及 Active Directory 域。
第一台防火墙在 10 月 23 日 18:14 UTC 的自动化批次中被 root。但它随后不久就崩溃了,很可能是因为约 900MB 的漏洞利用流量,并且再也没有重新上线。攻击者用 240 次自动化探测监控了它两个小时,等待它恢复。它没有恢复。第二台防火墙的证书数据明确将其与目标组织关联,但它在最初的批次中超时了。
攻击者从第一台防火墙的配置中意识到该组织的价值,于是创建了一个单独的专用行动,并于 10 月 24 日 10:09 UTC 成功利用了它。
在数小时内,攻击者:
建立了一条进入内部网络的持久隧道。
一条 8 端口反向 SSH 隧道将被攻陷的防火墙连回操作者的基础设施,转发对以下目标的访问:
-
域控制器(LDAP、LDAPS、RDP)
-
内部防火墙管理服务器
-
GlobalProtect VPN 基础设施
-
一个用于任意内部网络访问的 SOCKS5 代理
该隧道被包装在一个 systemd 服务和 rc.local 启动钩子中,两者都从 /usr/local/lib/.panops/ 启动脚本,因此能在重启后存活并自动重连。
通过隧道利用了管理服务器。 在 11:35 UTC,也就是 root 第二台防火墙后不到 90 分钟,攻击者利用新获得的服务器访问权限和同样的 PHP2Shell + Fragnesia 攻击链,攻击了第三台政府服务器,也就是只能通过隧道访问的内部防火墙管理服务器。这台服务器集中管理该组织的所有防火墙。攻陷它使攻击者能够访问每一台受管防火墙的配置、凭据和网络设置。这使被利用的服务器总数达到 25 台。
从管理服务器发起了一次 AD 攻击行动。 管理服务器本就与 Active Directory 保持着 LDAP 连接(用于认证 VPN 用户),攻击者便把它当作攻击域的发射平台。
-
解密了 LDAP 服务账号密码。设备配置中存储的是加密后的密码,但拿到 root 权限就等于拿到了主密钥。攻击者提取出明文密码,并将其硬编码进后续每一个脚本。
-
通过 LDAP 查询枚举了域内所有用户和组。
-
用与组织相关的主题词对所有用户账号进行了密码喷洒。该域设置为
lockoutThreshold=0,即未启用账号锁定,喷洒尝试次数不受限制。 -
尝试创建 AD 后门账号,一个用户账号(在每个 OU 中都尝试过),一个机器账号(利用了默认的
MachineAccountQuota设置)。 -
分析了 AD ACL 链,寻找提权路径。
-
尝试从 Keycloak IdP 配置中提取 SAML 签名密钥。
-
探测了 Keycloak SSO 是否存在认证绕过。
攻击结果,包括密码喷洒是否撞出了有效凭据、后门账号是否创建成功、SAML 密钥是否被提取,都留在管理服务器的本地文件系统上,不在我们恢复出的痕迹之中。这意味着我们无法确定此次失陷的完整范围。

管理服务器 → Active Directory
| 状态 | 活动 |
|---|---|
| ✓ | 从配置中解密 LDAP 密码 |
| ✓ | 完整枚举用户与组 |
| ? | 密码喷洒(针对所有用户,无锁定) |
| ? | 创建后门用户与机器账户 |
| ? | 提取 SAML 签名密钥 |
攻击者目前掌握的情况
根据回收的痕迹,可以确认攻击者拥有:
-
通过可跨重启存活的反弹隧道和 SOCKS 代理,对组织内网保持持久远程访问,很可能仍处于活跃状态
-
两台防火墙及防火墙管理服务器上的 root webshell,很可能仍处于活跃状态
-
完整的 Active Directory 用户与组列表,相当于一份完整的组织架构图
-
解密后的 LDAP 服务账户凭据,可随时直接查询 AD
-
从 PAN-OS 防火墙文件系统中获取的私钥,包括 HA 复制密钥、SSL/TLS 证书密钥和设备认证密钥
-
完整的网络拓扑,每一个 IP、主机名、子网、服务器角色和 VPN 网关
-
安全设置薄弱的 SAML IdP 配置(
validate-idp-certificate: no) -
分布在美国、日本、台湾和韩国的另外 22 台已“停放”的防火墙,随时可用于攻击
目前无法确定的是,密码喷洒、后门账户创建或 SAML 密钥提取是否成功。只要其中任何一项得手,入侵范围就远远超出外围防火墙,深入组织的身份基础设施。
归因线索
我们未将此活动归因于某个具名威胁行为体。Palo Alto Networks 的 Unit 42 将其追踪为 CL-UNK-1280,并归因于 UTC+8 时区的中文使用者。不过,多项指标指向这是一次与中国有关联的行动:
| 指标 | 详情 |
|---|---|
| 目标选择 | 仅限美国、日本、台湾、韩国。这些正是中国在太平洋地区国家背景行动的主要战略情报目标。 |
| FOFA | 用于发现目标的互联网侦察平台是一项中国服务。 |
| iox | 在回收的工具中发现的一款中国开发的隧道工具。 |
| DeepSeek 和 Kimi | aiscan 攻击性安全平台中配置的大语言模型均为中文模型。 |
| UTC+8 时间戳 | 基础设施的时钟运行在中国标准时间上,这一点通过将日志时间戳与目标返回的 HTTP Date: 响应头对比得到确认。 |
| 中文提示词 | aiscan 会话日志中包含中文用户消息。 |
结论
这次行动所展现出的准备程度和技术能力,远超那种见机行事的利用方式。攻击者在漏洞研究上投入了大量精力,获取 PAN-OS 固件、将其解密、提取 PHP 库、为 9 个不同软件版本构建精确的内存布局,并通过实验室测试校准利用参数。利用过程本身则自动化且高效:单批次尝试攻击 240 个目标,按版本自动选择对应的配置。
目标明确指向政府机构。
攻击者扫描了 19,000 台防火墙,拿下其中 24 台,并立刻锁定了真正重要的那两台。在攻陷一台隶属美国政府的防火墙后数小时内,他们便已隧道进入内网,用同一个 PHP2Shell 漏洞攻陷了第三台服务器,并发动了一轮完整的 Active Directory 攻击行动。而这一切的起点,只是一个发往管理接口的未认证 HTTPS 请求,那个接口本就不该暴露在互联网上。
其余 22 台被攻陷的防火墙仍留有活跃的 webshell,处于待命状态。通往该美国政府机构的持久隧道很可能仍在运行。攻击者手里还有 19,000 个已指纹识别的目标,随着他们为更多 PAN-OS 版本开发出对应配置,随时可以回头再打。Palo Alto Networks 的设备遥测数据显示,针对暴露在外的 PAN-OS 设备的利用尝试仍在持续。
完整指引和入侵指标见 Palo Alto Networks 网站。
弥合发现与防御之间的差距
对政府和关键基础设施而言,发现漏洞只是开始。防御方需要找出暴露在外的系统,弄清攻击者能利用什么,并在立足点演变成更大范围的失陷之前采取行动。
Dream 通过两个互补的网络防御平台来应对这一挑战:
-
Sphere 扩展国家网络防御能力。 它梳理暴露面、对风险排定优先级,并针对政府网络中的攻击进行检测和响应,且根据各国的威胁态势和基础设施量身定制。
-
Hero 扩大网络研究规模。 其自主研究智能体帮助专家调查威胁、发现并验证漏洞,包括在没有源代码的软件中,并制定修复指引和补丁。本文详述的调查正是由 Dream 的研究人员使用这一工具完成的。
两者结合,将更深入的调查与覆盖全国攻击面的防御连接起来。