Manual práctico de hping

Que es y para qué sirve

La herramienta hping es un analizador/ensamblador de paquetes TCP/IP de uso en modo consola. Está inspirado en el comando ping de unix, aunque a diferencia de éste, hping no solo es capaz de enviar paquetes ICMP sino que además también puede enviar paquetes TCP, UDP, y RAW-IP.

Todo esto quiere decir, que con esta herramienta, podemos generar paquetes TCP/IP a medida, que contengan la información que queramos. Esto puede resultar muy interesante para poder efectuar auditorías de red y poder así prevenir ataques malintencionados.

Descarga e instalación

La instalación de esta herramienta, al menos en Ubuntu, es realmente sencilla, como la mayoría de aplicaciones. Tan sólo hay que abrir una consola y escribir como root:

root@laptop:/home/root# apt-get install hping3

Para más información puedes consultar la web oficial aquí.

Diferentes usos y su sintaxis

El uso más sencillo que podemos darle es como sustituto de la herramienta ping, aunque veremos que la información que nos aporta es algo diferente. Vamos a comparar ambas herramientas:

root@laptop:/home/root# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.017 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.023 ms
^C
— localhost ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.016/0.019/0.023/0.002 ms

root@laptop:/home/root# hping3 localhost
HPING localhost (lo 127.0.0.1): NO FLAGS are set, 40 headers + 0 data bytes
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=0 flags=RA seq=0 win=0 rtt=0.1 ms
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=0 flags=RA seq=1 win=0 rtt=0.1 ms
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=0 flags=RA seq=2 win=0 rtt=0.0 ms
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=0 flags=RA seq=3 win=0 rtt=0.0 ms
^C
— localhost hping statistic —
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.0/0.1 ms

En ambos casos, la información que nos proporciona es muy similar, salvo algún pequeño matiz como el campo de flags, que a continuación veremos de qué se trata.

También podemos utilizarlo como scanner de puertos, utilizando el método idle scan (por cierto, método ideado por Salvatore Sanfilipo, el mismo creador de hping), la sintaxis es la siguiente:

root@laptop:/home/root# hping3 -S localhost -p 9091
HPING localhost (lo 127.0.0.1): S set, 40 headers + 0 data bytes
len=44 ip=127.0.0.1 ttl=64 DF id=0 sport=9091 flags=SA seq=0 win=32792 rtt=0.1 ms
len=44 ip=127.0.0.1 ttl=64 DF id=0 sport=9091 flags=SA seq=1 win=32792 rtt=0.1 ms
len=44 ip=127.0.0.1 ttl=64 DF id=0 sport=9091 flags=SA seq=2 win=32792 rtt=0.1 ms
len=44 ip=127.0.0.1 ttl=64 DF id=0 sport=9091 flags=SA seq=3 win=32792 rtt=0.0 ms
^C
— localhost hping statistic —
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.1/0.1 ms

Si nos fijamos en el valor del flag, veremos que pone SA, que quiere decir SYN/ACK, que a grosso modo es el mensaje que un servidor responde cuando tiene un puerto abierto (en mi caso tengo un pequeño servidor web en el puerto 9091). Si hubiera estado cerrado, nos habría respondido con el flag RA, que quiere decir RST/ACK, o lo que es lo mismo, que tiene el puerto cerrado; veámoslo utilizando otro puerto distinto:

root@laptop:/home/root# hping3 -S localhost -p 9092
HPING localhost (lo 127.0.0.1): S set, 40 headers + 0 data bytes
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=9092 flags=RA seq=0 win=0 rtt=0.0 ms
len=40 ip=127.0.0.1 ttl=64 DF id=0 sport=9092 flags=RA seq=1 win=0 rtt=0.1 ms
^C
— localhost hping statistic —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.0/0.1 ms

En este caso nos responde con un RST/ACK, lo que nos indica que el puerto 9092 está cerrado.

Otro uso que podemos darle es como herramienta traceroute, aunque para este uso, prefiero tcptraceroute, veamos cómo hacerlo con hping:

root@laptop:/home/root# hping3 pedrocarrasco.org -t 1 −−traceroute
HPING pedrocarrasco.org (wlan0 174.132.157.133): NO FLAGS are set, 40 headers + 0 data bytes
hop=1 TTL 0 during transit from ip=10.109.8.1 name=UNKNOWN
hop=1 hoprtt=0.9 ms

