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}