Solution de U03 pour Layer Cake 3/3

intro forensics docker

10 février 2025

Nous commeçons par regarder si à tout hasard la commande docker history nous permet de trouver quelque-chose…

docker pull anssi/fcsc2024-forensics-layer-cake-3

docker history anssi/fcsc2024-forensics-layer-cake-3
IMAGE          CREATED   CREATED BY   SIZE      COMMENT
269cd0c184df   N/A                    34.2MB  

Il n’y a rien d’intéressant, l’image a été générée avec une seule layer et la commande docker history ne rapporte rien de croustillant.

Il ne nous reste donc qu’à analyser le contenu de la layer présente dans l’image.

docker save anssi/fcsc2024-forensics-layer-cake-3 -o cake3.tar
tar --one-top-level=cake3 -x -v -f cake3.tar
cd cake3

Méthode “douce”

Nous décompressons la layer à partir du fichier manifest.json, notez l’utilisation de --delay-directory-restore car certains répertoires dans l’image n’ont aucun droit en écriture et leur restauration provoque des erreurs access denied lorsque tar essaie de restaurer les sous-répertoires.

jq --raw-output '.[0]["Layers"][]' manifest.json | xargs -I % tar --delay-directory-restore -x -v -f %

L’arborescence suivante a été créée :

ls -l nix/store/
total 28
dr-xr-xr-x 6 takeshiba takeshiba 4096 janv.  1  1980 1rm6sr6ixxzipv5358x0cmaw8rs84g2j-glibc-2.38-44
dr-xr-xr-x 3 takeshiba takeshiba 4096 janv.  1  1980 3sxwxqzkkrgpgaibkm27ggb9kjbzdy31-xgcc-13.2.0-libgcc
dr-xr-xr-x 4 takeshiba takeshiba 4096 janv.  1  1980 5lr5n3qa4day8l1ivbwlcby2nknczqkq-bash-5.2p26
dr-xr-xr-x 3 takeshiba takeshiba 4096 janv.  1  1980 77yhmwrwism02371kzyda4d127kdwdnf-libunistring-1.1
dr-xr-xr-x 3 takeshiba takeshiba 4096 janv.  1  1980 m8ww0n3iqndg8zaiwbsnij6rvmpmjbry-hello
dr-xr-xr-x 4 takeshiba takeshiba 4096 janv.  1  1980 n9sq1bvghs9z0qg6cmwg27y4jmszwgqi-libidn2-2.3.7
dr-xr-xr-x 4 takeshiba takeshiba 4096 janv.  1  1980 rnxji3jf6fb0nx2v0svdqpj9ml53gyqh-hello-2.12.1

Deux répertoires nous intéressent (les autres étant des dépendances) :

  • rnxji3jf6fb0nx2v0svdqpj9ml53gyqh-hello-2.12.1

  • m8ww0n3iqndg8zaiwbsnij6rvmpmjbry-hello

Le premier répertoire contient l’application hello en version 2.12.1, le deuxième contient la définition du service correspondant, nous y trouvons le flag qui est passé en paramètre du programme hello.

cat nix/store/m8ww0n3iqndg8zaiwbsnij6rvmpmjbry-hello/bin/hello 

#!/nix/store/5lr5n3qa4day8l1ivbwlcby2nknczqkq-bash-5.2p26/bin/bash
exec /nix/store/rnxji3jf6fb0nx2v0svdqpj9ml53gyqh-hello-2.12.1/bin/hello -g "FCSC{xxxxxxxx}" -t

grep --text --only-matching 'FCSC{[0-9a-fA-F]*}' nix/store/m8ww0n3iqndg8zaiwbsnij6rvmpmjbry-hello/bin/hello
FCSC{xxxxxxxxx}

Méthode “bestiale”

Nous avons vu que l’image est une archive tar, qui contient elle-même des archives tar pour chaque layer. Comme aucune de ces archives n’est compressée nous pouvons faire un grep avec une expression régulière pour trouver notre flag.

grep --text --only-matching 'FCSC{[0-9a-fA-F]*}' cake3.tar 
FCSC{xxxxxxxxx}

Script automatique

Le script suivant permet d’automatiser la récupération du flag par les méthodes “douce” et “bestiale” :

#!/usr/bin/bash

# sudo car on a pas les droits d'écriture sur le répertoire nix/store
#
sudo rm -rf cake3.tar cake3

docker pull anssi/fcsc2024-forensics-layer-cake-3 
docker save anssi/fcsc2024-forensics-layer-cake-3 -o cake3.tar


# Methode "douce"
#
echo '* Methode "douce"'
echo '*'
tar --one-top-level=cake3 -x -f cake3.tar
cd cake3
jq --raw-output '.[0]["Layers"][]' manifest.json | xargs -I % tar --delay-directory-restore -x -f %
grep --only-matching 'FCSC{[0-9a-fA-F]*}' nix/store/m8ww0n3iqndg8zaiwbsnij6rvmpmjbry-hello/bin/hello
cd ..

# Methode "bestiale"
#
echo '* Methode "bestiale"'
echo '*'
grep --text --only-matching 'FCSC{[0-9a-fA-F]*}' cake3.tar 

Le résultat du script est le suivant :

Using default tag: latest
latest: Pulling from anssi/fcsc2024-forensics-layer-cake-3
681bf49a2a72: Pull complete 
Digest: sha256:f11c3351c870c7839ce1a266c71307ae11de11b9261137e89b32fca07ba457e4
Status: Downloaded newer image for anssi/fcsc2024-forensics-layer-cake-3:latest
docker.io/anssi/fcsc2024-forensics-layer-cake-3:latest
* Methode "douce"
*
FCSC{xxxxxxxx}
* Methode "bestiale"
*
FCSC{xxxxxxxx}