LABORATORIO DE PIVOTING 1

Introducción

Primer artículo de una serie en la que pondremos en práctica los conocimientos que vamos adquiriendo mientras preparamos el eCPPTv2.

En esta ocasión, vamos a resolver un laboratorio formado por nuestra máquina de ataque, la máquina Symfonos1 visible en la misma red de nuestro equipo y la máquina Symfonos2 que solo estará disponible una vez que hayamos vulnerado Symfonos1, por lo que deberemos realizar pivoting entre ellas. Este laboratorio lo podemos encontrar en el Planning de Estudio con S4vitar ha elaborado para preparar diversas certificaciones. El esquema del laboratorio es la siguiente:

Determinando la IP de Symfonos 1

Determinando la IP del equipo Symfonos1

Podemos hacerlo de varias maneras, con netdiscover o arp-scan –l. Vamos a verlo

Netdiscover

Arp-scan -l

Ya tenemos la IP de Symfonos1, 192.168.1.16. A partir de aquí, podemos comenzar a vulnerar esta máquina.

Enumeración de Symfonos 1

NMAP

Comenzamos realizando un escaneo rápidos de los servicios abiertos de Symfonos1.

Están los puertos 22, 25, 80, 139 y 445 abiertos. El siguiente paso será realizar un escaneo más profundo de los servicios abiertos.

Enumeración SMB

Como hemos visto anteriormente, tenemos los puertos 139 y 445 (SMB) abierto. Vamos a comenzar haciendo una enumeración con enum4linux.

Descubrimos el nombre de usuario /helios

Y, el directorio anonymous al que podemos acceder sin credenciales.

Vamos a acceder al recurso compartido anonymous utilizando la herramienta smbclient de la siguiente manera:

Hay un archivo txt, vamos a ver su contenido.

Para descargar el archivo a nuestra máquina de ataque.

Ahora tenemos un nombre de usuario y varias posibilidades de contraseña. La combinación de nombre de usuario helios con la contraseña qwerty permite acceder al recurso compartido de helios.

Volvemos a descargar los archivos en nuestra máquina de ataque y vemos su contenido. El archivo research.txt no contiene nada interesante más allá de mitología sobre el Dios Helios. Vamos con el otro archivo.

Parece el directorio de un sitio Web. Vamos a comprobarlo en el navegado.

Enumeración HTTP

Abrimos el puerto 80 en el navegador y buscamos el “posible” directorio que encontramos anteriormente.

Parece un sitio Web montado sobre un CMS WordPress. Detalle importante, cuando intentamos acceder a cualquiera de los enlaces, estos nos redirigen a un sitio Web con dominio symfonos.local. Vamos a registrar este dominio en nuestro archivo /etc/hosts para poder listar el contenido del sitio Web.

A partir de aquí, vamos a hacer dos cosas. Por un lado, enumeración de directorios y por otro, una enumeración con la herramienta wpscan.

La enumeración de directorios no aporta información interesante.

Después de la enumeración con wpscan, se descubre que 2 complementos son vulnerables a LFI no autenticado.

Vamos a utilizar el exploit disponible en exploitdb. Vamos a utilizar esta URL para leer archivos como /etc/passwd:

Explotación de Symfonos 1

Ahora que podemos ver archivos del sistema, vamos a intentar un ataque llamado ‘log poisoning’. En este ataque, un atacante inyecta código malicioso en un archivo del registro para posteriormente, ver el archivo de registro usando el navegador. Tan pronto como se abra el archivo, se ejecutará el código malicioso que contiene.

Vamos a enumerar una serie de archivos de registros más comunes para ver si podemos verlos.

  • /var/log/auth.log (sin acceso)
  • /var/log/apache2/access.log (sin acceso)

Si recordamos el resultado del escaneo, había un servidor de correo ejecutándose en el puerto 25. Al mismo tiempo, recordamos que el WordPress está ejecutando el plugin mail-masta, ¿Interesante? Vamos a comprobarlo.

En la máquina se está ejecutando el puerto 25 SMTP (servidor de correo). En teoría debe existir un directorio /var/mail para el usuario del sistema, en este caso helios. Vamos a comprobarlo.

  • /var/mail/helios

A este archivo sí que tenemos acceso. Como SMTP se ejecuta en el puerto 25, vamos a utilizarlo para enviar un correo al usuario “helios” que contenga el código malicioso. Primero, vamos a comprobar si existe dicha vulnerabilidad enviando un mensaje de prueba.

Abriendo de nueva el archivo /var/mail/helios en el navegador, vemos que es posible la inyección de registro.

Vamos a poner netcat a la escucha en el puerto 4444 y vamos a inyectar un Shell inverso PHP en el archivo de correo.

La Shell que vamos a utilizar es la siguiente:

IP 192.168.1.17 (cambio por error en red)

Volvemos a abrir el archivo en el navegador y ya tendremos establecida la conexión con la máquina víctima.

Tenemos una Shell limitada, vamos a mejorarla (python –c ‘import pty; pty.spawn(“/bin/bash”)’).

Escalada de privilegios en Symfonos 1

