lien pour télécharger l'archive : http://repo.zenk-security.com/ctfs/ndh2k15/Bpythonastic.tar.gz
Après avoir extrait l'archive, on se retrouve face à un fichier “chall.raw”.
On comprend rapidement que ce fichier est un dump mémoire d'une machine tournant sur linux. En effet, “dump.raw” contient plein de fichiers de différentes sortes et un coup de string nous donne la version exacte de la distribution linux utilisée :
$ strings chall.raw | grep "Linux version" Linux version 2.6.32-5-amd64 (Debian 2.6.32-48squeeze6) (jmm@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Tue May 13 16:34:35 UTC 2014
Volatility, depuis sa version 2.2 supporte les dumps mémoires linux à condition de lui fournir le bon profile (donc dans notre cas le profile Debian 2.6.32-5-amd64).
Cette page explique bien comment créer un profile : https://code.google.com/p/volatility/wiki/LinuxMemoryForensics
Ayant eu la flemme d'en créer un, j'ai cherché sur le net le profile correspondant au dump et … c'est dans les répos d'ubuntu que j'ai trouvé le st graal : http://packages.ubuntu.com/trusty/utils/volatility-profiles !
Dans cette archive on trouve pas mal de profile dont “_Debian_Squeeze_2.6.32-5-amd64_.zip”. Parfait !
On copie le profile zippé dans le répertoire : volatility/plugins/overlays/linux/ puis on vérifie si il est bien reconnu par volatility :
$ ./vol.py --plugins=profiles --info | head Volatility Foundation Volatility Framework 2.4 Profiles -------- Linux_Debian_Squeeze_2_6_32-5-amd64_x64 - A Profile for Linux _Debian_Squeeze_2.6.32-5-amd64_ x64
Good, on peut enfin analyser le dump mémoire, on a plusieurs commandes à disposition. Pour avoir la liste des commandes on tape :
$ ./vol.py chall.raw --profile=Linux_Debian_Squeeze_2_6_32-5-amd64_x64 -h | grep linux_
on va regarder les dernières commandes tapées dans le bash :
$ ./vol.py -f chall.raw --profile=Linux_Debian_Squeeze_2_6_32-5-amd64_x64 linux_bash [...] 1852 bash 2015-03-19 13:59:05 UTC+0000 bpython 1852 bash 2015-03-19 13:59:34 UTC+0000 emacs chall.py 1852 bash 2015-03-19 13:59:47 UTC+0000 bpython
Allons chercher emacs ou bpython dans la liste des processus :
$ ./vol.py -f chall.raw --profile=Linux_Debian_Squeeze_2_6_32-5-amd64_x64 linux_pstree [...] ......bpython 2364 0 [...]
On ne trouve pas emacs, mais on trouve le processus bpython. J'imagine que les données intéressantes doivent se trouver dans le heap, on va chercher l'adresse du heap dans ce processus :
$ vol.py -f chall.raw --profile=Linux_Debian_Squeeze_2_6_32-5-amd64_x64 linux_proc_maps -p 2364 [...] 2364 0x1a36000 0x2080000 rw- 0x0 0 0 0 [heap] [...]
On dump la mémoire du processus :
$ ./vol.py -f chall.raw --profile=Linux_Debian_Squeeze_2_6_32-5-amd64_x64 linux_dump_map -p 2364 --dump-dir=.
Un coup de strings :
$ strings task.2364.0x1a36000.vma [...] >>> from chall import * >>> flag=Challenge() >>> flag=base64.b64encode(pickle.dumps(flag)) >>> print flag KGljaGFsbApDaGFsbGVuZ2UKcDAKKGRwMQpTJ2ZsYWcnCnAyClMnYTYzOWEyMWE0YTc0NzAzZmEwNDJkNjE3NjgxYWE0NGJiNGQxYzA4YmM1ZmJmN2VmZDZiNDU1ODJiMGYwZDQwMycKcDMKc1MnaWQnCnA0CkkwCnNTJ2F1dGhvcicKcDUKUydZZ2dkcmFzaWwnCnA2CnNiLg== [...]
On décode :
$ echo -n "KGljaGFsbApDaGFsbGVuZ2UKcDAKKGRwMQpTJ2ZsYWcnCnAyClMnYTYzOWEyMWE0YTc0NzAzZmEwNDJkNjE3NjgxYWE0NGJiNGQxYzA4YmM1ZmJmN2VmZDZiNDU1ODJiMGYwZDQwMycKcDMKc1MnaWQnCnA0CkkwCnNTJ2F1dGhvcicKcDUKUydZZ2dkcmFzaWwnCnA2CnNiLg==" | base64 -d (ichall Challenge p0 (dp1 S'flag' p2 S'a639a21a4a74703fa042d617681aa44bb4d1c08bc5fbf7efd6b45582b0f0d403' p3 sS'id' p4 I0 sS'author' p5 S'Yggdrasil' p6
On balance le hash sur https://crackstation.net/ qui nous trouve le mot de passe associé : Yougotit