Cargando



Cómo utilizar la herramienta de red netcat

En este tutorial verás cómo manejar la herramienta netcat, una herramienta de red muy potente


jul 22 2016 11:02
Avanzado
jul 22 2016 13:40

En este tutorial se va a hablar sobre una herramienta de red muy potente Netcat, comúnmente abreviada como nc. Esta herramienta se utiliza a través de línea de comandos y su sintaxis es muy sencilla. Nos va a permitir escribir y recibir datos a través de sockets (TCP o UDP). Cuenta con muchas características y por lo tanto la podemos usar de muchas maneras. Es importante conocer su funcionamiento, ya que nos permitirá debuggear, testear e investigar en la red.

 

Netcat puede operar de 2 modos:

 

Cliente
En este modo se encargará de conectar con el listener (que está a la escucha en una dirección e IP determinada, y que necesitaremos saber).

 

Servidor o listener
Espera conexiones de los clientes en un determinado puerto.

 

Vamos a aprender el funcionamiento de Netcat o nc a través de ejemplos prácticos, que es la mejor forma de aprender. Para ello voy a utilizar el sistema operativo Ubuntu 16.04.

 

Lo primero que vamos a ver es la sintaxis de netcat:

nc [opciones] [objetivo] [puerto]
Netcat tiene muchas opciones, veamos algunas:

 

Algunas opciones de netcar
  • -l: Indica a netcat que debe permanecer a la escucha.
  • -p: Para indicar el puerto de origen.
  • -s: Para indicar la dirección origen.
  • -k: Para que permita “infinitas” conexiones el listener (se usa con -l).
  • -u: Netcat abre el puerto como UDP en vez de TCP (que es por defecto).
  • -v: Con esta opción nos mostrará información de la conexión.
  • -i: Para indicar el retraso para enviar y recibir. (En segundos).
  • -4: Sirve para que Netcat solo use IPv4.
  • -6: Al igual que la anterior pero fuerza a usar IPv6.

 

Existen más opciones las cuales podemos ver ejecutando el siguiente comando:

nc -h
A continuación se puede ver en la imagen:

 

nc_help.jpg

 

Vamos a empezar con los ejemplos, primero irán los más sencillos, para ir complicándolos, pero solo un poco, verás que es muy fácil de utilizar.

 

Ejemplo 1

Poner a escuchar mi máquina en el puerto 87:
sudo nc -l -p 87
nota
Funcionaria igual quitando -p.

 

Ahora vamos a establecer una conexión desde otra terminal, como la ejecuto en la misma máquina, utilizo localhost como dirección:

nc localhost 87
Si escribimos algo desde el cliente que acabamos de abrir lo veremos también en la terminal que está escuchando, y así verificamos que la conexión funciona correctamente. Pero si escribimos en el listener, la primera terminal, también le llega al cliente. A continuación dejo una imagen del listener y otra del cliente:

 

 

nc_ejemplo_1_1.jpg

 

 

nc_ejemplo_1_2.jpg

 

 

Vemos que se comunican como queríamos en este ejemplo, vamos a por otro.

 

Ejemplo 2

Podemos hacer que el servidor o listener guarde los datos que le manda el cliente en un archivo, para ello el comando a ejecutar no difiere mucho del visto en el primer ejemplo:
sudo nc –l 87 >  test
Nota
test es el nombre del archivo donde guardaras la información que llegue.

 

En el lado del cliente el comando será igual que antes:

nc localhost 87
En la siguiente imagen se ve lo ejecutado en el cliente (el listener está escuchando antes que se conecte, si no, no tendría efecto):

 

nc_ejemplo_2_1.jpg

 

Y en el lado servidor podemos ver que aparentemente no se recibe nada, pero lo único cierto es que no se muestra por pantalla y se guarda en el fichero test:

 

nc_ejemplo_2_2.jpg

 

Continuemos con otro ejemplo.

 

Ejemplo 3

Vamos a comprobar si un rango de puertos, para saber si están abiertos o no, en este ejemplo el rango será 80-90. Primero abrimos un servidor en el puerto 80 como hicimos en el primer ejemplo (así veremos cómo funciona cuando esté abierto, y cuando no):
sudo nc -l 87
Y en el cliente ejecutaremos:
nc -z -v localhost 80-90
El parámetro -z se utiliza para escanear, y el -v como vimos antes para que muestre información (si esto no lo ponemos no mostrará que puerto está abierto y cual no), a continuación la imagen del cliente:

 

nc_ejemplo_3.jpg

 

Vamos a pasar a ver un ejemplo en UDP.

 

Ejemplo 4

Este ejemplo también es sencillo, vamos a poner a escuchar por UDP en el puerto 2016, y vamos a obligar a que sea dirección IPv4:
sudo nc -l -u -4 2016
Y ahora hacemos al cliente conectarse:
nc -u -4 2016
No facilito imagen, ya que la captura será igual a la del ejemplo 1, cambiando claro está la parte del comando. Vamos a pasar a algún ejemplo en el que utilicemos código en Python.

 

Ejemplo 5

Vamos a poner un código lo más sencillo posible en Python para que escuche una conexión, reciba un dato y termine.
import socket

s = socket.socket()
s.bind(("192.168.56.1", 1987))
s.listen(1)
conn, addr = s.accept()

data = conn.recv(1024).decode("utf-8")
print(data)
Este código lo voy a ejecutar en Windows y luego desde Linux conectaré con él a través de netcat, la siguiente imagen muestra el lado cliente en Linux:

 

ejemplo5_nc_client.jpg

 

Y lo que se vería en Windows:

 

ejemplo5_nc_python.jpg

 

Si modificamos algo el código podemos hacer que ejecute un comando y nos mande su contenido, pero también podemos que nos devuelva una shell, que nos permitirá hacer muchas cosas, así que pasemos al siguiente ejemplo.

 

Ejemplo 6

En este ejemplo voy a ejecutar un código Python en la misma máquina de Linux, y me voy a conectar con netcat, vamos a comprobar que nos devuelve una Shell (/bin/bash). A continuación dejo el código de Python, lo más sencillo y corto posible, solo para el ejemplo.
import socket, subprocess

s = socket.socket(socket.AF_INET)
s.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1)
s.bind(("", 1987))
s.listen(1)
conn, addr = s.accept()

p = subprocess.Popen(["/bin/bash"], stdin = conn, stdout = conn, stder = conn)
Se ejecuta el código de Python y se ve lo siguiente (la imagen muestra como queda al conectarse desde netcat):

 

 

server_shell_ejemplo6_jpg.jpg

 

 

Vemos que se mantiene a la escucha al ejecutarlo, pero cuando se conecte un cliente se cierra la conexión, y tenemos una Shell para nosotros.

 

 

nc_shell_ejemplo6_jpg.jpg

 

 

También podríamos hacer un código que se conectara a nuestra máquina, que la pondremos a escuchar en un puerto determinado, en general hay muchas posibilidades, ahora te toca investigar y “jugar” con netcat, que como has podido ver nos puede ayudar en muchos momentos.


¿Te ayudó este Tutorial?


1 Comentarios

Muy completo, gracias

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X