Análisis técnico real de f1live.me / dervlin.me / seckyes.cc Desmontando 4 capas de defensa: tokens firmados, anti-iframe, detector de sandbox y Cloudflare. Fecha del análisis: Octubre 2026


Índice

  1. El reto
  2. El mapa de la cadena
  3. Capa 1 — Tokens firmados que caducan
  4. Capa 2 — Validación de Referer y contexto
  5. Capa 3 — El detector de sandbox (la trampa genial)
  6. Capa 4 — Cloudflare: la barrera final
  7. Por qué NO se puede automatizar
  8. Por qué NO se puede quitar la publicidad
  9. Lo que SÍ funciona
  10. Conceptos para seguir aprendiendo
  11. Glosario

El reto

Queríamos dos cosas simples (en teoría):

  1. Reproducir el canal de F1 (Sky Sports F1) sin toda la web alrededor — solo el video.
  2. Quitar la publicidad que aparece encima.

Lo que encontramos en el camino: un sistema anti-bot de 4 capas que hace técnicamente imposible ver el video sin aceptar la publicidad.


El mapa de la cadena

El video no está en f1live.me. Está escondido detrás de una cadena de 4 saltos:

┌─────────────────────────────────────────────────────────────────┐
│  1. f1live.me/sky-sports-f1-sky-f1/formula-1/1                   │
│     La página "bonita": menús NFL/NBA/F1, chat, tags, ads.       │
│     Solo contiene un <iframe>.                                    │
└────────────────────────────┬────────────────────────────────────┘
                             │ <iframe src=...>
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  2. embedsports.me/motorsports/sky-sports-f1-sky-f1-stream-1     │
│     El "embed". Carga embed.min.js + siteConfig (tokens).         │
│     Aquí vive el anti-bot y el detector de sandbox.               │
└────────────────────────────┬────────────────────────────────────┘
                             │ JS construye con tokens firmados
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  3. dervlin.me/sd0embed/motorsports?pid=5&v=skyf1&...            │
│     El reproductor JW Player + HLS + P2P.                         │
│     Aquí se genera la URL real del stream.                        │
└────────────────────────────┬────────────────────────────────────┘
                             │ construye URL firmada
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  4. seckyes.cc?scode=sv2.xxx&stream=xxx&expires=xxx&...          │
│     El manifiesto .m3u8 detrás de CLOUDFLARE.                     │
│     Sin cf_clearance → 401. Sin TLS de Chrome → 400.              │
└─────────────────────────────────────────────────────────────────┘

Cada salto añade una capa de seguridad. Vamos una por una.


Capa 1 — Tokens firmados que caducan

En la respuesta de embedsports.me, el servidor inyecta un JSON en cada visita:

const siteConfig = {
  csrf:        "YjQ2MzZjNTRjZWRhYWFiZDVhMzIyNjMzN2E4OWJiMzcyθ...",  // base64 enorme
  csrf_ip:     "gygZRDIEO8iTmn+1qb/aT17KR5TObPvjXvfAv+CobNIBvRSBtSKw/...",
  sec_hash:    "BmMfPIIybm4sclCFeRdb2w",
  sec_expires: 1792435119,
  tracker:     "pge=embed&lang=en&dom=em&ref=...",
  trackerUrl:  "https://shop.lbeato.store"
};

Qué es cada campo

Campo Qué es Para qué sirve
sec_expires Timestamp Unix La firma caduca (~60 segundos)
csrf Token anti-CSRF: base64(hex.hex.firma) Evita peticiones falsificadas
csrf_ip Token cifrado que contiene tu IP Ata la sesión a tu dirección IP
sec_hash Hash corto Valida la combinación de tokens
trackerUrl Dominio de tracking Telemetría / anti-fraude

El detalle importante

Fíjate en la estructura de csrf:

YjQ2MzZjNTRjZWRhYWFiZDVhMzIyNjMzN2E4OWJiMzcy...  .  M...  .  ZDM4NGYwZTdlMjkz...
└──────── primer segmento ────────┘      └─ ts ─┘   └─── firma (parece HMAC) ───┘

Es una URL firmada. El servidor la valida con una clave secreta y rechaza cualquier manipulación.

Consecuencia: aunque copies la URL, muere en ~60 s y está atada a tu IP. No puedes “guardarla” para usar después.


Capa 2 — Validación de Referer y contexto

Esta es la parte anti-hotlinking. En el código de embedsports.me está literal:

// Si soy la ventana de arriba (no estoy dentro de un iframe) → BLOQUEADO
if (window.top === window.self)
    return e("Direct access blocked, place iframe embed code on your website.");

// Si no tengo referer → BLOQUEADO
if (!(document.referrer || location.ancestorOrigins?.length))
    throw e("Referrer check failed, null referrer not allowed");

Qué implica

El reproductor solo funciona dentro de un <iframe> y solo con un Referer real:

