
Plex2Shell(CVE-2026-96652 및 3건 추가)의 영향을 받는 Plex Media Server 찾기
Plex2Shell의 영향을 받는 Plex Media Server를 찾습니다. Plex2Shell은 네 가지 취약점(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 | 1.43.3.10861보다 오래된 Plex Media Server |
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를 통해) 보이고 셸 기록에 남습니다. 키 값은 오류 메시지에서 마스킹됩니다. (이 점을 알려준 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 탐색, 웹
서버)은 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"는 이들의 상표입니다.