rtmpsuck: téléchargement de vidéo Flash

Published: 05-09-2017

Updated: 07-09-2017

By: Maxime de Roucy

tags: rtmpdump

Sources :

rtmpdump est un logiciel permettant de télécharger un flux RTMP (captain obvious approved).

RTMP (Real Time Messaging Protocol) est souvent utilisé par la technologie Flash pour faire transiter un flush vidéo.

rtmpdump permet donc en théorie de récupérer la plupart des vidéo flash que le trouve sur le net. Je dit en théorie car dans la pratique l’accès au flux RTMP est souvent protégé par tout un tas de mesure pour empécher le téléchargement de la vidéo (authentification, cookie, port knocking…). Trouver le bonnes options rtmpdump et déjouer ces protection est donc souvent assez ardu.

rtmpsuck est un outil qui vient avec rtmpdump. C’est un proxy transparent qui sauvegarde les flux qu’il fait transiter.

Pour faire simple :

serveur ↔ rtmpsuck ↔ navigateur
              ↓
         sauvegarde

rtmpsuck ne possède qu’une option, -z permettant de passer l’output en debug.

Ni le navigateur, ni le serveur ne « voit » rtmpsuck. La lecture de la vidéo se fait donc normalement sur le navigateur et le flux est sauvegardé en parallèle.

Le tout est donc de faire en sorte que le flux rtmp transite par rtmpsuck.

Pour ce faire je lance une première fois la vidéo dans mon navigateur, en ayant pris soin d’avoir préalablement lancer tcpdump.

max@host % sudo tcpdump -i eth0 -w tcpdump.save

Après quelques secondes je stop la vidéo et tcpdump. Et je cherche dans le fichier de log tcpdump.save l’ip et le port d’où proviennent le flux RTMP. Ici IP 1.2.3.4, port 80 :

max@host % tcpdump -r tcpdump.save -An | grep -B 5 -i rtmp 
… IP 1.2.3.4.80 > 192.168.1.2.12345: …

Il s’agit de la variante RTMPT, c’est du RTMP encapsulé dans du HTTP.

J’ai recherché la chaine de caractère « rtmp », mais j’aurai aussi pu chercher « swfUrl » ou « tcUrl », ce sont des chaînes de caractères qui ont de très forte chance d’être présent lors de l’établissement de la connection RTMPT, cf. section « 7.2.1.1. connect » dans les spécifications du protocol RMTP.

wireshark permet aussi n’analyser le fichier généré par tcpdump. Mais il ne détecte pas automatiquement (en tous cas lorsque j’ai essayé) la présence d’une transaction RTMPT.

Personnellement, j’ai essayé d’utiliser la méthode « Edit → Preferences → Protocols → TCP → Try heuristic sub-dissectors first » sans succès (source: Wireshark doesn’t recognises RTMP streams). En ayant déterminé l’IP et le port effectivement utilisé par le serveur RTMPT (via le grep mentioné précédemment) j’ai pu faire « Clique droit sur l’un des paquets de la connection → Decode As… → RTMPT ». Une fois le flux marqué comme RMTP (RTMPT dans wireshark) il suffit d’appliquer le filtre « rtmpt » pour isoler la communication RTMPT des autres paquets. Je considère donc wireshark comme un très bon outil de visualisation, pour l’apprentissage et la compréhention, mais il n’est pas adapté dans notre cas, pour la recherche de flux RTMPT.

Une fois l’IP (1.2.3.4) et le port (80) du server RTMPT déterminé, on lance rtmpsuck avec un utilisateur différent de celui utilisé pour faire tourner le navigateur, ici « nobody » :

max@host % mkdir rtpmsuck-folder
max@host % chown nobody: rtpmsuck-folder
max@host % cd rtpmsuck-folder
max@host % sudo -u nobody rtmpsuck

Et on demande au noyau de rediriger, tout le traffic sortant à destination de l’IP 1.2.3.4 et le port 80 et n’ayant pas été produit par un programme appartenant à « nobody », vers l’IP 127.0.0.1 et le port 1935 (IP/port d’écoute de rtmpsuck).

max@host % sudo iptables -t nat -A OUTPUT -d 78.109.88.119 -p tcp --dport 80 -m owner \! --uid-owner nobody -j REDIRECT --to-port 1935

Note : j’ai essayé d’écrire la même règle avec nftables mais le hook output du type nat ne semble plus fonctionner ; j’ai créé le bug 1168.

Une fois ces commandes passées, il suffit de recharger la page web et lancer vidéo pour que rtpmsuck commence l’enregistrement.

Une fois terminé, on peut supprimer la règle iptables via :

max@host % sudo iptables -t nat -F

Cette commande supprime aussi toutes les autres règle de la table nat mais s’il y avait d’autre règle c’est que vous savez utiliser iptables… et vous n’avez pas besoin de ce tuto ☺.

Note : J’ai essayé d’utiliser les informations affichée par rtmpsuck pour écrire une commande rtmpdump équivalente (cf. forum ffmpeg) mais ça n’a pas fonctionné.

Je ne suis jamais tombé sur des vidéo en RTMPS, RTMPE ou RTMPTE (transfert chiffré). Normalement ces protocoles sont gérés par rtmpdump (et donc j’espère rtmpsuck) mais je ne sais pas du tout ce que ça donne. De plus, ces formats étant chiffrés je suppose qu’il plus difficile de déterminer l’IP et le port du serveur ; un grep sur l’output de tcpdump a peut de chance de fonctionner.