La primera búsqueda habitual para la escalada de privilegios es sondear binarios SUID mediante el comando find.

Statuscheck NO es un binario predeterminado de Linux.

El binario ejecuta CURL sin ruta absoluta. Vamos a crear un CURL “falso” y modificaremos el PATH de ejecución para que el archivo /opt/statuscheck llame al CURL falso y que se ejecute como ROOT.

¿Cómo hacemos esto? De la siguiente manera:

Volvemos a llamada al binario /opt/statuscheck que a su vez llamará al CURL falso como ROOT y obtendremos consola.

Pivoting desde Symfonos 1 a Symfonos 2

Una vez que hemos comprometido la primera máquina del laboratorio, ya estaremos en condiciones de poder saltar a la segunda máquina de este, Symfonos 2. Para ello, seguiremos el siguiente proceso.

Primero vamos a comprobar a que redes tiene acceso Symfonos 1. Lo vamos a hacer de la siguiente manera:

Tiene conexión en la red 192.168.1.0/24, misma red donde está conectado nuestra máquina de ataque y también a la 10.0.2.0/24, red donde se encuentra conectada la máquina Symfonos 2.

Para escanear que equipos están conectados a la red 10.0.2.0/24, vamos a crear un pequeño script en bash cuya utilidad será descubrir las IP activas a través de PING.

Enviamos este script a Symfonos 1 utilizando un servidor Ptyhon HTTP. En nuestra máquina de ataque ejecutamos esto:

Para descargar el archivo en la máquina víctima, ejecutamos el siguiente comando:

Una vez enviado, damos permisos a este script y lo ejecutamos. Tras pocos segundos obtenemos el siguiente resultado.

Tenemos dos IP en la red 10.0.2.0/24. La IP 10.0.2.5 es la que corresponde a la máquina Symfonos 1 mientras que la IP 10.0.2.4 corresponde a la máquina Symfonos 2. También podemos enumerar los servicios que tiene disponible esta IP. Para ello creamos otro pequeño script en bash que sirve para detectar servicios abiertos. El código de este script es el siguiente:

Enviamos este script a la máquina Symfonos 1, damos permisos y ejecutamos de la siguiente manera:

El siguiente paso, una vez que sabemos que existe una segunda máquina visible desde Symfonos 1, será pivotar sobre esta máquina para poder acceder a Symfonos 2 desde nuestra máquina de ataque, si bien en este momento no sería posible.

Para hacer esto, vamos a crear un túnel utilizando la herramienta Chisel. Esta tunelización se crea de la siguiente manera:

En nuestra máquina de ataque ejecutamos el siguiente comando:

El siguiente paso será enviar un ejecutable de Chisel a la máquina Symfonos 1 utilizando el servidor Python HTTP que utilizamos anteriormente, darle permisos de ejecución y ejecutarlo de la siguiente manera:

De esta manera ejecutamos la técnica de Remote Port Forwarding. Una vez hecho esto, ya tendremos acceso al puerto 80 de la máquina Symfonos 2 desde nuestra máquina de ataque.

Perfecto, ¿pero tenemos que hacer el mismo proceso para todos los puertos de Symfonos 2? Existe un método en el que podremos tener conexión con todos los puertos de la máquina Symfonos 2 ejecutando un único comando. Para ello, vamos a utilizar Socks. Procedemos de la siguiente manera:

En Symfonos 1 ejecutamos lo siguiente:

Y vemos el resultado obtenido en nuestra máquina de ataque.

Vemos que se ha creado una conexión de tipo socks a la escucha en el puerto 1080. Para que esto funcione deberemos crear una conexión socks para ese puerto en el archivo /etc/proxychains.conf. Añadimos la siguiente línea en el archivo.

A partir de este momento deberemos utilizar la utilidad proxychains para poder utilizar el túnel que hemos creado y ya tendremos conexión con esta máquina que no está conectada en nuestra red.

A partir de este momento puede comenzar la enumeración y explotación de la máquina Symfonos 2.

Enumeración de Symfonos 2

NMAP

Como siempre, comenzamos escaneando los servicios que tiene abiertos la máquina Symfonos 2.

Symfonos 2 tiene 5 servicios abiertos (21, 22, 80, 139, 445). El siguiente paso, será realizar un escaneo exhaustivo de los cinco servicios abiertos.

Enumeración Web

Si intentamos acceder a la dirección IP 10.0.2.4 desde el navegador, este no va a poder acceder puesto que no tiene conexión con la máquina Symfonos 2. Para arreglar esto, vamos a utilizar Foxy Proxy para poder establecer el túnel al sitio Web de Symfonos 2. Foxy Proxy lo configuramos de la siguiente manera:

Ya tenemos acceso al puerto 80 de Symfonos 2. Vamos a realizar una enumeración de directorios con dirsearch. Recordamos que debemos utilizar proxychains para poder utilizar la tunelización.

Nada interesante

Enumeración SMB

Realizamos una enumeración con enum4linux de Symfonos 2.

Después de completar la enumeración obtenemos una serie de información interesante.

Existe una cuenta anónima disponible que contiene una carpeta backups que contiene un archivo log.txt. Lo descargamos en nuestra máquina atacante para ver su contenido.