El campo ip=10.109.8.1, hace referencia a la IP del primer salto que realiza para llegar al dominio especificado. Ésto lo hemos especificado poniendo -t 1 (también podemos utilizar el comando -z en vez de -t, e incrementar el TTL cuanto queramos de uno en uno presionando Ctrl+Z).

Además podemos «firmar» los paquetes que enviemos, con el contenido que queramos. Aunque este ejemplo es inocuo, utilizándolo (in)debidamente podríamos causar diversas alteraciones en la máquina destino. Veámos el ejemplo:

root@laptop:/home/root# cat firma.txt
esto es solo un ejemplo
root@laptop:/home/root# hping3 -2 -p 7 localhost -d 50 -E firma.txt
HPING localhost (lo 127.0.0.1): udp mode set, 28 headers + 50 data bytes
[main] memlockall(): Success
Warning: can’t disable memory paging!
ICMP Port Unreachable from ip=127.0.0.1 name=localhost
status=0 port=1963 seq=0

Estableciendo la opción -2 enviamos paquetes UDP, con la opción -d 50 indicamos la longitud del mensaje y con la opción -E indicamos que lea del archivo firma.txt. Podemos ver lo que hemos enviado si capturamos con cualquier sniffer (yo he usado wireshark) el tráfico de la red.

Firmar paquetes con hping
Firmar paquetes con hping

Otra interesante habilidad de hping es poder enviar archivos a través de la red. Para esto, necesitamos una máquina que envíe algún archivo, y otra que esté a la escucha para recibirlo. Primero, preparamos la máquina que permanecerá a la escucha, para ello utilizaremos el parámetro −−listen en el que especificaremos el texto que nos servirá de indicador de inicio de mensaje (en este caso utilizo signature), el protocolo que usaremos es ICMP y lo establecemos utilizando el parámetro −−icmp (también puede usarse UDP o TCP). Al ejecutarlo veremos algo así:

root@laptop:/home/root# hping3 localhost −−listen signature −−safe −−icmp
Warning: Unable to guess the output interface
hping3 listen mode
[main] memlockall(): Success
Warning: can’t disable memory paging!

Ahora toca preparar por otro lado el comando que nos servirá para enviar el fichero que queramos.

root@laptop:/home/root# hping3 localhost −−icmp -d 50 −−sign signature −−file firma.txt
HPING localhost (lo 127.0.0.1): icmp mode set, 28 headers + 50 data bytes
[main] memlockall(): Success
Warning: can’t disable memory paging!
len=78 ip=127.0.0.1 ttl=64 id=5268 icmp_seq=0 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5287 icmp_seq=1 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5289 icmp_seq=2 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5291 icmp_seq=3 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5293 icmp_seq=4 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5295 icmp_seq=5 rtt=0.1 ms
len=78 ip=127.0.0.1 ttl=64 id=5297 icmp_seq=6 rtt=0.1 ms

El resultado es que en el lado en que estábamos esperando recibir algo, empieza a verse lo siguiente:

root@laptop:/home/root# hping3 localhost −−listen signature −−safe −−icmp
Warning: Unable to guess the output interface
hping3 listen mode
[main] memlockall(): Success
Warning: can’t disable memory paging!
esto es solo un ejemplo
esto es solo un ejemplo
esto es solo un ejemplo
esto es solo un ejemplo
esto es solo un ejemplo
esto es solo un ejemplo

Conociendo este último uso, y con un poco de imaginación podremos utilizar hping como si de un troyano se tratase. Aunque mas que para ser usado como troyano, esta herramienta es perfecta para realizar ataques de DoS, spoof o flood. Acabaremos el artículo viendo un sencillo ejemplo de ataque flooding:

root@laptop:/home/root# hping3 −−rand-source −−flood localhost
HPING localhost (lo 127.0.0.1): NO FLAGS are set, 40 headers + 0 data bytes
hping in flood mode, no replies will be shown
^C
— localhost hping statistic —
189742 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

