HeroCTF v3 — Forensic Write-up : We need you

Les Pires Hat
7 min readApr 29, 2021

Du 23 avril au 25 avril 2021 a eu lieu la troisième édition du HeroCTF (page d’accueil du CTF). Notre équipe a terminé 2ème au classement général (première place au classement étudiant) sur plus de 600 équipes.

Nous allons voir dans ce Write-up comment résoudre le challenge “We need you” crée par Worty.

We need you

We need you 1/5

Pour cette première partie, nous disposons de cet énoncé :

Grâce à l’énoncé, je sais que le fichier que je télécharge est un prélèvement RAM d’une machine et j’ai pour objectif de trouver le nom du PC.

Pour résoudre ce challenge je vais utiliser Volatility 2.6.1 plutôt que Volatility 3 car j’ai plus d’expérience avec et que Volatility 3 n’est pas encore en version release.

La première chose à faire lorsque l’on à un dump de RAM, c’est d’identifier le système d’exploitation de ce prélèvement mémoire, je vais donc utiliser la commande imageinfo.

volatility -f capture.mem imageinfo

La commande nous retourne 4 profils Windows 7 pour ce dump de RAM ce qui nous donne l’information que la machine en question est une machine Windows sur sa version 7.

Pour trouver le nom du PC, il y avait plusieurs moyens de faire :

Il était possible d’utiliser la commande envars qui va nous retourner toutes les variables d’environnement de l’OS.
Étant donné que l’on cherche le computer name j’ai aussi fait un grep pour affiner ma recherche.

volatility -f capture.mem --profile=Win7SP1x86_23418 envars | grep "COMPUTERNAME"

Il était aussi possible d’utiliser la hivelist qui nous permet de voir les registres accessibles sur la mémoire de la machine.

Le registre qui va nous intéressé pour résoudre cette épreuve est le
\REGISTRY\MACHINE\SYSTEM.

Ensuite grâce à un printkey et à l’utilisation de l’adresse virtuelle du registre nous allons pouvoir accéder dans le ControlSet001\Control\ComputerName\ComputerName au computer name.

volatility -f capture.mem --profile=Win7SP1x86_23418 printkey -o 0x8941a2c0 -K 'ControlSet001\Control\ComputerName\ComputerName'

Il était aussi possible de trouver le computer name avec un petit strings

strings capture.mem | grep "^COMPUTERNAME" | head -n 1

Et voilà en ce qui concerne la partie 1 nous savons désormais que le nom du pc dont vient le dump de RAM est KANNIBAL le flag était donc :

Hero{KANNIBAL}

We need you 2/5

Pour cette deuxième partie, l’énoncé était le suivant :

Nous devons donc trouver l’utilisateur et son mot de passe.

Pour ce faire je vais utiliser la commande hashdump qui va aller me chercher les tous les hash de mot de passe et les utilisateurs présents sur la machine.

volatility -f capture.mem --profile=Win7SP1x86_2341

L’utilisateur que je cherche ainsi que le hash lié à cet utilisateur est :

Razex:1000:aad3b435b51404eeaad3b435b51404ee:78d9c7e905c695087ee3baa755ce43e4:::

Pour trouver le mot de passe en clair un petit coup dans crackstation et le tour est joué.

Le flag pour cette deuxième partie était le suivant :

Hero{Razex:liverpoolfc123}

We need you 3/5

Pour cette troisième partie, nous devons trouver le serveur qui a infecté les machines, nous devons donc trouver une ip et un port.

La première commande que je vais utiliser est le cmdscan qui va me permettre de voir les commandes qui ont été envoyées depuis le cmd.exe.

volatility -f capture.mem --profile=Win7SP1x86_23418 cmdscan

Bingo voici une adresse ip suivie d’un port l’attaquant à utilisé l’utilitaire netcat pour se connecter à son C2.

On pouvait aussi utiliser la commande netscan qui nous donne les connexions établies sur la machine.

volatility -f capture.mem --profile=Win7SP1x86_23418 netscan

Sinon, nous avons aussi la commande consoles qui est sensiblement la même que la commande cmdscan mais elle nous donne plus d’information sur les outputs des commandes et cela peut s’avérer utile en réponse à incident.

Grâce à l’utilisation d’une de ses commandes, nous avons donc obtenu le flag de cette troisième partie.

Hero{146.59.156.82:4444}

We need you 4/5

La quatrième partie de ce challenge nous demande de retrouver les noms et prénoms des deux attaquants ainsi que leur malware et sa version.

