AVERTISSEMENT: Ce sujet s'adresse aux curieux souhaitant aller plus loin dans l'étude de codes malveillants : si ce n'est pas votre cas, peut être devriez vous dès à présent passer votre chemin. L'ensemble de nos âneries sont réalisées dans un environnement adapté à l'étude des codes malveillants sous VM, ne reproduisez jamais ces manipulations sur votre propre système d'exploitation.
L'été est déjà loin, la nuit est tombée. Il est 22h et c'est le big idle sur nos serveurs de discussion : la routine. Glandouille, concentré sur une partie de Klotski sur un niveau plutôt coriace... le client irc s'affole puis émet un son signalant l'arrivé d'une personne sur le clavardoir puis un second, celui d'un message:
@Malekal_morte - "yep j'crois que j'ai les malvertisings mais j'arrive pas avoir les redirections alor ché pas si c'est parce que les redirections ne sont pas activées ou si c'est parce que faut certaines conditions pour que la redirection se fasse et là vu le nombre de sites touchés, devrait y avoir bcp de sujets mais pour le moment quedalle..."
Charabia, me direz-vous? Que nenni, l'homme est ému, enthousiaste, la voix chevrotante...
Le temps de faire chauffer la cafetière, @Malekal_morte m'explique que le sujet concerne son dernier billet Kovter. En résumé, il se diffuse via des malvertising, des publicités piégées à l'insu des annonceurs et des régies, sur des sites pornographiques. Une fois le malware sur le système ce dernier va ouvrir des pages avec du contenu pédopornographique. Vous aviez encore des doutes quant aux limites de la connerie humaine ?
Avant toute chose, je vais jeter un œil à super Kovter indexé sur MalwareDB. ( pour aller directement au sujet, défiler jusqu'à voir ce symbole → )
Je découvre que ce programme, recouvert de plusieurs couches, est écrit en Delphi et qu'il embarque en ressources une configuration chiffrée.

La même configuration, un peu plus lisible.

Le "cp" correspond à "ControlPanel" : la communication se fait depuis "svoirdwiz.org" & "svoirdwiz.biz" via la page "form.php" appellée en méthode POST, etc... voir la capture du traffic pour plus de détails. Les deux noms de domaine ont été achetés chez "PDR Ltd" par deux individus sous le possible sobriquet "Oleg" les adresses sont différentes sauf l'email : "[email protected]" - l'adresse IP 50.7.193.124 est située dans une petite range "50.7.193.120/29", hin.. hin... 6 ips seulement, plutôt rare ;)
Les "popurl" correspondent aux sources des fenêtres intruses et les "poptime", la fréquence. Les noms de domaine, enregistrés chez "Gransy s.r.o", se terminent en .info et pointent sur la même adresse IP "188.40.161.41".
Je prends le temps d'écrire un petit extracteur de config pour scalper à la volée tous les fichiers de la même famille. Bien, bien.. voilà de futures informations intéressantes pour alimenter nos plateformes ( similaires à des produits tels que Maltego, pour ceux qui connaissent )
→ Revenons à ce qui chagrine Malekal, la partie Malvertising. Il m'a indiqué une bannière publicitaire suspecte mais il n'arrive pas à mettre en évidence les mécanismes de la redirection. L'échantillon est une banale animation flash promotionnelle pour sites X.
Pour commencer, j'envoie ce fichier sur des outils automatisés, comme par exemple, Wepawet mais j'ai rapidement des problèmes : le fichier utilise une version de flash non supportée, le fichier n'affiche rien de suspect, rien d'intéressant et en plus VirusTotal retourne un résultat de 0/47 (0%), snif. Conclusion, obligé de décortiquer le bidule en utilisant sa cervelle, dur...
La première étape consiste à vérifier que le fichier téléchargé sur MalwareDB correspond bien à celui que je vais manipuler. Pour cela, j'utilise le petit et puissant utilitaire de SlavaSoft nommé FSUM. J'exécute l'interpréteur de commandes Windows (donc cmd.exe) et je saisi "cd\" (sans les guillemets, CD: Change Directory) pour me positionner à la racine car c'est ici que j'ai téléchargé le zip. Je dézippe le fichier, j'ai alors le fichier "c2f5cf5f06d5df2b9580d01c531ccf00" - le flash - que je renomme en "c2f5cf5f06d5df2b9580d01c531ccf00.swf"
fsum -jnc c2f5cf5f06d5df2b9580d01c531ccf00.swf
c2f5cf5f06d5df2b9580d01c531ccf00 *c2f5cf5f06d5df2b9580d01c531ccf00.swf
Le fichier récupéré est bien identique au fichier distant.
Je vais ensuite décompresser le flash à l'aide de flasm.
flasm -x c2f5cf5f06d5df2b9580d01c531ccf00.swf
c2f5cf5f06d5df2b9580d01c531ccf00.swf successfully decompressed, 638418 bytes
Pour les besoins de l'analyse, je vais télécharger et installer Adobe AIR car il est nécessaire à l'usage de l'outil d'investigation d'Adobe, c'est à dire SWFInvestigator.
Une fois SWFInvestigator installé et exécuté, je fais glisser "c2f5cf5f06d5df2b9580d01c531ccf00.swf" sur le GUI.