Escenario ¿Funciona? Por qué
Abrir la URL del player directamente ❌ window.top === window.self
Abrir desde un archivo file:/// ❌ Referer = null
Abrir desde una web normal (http/https) ✅ Tiene referer y está en iframe
Con sandbox en el iframe ❌ Lo detecta (ver Capa 3)

Consecuencia: no puedes abrir el player “solo”; necesitas una página padre legítima que lo embeba.


Capa 3 — El detector de sandbox (la trampa genial)

Esta es, sin duda, la parte más astuta y donde se responde tu pregunta principal. ¡Aquí está el por qué no puedes quitar la publicidad!

El truco

El sitio inyecta en el DOM un objeto invisible:

if (esDispositivoRaro || esEdge) {
  document.body.insertAdjacentHTML("beforeend",
    '<object data="data:application/pdf;base64,aG1t" ' +
    'width="1px" height="1px" ' +
    'style="position:absolute;top:-500px;left:-500px;visibility:hidden;" ' +
    'onerror="sandDetect();this.remove()"></object>');
}

window.sandDetect = () => e("Remove sandbox attributes on the iframe tag");

Cómo funciona (el bait anti-adblock)

  1. Crea un <object> con datos basura (aG1t = “hmt” en base64).
  2. El objeto falla al cargar.
  3. Si el iframe tiene sandbox, el navegador bloquea la carga del objeto → dispara onerror.
  4. onerror llama a sandDetect() → te muestra “Remove sandbox attributes on the iframe tag” y mata el video.

Por qué esto es clave

El video y la publicidad comparten el MISMO entorno de ejecución.

  • El anuncio necesita: popups, redirecciones, objetos, formularios, top-navigation.
  • Si le pones sandbox al iframe para cortar eso → el objeto de prueba falla → el player detecta que bloqueaste la publicidad → se niega a reproducir.

Es monetización coercitiva disfrazada de “seguridad”:

    ┌──────────────────────────────────────┐
    │  Elige:                              │
    │                                      │
    │   A) Ves el video CON publicidad  ✅ │
    │   B) Bloqueas publicidad → NO video  │
    │                                      │
    │   No existe opción C.                │
    └──────────────────────────────────────┘

Capa 4 — Cloudflare: la barrera final

Cuando el player por fin construye la URL del stream:

https://seckyes.cc?scode=sv2.08ab3c20...&stream=yehe4ipo9...&expires=1792435224
   &u_id=stlan-fd6b28f7...&session_id=9e59bfde...&host_id=s-b3

Y ahí responde Cloudflare:

HTTP/2 401
server: cloudflare
cf-ray: a4d44fb40ef670a7-EZE
nel: {"report_to":"cf-nel","success_fraction":0.0,...}
cf-cache-status: DYNAMIC

Qué valida Cloudflare (4 checks)

Se emite solo tras pasar un challenge JavaScript (o captcha). El navegador debe resolver un problema criptográfico antes de recibirla.

2. Fingerprint TLS (JA3/JA4)

Cloudflare analiza cómo se negoció el cifrado HTTPS (orden de cifrados, extensiones, curvas). Python y curl tienen una “firma” distinta a Chrome.

Prueba real: curl → 401, yt-dlp (petición propia) → 400. Misma URL, misma cookie. Solo cambia el “olor” TLS.

3. Binding a IP + User-Agent

La cookie cf_clearance está atada a:

  • La IP que la generó
  • El User-Agent del navegador

Cámbialos → la cookie deja de valer.

4. Cookies particionadas (CHIPS)

Si la cookie se crea dentro de un iframe, Cloudflare la guarda particionada por el sitio de arriba (SameSite=None; Secure; Partitioned). No se puede reusar en otro contexto/dominio.


Por qué NO se puede automatizar

Junta las 4 capas y obtienes una cadena de requisitos que deben cumplirse simultáneamente:

Requisito Capa que lo impone Cómo se “sortea”
IP concreta csrf_ip + cf_clearance Misma IP (nada de proxies)
Token fresco (<60 s) sec_expires Regenerar pedido por pedido
Dentro de un iframe con referer Capa 2 (referer check) Página padre real
NO tener sandbox Capa 3 (detector <object>) Sacrificar bloqueo de ads
Pasar challenge JS Cloudflare (cf_clearance) Navegador real
Fingerprint TLS de Chrome Cloudflare (JA3/JA4) Navegador real (no curl/python)
Mismo UA que generó la cookie Cloudflare binding No cambiar UA

La conclusión dura

Es un sistema cerrado de confianza. El único cliente que acepta es:

Un navegador real, con tu IP, con tus cookies frescas, viendo su publicidad.

Todo lo demás — curl, yt-dlp, Chromium headless, iframes con sandbox — se detecta y se bloquea.

Evidencia de nuestros intentos

Intento Resultado Quién lo bloqueó
curl con URL firmada válida 401 Cloudflare (TLS fingerprint)
yt-dlp (petición propia) 400 Cloudflare
Chromium headless (Selenium) 403 en dervlin Anti-bot de comportamiento
nodriver (headless) no navega / no arranca Detección de automatización
iframe con sandbox cartel anti-adblock Capa 3 (detector object)
Página en file:// “null referrer not allowed” Capa 2

