Aller au contenu principal

Le bruteforce de mac virtuelles, l'épine dans le pied des serveurs IPTV illégaux

· 11 minutes de lecture
Orkanyx
Orkanyx
Createur de cyberforge

Introduction

le 14 Juillet 2024, DAZN, un service de streaming sportif à acquis les droits de la Ligue 1 pour 400 millions d'euros.

Cette dernière propose aux supporters, 2 offres d'abonnement, dont une à 30€ par mois avec engagement de 12 mois (pour regarder l'ensemble des matchs de L1 sauf 1 match diffusés par Bein).

Ainsi, le supporter français doit débourser 45€ par mois rien que pour regarder la ligue 1. Nul besoin de continuer pour prouver que ce système ne fonctionnera pas. D'autant plus que DAZN requiert 1,5 millions d'abonnés afin d'être rentable.

L'usage d'une IPTV est donc une alternative pour ces supporters, lésés de débourser chaque année de plus en plus d'argent afin de regarder leur club favori.

Cet article a pour but de voir le fonctionnement d'une IPTV, ainsi que son serveur et son moyen de connexion/authentification

Disclaimer

Obtenir une IPTV gratuitement en "hackant" un serveur est illégal. Cet article a pour but de vous informer sur le fonctionnement d'une IPTV, et non de vous inciter à en obtenir une gratuitement ou non.

Fonctionnement d'une IPTV

En me renseignant auprès d'autres personnes ayant une IPTV, j'ai identifié 2 méthodes d'authentification pour accéder à une IPTV:

  1. Via un username et un mot de passe, puis via un fichier m3u

Voici comment cette authentification fonctionne :

Fichier m3u

Un fichier m3u est un fichier texte contenant un inventaire de chaines et leur lien de "flux" respectifs.

Si vous voulez en savoir plus, des fichiers m3u publics sont disponibles sur github : https://github.com/iptv-org/iptv

Cependant, j'ai pu remarquer que les noms d'utilisateurs et mots de passes dont générés par le propriétaire du service IPTV, et ces derniers sont généralement complexes. Impossible pour nous de les deviner.

  1. Via une mac virtuelle

Cette méthode d'authentification est notamment utilisée pour les box ou STB (Set-Top-Box, équivalentes aux décodeurs utilisés par les opérateurs traditionnels, cf : https://en.wikipedia.org/wiki/Set-top_box) vendues via des marketplaces telles que Alibaba ou Aliexpress. Voici comment cela fonctionne :

Analyse des requêtes faites par une IPTV (via STB)

  1. Handshake entre la STB et le serveur :

Le STB envoie :

  1. Sa mac virtuelle via le header Cookie (mandatory)
  2. Sa langue (facultative)
  3. Sa timezone (facultative)

Le serveur répond avec un token, qui sera utilisé par la suite.

  1. Demande d'informations sur l'abonnement :

La STB va ensuite demander des informations sur son abonnement, via l'action get_main_info :

Pour s'authentifier, la STB envoie :

  1. Sa mac virtuelle via le header Cookie et en argument GET
  2. Le token reçu précédemment via le header Authorization (Bearer)
remarque

Ces informations d'authentifications seront systématiquement envoyées par la STB dans les requêtes suivantes.

Le serveur répond par la date d'expiration de l'abonnement. Celui ci sera validé par la STB avant demande de flux.

  1. Demande de la liste des chaînes :

La STB demande ensuite la liste des chaînes via l'action get_all_channels :

Le serveur répond par la liste des chaînes disponibles, avec un format JSON.

Le lien de chaque chaîne est de la forme suivante :

http://localhost/ch/<numéro>
  1. Demande d'une chaîne :

Le lien donné est un lien local. Par conséquent, il doit être modifié pour être utilisé par la STB. Cela se fait via l'action create_link :

Le serveur envoie un lien de la forme suivante :

https://<serveur_flux_iptv>/live/<string_aleatoire>/<string_aleatoire>/<numéro_chaine>.ts?play_token$[TOKEN]
remarque

Cette structure à pour but d'éviter un quelquonque partage de lien, ou bruteforce.

Il est aussi important de noter que la durée de vie du token est très faible (environ 2 minutes).

  1. Lecture de la chaîne :

La STB va alors envoyer une requête permettant de lire la chaîne :

remarque

