Solution de U03 pour Layer Cake 2/3

intro forensics docker

10 février 2025

Nous récupérons l’image :

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

La commande docker history permet de récupérer les commandes utilisées pour bâtir une image.

Notez que les couches sont affichées dans l’ordre inverse de leur exécution (normal car les couches de filesystem s’empilent). On voit qu’un fiichier appelé secret est copié en /tmp/secret, puis qu’il est ensuite détruit.

docker history anssi/fcsc2024-forensics-layer-cake-2
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
03014d9fc480   10 months ago   CMD ["/bin/sh"]                                 0B        buildkit.dockerfile.v0
<missing>      10 months ago   USER guest                                      0B        buildkit.dockerfile.v0
<missing>      10 months ago   RUN /bin/sh -c rm /tmp/secret # buildkit        0B        buildkit.dockerfile.v0
<missing>      10 months ago   COPY secret /tmp # buildkit                     71B       buildkit.dockerfile.v0
<missing>      12 months ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B        
<missing>      12 months ago   /bin/sh -c #(nop) ADD file:37a76ec18f9887751…   7.38MB    

Une image est un empilement (overlay) de couches (layers), chacune ne contenant que les modifications du filesystem d’une couche à l’autre. L’image contient aussi des metadonnées (dont la description des layers et les données que l’on a affichées dans l’exercice précédent grâce à la commande docker history)

Lorsque l’on sauvegarde une image par la commande docker save une archive au format tar est générée, elle contient les différentes layers sous la forme d’autre archives au format tar. Les fichiers des layers sont stockés dans les archives sans le / de la racine, notre fichier sera donc tmp/secret.

L’image contient les fichiers suivants :

drwxr-xr-x 0/0               0 2024-03-25 10:05 blobs/
drwxr-xr-x 0/0               0 2025-02-10 08:19 blobs/sha256/
-rw-r--r-- 0/0            1471 2024-03-25 10:05 blobs/sha256/03014d9fc4801b1810b112fd53e05e35ea127e55c82d1304b5622cfe257c0ad8
-rw-r--r-- 0/0             482 2024-03-25 10:05 blobs/sha256/50a0303499bb5e208319a16317bde238b259b74945b7f5ec214743404c6c8323
-rw-r--r-- 0/0             406 2024-03-25 10:05 blobs/sha256/66a34fd7d1ee6e3435fd8975d276cea87c0a525ff13a88a4b19e5fc406e1d4e5
-rw-r--r-- 0/0            1017 2024-03-25 10:05 blobs/sha256/6a14d402103eb7eb354cf8f4ee043886f74a44b8cc912239e68561140a1d27cb
-rw-r--r-- 0/0             701 1970-01-01 01:00 blobs/sha256/aa6a5e1de1984008d10132de21845c0fa3c4e07be027ce81fa90e0763dae188c
-rw-r--r-- 0/0         7667200 2024-03-25 10:05 blobs/sha256/d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820
-rw-r--r-- 0/0            2560 2024-03-25 10:05 blobs/sha256/eebed19322aaa0082058596cc4cff6c33253f1ce4327e9ae4399edb2f657242e
-rw-r--r-- 0/0            2048 2024-03-25 10:05 blobs/sha256/fe62c480fd0c4bba858571806e7474fa5aa061ce78292de1988db0cd54d494b6
-rw-r--r-- 0/0             385 2025-02-10 08:19 index.json
-rw-r--r-- 0/0            1096 1970-01-01 01:00 manifest.json
-rw-r--r-- 0/0              31 1970-01-01 01:00 oci-layout
-rw-r--r-- 0/0             120 1970-01-01 01:00 repositories

Le fichier manifest.json indique parmi les blobs lequels contiennent les layers :

[
  {
    "Config": "blobs/sha256/03014d9fc4801b1810b112fd53e05e35ea127e55c82d1304b5622cfe257c0ad8",
    "RepoTags": [
      "anssi/fcsc2024-forensics-layer-cake-2:latest"
    ],
    "Layers": [
      "blobs/sha256/d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820",
      "blobs/sha256/eebed19322aaa0082058596cc4cff6c33253f1ce4327e9ae4399edb2f657242e",
      "blobs/sha256/fe62c480fd0c4bba858571806e7474fa5aa061ce78292de1988db0cd54d494b6"
    ],
    "LayerSources": {
      "sha256:d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820": {
        "mediaType": "application/vnd.oci.image.layer.v1.tar",
        "size": 7667200,
        "digest": "sha256:d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820"
      },
      "sha256:eebed19322aaa0082058596cc4cff6c33253f1ce4327e9ae4399edb2f657242e": {
        "mediaType": "application/vnd.oci.image.layer.v1.tar",
        "size": 2560,
        "digest": "sha256:eebed19322aaa0082058596cc4cff6c33253f1ce4327e9ae4399edb2f657242e"
      },
      "sha256:fe62c480fd0c4bba858571806e7474fa5aa061ce78292de1988db0cd54d494b6": {
        "mediaType": "application/vnd.oci.image.layer.v1.tar",
        "size": 2048,
        "digest": "sha256:fe62c480fd0c4bba858571806e7474fa5aa061ce78292de1988db0cd54d494b6"
      }
    }
  }
]

Nous réalisons le script suivant qui automatise les opérations :

rm -rf cake2.tar cake2

docker pull anssi/fcsc2024-forensics-layer-cake-2 
docker save anssi/fcsc2024-forensics-layer-cake-2 -o cake2.tar

tar --one-top-level=cake2 -x -v -f cake2.tar
cd cake2
jq --raw-output '.[0]["Layers"][]' manifest.json | xargs -I % tar xfv % tmp/secret 2>/dev/null
cat tmp/secret

Le résultat est le suivant :

Using default tag: latest
latest: Pulling from anssi/fcsc2024-forensics-layer-cake-2
4abcf2066143: Already exists 
a0eaf34c8bac: Pull complete 
1ba3c4c6a2e3: Pull complete 
Digest: sha256:86a863f674adbbae9168d1a5d233478cd9747a587a322b8950fcb39f3992be7a
Status: Downloaded newer image for anssi/fcsc2024-forensics-layer-cake-2:latest
docker.io/anssi/fcsc2024-forensics-layer-cake-2:latest
blobs/
blobs/sha256/
blobs/sha256/03014d9fc4801b1810b112fd53e05e35ea127e55c82d1304b5622cfe257c0ad8
blobs/sha256/50a0303499bb5e208319a16317bde238b259b74945b7f5ec214743404c6c8323
blobs/sha256/66a34fd7d1ee6e3435fd8975d276cea87c0a525ff13a88a4b19e5fc406e1d4e5
blobs/sha256/6a14d402103eb7eb354cf8f4ee043886f74a44b8cc912239e68561140a1d27cb
blobs/sha256/aa6a5e1de1984008d10132de21845c0fa3c4e07be027ce81fa90e0763dae188c
blobs/sha256/d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820
blobs/sha256/eebed19322aaa0082058596cc4cff6c33253f1ce4327e9ae4399edb2f657242e
blobs/sha256/fe62c480fd0c4bba858571806e7474fa5aa061ce78292de1988db0cd54d494b6
index.json
manifest.json
oci-layout
repositories
tmp/secret
FCSC{xxxxxxxx}