Pivoting utilizando Chisel, Socat y Proxychains
El proposito de este laboratorio, es aprender a realizar pivoting de manera manual utilizando las herramientas chisel
, socat
y proxychains
.
El escenario que se nos presenta es el siguiente:
Podemos observar que tenemos tres subredes la 10.10.10.0/24
, otra subred que es la 20.20.20.0/24
y por ultimo la 30.30.30.0/24
.
El objetivo, es poder acceder desde nuestra máquina atacante a la máquina Linux que tiene la ip 30.30.30.5
. En principio no tenemos acceso a esta máquina, ya que no compartimos la misma subred, para lo cual deberemos hacer pivoting a través de las otras máquinas.
Con el fin de solamente centrarnos en lo que es el pivoting, dejaremos de lado la reconocimiento, enumeración, explotación y el resto de fases de un pentesting. Para lo cual, contamos con credenciales para acceder por ssh a cada una de las máquinas.
Chisel
Antes de seguir avanzando en nuestro laboratorio, tenemos que conocer las herramientas a utilizar. Para ello, debemos conocer que es Chisel.
Como se indica en el repositorio oficial de Chisel, Chisel es un túnel rápido TCP/UDP, transportado sobre HTTP, asegurado vía SSH. Un único ejecutable que incluye cliente y servidor. Escrito en Go (golang). Chisel es principalmente útil para pasar a través de firewalls, aunque también se puede utilizar para proporcionar un punto final seguro en su red.
Ahora si, iniciemos con el laboratorio.
En primer lugar, accedemos via ssh a la máquina 1 10.10.10.4
y descargamos el binario de chisel
y socat
, el cual compartimos desde la nuestra máquina atacante creando un simple servidor http con python.
Descargamos los binarios de chisel
y socat
desde la máquina 1 y le asignamos permisos de ejecución.
Servidor de chisel
Creamos el servidor de chisel desde nuetra máquina atacante.
server
Corre chisel en modo servidor--reverse
Este parámetro habilita la funcionalidad de redirección reversa de puertos en el servidor de Chisel. Esto implica que un cliente de Chisel puede exponer los puertos de la máquina en la que se está ejecutando hacia los puertos locales de la máquina donde se encuentra en funcionamiento el servidor de Chisel.--port, -p
Define el puerto HTTP en el cual escuchará el servidor.
Cliente de chisel
- Máquina 1
Nos conectamos con el cliente de chisel al servidor creado anteriormente haciendo un portforwarding de todos los puertos
La máquina 2 20.20.20.5
tiene un servidor HTTP Apache corriendo en el puerto 80. Pero todavía no tenemos acceso, ya que debemos realizar una configuración en nuestro navegador.
Una vez realizada la configuración, ya podemos acceder al sitio web.
Proxychains
Por otra parte, si queremos realizar escaneos con nmap, conectarnos por ssh, utilizar herramientas de web fuzzing, entre otros, deberemos agregar la siguiente linea socks5 127.0.0.1 4444
a nuestro archivo /etc/proxychains4.conf
(en el caso de Parrot el archivo es /etc/proxychains.conf
):
Proxychains es una herramienta de Linux que actua como un “encadenador” o “cadena” entre otras herramientas o aplicaciones que deseamos ejecutar y una serie de servidores proxy que queremos utilizar. En este post, lo utilizaremos junto con chisel, pero también podemos usarlo con herramientas como Ligolo-NG o SSH.
Es importante aclarar, que al igual que configuramos el proxy en nuestro navegador, debemos ejecutar nuestros comandos anteponiendo el comando proxychains
.
Ejemplo:
1
2
proxychains nmap -sT -p- --open -Pn -n 20.20.20.5 -vvv -oG scanPorts
proxychains nmap -sT -sCV --open -p22,80 20.20.20.5 -n -Pn -vvv -oN targeted
Es importante mencionar, que proxychains soporta unicamente conexiones TCP, por esta razón especificamos el argumente
-sT
, donde la técnica de escaneo implica que Nmap intentará establecer una conexión TCP con los puertos del objetivo para determinar su estado. Si la conexión se establece correctamente, se concluye que el puerto está abierto. Si la conexión es rechazada, se interpreta como un puerto cerrado. Además de lo mencionado, proxychains soporta unicamente los protocolos HTTP y SOCKS en su versión 4 y 5. Por ende, el uso del comandoping
queda descartado ya que utiliza el protocolo ICMP.
Reverse Shell - Máquina 2
Hasta el momento, hemos podido acceder al sitio web alojado en la máquina 20.20.20.5
. Pero que pasa si queremos acceder a la máquina 2, es decir, obtener una reverse shell. No podremos, ya que lo que hacemos con chisel
es hacer un portforwarding de los puertos de la máquina víctima, pero la máquina 2 no tiene conexión con nuestra máquina atacante. Es en este punto donde entra en juego socat
.
Socat
Antes de continuar, debemos explicar ¿Qué es SOCAT?
socat
es una herramienta de línea de comandos en sistemas operativos basados en Unix, incluidos Linux, que proporciona funcionalidades avanzadas para la manipulación y transferencia de datos entre dos puntos. El nombre “socat” proviene de “SOcket CAT”, y puede considerarse como una versión avanzada y extendida de la utilidad cat
.
socat
es versátil y puede utilizarse para crear conexiones de red, realizar redirecciones, y manipular varios tipos de comunicación de red y sistemas de archivos. Puede funcionar como un “conector” entre diferentes dispositivos o procesos, y es conocido por ser extremadamente flexible.
Algunos ejemplos de uso de socat
incluyen:
- Túneles y reenvíos de puertos: Puede utilizar
socat
para crear túneles de red o redirigir puertos, permitiendo la comunicación entre dos sistemas a través de un firewall o una red.
1
2
# Ejemplo de reenvío de puerto
socat tcp-listen:1111,fork,reuseaddr tcp:10.10.10.5:4444
tcp-listen:1111,fork,reuseaddr
: Esta parte del comando indica asocat
que debe escuchar en el puerto TCP 1111 en el sistema local. La opciónfork
significa que se debe crear un nuevo proceso para manejar cada conexión entrante, yreuseaddr
permite que se vuelva a utilizar la dirección y el puerto incluso si la conexión anterior aún está en curso.tcp:10.10.10.5:4444
: Esto especifica que las conexiones entrantes al puerto TCP 1111 deben ser redirigidas a la dirección IP10.10.10.5
en el puerto TCP 4444. En otras palabras, este comando establece un reenvío de puerto desde el puerto 1111 en el sistema local hasta el puerto 4444 en el sistema remoto con la dirección IP 10.10.10.5.
- Manipulación de archivos y dispositivos: Podemos utilizar
socat
para redirigir la salida de un comando a un archivo o manipular datos entre procesos.
1
2
# Ejemplo de redirección de salida
echo "Hola Mundo" | socat - FILE:/tmp/salida.txt
- Conexiones SSL/TLS:
socat
también es capaz de manejar conexiones seguras utilizando SSL/TLS.
1
2
# Ejemplo de conexión SSL
socat TCP-LISTEN:443,reuseaddr,fork OPENSSL:localhost:80,verify=0
Continuando con nuestro laboratorio, lo que debemos hacer en este punto es acceder nuevamente a la máquina 1 por ssh y ejecutar socat de la siguiente manera:
Nos ponemos en escucha con nc
en el puerto 111 para recibir la reverse shell desde la máquina 2, la cual es reenviada por la conexión socat creada anteriormente.
Accedemos por ssh a la máquina 2 y enviamos la reverse shell a la máquina 1, donde socat se encargara de realizar el envío.
Enviamos la reverse shell
Máquina atacante
Hasta el momento tenemos lo siguiente:
El proximo paso que debemos realizar, es compartir desde la máquina 1 los binario de chisel
y socat
, para lo cual creamos un servidor con python por el puerto 8000
.
Máquina 2 - Descargamos los binarios de chisel
y socat
y le asignamos permisos de ejecución.
Ahora lo que debemos hacer es crear una nueva conexión de socat en la Máquina 1
Luego, en la Máquina 2, creamos otro tunel proxy con chisel
.
Y si miramos nuestro chisel server, deberíamos ver un nuevo tunel proxy creado en el puerto 5555
En este punto, debemos agregar este nuevo proxy al archivo proxychains4.conf
Es importante aclarar, que los nuevos proxys deben ingresarse arriba de los que estan presentes.
También debemos descomentar la opción dynamic_chain
y comentar la opción strict_chain
.
Hasta el momento, nuestro diagrama de red luce de la siguiente forma:
Reverse Shell - Máquina 3
Por ultimo, resta ganar acceso a través de una reverse shell a la máquina 3. Para lo cual debemos hacer lo siguiente:
Desde la máquina 1, debemos crear una nueva conexión con socat
.
Desde la máquina 2, también debemos crear un conexión con socat
que redirija las conexiones a la máquina 1.
Luego, desde nuestra máquina atacante ejecutamos nc
para que escuche por el puerto 222 esperando recibir la reverse shell desde la máquina 3.
Enviamos la reverse shell desde la máquina 3
Recibimos la reverse shell en nuestra máquina atacante
El diagrama final de nuestra red quedaría de la siguiente manera:
De esta forma, llegamos al final de nuestro laboratorio.
Espero que los conceptos y la metodología para realizar pivoting con estas herramientas hayan quedado claros. Si has llegado hasta este punto y aún tienes dudas, te recomiendo volver a realizar el laboratorio.
¡Gracias por tu lectura!