Le chunk dans la réponse correspond bien a un flux vidéo. On notera également le changement du content-type de text/javascript à video/mp2t.

Schéma récapitulatif

Méthodologie d'attaque

Supposons maintenant que l'on veuille trouver une mac virtuelle valide. Il nous faudrait forger 2 requêtes :

  1. Handshake :
GET /portal.php?action=handshake&type=stb&token=&mac= HTTP/1.1
Host: <serveur_iptv>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: */*
Cookie: mac=<mac_a_trouver>;stb_lang=en;timezone=Europe/Paris

Si la réponse du serveur est un code 200, alors la mac virtuelle est valide. Cependant, elle peut ne pas être rattachée à un abonnement actif.

Pour le vérifier, on va demander au serveur si la mac possède effectivement un abonnement actif :

  1. Demande d'informations sur l'abonnement :
GET /portal.php?type=acount_info&action=get_main_info&mac=<mac_precedente> HTTP/1.1
Host: <serveur_iptv>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: */*
Authorization: Bearer <token_precedemment_obtenu>
Cookie: mac=<mac_a_trouver>;stb_lang=en;timezone=Europe/Paris

Nous aurons une réponse de la forme suivante :

{
"js": {
"mac": "<mac_trouvée>", "phone": "<date_de_fin_abonnement>"
}
}

Ainsi, il sera possible de faire le tri entre les mac virtuelles valides mais expirées, et les mac virtuelles valides et actives.

Il est possible alors de faire son propre script de bruteforce, ou alors d'utiliser un outil tel que 'mcbash' qui le fait également très bien :

Lien : https://github.com/dougy147/mcbash

Reconnaître et trouver des serveurs IPTV

Une mac adresse est constituée de 6 octets, soit 48 bits. Cela représente 281 474 976 710 656 combinaisons possibles. C'est possible de deviner cette mac virtuelle, mais cela demandera du temps.

En analysant les différentes fuites d'informations, j'ai pu constater que toutes les MAC commencent par 00:1A:79. Cela ramène le nombre de possibilités à 2^24 (16 777 216).

Toujours avec ces différentes fuites d'informations, j'ai pu relever plusieurs points communs entre eux :

  1. Les serveurs IPTV répondent tout le temps sur l'endpoint /c/
  2. Les serveurs IPTV ont comme noms communs stalker_portal ou PORTAL
  3. Le code html contient souvent le terme stb

Exemple :

Avec ces informations, il est possible de créer un filtre sur Shodan afin de trouver des serveurs IPTV.

http.html:stb http.html:version.js
remarque

Au vu du nombre de requêtes limité disponibles sur shodan, j'ai visé large pour ensuite filtrer les résultats

version.js est un fichier commun à tous ces IPTV. Je fais un premier filtre afin de réduire le nombre de résultats.

La requête donne 133 serveurs IPTV, assez pour pouvoir commencer.

Probabilités et faisabilité de l'attaque

TLDR

Cette partie est très calculatoire et facultative mais nécessaire pour comprendre la faisabilité de l'attaque.

TLDR : Nous avons 92% de chance de trouver une mac virtuelle valide en 1 jour.

Partie très calculatoire (attention les yeux)

Probabilité de trouver une mac virtuelle valide en 24h

attention

Veuillez voir cette partie avec le thème sombre, car les équations sont écrites en blanc. Sorry, limitation de docusaurus.

Nous avons vu que le nombre de possibilités pour obtenir une mac virtuelle par server est de 2^12, soit un peu plus de 16 millions de possibilités.

On considère que l'on envoit 1 requête par seconde, et que le nombre d'abonnés moyen sur un serveur iptv est de 500.

Ainsi, la probabilité de ne pas gagner sur un seule tirage est égale à :

On peut ensuite calculer la probabilité de ne pas gagner tous les tirages, c'est a dire de faire chou blanc pour un jour :

Enfin, on peut donc calculer facilement la probabilité de gagner au moins un tirage, c'est a dire de trouver une mac virtuelle valide :

Nous avons 92% de chance de trouver une mac virtuelle valide en 1 jour.

Recalcul des probabilités pour 10 serveurs

Cependant, nous pouvons tomber sur un serveur qui nous bloque dès la 5ème requête par exemple, réduisant nos chances à 0.

Pour réduire ce phénomène, et augmenter nos chances de succès, nous avons 2 options :

  1. Réduire le nombre de requêtes par seconde, mais cela réduit drastiquement nos chances de succès, et ne garantit pas que le serveur ne va pas nous bloquer par la suite.
  2. Cibler plusieurs serveurs en même temps, ce qui augmente nos chances de succès, même si un serveur nous bloque.

Ainsi, recalculons les probabilités pour 10 serveurs a la fois, mais 2 serveurs ne contiennent aucune mac valide (soit parce que l'on a été bloqué, soit pour une autre raison).

On rappelle que la probabilité de ne pas gagner par tirage est de 0.999970, et que les tirages sont indépendants.

Nous pouvons donc calculer la probabilité de ne pas gagner sur 8 tirages (1 seconde = 8 tirages) :

Même calcul, mais sur 24h :

On peut donc en déduire la probabilité de gagner au moins une fois sur 24h :

La probabilité est équivalente au cas n°1, mais nous avons bien pris en compte l'éventualité de serveurs "bloquants".

Ecarts et expérience

Evidemment, 2 serveurs sur 10 qui ne répondent plus est une statistique arbitraire. Cela peut être plus, ou moins.

Cependant, après avoir lancé ce même scénario sur 10 serveurs IPTV, j'ai pu constater que la première mac à été trouvée en environ 4h :

A savoir que mes paramètres étaient les suivants :

  • 10 serveurs
  • 1 requête par seconde
  • Pause de 2 secondes par 10 requêtes
  • Serveur considéré comme inactif si aucune réponse en 10 secondes
remarque

Par ailleurs, les MAC valides sont généralement groupées, ce qui peut ajouter de l'incertitude sur nos calculs.

Ici, les mac proches de la mac trouvée précédemment étaient également valides :

Par conséquent, il est également possible de trouver plusieurs mac valides en même temps en changeant les derniers bits.

Résultats

Ici sont les résultats obtenus sur 10 serveurs :

Lire une IPTV avec la mac virtuelle

Une fois que vous obtenez une mac virtuelle, pour lire le contenu, vous avez 2 possibiltés :

Via STBEmu (Android / Android TV)

https://play.google.com/store/apps/details?id=com.mvas.stb.emu.free&hl=fr&pli=1

L'application STBEmu disponible sur le playstore gratuitement permet d'émuler une box STB sur votre téléphone afin de lire n'importe quelle chaine.

Une fois l'application installée, il vous suffit de modifier 2 paramètres dans le profil que vous crééz :

  1. Dans "Portal Settings", puis "Portal URL", entrez l'url du serveur IPTV (ne pas oublier de mettre le port), avec /c a la fin
  2. Dans "STB Configuration", puis "Mac Address", entrez la mac virtuelle que vous avez trouvée
remarque

Le serial number est aussi transmis au serveur mais non contrôlé. Vous pouvez laisser le paramètre par défaut.

Une fois de retour sur la page principale, appuyez sur le bouton en haut à gauche (les trois bâtons), puis sur "Reload Portal". Vous devriez voir les chaines apparaitre.

Via PiTV (Windows / Mac / Linux)

Télécharger le binaire correspondant a votre plateforme sur https://github.com/ozankaraali/PiTV/releases/tag/latest

Puis renseignez les informations que vous avez trouvées :

Conclusion

Nous avons vu comment fonctionne une IPTV, et notamment les différentes méthodes d'authentification. Ces dernières peuvent être mal conçues, mal protégées et permet donc d'avoir accès à un service IPTV sans forcément devoir payer.

Sur un autre point, le fait que les frais nécessaires pour un français moyen augmentent autant pour accéder à un contenu d'un sport, qui rappelons le, est un sport populaire est inadmissible.

Il est donc normal que des personnes cherchent des alternatives, et l'IPTV en est une. Augmenter les prix tout en essayant d'éradiquer ces moyens alternatifs est futile. Pour cause, 200 000 personnes ont assisté au match d'ouverture de la ligue 1 2024-2025 via Telegram. Un record.

Le pari de DAZN est risqué, voir perdu d'avance...

Enfin, je souhaiterais insister sur un point, financer l'IPTV équivaut à financer des groupes potentiellement criminels. J'encourage les personnes qui souhaitent regarder les matchs de L1 à utiliser des moyens légaux, tels que la chaine youtube https://www.youtube.com/cazetv qui diffuse gratuitement les matchs, depuis le brésil (utilisez un VPN au brésil).