Podemos ver que en tan solo unos segundos, hemos inundado la red con casi doscientos mil paquetes transmitidos de forma ininterrumpida. Esto puede (suele) causar que la red se colapse, impidiendo a otros usuarios poder utilizarla, ya que hping no deja espacio (entre paquete y paquete) para que otras máquinas transmitan ningún tipo de información. El parámetro −−rand-source hace que cada paquete tenga un origen distinto y aleatorio, y −−flood no deja espacio entre paquete y paquete. Si tenemos wireshark a la escucha, podemos ver cual es el resultado:

hping-flood
hping-flood

Ahora os toca practicar con hping para aprender más sobre el protocolo TCP/IP y sus debilidades. No creo que haga falta decirlo, pero por si acaso aviso de que el uso malintencionado de esta herramienta puede ser ilegal, así que utilizad esta información de un modo educativo o para auditar vuestra propia red.

Privacidad real usando GPG

Candado (imagen extraida de la wikipedia)
Candado (imagen extraida de la wikipedia)

¿Qué es GPG?

GPG, tal y como se dice en la Wikipedia, es una herramienta para cifrar y firmar mensajes. Podriamos decir que es el hermano libre de PGP. Existen los proyectos GPG4win y macgpg2 que proveen de una versión de GPG para Windows y Mac respectivamente.

¿Para qué necesito cifrar y firmar mensajes?

Lo más conveniente sería que habitualmente hiciéramos uso de este tipo de herramientas, al menos para las comunicaciones que queramos mantener realmente en privado.

Por si no lo sabías, la mayoría de correos electrónicos, programas de mensajería como Messenger, accesos y contenido de páginas web, herramientas de videoconferencias, y un largo etcétera de utilidades que a priori pueden parecernos suficientemente privadas, se transmiten por Internet sin ningún tipo de encriptación. Esto quiere decir que si alguien es capaz de escuchar esta comunicación (muy sencillo mediante cualquier sniffer), puede llegar a ver todo lo que estamos haciendo.

Puede parecer poco probable que esto suceda, pero ni te imaginas la de oportunidades que se presentan al día para poder ser víctima de este tipo de espionaje: siempre que utilizas tu conexión wifi del móvil o portátil y te conectas a Internet en un bar, en una biblioteca pública, en la red cableada de tu oficina, incluso en la propia red inalámbrica de tu casa (ni te imaginas lo fácil que puede llegar a ser reventar la clave de una red wifi doméstica) puedes estar siendo espiado.

Sí, sé que suena paranoico, y probablemente lo sea, pero si necesitas una privacidad real, la mejor solución es encriptar o cifrar nuestras comunicaciones.

¿Cómo puedo encriptar un mensaje?

Para encriptar un mensaje con GPG (o con cualquier sistema de criptografía asimétrica), necesitamos generar un par de claves. Una de ellas será la clave pública, clave que todo el mundo deberá conocer, y la otra será la clave privada, que debe mantenerse en privado y sólo tú debes conocer, ya que eso nos garantizará los servicios de confidencialidad, autenticación, integridad y no repudio.

Para generar nuestro par de claves, utilizaremos Seahorse, un gestor de claves GPG para Gnome que facilita mucho todo el proceso. Si utilizas Gnome, te interesará instalar también los plugins de seahorse para nautilus, para disponer del menú contextual que te permita encriptar un archivo haciendo clic en el botón derecho. Instalar seahorse y el plugin puedes hacerlo escribiendo en la consola lo siguiente:

root@laptop:/home/root# sudo apt-get install seahorse seahorse-plugins

Tras la instalación, debes reiniciar nautilus. Para hacerlo puedes reiniciar el PC, o cerrar sesión y volver a entrar o simplemente escribiendo:

root@laptop:/home/root# killall nautilus

Aquí están las capturas que nos muestra cómo generar el par de claves paso a paso utilizando Seahorse:

