PentestingIPTV Pentest Lab
Catalogo de Tecnicas
105+ tecnicas probadas — SQL Injection, SSRF, routing bypass, RCE/Debug y protocolos no-HTTP
Lo Que Intentamos (Catalogo de Tecnicas)
Resumen de Intentos
SQL Injection — Todo Cerrado
Probamos inyeccion SQL en todos los parametros accesibles:
| Target | Parametro | Resultado |
|---|---|---|
STB API load.php | MAC cookie, sortby, search, category, p, stb_type | Prepared statements |
Xtream player_api.php | series_id, sort, category_id, username, password, vod_id, stream_id | Prepared statements / PHP crash |
Xtream panel_api.php | Todos los params | Prepared statements |
Check Point 2019 vclub | sortby (SLEEP, FLOOR/RAND, UNION) | Tabla vacia — sin ejecucion |
Conclusion: Todos los parametros usan prepared statements. El crash en series_id es un error de PHP (type casting), no SQL injection.
SSRF — Sin Fetch Saliente
Probamos 16 endpoints buscando Server-Side Request Forgery:
| Endpoint | Parametro | Resultado |
|---|---|---|
itv/create_link | cmd, url | {"js":[]} — ignora |
stb/get_url | url | {"js":[]} — ignora |
stb/proxy | url | {"js":[]} — ignora |
epg/get | period, ch_id | {"js":[]} — sin fetch |
test_download | url | {"js":[]} — no implementa |
| RTMP notify callback | stream name | Procesa pero no hace HTTP |
Analisis de timing: Inyectamos URLs a puertos cerrados y IPs no enrutables. Si el servidor hiciera fetch, veriamos delays de conexion. Resultado: timing constante — no hay fetch.
Bypass de Routing — 30+ Tecnicas Fallidas
Detalle de tecnicas:
| Categoria | Tecnicas | Resultado |
|---|---|---|
| Method override | X-HTTP-Method-Override, _method, 6 headers | Escapa a Laravel (sin rutas admin) |
| Path confusion | Double slash, encoded slash, dot segments, null byte, CRLF, semicolon, backslash | nginx normaliza todo |
| Entry points | 16+ alternativas PHP (index.php, app.php, api.php...) | Ninguna existe |
| Alternative paths | portal.php, PATH_INFO via load.php | Misma cupula |
| Silex routes | 51 rutas POST probadas | Todas 405 |
| Admin JSON | 10+ rutas _json | Auth middleware -> 404 |
| Internal routes | tools, debug, graphql, rest, api, v1 | Todas 404 |
RCE y Debug — Bloqueados
Check Point 2019 Chain:
- Stage 1 (Auth Bypass): Funciona parcialmente —
type=vclubaccesible - Stage 2 (SQLi): Tabla vclub esta vacia, ORDER BY no ejecuta
- Stage 3 (RCE): Depende de Stage 2
La vulnerabilidad existe en el codigo pero es inexplotable en esta instancia porque no hay datos en las tablas accesibles sin auth.
| Vector | Estado |
|---|---|
_fragment (CVE-2014-4931) | Ruta existe, bloqueada por routing |
| Laravel Ignition (CVE-2021-3129) | Instalado, POST -> 405 (dual routing) |
| Silex debug (_profiler, _wdt) | Registrado pero 403/404 |
| Config leak (.env, composer.json, logs) | Todo 404 o redirect |
| PHP stream wrappers | Ignorados |
| APP_DEBUG info leak | false (sin stack trace) |
| 6 PHP CVEs evaluadas | 0 aplicables (target Linux, sin upload) |
| Type juggling | do_auth ignora todos los params |
| XXE | XML no procesado |
| Check Point 2019 full chain | Auth bypass funciona, SQLi inexplotable (tablas vacias) |
Protocolos No-HTTP
Fuera de HTTP probamos otros vectores:
| Vector | Resultado |
|---|---|
| CL.TE / TE.CL smuggling | 400 nginx strict parsing |
| h2c upgrade | 404 Laravel |
| WebSocket + Host bypass | 404 Laravel |
| CONNECT tunneling | Rechazado |
| HTTP/1.0 downgrade | Sin diferencial |
| Port 31210 header spoofing | 403 (socket-based IP check) |
| SIP :5060 (3 nodos, TCP+UDP) | Sin respuesta |
| RTMP :4499 (10 apps) | Solo /live existe, auth callback deniega |
| SSH user enum (CVE-2018-15473) | Parchado (timing constante) |
| SSH brute force (2700 combos) | Cancelado al 32%, sin exito |
| DNS AXFR (4 dominios x 2 servidores) | Todos denegados |
| nginx MP4 module CVEs | Modulo NO activo en ningun nodo |
| RoadRunner health/metrics | No expuesto |
| set_settings write | Confirmado read-only |