L'onglet "SWF Info" vous indique bien que le fichier n'est plus compressé. Avec l'expérience, vous remarquerez que "Has Metadata" et "Local w/ Networking" sont présents, ce qui sera important de garder en tête pour la suite. Utilisez l'onglet "Tag Viewer" pour parcourir ces ressources. Les métadonnées de type RDF/XML contiennent des informations qui peuvent vous aider à répondre à certaines de vos interrogations : Qui ? Quoi ? Quand ? ... ce genre de petites cachoteries.

Les blocs importants sont les DefineBinaryData,
En principe, il n'y en a peu : l'animation.
ID1 : L'animation légitime
<DefineBinaryData id='1' idrefName='Main_swfClass_dataClass' length='595705' />
ff 15 ff 16 09 00 01 00 00 00 00 00 43 57 53 08 | ************CWS* |
Les bytes 0x43,0x57,0x53 confirment que le format de fichier est correct.
ID2 : Là par contre, c'est un bloc inconnu.
<DefineBinaryData id='2' idrefName='Main_storyClass' length='16904' />
ff 15 0e 42 00 00 02 00 00 00 00 00 4f 3d 22 3a | ***B********O=": |
Si je scroll jusqu'à la fin du bloc:

Ce petit morceau ressemble à du JavaScript, en revanche le reste est étrange.
A y regarder de plus près, on y voit des bribes de termes : présence d'une compression ?
Toujours est-il que Malekal avait raison : lorsqu'on ouvre le fichier flash depuis un navigateur, il n'y a pas de redirection malveillante. J'utilise "SWF Disassembler" pour tenter d'y voir plus clair.
Dans la fonction Main() on observe ce qui ressemble fort au chemin complet du projet où le "Main.as" étant le source de l'ActionScript.

"C:\диск F\kent_projects\realgfporn3152\src;;Main.as" Intéressant... je ne détaillerai pas d'avantage ce style d'analyse car c'est un peu compliqué, je vais plutôt vous orienter sur l'analyse dynamique. La raison pour laquelle la redirection ne fonctionne pas est simple, si l'animation est lancée depuis un fichier local alors ça ne fonctionne pas, il faut qu'elle soit "en ligne".
Pour recréer les conditions, je vais aller dans le menu "Utilities" et sélectionner "Mini Web Server". J'indique l'emplacement de mon fichier (C:) dans la section "root directory" puis je laisse par défaut et je valide "Start Listening".
Successfully listening on 127.0.0.1:9080
Le port 9080/TCP en écoute sur ma boucle locale pour simuler un HTTPd.
Je peux désormais utiliser le protocole adéquate depuis le navigateur.
Le traffic sera écouté avec le renifleur Wireshark
Sous Mozilla Firefox, je vérifie que JavaScript est actif puis je saisi l'URL vers mon serveur de fortune: http://127.0.0.1:9080/c2f5cf5f06d5df2b9580d01c531ccf00.swf
L'animation se charge et sans surprise... le renifleur intercepte:
GET /realgfporn2.php?id=312e372e302e3435 HTTP/1.1
Host: kentavr999.com
Un nom de domaine enregistré au bureau "PDR Ltd" par une personne fictive "Richard Sexxxpox" avec l'email "[email protected]", ses NS sont russes et l'hébergeur est l'anglosaxon RedStation. La fameuse redirection manquante tant recherchée par Malekal se révèle enfin.
Pour ce qui est de comprendre le pourquoi du comment, je vais vous épargner les maux de tête ( Pour l'extraction et le décodage avec Malzilla, lire le billet de Jerome ). Pour faire simple, ils transforment un flash sain en flash malveillant à l'aide d'un outil. Celui-ci génère une nouvelle enveloppe flash qui embarque l'animation initiale ainsi qu'un chargeur pour exécuter le code javascript compressé. Ce code décompressé est d'une certaine manière encore compressé puisque le JavaScript est packé avec l'outil de Dean Edwards.

Au final le vil JavaScript, sous sa forme brute, fait... plus de 2300 lignes :o

L'intégralité du JavaScript est ici.
J'ai utilisé le greffon Javascript Deminifier pour Firefox qui permet d'améliorer l'affichage.
Au besoins, vous pouvez dé-obfusquer et embellir en ligne à l'aide de JsBeautifier.
Une approche pas trop compliquée qui permet de se dépatouiller, il y en a d'autres... En cherchant sur le forum, je me suis aperçu qu'il n'y avait rien sur comment décortiquer un fichier flash alors bah... si vous avez appris quelques astuces, c'est cool. Si c'est du chinois, désolé :x
edit: Si vous avez des doutes sur un fichier flash, envoyez le sur urlQuery, si l'encadré "Overview" contient des "urlQuery Alerts" en rouge alors il y a danger.