查找受 Plex2Shell 影响的 Plex Media Server,该漏洞链由四个漏洞组成 (CVE-2026-96652、CVE-2026-96654、CVE-2026-96655、CVE-2026-96656),可让 攻击者在无需登录的情况下接管低于 1.43.3.10861 版本的 Plex Media Server。属于 shouldipanic.ch 的一部分。
Plex2Shell 自 2026 年 10 月 17 日起已被利用(挖矿程序、代理),并 被列入 CISA 的已知被利用漏洞列表。所有低于 1.43.3.10861 且可从互联网 访问的 Plex Media Server 都面临风险。
plex2scan 有两种形式:
plex2scan.py:一个无依赖的单一 Python 文件,用于检查
你自己的服务器:IP 范围、包含 Plex 端口 32400 的端口扫描、vhost
发现以及 Plex 版本检查。
每个 Plex Media Server 无需登录即可响应 GET /identity,并在那里告知其
版本。plex2scan 加载起始页(通过其 X-Plex-Protocol 头或 Plex Web 页面
识别 Plex),并请求一次 /identity。
不会发送其他任何内容:没有登录,没有漏洞利用。
curl -LO https://github.com/akaihigurashi/plex2scan/releases/latest/download/plex2scan.py
python3 plex2scan.py 203.0.113.0/24
Python 3.8 或更高版本,无需安装任何东西。示例:
python3 plex2scan.py 203.0.113.10 # 21 ports incl. 32400 + every vhost on the IP
python3 plex2scan.py 203.0.113.10:32400 # only Plex's own port
python3 plex2scan.py plex.example.ch # a Plex behind a reverse proxy
python3 plex2scan.py 203.0.113.0/24 --names domains.txt # + hostnames from your own data
python3 plex2scan.py 203.0.113.10 -p all -o out.csv # all 65535 ports, CSV output
python3 plex2scan.py -h # all options
| 状态 | 含义 |
|---|---|
VULNERABLE | Plex Media Server 版本低于 1.43.3.10861 |
POSSIBLY VULNERABLE | 发现 Plex Media Server,但版本被隐藏 |
PATCHED | Plex Media Server 为 1.43.3.10861 或更新版本 |
NOT DETECTED | 未发现 Plex Media Server |
结果按最严重优先排列,并附简短原因。隐藏的结果(关闭的端口、错误、仅显示默认站点的 vhost)会通过 -a 显示,证据通过 -v 显示。
| 选项 | 作用 |
|---|---|
-p LIST | 端口:web(20 个常见端口 + 32400,默认)、all,或 80,443,32400 |
-n | 不进行端口扫描,仅扫描 443 和 80 |
--names FILE | 使用你自己的主机名列表,作为 vhost 进行检查 |
--no-vhosts | 不查找同一 IP 上的其他网站 |
-a / -v | 显示隐藏结果 / 显示证据 |
-o FILE | 同时将所有结果写入 CSV |
-d | 调试:显示每个请求、请求头和匹配项 |
-q | 不显示横幅(用于脚本) |
-V | 打印版本 |
-h | 显示所有选项 |
myawesomeproxy、
mylovelyminer 或 x12345,Plex 的 Codecs 文件夹中出现未知的 .so/.dll 文件,
连接到 proxystream.st,在没有任何播放时 CPU 负载很高。更新
并不能移除已经入侵的攻击者。AlienVault OTX 和 HackerTarget 无需密钥即可使用。VirusTotal、Shodan 和 SecurityTrails 需要 API 密钥,从环境变量中读取:
| 变量 | 来源 |
|---|---|
PANIC_VT_KEY | VirusTotal 被动 DNS |
PANIC_SHODAN_KEY | Shodan 主机名 |
PANIC_SECURITYTRAILS_KEY | SecurityTrails 反向 IP |
将它们保存在只有你能读取的 .env 文件中,并仅在扫描时加载:
( set -a; . ./.env; set +a; python3 plex2scan.py 203.0.113.10 )
--vt-key、--shodan-key 和 --securitytrails-key 同样可用,但命令行参数对其他本地用户可见(ps),并且会留在你的 shell 历史记录中。密钥值在错误消息中会被掩码处理。(感谢 Jonas Hüsser 提供此建议。)
docker run -d --name plex2scan --restart unless-stopped \
-p 127.0.0.1:8091:8091 \
-e PANIC_ORIGIN=https://plex2scan.example.ch \
-v plex2scan-data:/data \
ghcr.io/akaihigurashi/plex2scan:latest
或使用 Compose:下载 docker-compose.yml,设置
PANIC_ORIGIN,然后运行 docker compose up -d。容器仅监听 localhost;
请在其前面放置一个带 TLS 的反向代理
(nginx 示例)。
| 变量 | 默认值 | 用途 |
|---|---|---|
PANIC_ORIGIN | – | 公开地址。来自其他来源的请求会被拒绝。请设置它。 |
PANIC_OPERATOR / PANIC_CONTACT | – | 页面底部可选的联系方式部分 |
PANIC_IMPRINT_URL | – | 指向现有版本说明的可选链接 |
PANIC_TRUSTED_PROXY | 127.0.0.1,::1 | 其 X-Real-IP 头受信任的代理 |
PANIC_DENY_HOSTS / PANIC_DENY_IPS | – | 永不检查这些域名 / 地址 |
PANIC_AUDIT_DIR | /data/audit | 每日审计日志文件 |
PANIC_RETENTION_DAYS | 30 | 早于此天数的审计文件会被删除 |
该页面具有与 php2scan 相同的保护措施: 同意复选框、审计日志、拒绝 VPN/Tor/数据中心客户端、速率限制、 结果缓存、仅限公共主机名且连接固定到被检查的 地址、永不检查的网站(知名服务、访问量最大的 100 个网站、政府网站、受制裁国家),以及 禁止来自受制裁国家的访问。除网站本身(443,然后是 80)外,页面仅 查看端口 32400,且仅在其开放时。
扫描器引擎(抓取、指纹识别、端口扫描、vhost 发现、Web
服务器)位于 panic-core。
Plex2Shell 特有的所有内容都在 check.py 中。
plex2scan.py 和 web.py 由两者生成:
git clone https://github.com/akaihigurashi/panic-core ../panic-core
python3 ../panic-core/bundle.py check.py
GPL-3.0,参见 LICENSE。字体:Inter 和 JetBrains Mono(SIL Open Font License)。与 Plex, Inc. 无关联,也未获其认可;“Plex”是其商标。