Paso 1: Ejecutamos Seahorse, y vamos al menú Archivo » Nueva...
Paso 1: Ejecutamos Seahorse, y vamos al menú Archivo » Nueva...
Paso 2: Aparecerá una ventana con los tipos de claves que seahorse nos permite crear. Seleccionamos Clave PGP
Paso 2: Aparecerá una ventana con los tipos de claves que seahorse nos permite crear. Seleccionamos Clave PGP
Paso 3: Aparece una nueva ventana en la que deberemos introducir nuestros datos: Nombre, email y comentario (éste último opcional). También podemos seleccionar el tipo de cifrado, la fortaleza de la clave (recomendado 4096 o más) y la caducidad de la misma si hacemos clic en «opciones avanzadas de clave»
Paso 3: Aparece una nueva ventana en la que deberemos introducir nuestros datos: Nombre, email y comentario (éste último opcional). También podemos seleccionar el tipo de cifrado, la fortaleza de la clave (recomendado 4096 o más) y la caducidad de la misma si hacemos clic en «opciones avanzadas de clave»
Paso 4: Escribe una contraseña. Ésta sirve para poder guardar de forma segura la clave privada. Deberás utilizar esta clave siempre que hagas uso de la clave privada, así que procura no olvidarla!
Paso 4: Escribe una contraseña. Ésta sirve para poder guardar de forma segura la clave privada. Deberás utilizar esta clave siempre que hagas uso de la clave privada, así que procura no olvidarla!
Paso 5: En este paso es donde se crea propiamente el par de claves. Este proceso puede tardar bastante, en función de la fortaleza de la clave que hayamos seleccionado antes. Para 4096 tarda unos 3 minutos.
Paso 5: En este paso es donde se crea propiamente el par de claves. Este proceso puede tardar bastante, en función de la fortaleza de la clave que hayamos seleccionado antes. Para 4096 tarda unos 3 minutos.
Paso 6: Una vez haya terminado de generar la clave, aparecerá automáticamente en la lista de claves personales, listo para usarlo!
Paso 6: Una vez haya terminado de generar la clave, aparecerá automáticamente en la lista de claves personales, listo para usarlo!

Si utilizas Windows o Mac, prueba con GPG4Win o macgpg2, el proceso debe ser muy parecido, aunque nunca lo he probado. Si alguien tiene alguna experiencia con estas versiones estaré encantado de saber qué tal funcionan y poder intercambiar opiniones.

¿Y ahora qué?

Bien, pues ahora puedes encriptar y firmar documentos o archivos y enviárselos a quien quieras, con la certeza de que nadie, salvo la persona a la que le envías el mensaje, podrá leerlo. Para hacerlo, la persona que recibirá el mensaje encriptado debe disponer también de un par de claves como los que acabamos de generar, y tú debes conocer la clave pública del destinatario.

Vamos a ver un ejemplo de cómo exportar tu clave pública con Seahorse.

Paso 1: Seleccionar la clave GPG de la que quieres exportar la clave pública y hacer clic en el icono de «Exportar a un archivo»
Paso 1: Seleccionar la clave GPG de la que quieres exportar la clave pública y hacer clic en el icono de «Exportar a un archivo»
Paso 2: Seleccionar el nombre e indicar dónde queremos guardarlo.
Paso 2: Seleccionar el nombre e indicar dónde queremos guardarlo.

Para importar una clave pública y añadirla en tu lista de claves públicas, tan solo tienes que hacer doble clic en el fichero .asc o, dentro de Seahorse, hacer clic en Archivo » Importar… y seleccionar el archivo de clave pública.

Una vez tengas alguna clave pública del destinatario en el apartado de «Otras claves» ya podemos compartir mensajes encriptados con esa persona. El proceso es muy sencillo, aquí van las capturas de cómo cifrar un archivo paso a paso:

