[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)

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 !

LOUIS GIESENINGÉNIEUR SÉCURITÉ
Louis est un développeur autant web que système qui a également mis un pied dans d’autres domaines de l’informatique tels que le DevOps et la sécurité offensive.

Arrivé en février 2020 chez Login, il réalise aussi des pentests occasionnellement.

Add a comment

*Please complete all fields correctly