Maker is dead

Contexte

Un maker est retrouvé mort dans un incendie, les pompiers déclarent que la cause de l'incendie provient d'une imprimante 3D. Dans l'incendie, ils récupÚrent une clef usb et un raspberry pi à analyser.

Partie I

Lord of War 1/4

Piste de recherche : flag.txt

Pour commencer, nous avons deux images disques :

  • Raw1.dd qui correspond Ă  la clĂ© USB retrouvĂ©

  • Raw2.dd qui correspond au raspberry

Les 4 premiÚres étapes du challenge consiste à récupérer des informations dans le Raw1.dd

Je commence par lister le contenu de cette image :

Je découvre 3 partitions, dont une plus importante que les autres, la numéro "002" qui contient un systÚme de fichier NTFS.

Je décide de regarder ce quelle contient :

Un fichier "Flag.txt" intĂ©ressant... ça semble ĂȘtre ce que l'on cherche vu notre piste de recherche ! J'extrait le fichier :

J'ai mon premier flag ! ECW{59b931696910632cd89986ccbf626e388055477e} + 50 points

Lord of War 2/4

Piste de recherche : WALLET

Cette fois ci, on recherche quelque chose en rapport avec "Wallet" :

  • Portefeuille

  • Cryptomonnaie

  • Bitcoin, Ethereum ?

Je commence par chercher le mot clé dans l'image disque, mais sans succÚs :

Je décide donc d'approndir ma recherche dans les autres fichiers trouvé précemment !

J'ai Ă  ma disposition :

  • 2 fichiers PDF

  • 2 VidĂ©os

  • Un jeu d'Ă©chec

AprÚs quelques recherches dans le fichier PDF et les vidéos, aucune information semble pertinente pour cette piste "Wallet", je décide d'éplucher le jeu d'échec.

Le fichier PgnChessBook/READ_ME_FIRST.txt nous apprend qu'il est possible à partir du programme PgnChessBook/Install_PgnChessBook.exe d'importer une partie d'échec si elle est au format .pgn, ça tombe bien nous avons le fichier PgnChessBook/my_best_game.pgn.

J'éxécute le programme et j'importe le fichier :

AprĂšs quelques tests de simulation de la partie, on se rend vite compte qu'elle n'a aucun sens car les deux joueurs placent leurs pions n'importe comment.

Les données contenue dans le fichier my_best_game.pgn semblent d'autant plus étrange :

Je décide d'effectuer quelques recherches sur ce format.

Je tombe sur le dépot github d'un certain "jes" https://github.com/jes/chess-steg qui a développé un outil pour encoder/décoder du texte au format pgn.

Il met en plus Ă  disposition un outil en ligne : https://incoherency.co.uk/chess-steg/

Et cette fois ci, la piste de recherche prend tout son sens :

On découvre une conversation entre "Drewski" et "Yuri".

Drewski semble vouloir acheter quelques choses Ă  Yuri Ă  travers des cryptomonnaies, Drewski procĂšde Ă  un paiement, et Yuri lui envoie un fichier "stl". Mais quelque chose se passe mal... car Yuri veut dans ses derniers messages, tuer Drewski. Drewski serait-il le maker mort dans l'incendie ?

En attendant, j'ai mon 2Ăšme flag : ECW{6d064b364f2a315c32fd25184256c1278b12ee73} + 50 points

Lord of War 3/4

Piste de recherche : 2eme flag.txt

Pour cette 3Úme étape, nous recherchons un deuxiÚme fichier flag.txt sur l'image disque de la clé usb.

Ce fichier est peut-ĂȘtre cachĂ© dans les 2 fichiers pdf restant, oĂč dans les 2 vidĂ©os.

Je remarque un dĂ©tail important concernant les deux vidĂ©os, elles font la mĂȘme durĂ©e, mais la vidĂ©o VOST Ă  une taille pratiquement deux fois plus grandes que l'autre.

On pourrait penser que les sous-titres sont la cause de cette différence de taille... je décide de les analyser !

La vidéo est l'épisode 1 de la saison 1 de la série Mister Robot.

Un détail m'interpelle, certaines lettres dans les sous titres sont écrites en italiques :

J'extrait les sous-titres de la vidéo avec l'outil ffmpeg :

On retrouve les caractÚres en italiques encadré par les balises <i></i>. En les récupérant un à un, on obtient idontignoreyouboby.