Cela devient intéressant, dans le précédent challenge en analysant les commandes entrées par les attaquants je peux voir qu’ils sont allés dans Documents puis dans un dossier un peu différent de ce que l’on peut trouver sur une machine Windows nommé Malw4r3.

Pour lire les fichiers qui sont chargés en RAM et accessibles, je vais utiliser la commande filescan.

volatility -f capture.mem --profile=Win7SP1x86_23418 filescan | grep Malw4r3

J’ai donc la possibilité d’extraire plusieurs fichiers dans ce dossier Malw4r3, le fichier le plus intéressant est le Nemesis.py.txt.py.txt

Je vais donc récupérer l’offset de ce fichier et l’extraire du dump de RAM avec la commande dumpfiles.

volatility -f capture.mem --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000007dc30518 -n -u --dump-dir output

Ce fichier me donne donc le nom d’un des attaquants plus la version du malware, au vu du fichier je devine que le malware se nomme “Nemesis”.

Pour le nom et le prénom du deuxième attaquant je suis parti sur des fausses pistes comme par exemple en cherchant l’auteur sur github pour trouvé le malware etc…
En réalité après avoir fait une pause, j’ai cherché dans un endroit qui paraît tellement logique que j’ai oublié de regarder dedans : c’est le presse papier, l’endroit où sont stockés nos fameux copier coller.

Pour ce faire, Volatility permet de lire le contenu du presse papier chargé en RAM avec la commande clipboard.

volatility -f capture.mem --profile=Win7SP1x86_23418 clipboard

Et bingo, voilà notre deuxième attaquant ! Avec toutes les informations que nous avons trouvées, nous avons notre flag pour la quatrième partie du challenge.

Hero{GOLDEN-Dany:PAVOLI-Ruben:Nemesis-4.5.1}

We need you 5/5

Nous voici donc à la cinquième et dernière partie de ce challenge celle qui m’aura causé le plus de problèmes, mais qui m’aura beaucoup appris aussi.

Nous devons trouver l’URL du C2, l’utilisateur et le mot de passe pour s’y connecter.

J’ai donc naturellement utilisé la commande iehistory pour voir le contenu de l’historique d’internet explorer.

Grâce à ces informations je sais que je cherche un mot de passe envoyé en POST et que l’url est http://nemesis3g2upl4pq6kufc4m.onion/ et le user Razex.

Maintenant pour trouver le mot de passe ce fut un peu plus ardu et après quelques hint de W0rty notamment le “RTFM strings”, je décide de dump les processus de iexplorer pour faire des strings d’idiot dessus sans savoir trop quoi chercher.

Pour ce faire j’ai utilisé la commande pslist pour lister les processus.

volatility -f capture.mem --profile=Win7SP1x86_23418 pslist

Ensuite je vais me servir des PID pour pouvoir utiliser la commande memdump qui va me permettre de dump les processus.

volatility -f capture.mem --profile=Win7SP1x86_23418 memdump -p 3404,3504 --dump-dir .

Après des heures de sommeil et de tryhard, je décide de bien lire et de comprendre le man de strings et je trouve une option intéressante qui se nomme encoding, de ce fait avec mon équipe nous décidons de tester tous les encoding possible pour trouver ce fameux mot de passe.

Et puis en forçant un peu et en essayant nous l’avons trouvé en utilisant l’option -el de strings qui s’avère être l’option pour faire un strings en UTF-16.

strings *.dmp -el | grep razex -A 5 -B 5

L’option -A de grep me permet de voir les 5 lignes avant la ligne qui est grep et l’option -B permet de voir 5 lignes après.

Le mot de passe est donc : razexP85Inq4

Ce qui nous donne le flag de la cinquième partie de ce challenge.

Hero{http://nemesis3g2upl4pq6kufc4m.onion/-Razex:razexP85Inq4}

Quelques jours après le challenge et en ayant discuter avec des personnes de mon boulot, j’ai compris qu’en faite IE stocke les informations en UTF16 plutôt qu’en UTF8 ce qui devient illisible avec un simple strings sans option.

Mine de rien, ce manque de savoir m’aura fait perdre beaucoup de temps. Mais cela n’est pas grave, car j’ai appris plein de choses lors de ce challenge et notamment le fait de mener une investigation logique et rester concentré sur l’essentiel pour ne pas partir trop loin.

Merci à Worty pour le challenge bien sympathique.

--

--