Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 7 de agosto de 2015

Netcat, la navaja suiza de los Linuxeros

Llega el turno de hablaros de una de las navajas suizas de los apasionados de Linux; nada más ni nada menos que el gran netcat. Dicha herramienta esta especialmente diseñada para los administradores de red, y auditores de seguridad, pero también resulta útil en caso de querer hacer algunas pruebas en nuestro equipo... Su versatilidad y sus capacidades son de doble filo, pues es una herramienta capaz de hacer mucho bien, pero al mismo tiempo puede causar estragos en caso de querer emplearla con fines malévolos; es por ello que os recomiendo que cualquier prueba que se quiera realizar con esta herramienta se haga en un entorno controlado o en un entorno en el que tengamos permiso.

Portada_netcat

Instalación

Netcat, como otras tantas herramientas no viene instalada por defecto en el sistema operativo; pero gracias a los completos repositorios que tenemos disponibles, su instalación es tan sencilla como recurrir al famoso apt-get para instalar nuestra herramienta. Su instalación es tan sencilla como escribir:

  1. apt-get install netcat


Las bases

Comencemos con el comando más básico de todos; el comando de apertura de un puerto en nuestra máquina. Dicho puerto sería abierto por netcat y estaría en modo de escucha atento a cualquier conexión desde un equipo remoto. Para lograrlo tendríamos que especificar que vamos a poner a netcat en modo de escucha con el parámetro -l(listening) y además especificaremos que el puerto en qué escucharemos con el parámetro -p(port) y el número de puerto en que queremos escuchar. Es importante asegurarnos de tener el puerto en cuestión libre, ya que en caso contrario no funcionaría. He aquí un listado con los puertos más comunes que nos puede ser útil. Con estos conceptos claros, imaginemos que queremos abrir el puerto 20000; el comando para lograr dicho objetivo sería:

  1. nc -l -p 20000 &

Al añadir el carácter & al final del comando, podríamos seguir trabajando con normalidad sin tener que recurrir a abrir otra consola, ya que permite que el proceso que recién hemos abierto se ejecute en segundo plano. Ahora bien... Es importante saber que efectivamente hemos abierto el puerto exitosamente, lo cual se puede averiguar comprobando si, tras escribir el comando, ha aparecido una línea con un número entre corchetes (generalmente el número 1) y otro número al lado éste; Esta línea hacer referencia hace referencia al número de proceso y posee el siguiente aspecto:

número_proceso

Otra opción que tenemos disponible para hacer la revisión es comprobarlo mediante la ayuda del comando netstat, tal que así:

  1. netstat -putan |grep nc

En caso no aparecer resultado alguno, significaría que el comando que hemos lanzado no ha funcionado correctamente, ya sea porque el puerto está ocupado o por una sintaxis incorrecta. Si hubiese funcionado, veríamos que el servicio se encuentra en estado LISTEN:

Netcat_escucha

Ahora que tenemos el puerto abierto, lo más básico que podemos hacer desde otro equipo conectado en la misma red es conectarnos mediante netcat desde otro equipo a dicho puerto. Aunque hay varias formas de hacerlo, la conexión más básica de todas tendría la estructura:

nc ip_equipo_remoto puerto

Supongamos que el equipo en el que hemos abierto el puerto 20000 anteriormente, posee la ip 192.168.1.4; el comando para establecer la conexión con dicho objetivo sería:

  1. nc 192.168.1.4 20000

Esto crearía una conexión básica entre ambos puntos. Una buena forma de comprobar que efectivamente se ha establecido la conexión sería escribiendo el comando netstat de nuevo en el servidor. En caso de que la conexión entre ambos puntos estuviese establecida, veríamos que el comando habría dado como resultado que existe una conexión entre la ip 192.168.1.4:20000 y nuestro equipo que además el estado del servicio nc ha cambiado a modo ESTABLISHED.

Conexión_netcat


Manipulando archivos

Netcat puede ser usado para acciones mucho más completas que simples conexiones; entre ellas la manipulación de archivos. Para ello habría que poner a netcat en modo de escucha como antes, pero con una pequeña modificación para que no solo pueda establecerse una comunicación, sino que además todo lo que se "reciba" desde el cliente quede grabado dentro de un archivo. Para ello habría que escribir el siguiente comando:

  1. nc 192.168.1.4 20000 >> /usr/src/texto.txt

Ahora que tenemos nuestro fichero "escuchando" habría que enviar una cadena a dicho fichero desde el otro equipo... Esto aunque puede parecer complicado, no lo es; Únicamente hay que unificar un comando como echo o cat con el comando de conexión remota básico que he mostrado antes; dicha unificación se realizarían mediante el carácter | . Por ejemplo, en caso de desear lanzar el comando echo "Esto es una prueba", habría que escribir:

  1. echo "esto es una prueba" |nc 192.168.1.4 20000

Si ahora revisásemos el fichero texto.txt, veríamos una nueva línea presente en éste; concretamente la línea que hemos añadido mediante el comando "echo".