Por qué NO se puede quitar la publicidad

Respuesta directa a tu pregunta. No se puede separar el video de la publicidad por estas razones:

  1. Mismo circuito (Capa 3): el player detecta si bloqueas el entorno que el anuncio necesita. Bloqueas ads → no hay video.

  2. uBlock solo corta red, no decides qué es “el video”: el bloqueador de anuncios corta peticiones a dominios de ads. A veces el video sigue; a veces hay una verificación de que el anuncio “cargó”. En este sitio, la Capa 3 asegura que la verificación falle si bloqueas.

  3. El anti-bot está fundido con la monetización: no es que los desarrolladores sean torpes; es diseño deliberado. Es “o aceptas la publicidad o no hay contenido”.

  4. Rendirse y usar un reproductor externo (mpv): ahí no hay publicidad porque no abres la web. Pero mpv necesita la cookie cf_clearance (Capa 4), que solo tu navegador real puede generar. Reutilizas tu sesión; no la automatizas desde cero.


Lo que SÍ funciona

Opción 1 — Tu navegador + uBlock Origin (la más simple)

  • Instala uBlock Origin (bloqueador por red, no toca el iframe).
  • Abre el player.
  • A veces el video sigue: el bloqueador corta dominios de ads, y el player no siempre lo detecta. Es una lotería, pero es gratis.
  1. Abre el player en tu navegador real y dale Play.
  2. F12 → Network → filtra m3u8 → Copy as cURL.
  3. Pasa esa URL + cookie a mpv/yt-dlp → sin publicidad, sin navegador.

No es automatizable desde cero, pero reutiliza tu sesión ya autorizada.

Opción 3 — Aprender de esto (lo que estás haciendo)

Entender estas capas es una excelente introducción a:

  • Seguridad web ofensiva y defensiva
  • Anti-bot / anti-scraping
  • Privacidad y fingerprinting

Conceptos para seguir aprendiendo

Concepto Qué es Busca
JA3 / JA4 Huella del handshake TLS. Delata curl vs Chrome “TLS fingerprinting JA3”
Cloudflare Turnstile El challenge JS moderno (reemplaza reCAPTCHA) “Cloudflare Turnstile managed challenge”
CHIPS Cookies particionadas por sitio de arriba “CHIPS partitioned cookies”
HMAC-signed URLs URLs firmadas con clave secreta “URL signing HMAC”
Anti-adblock bait El truco del <object> roto “anti-adblock bait object”
Token binding Atar sesiones a IP/UA “session token binding”
HLS / m3u8 Formato de streaming (Apple) “HLS m3u8 format”
P2P streaming Distribuir video entre usuarios “P2P HLS P2pEngine”

Cómo experimentar (ético)

  • Monta tu propio Cloudflare delante de un sitio de pruebas y mira los headers.
  • Usa curl --http2 vs curl --http1.1 y compara respuestas.
  • Explora chrome://net-export/ para ver tus propias conexiones TLS.
  • Lee la doc de Cloudflare sobre fingerprinting y CHIPS.

Glosario

  • cf_clearance: cookie que demuestra que pasaste el challenge de Cloudflare. Dura 30–60 min.
  • csrf: Cross-Site Request Forgery; aquí un token firmado anti-manipulación.
  • Referer: cabecera que dice de qué página vienes. Sirve para anti-hotlinking.
  • sandbox: atributo de <iframe> que restringe lo que el contenido embebido puede hacer.
  • iframe: ventana embebida dentro de otra página.
  • m3u8 / HLS: lista de segmentos de video (manifiesto) usada para streaming.
  • JA3/JA4: hash de la configuración TLS del cliente. Un ID de “quién llama”.
  • CHIPS: cookies separadas por el sitio de arriba (particionadas).
  • HMAC: firma criptográfica con clave secreta.

Resumen final

Pregunta Respuesta corta
¿Por qué curl falla? Cloudflare detecta el fingerprint TLS
¿Por qué yt-dlp falla? Igual: petición HTTP no es Chrome
¿Por qué headless falla? Anti-bot de comportamiento (403 en dervlin)
¿Por qué el sandbox mata el video? El detector <object> envenenado (Capa 3)
¿Por qué no puedo quitar los ads? El video y los ads comparten circuito; si bloqueas el entorno de ads, no hay video
¿Se puede automatizar 100%? No de forma estable: exige navegador real + IP + cookies + ads
¿Qué SÍ funciona? uBlock en tu navegador, o mpv con tu cookie capturada

Moraleja: la “seguridad” aquí no protege al usuario; protege la monetización. El anti-bot y el anti-adblock son la misma cosa disfrazada de dos.


Análisis realizado con fines educativos. Todos los datos se obtuvieron de respuestas públicas del sitio.