[Sthack][Writeup – Forensic] Docker Layer
Introduction
On reçoit une image docker mayfly277/sthack2021_docker_forensic et on nous demande de déchiffrer le fichier flag.txt qui se trouve à la racine.
Investigation
On pull l’image docker et on lance un bash pour voir ce qu’il y a dedans:
$> sudo docker pull mayfly277/sthack2021_docker_forensic
$> docker run -it mayfly277/sthack2021_docker_forensic bash
root@f477331b21a8:/$> ls
bin boot dev etc flag.enc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
Ok. Bon, on a bien la présence du fichier flag.enc, mais pas de clé pour le déchiffrer, ni la méthode de chiffrement.
On va s’intéresser un peu plus aux différentes commandes qui ont pu être présentes dans le Dockerfile.
$> docker history mayfly277/sthack2021_docker_forensic:latest –no-trunc
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:df9bf87b22e3a6cb1e50a016f9add403c2024cd8dc82204f40979aa47ed58ed1 5 weeks ago /bin/sh -c rm /pass.txt 0B
5 weeks ago /bin/sh -c echo -n $(curl -s https://pastebin.com/raw/ErwwdMja) | openssl enc -aes-256-cbc -iter 10 -pass pass:$(cat /pass.txt) -out flag.enc 64B
5 weeks ago /bin/sh -c (nop) COPY file:1a7183ad2543f172d82f35bd319cae411595c5fdfb76b1da1da6b6768ac3df6e in / 22B
5 weeks ago /bin/sh -c apt install -y curl openssl 16.2MB
5 weeks ago /bin/sh -c apt update -y 30.4MB
6 weeks ago /bin/sh -c #(nop) CMD [« bash »] 0B
6 weeks ago /bin/sh -c #(nop) ADD file:d2abf27fe2e8b0b5f4da68c018560c73e11c53098329246e3e6fe176698ef941 in / 72.8MB
Deux commandes intéressantes dans cette historique:
/bin/sh -c rm /pass.txt
/bin/sh -c echo -n $(curl -s https://pastebin.com/raw/ErwwdMja) | openssl enc -aes256-cbc -iter 10 -pass pass:$(cat /pass.txt) -out flag.enc
On se rend assez vite compte que le pastebin contenait le flag, seulement il n’est plus disponible (fallait tout de même tenter !), et que le fichier pass.txt est supprimé à la fin du Dockerfile.
L’image étant marqué à missing, on ne peut pas y accéder simplement avec un tag docker différent, pas cool.
On va essayer de dive dans les différentes couches docker avec un super tool : Docker dive (https://github.com/wagoodman/dive)
$> docker run –rm -it -v /var/run/docker.sock:/var/run/docker.sock -v « $(pwd) »: »$(pwd) » -w « $(pwd) » -v « $HOME/.dive.yaml »: »$HOME/.dive.yaml » wagoodman/dive:latest mayfly277/sthack2021_docker_forensic
On a bien la présence du fichier pass.txt dans une des layers, et on va donc pouvoir le récupérer dans les subvolumes docker !
$> find /var/lib/docker/btrfs/subvolumes -name ‘pass.txt’
/var/lib/docker/btrfs/subvolumes/a91dd53f0dbcdb3b54854cab475da4648b85be660c9cb46688ee8c38d9d44ed5/pass.txt
$> cat /var/lib/docker/btrfs/subvolumes/a91dd53f0dbcdb3b54854cab475da4648b85be660c9cb46688ee8c38d9d44ed5/pass.txt
MySupAAAS3cure_PassSSS
Solution
On a plus qu’a utiliser openssl pour déchiffrer tout ça !
root@9e6a67787ad1:/$ echo « MySupAAAS3cure_PassSSS » > pass.txt
root@9e6a67787ad1:/$ openssl aes-256-cbc -d -iter 10 -pass pass:$(cat /pass.txt) -in flag.enc -out flag.dec
root@9e6a67787ad1:/$ cat flag.dec
STHACK{08ae895ddfdcbdb5c8cfb848e7c7ae23}
BOOM, voila les puntos !
Arrivé en février 2020 chez Login, il réalise aussi des pentests occasionnellement.