Estableciendo un timeout en netcat

Una de las grandes cualidades de netcat es que podemos hacer que el servicio se mantenga en escucha durante un determinado número de segundos... Esto es especialmente útil cuando no queremos permitir tener a netcat escuchando todo el tiempo; cosa que en muchas ocasiones puede resultar altamente imprudente. La mayoría de las ocasiones solamente queremos que el puerto esté escuchando cierto número de segundos, es por ello que la utilidad de esta opción es incalculable. Imaginemos que por ejemplo queremos tener el puerto abierto durante 5 minutos; es decir 300 segundos. Esto lo podemos lograr mediante el parámetro -w y si lo aplicasemos a la necesidad que acabo de mencionar, es decir, 300 segundos, tendríamos este comando:

  1. nc -l -w 300 -p 20000 &

Pasados los 5 minutos, el servidor nos comunicaría de la finalización de dicha "escucha"; en caso de estar dentro de una consola, la susodicha nos comunicaría: no connection : Connection timed out. Además si comprobásemos de nuevo con netstat el servicio netcat, veríamos que no tiene ninguna conexión abierta.


Manteniendo las conexiones activas tras su desconexión

Uno de los problemas con los que uno se puede encontrar usando esta herramienta, es la imposibilidad de mantener el puerto de escucha abierto en el servidor. Esto es tan sencillo como añadir el parámetro -k(Keep Alive) a la hora de establecer un puerto en escucha. Un ejemplo muy simple que se podría aplicar en el servidor sería:


  1. nc -l -k -p 20000 &


Enviando comandos al servidor


Una de las opciones más peligrosas y al mismo tiempo interesantes que ofrece es utilidad, es el envío de comandos desde un equipo a otro mediante el uso de netcat. Imaginemos que tenemos abierto el puerto 20000 en nuestro servidor. Podemos enviar comandos desde otro equipo mediante la combinación del comando netcat y el parámetro -c(command); esta opción es MUY PELIGROSA y puede tener consecuencias garrafales si no se usa con cuidado. A modo de demostración, ejecutaré remotamente el comando apt-get update remotamente en el equipo con la ip 192.168.1.4, con el puerto 20000. Dicha acción se ejecutaría con este comando:

  1. nc -c "apt-get update" 192.168.1.4 20000


En el equipo en el que hemos ejecutado el comando no apreciaremos comando alguno... Desgraciadamente si nos dirigimos al servidor veremos que efectivamente se está ejecutando la orden que hemos lanzado.

update

Una orden sencilla e inofensiva, pero que fácilmente podría tornarse peligrosa si se cambiase dicha orden por otras, tales como rm -R /* o similares... Es por ello que toda acción que se quiera hacer con esta opción debe de ser realizada con mucho cuidado y tomando todas las precauciones posibles.


Protocolo udp

Netcat trabaja por defecto con el protocolo tcp por defecto, pero en ocasiones podemos considerar que este protocolo no se ajusta a nuestras necesidades... Es por ello que podemos recurrir al protocolo udp en caso de verlo necesario. Esto es tan sencillo como recurrir al parámetro -u al comando de escucha del servidor; lo cual si lo aplicásemos al comando básico de "escucha" del servidor sería:

  1. nc -l -u -p 20000 &

A primera vista no apreciaríamos ninguna diferencia con respecto a los usos anteriores que le hemos dado a esta utilidad, pero si hiciésemos uso una vez más del comando netstat veríamos que efectivamente se está haciendo uso del protocolo UDP:

netstat_udp


Protocolo ipv6

Lo más común suele ser trabajar con el protocolo ipv4, ya que es el más usado en la mayoría de los ámbitos. Aún así, con el paso del tiempo el protocolo ipv6 ha ido ganando relevancia y en algunas ocasiones puede resultar interesante e incluso necesario recurrir a comunicarnos a través de dicho protocolo. 

Netcat tiene la opción de trabajar con ambos protocolos pero usa dos herramientas distinta para hacerlo, de forma muy parecida a iptables. Usa netcat para las comunicaciones ipv4 y netcat6 para las ipv6 con lo que simplemente habría que instalar dicha "variante" mediante apt-get y después usar netcat de la misma forma que hemos usado hasta ahora, con la diferencia de que esta vez usaríamos el comando nc6 unido al parámetro -6:

  1. apt-get install netcat6
  2. nc6 -6 -l -p 20000 &

Ahora solamente habría que recurrir al comando netstat una vez más; en este caso la diferencia radicaría que, en vez de funcionar con el protocolo tcp; lo haría con el protocolo tcp6.


Espero que os resulte útil.

Saludos.

2 comentarios :

  1. Muy buen artículo, no conocía esta herramienta! Gracias por los usos y los comandos junto a su explicación ;-)

    ResponderEliminar
    Respuestas
    1. Me alegro que te haya gustado. La verdad es que es una herramienta poco conocida a nivel de usuario, ya que está destinada a usos bastante concretos. Aún así su utilidad es innegable.

      Saludos.

      Eliminar