Paso 1: Seleccionamos el fichero que queremos cifrar y hacemos clic con el boton derecho. Seleccionamos la opción Cifrar...
Paso 1: Seleccionamos el fichero que queremos cifrar y hacemos clic con el boton derecho. Seleccionamos la opción Cifrar...
Paso 2: Elegimos las personas que van a poder descifrar el mensaje. En este caso seleccionamos a Albert. También podemos elegir si queremos firmar el mensaje que ciframos o no.
Paso 2: Elegimos las personas que van a poder descifrar el mensaje. En este caso seleccionamos a Albert. También podemos elegir si queremos firmar el mensaje que ciframos o no.
Paso 3: Escribimos la contraseña que hemos utilizado para cifrar nuestra clave privada durante el proceso de creación de la clave (ver paso 4, durante la creación de clave)
Paso 3: Escribimos la contraseña que hemos utilizado para cifrar nuestra clave privada durante el proceso de creación de la clave (ver paso 4, durante la creación de clave)
Paso 4: Se genera un archivo cifrado con el mismo nombre que el original y se le añade la extensión PGP. Este es el fichero que debemos enviar, ya que, en este caso, sólo Albert podrá descifrarlo. Ni siquiera yo mismo podría descifrarlo. Si quieres poder descifrarlo tu también, tan solo debes añadirte a ti mismo como destinatario.
Paso 4: Se genera un archivo cifrado con el mismo nombre que el original y se le añade la extensión PGP. Este es el fichero que debemos enviar, ya que, en este caso, sólo Albert podrá descifrarlo. Ni siquiera yo mismo podría descifrarlo. Si quieres poder descifrarlo tu también, tan solo debes añadirte a ti mismo como destinatario.

Ya está! Ahora solo tenemos que enviar el archivo encriptado por correo electrónico, mensajería instantánea o como queramos y nos hemos asegurado de que sólo el destinatario podrá descifrarlo. Si el fichero sufre alguna modificación durante el envío -malintencionadamente o no-, quedará corrupto y no podrá ser devuelto a su estado original (no podrá ser descifrado), por lo tanto se cumple el servicio de integridad. Si además de cifrarlo, hemos optado por firmarlo, el destinatario tendrá la certeza de que sólo quien lo envía ha podido ser el remitente, así que también se cumple el servicio de autenticación. Y desde luego nadie podrá conocer el contenido, salvo Albert en este caso, así que se cumple también el servicio de confidencialidad.

Por cierto, aquí dejo el enlace a mi clave pública por si alguien necesita enviarme algo realmente confidencial.

Imágenes panorámicas

Desde hace bastante tiempo, una de mis aficiones, siempre que llevo una cámara de fotos encima, es tomar múltiples instantáneas para luego poder unirlas mediante algún software de stitching para crear fantásticas imágenes panorámicas. Los resultados suelen ser increíbles, las imágenes resultantes consiguen una calidad gigantesca, me encanta la sensación de poder hacer zoom y más zoom y seguir teniendo una imagen nítida, algo normal, si contamos con imágenes que, una vez unidas llegan a tener 14.000 pixels de ancho o más. Es algo así como Google Maps, pero más modesto.

Existen muchos programas que realizan este proceso de manera automática, pero el que yo utilizo es Hugin por muchos motivos, que puedo resumir en 3 grandes puntos:

  1. Es Software libre, y siempre que exista una opción libre suele ser mi elección favorita.
  2. Es multiplataforma, así que si algún día (por cuestiones ajenas a mi voluntad) tengo que trabajar en algún SO que no sea libre puedo seguir disfrutando de este genial programa.
  3. Es muy sencillo de usar si no quieres complicarte mucho, aunque si quieres puedes toquetear un montón de parámetros para que quede una panorámica perfecta.

Y ahora os dejo con algunas de las imágenes – en baja resolución, sorry – que yo mismo he tomado durante los últimos años.

Ciudad de las Artes de Valencia, durante la Campus Party de 2003
Ciudad de las Artes de Valencia, durante la Campus Party de 2003
Besalú, un pueblo medieval situado en La Garrotxa en 2005
Besalú, un pueblo medieval situado en La Garrotxa en 2005

Castillo de Gormaz en 2008
Castillo de Gormaz en 2008
Colliure en 2009
Colliure en 2009

Fornells, Menorca en 2007
Fornells, Menorca en 2007
Las Casas Colgantes, Cuenca, 2008
Las Casas Colgantes, Cuenca, 2008
Molinos en Holanda, 2009
Molinos en Holanda, 2009
Rotterdam, Holanda en 2009
Rotterdam, Holanda en 2009
Port de la selva, Catalunya, 2010
Port de la selva, Catalunya, 2010
Perdidos en el monte de Orea, 2008
Perdidos en el monte de Orea, 2008
Port de la selva, Catalunya, 2010
Port de la selva, Catalunya, 2010

Base militar abandonada, El Toro, 2003
Base militar abandonada, El Toro, 2003