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é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.
onosh@siftworkstation:# ls -l |grep 'mp4'
-rwxrwxrwx 1 onosh onosh 7858017 Oct 15 23:09 MrNigloR-S01-ep1.mp4
-rwxrwxrwx 1 onosh onosh 18215861 Oct 17 12:18 MrNigloR-S01-ep1-VOST.mp4
On pourrait penser que les sous-titres sont la cause de cette différence de taille... je décide de les analyser !
onosh@siftworkstation:# du -h *mp4
7.5M MrNigloR-S01-ep1.mp4
18M MrNigloR-S01-ep1-VOST.mp4
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 :
onosh@siftworkstation:# cat MrNigloR-S01-ep1-VOST_3_text.srt
1
00:00:00,700 --> 00:00:03,700
What is it about society
that d<i>i</i>sappoints you so much?
2
00:00:11,000 --> 00:00:12,600
Oh, I <i>d</i>on't know.
3
00:00:13,200 --> 00:00:16,080
Is it that we collectively
thought Steve J<i>o</i>bs
4
00:00:16,080 --> 00:00:18,000
Was a great man, even whe<i>n</i> we knew
5
00:00:18,000 --> 00:00:21,000
He made billions off <i>t</i>he backs of children?
6
00:00:23,000 --> 00:00:26,500
Or maybe it's that it feels l<i>i</i>ke
all our heroes are counterfeit.
7
00:00:27,300 --> 00:00:30,000
The world itself's just one bi<i>g</i> hoax.
8
00:00:31,000 --> 00:00:34,300
Spamming with our run<i>n</i>ing
commentary of bullshit
9
00:00:34,300 --> 00:00:39,100
masquerading as insight, <i>o</i>ur
social media faking as intimacy.
10
00:00:41,000 --> 00:00:43,500
Or is it that we voted fo<i>r</i> this?
11
00:00:43,550 --> 00:00:43,550
scC<=:7b:?rCJAE$Ac4b
12
00:00:44,000 --> 00:00:46,000
Not with our rigged
<i>e</i>lections, but with our things,
13
00:00:46,000 --> 00:00:47,700
our propert<i>y</i>, our money.
14
00:00:48,510 --> 00:00:51,100
I'm n<i>o</i>t saying anything new.
We all know why we do this,
15
00:00:51,100 --> 00:00:53,200
not because H<i>u</i>nger Games
books makes us happy
16
00:00:54,100 --> 00:00:55,800
but because we wanna <i>b</i>e sedated.
17
00:00:56,000 --> 00:00:58,600
Because it's painful n<i>o</i>t to pretend,
18
00:00:58,600 --> 00:01:00,000
<i>b</i>ecause we're cowards.
19
00:01:01,090 --> 00:01:03,100
Fuck societ<i>y.</i>
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 :
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.
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 !
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" :
onosh@siftworkstation -> /tmp
# cryptsetup luksOpen lapartitionluks.dd BRIOCHE
Enter passphrase for lapartitionluks.dd:
onosh@siftworkstation -> /tmp
# mount -r /dev/mapper/BRIOCHE /mnt/lulu/
onosh@siftworkstation -> /tmp
# ls -l /mnt/lulu/
total 88
drwxr-xr-x 2 root root 4096 mai 27 07:11 bin
drwxr-xr-x 2 root root 4096 mai 27 07:24 boot
drwxr-xr-x 4 root root 4096 mai 27 07:05 dev
drwxr-xr-x 87 root root 4096 juil. 9 12:20 etc
drwxr-xr-x 3 root root 4096 mai 27 07:10 home
drwxr-xr-x 17 root root 4096 juil. 9 10:00 lib
drwx------ 2 root root 16384 mai 27 07:24 lost+found
drwxr-xr-x 2 root root 4096 mai 27 07:05 media
drwxr-xr-x 2 root root 4096 mai 27 07:05 mnt
drwxr-xr-x 4 root root 4096 juil. 9 09:42 opt
drwxr-xr-x 2 root root 4096 mai 10 20:59 proc
drwx------ 3 root root 4096 janv. 1 1970 root
drwxr-xr-x 4 root root 4096 mai 27 07:05 run
drwxr-xr-x 2 root root 4096 juil. 9 10:00 sbin
drwxr-xr-x 2 root root 4096 mai 27 07:05 srv
drwxr-xr-x 2 root root 4096 mai 10 20:59 sys
drwxrwxrwt 7 root root 4096 juil. 9 16:54 tmp
drwxr-xr-x 10 root root 4096 mai 27 07:05 usr
drwxr-xr-x 12 root root 4096 juil. 9 09:34 var
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 :
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/
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.
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 (<<<) :
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...