Autre dĂ©tail, je remarque dans les sous-titres la chaĂźne scC<=:7b:?rCJAE$Ac4b mais elle semble ĂȘtre chiffrĂ©.

L'un des PDF (Wiki.pdf) disponible sur la clé usb, on nous donne des informations sur le ROT13, une technique de chiffrement par décalage :

Vu l'alphabet utilisé pour cette chaßne chiffré, le ROT13 n'est pas adapté. En revanche le ROT47 oui, car il prend en charge les caractÚres spéciaux, j'obtiens une clé : D4rklif3inCryptSp4c3

Maintenant, j'ai deux clés potentiels, mais je ne sais pas quoi en faire !

AprÚs quelques recherches par mots clés sur google, je trouve mon bonheur, un article de Korben qui semble intéressant :

Cacher un conteneur TrueCrypt dans une vidéo

Que dit l'article :

Martin Fiedler, un allemand portant le pseudo KeyJ a mis en ligne sur son blog, une mĂ©thode permettant d’intĂ©grer dans une vidĂ©o MP4, un conteneur TrueCrypt... Avant de commencer, il faut trouver un MP4 ou un MOV qui soit crĂ©dible pour le transport. C’est Ă  dire un film qui soit suffisamment bien encodĂ© et de bonne qualitĂ©, pour qu’une augmentation de sa taille n’éveille pas les soupçons. Une sĂ©rie de 500 Mo que vous ferez grimper Ă  700 Mo pourra faire l’affaire si la qualitĂ© est au rendez-vous.

Comment cela fonctionne ?

Plus de détails

Et si nous avions un container chiffré dans notre vidéo ? Cela expliquerai sa taille importante et l'existance des clés pour le déchiffrer !

3Úme mission réussie ! le flag est à nous : ECW{40474cc4ffb7874ebab39da9d1a16caaa9f06b07} + 100 points

Lord of War 4/4

Pour ce dernier challenge, il n'y a pas de piste de recherche.

Le container veracrypt contenait 3 autres fichiers :

  • Un fichier pdf

  • Un fichier gcode

  • Un fichier kdbx

Le fichier Brandalism.pdf n'est pas intéressant car il est identique à celui mis à disposition par l'entreprise Brandalism sur internet (sha256sum identique).

Le fichier Liberator.gcode semble intéressant, car le "gcode" est un langage pour donner des instructions à une imprimante 3D. Mais ce fichier ne cache aucun secret, à part le logo des organisateurs du CTF.

Le dernier fichier est un keepass, j'essaye de l'ouvrir avec la clé récupéré précédemment idontignoreyouboby :

Et ça marche, le flag de cette derniÚre étape de la premiÚre partie était caché ici !

ECW{9dc2896d55b56eb19f59d544383f832644381817} + 100 points

Partie II

Cette deuxiÚme partie est constituée de 3 étapes et l'analyse se concentre sur l'image disque du rapsberry, c'est à dire le fichier Raw2.dd

Burn After Reading 1/3

On nous donne les informations suivantes :

Suite de l'enquĂȘte sur le maker dĂ©cĂ©dĂ© dans des conditions suspicieuses...

Une piste de recherche : Point d'entrée

Ici, on doit chercher une trace, qui montrerait le point d'entrée de l'attaquant. Et pour trouver une trace, on vise automatiquement les logs.

Malheuresement, cette image disque du raspberry est chiffré avec Luks ! mais heureusement, le maker a enregistré la clé de déchiffrement dans le fichier keepass :

Il suffit de monter la partition chiffrée avec la clé "3DPiting" :

On a désormais accÚs au raspberry.

Comme dit ci-dessus, nous recherchons une "trace", quoi de mieux que les logs pour trouver cela ?

Nous savons que le maker est mort dans un incendie, suite Ă  l'attaque d'un pirate. Nous devons retrouver le point d'entrĂ©e du pirate... le fichier auth.log semble ĂȘtre l'un des plus pertinent pour lister les tentatives d'authentification.

Je découvre des traces qui semblent malveillante vers 13:50:59 :

L'utilisateur de "pihole", un outil pour bloquer les publicités, à supprimer et ajouter des noms de domaines aux listes de blocage de pihole.

Un nom de domaine est particulier : http://RUNXe2VkOTM3NWYzMGJkMjIwNzdjZmRkNDk3YWU3YzJhZWYxYmI0YjgzMmZ9Cg==

Il s'agit d'une chaine encodé en base64, et si on l'a décode :

Nous avons notre flag : ECW{ed9375f30bd22077cfdd497ae7c2aef1bb4b832f} + 50 points

Burn After Reading 2/3

Piste de recherche : Fichiers Ciblés

Rappelons nous, Yuri, le pirate avait envoyé un fichier "STL", ce fichier est utilisé par les imprimantes 3D. Je décide d'analyser les fichiers que l'imprimante du maker à utilisé.

La solution "octoprint" est installé sur le raspberry, cette solution permet de contrÎler les opérations d'une imprimante 3D.

Les fichiers imprimés par l'imprimante sont stockés dans le répertoire uploads/

On découvre 6 fichiers, ouvrons les tous !

CE3PRO_Table_Hanger.gcode

CE3PRO_corona.gcode

CE3PRO_MIG-29_kit.gcode

CE3PRO_Naomi__Wu.gcode

CE3PRO_unbelievable.gcode

Cool, on a notre flag ! ECW{f79d8842c644881ddf017e0928e87710c0a15d84} + 50 points

Burn After Reading 3/3

Piste de recherche : Le virus

Pour cette derniÚre et ultime étape, nous devons retrouver le virus qui a tué le maker (non ce n'est pas le corona virus)

On imagine qu'il y a une action sur l'imprimante pour que celle-ci prennent feu, et tue Drewski...

Le meilleur moyen de retrouver ce "virus", est de tracer une timeline des événement, le dernier jour ou le raspberry a fonctionné.

Actuellement, le seul élement malveillant que nous avons, est le nom de domaine louche, ajouté par le pirate à travers pihole.

La photo en plus grand

L'ensemble de l'attaque est maintenant tracée, un élément est particuliÚrement étrange... il s'agit du script basic-install.sh.

C'est le premier Ă©lĂ©ment louche Ă  ĂȘtre prĂ©sent sur le raspberry, d'une part par son horaire de crĂ©ation sur le serveur et d'autre part par son contenu.

Voici un échantillon de ce qu'il contient :

Le script bash semble avoir été obfusqué avec Bashfuscator, malheuresement pour nous, il n'existe pas de désobfuscateur


AprĂšs avoir sandboxer ce petit script, qui peut-ĂȘtre contient un virus, je l'Ă©xĂ©cute pour voir ce qu'il me donne. Quelques secondes d'attente, et le code source d'une page web s'affiche, la page youtube d'un clip de Kenji Girac...

Cela ne nous avance pas beaucoup...

Analysons la structure du fichier :

  • Il contient Ă©normĂ©ment d'expression Ă©trange comme ${@//\{twl}

  • Au dĂ©but du fichier, nous avons une redirection (<<<) :

    • ${*^^} "${@}"ba"${@%4GJp}"s'h' ${*%%x\{&|q\]l} "${@/\(mL\`U./>l\"rs}" <<< "$( "${@//F\[sym/8%wS;k43}"

Ce fameux "<<<" permet en bash, d'afficher ou d'éxécuter une commande en input.

Que ce passe t'il si je remplace ${*^^} "${@}"ba"${@%4GJp}"s'h' ${*%%x\{&|q\]l} "${@/\(mL\`U./>l\"rs}" par un simple cat pour afficher la commande lancée...

La commande curl qui récupÚre la page youtube du clip de Kenji s'affiche, cool !

Le fichier cache peut ĂȘtre une aute occurence de cette fameuse redirection "<<<"

Je trouve une deuxiĂšme redirection identique ! Le fichier utilise un OU pour lancer deux commandes :

bash <<< printf $(...) || bash <<< printf $(...)

Je n'ai plus qu’à rĂ©cupĂ©rer la deuxiĂšme commande... MĂȘme opĂ©ration que toute Ă  l'heure, j'ajoute cat devant le deuxiĂšme "<<<" :

Nous avons notre dernier flag ! ECW{7aaceb8d3e60402d94079707d2430c7394d916eb} + 100 points

Quel était l'objectif de ce virus ?

  • Trouver tous les fichiers gcode prĂ©sent sur le raspberry

  • Pour chaque fichier trouvĂ© :

    • Il injecte une commande invalide Ă  la fin du fichier

Un grand nombre de commandes invalides a peut-ĂȘtre fait bruler l'imprimante !

Mis Ă  jour

Ce contenu vous a-t-il Ă©tĂ© utile ?