PentestingIPTV Pentest Lab

Hallazgos Confirmados

Findings de severidad alta, media y baja — info disclosure, auth bypass, CORS abierto y catalogo expuesto

Lo Que Encontramos (Hallazgos Confirmados)

Mapa de Severidades


Hallazgos de Severidad Alta

1. Information Disclosure (CRITICO)

El endpoint get_profile de la STB API devuelve informacion completa del usuario sin requerir autenticacion real:

curl "http://XXX.XXX.XXX.XXX:8080/stalker_portal/server/load.php?type=stb&action=get_profile" \
  -H "Cookie: mac=cualquier cosa"

Datos expuestos (75+ campos):

CampoValor EjemploRiesgo
id1ID de usuario
mac(se refleja la cookie)Identificador del dispositivo
blocked1Estado de la cuenta
ipXXX.XXX.XXX.XXXUltima IP conocida
settings_password0000Password de configuracion
parent_password0000Password parental
default_timezoneEurope/BrusselsUbicacion del servidor
web_proxy_host(vacio)Posible vector SSRF
update_url(vacio)Posible vector SSRF

2. Auth Bypass por MAC Spoofing

El sistema de handshake genera tokens validos para CUALQUIER direccion MAC:

# Con MAC real
curl ".../load.php?type=stb&action=handshake" -H "Cookie: mac=XX%3AXX%3AXX%3AXX%3AXX%3AXX"
# -> {"js":{"token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}}

# Con MAC inventada
curl ".../load.php?type=stb&action=handshake" -H "Cookie: mac=AA%3ABB%3ACC%3ADD%3AEE%3AFF"
# -> {"js":{"token":"..."} (Tambien funciona!)

3. CORS Completamente Abierto

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS

Cualquier sitio web puede hacer peticiones a la API desde el navegador del usuario.


Hallazgos de Severidad Media

#FindingDetalle
4Default Passwordssettings_password=0000, parent_password=0000 en STB profile
5Rate Limit BypassPOST-only ban; GET handshake funciona durante el cooldown. 5-15 min recovery
6Array Injection Crashaction[]= -> 500 Server Error (potencial DoS)

Hallazgos de Severidad Baja / Informacional

#FindingDetalle
7Version LeakOpenSSH 8.9p1 Ubuntu 3ubuntu0.13 -> Ubuntu 22.04 LTS
8Stalker v5.3.1Confirmado via player_api.php, modulos, localizacion
9Dual Framework ExpuestoSilex + Laravel — comportamiento diferente por metodo
10RoadRunner ExpuestoX-Powered-By: RoadRunner en headers de redirect VOD
11VOD Tokens Sin Rate LimitTokens de un solo uso, pero generacion ilimitada via Xtream API

Catalogo Completo Listable sin Auth Completa

Aclaracion: Ya sabia que mi proveedor tiene miles de canales — es mi servicio de IPTV. Lo que fue un hallazgo es poder listar TODO el catalogo de 22,000+ canales del proveedor (no solo mi suscripcion) usando tecnicas de bypass.

# Con mis credenciales normales -> solo veo mis canales
curl "http://.../player_api.php?username=USER&password=PASS&action=get_live_streams"

# Pero via panel_api (sin auth de usuario) -> catalogo COMPLETO
curl "http://.../panel_api.php?username=USER&password=PASS"
# -> 11MB de JSON con TODOS los 22,000+ canales del proveedor

La diferencia es sutil pero importante: como cliente normal solo ves tu paquete. Pero la API de panel expone todo el inventario del proveedor si conoces cualquier credencial valida.


Dos Sistemas de Autenticacion Paralelos

Un descubrimiento arquitectonico importante: el sistema tiene DOS mecanismos de auth independientes:

Comportamiento curioso:

  • STB API dice "Auth Required" para contenido (type=itv/vod)
  • Xtream API con las mismas credenciales funciona perfectamente
  • El campo blocked=1 en STB API parece no tener efecto en Xtream API