La parte más importante del archivo log.txt es la primera línea. Nos dice que root realizó una copia de seguridad del archivo shadow en algún lugar aleatorio /var/backups.

Otra cosa para aprender de log.txt son los usuarios disponibles en el servidor.

FTP

En la enumeración inicial de la máquina Symfonos 2, vimos que se está ejecutando en el puerto 21 (FTP) la versión ProFTPD 1.3.5. Esta versión de FTP tiene un CVE (CVE-2015-3306). Esta vulnerabilidad permite a los atacantes leer y escribir en archivos arbitrarios a través de los comandos site cpfr y site cpto.

Entonces podemos copiar el contenido del archivo shadow y passwd.

Descargamos ambos archivos vía SMB.

SSH

Una vez obtenidos los archivos de credenciales, los unificamos con el comando unshadow.

A continuación, vamos a descifrar las credenciales utilizando John.

Obtenemos las credenciales aeolus:sergioteamo.

Recordamos que en la enumeración inicial de Symfonos 2 estaba el servicio SSH disponible. Vamos a probar las credenciales para el servicio SSH.

Obtenemos conexión a la máquina Symfonos 2.

Explotación de Symfonos 2

Una vez obtenemos conexión a Symfonos 2, vamos a comenzar comprobando si podemos ejecutar comandos usando sudo.

El siguiente paso será comprobar las conexiones internas de Symfonos 2.

Anotamos un servicio que se ejecuta de manera local en el puerto 127.0.0.1:8080

Vamos a redirigir este puerto interno de la máquina Symfonos 2 a nuestra máquina de ataque. Esto lo vamos a hacer aplicando la técnica de local port forwarding  a través del servicio SSH. El procedimiento es el siguiente:

De esta manera, comunicamos nuestro puerto 8080 interno con el puerto 8080 interno de la máquina Symfonos 2. El siguiente paso es ver que se está ejecutando en ese puerto en nuestro navegador Web.

Vamos a comprobar si se reutilizan las credenciales y existe el usuario aeolus.

Se reutilizan las credenciales para el usuario aeolus.

¿Qué es LibreNMS?

LibreNMS es un sistema de administración de red (NMS) de código abierto que utiliza el protocolo SNMP para monitorear dispositivos de red como enrutadores, conmutadores y servidores. Se basa en el lenguaje de programación PHP y utiliza una base de datos MySQL para almacenar datos. LibreNMS proporciona una interfaz basada en la web para monitorear y administrar dispositivos de red, así como funciones de alerta y generación de informes. Se puede usar para monitorear redes pequeñas y grandes, y es compatible con una amplia gama de dispositivos de varios proveedores. Vamos a buscar exploits disponibles para LibreNMS

Vamos a ver como ejecutamos y si la versión vulnerable coincide con la versión que está ejecutando Symfonos 2. Descargamos el exploit y vemos su contenido.

Este es el payload que ejecuta el exploit. Vamos a buscar ahora donde es ejecutado.

Este exploit crea un dispositivo nuevo, nos indica que valores se deben incluir e indica que el payload anterior es inyectado en community. Finalmente, vemos como ejecutar el exploit.

Pues vamos a ello, de forma manual. Primero, vamos a explicar cómo vamos a ejecutar. La IP que vamos a la que vamos a dirigir el exploit es la IP 10.0.2.5 de Symfonos 1 en el puerto 5000 (Recordamos que Symfonos 1 y Symfonos 2 tienen comunicación en la red 10.0.2.0/24). Al mismo tiempo, queremos que la reverse Shell sea visible desde nuestra máquina de ataque, deberemos redigir todos los paquetes que lleguen al puerto 5000 de Symfonos a nuestra máquina de ataque. Esto lo hacemos con Socat.

Vamos a crear el dispositivo nuevo en LibreNMS.

Nos vamos ahora a la terminal de Symfonos 1 y configuramos Socat.

De esta manera indicamos que todo el tráfico que reciba Symfonos 1 en el puerto 6000 sea redirigido al puerto 6000 de nuestra máquina de ataque. En nuestra máquina de ataque deberemos colocar netcat a la escucha en el puerto 6000.

Posteriormnte, volvemos a LibreNMS para realizar el proceso de ejecución. Clicamos sobre el icono

y seleccionamos Capture. Posteriormente, en la página abierta seleccionamos:

Posteriormente, clicamos sobre Run  y ya deberíamos tener conexión remota desde nuestra máquina de ataque hacía Symfonos 2.

Ya tenemos acceso desde nuestra máquina de ataque a Symfonos 2 con otro usuario, cronus.

Elevación de privielgios en Symfonos 2

Vamos a verificar si el nuevo usuario tiene perfil de usuario puede ejecutar comandos como sudo.

El usuario Cronus tiene acceso a mysql a través de sudo. Consultamos GTOBins para ver como elevar privilegios aprovechar esto.

Entonces vamos a utilizar esto para elevar privilegios.

Ya tenemos privilegios máximos en Symfonos 2.

Finalziado el laboratorio de pivoting formado por Symfonos 1 y 2.

No responses yet

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *