Manual / Tutorial de Hping (con ejemplos) I
En vista de que no he encontrado un manual que hable bien amplia mente sobre las posibilidades que nos brinda hping, me parece interesante comenzar a dedicar tiempo a comenzar a darle forma a la idea de tener un manual que explique y ejemplifique el uso de hping. Sin embargo, existen varios artículos dispersos en la web, los cuales voy a citar y al final de este artículo podrán encontrar una lista de los mas interesantes.
Preeliminares
Como reza la pagina oficial de hping, esta herramienta de linea de comando, esta inspirada el comando ping de unix, sin embargo su utilidad es 1024 veces superior (lo de mil 1024 es un chiste geek). Su finalidad es la de poder crear paquetes personalizados para poder analizar las respuestas.
Dentro de sus funciones, con hping podemos hacer:
- Firewall testing
- Advanced port scanning
- Network testing, using different protocols, TOS, fragmentation
- Manual path MTU discovery
- Advanced traceroute, under all the supported protocols
- Remote OS fingerprinting
- Remote uptime guessing
- TCP/IP stacks auditing
Actualmente hping tiene una versión 3, la cual nos permite realizar scripts sobre tcl para poder crear nuestras propias herramientas, como veremos mas adelante.
El primer problema que muchos encuentran al querer utilizar hping, es que hping no es una herramienta que como muchas otras le especificamos un target y esperamos ver resultados. Para poder utilizar hping, necesitamos conocer exactamente que estamos haciendo.
Por eso, antes de continuar leyendo te recomiendo que obtengas conocimientos en TCP, UDP, IP, ICMP y el Modelo OSI y DOD. Para los que están interesados en más que aprender alguna “receta” interesante, les recomiendo encarecidamente leer los siguientes RFC (estan en español):
RFC 768 Protocolo UDP (original)
RFC 793 Protocolo TCP (original)
RFC 791 Protocolo IP (original)
RFC 702 Protocolo ICMP (original)
Para los que necesitan recordar el funcionamiento del modelo osi, pueden ver una representación muy interesante en este link
Opciones generales
Hping tiene un funcionamiento parecido al ping en el sentido de que envia reiteradamente un paquete ( en el caso de hping uno “armado por nosotros” ) hasta que cortemos la ejecución del programa con un control C.
- Para poder elegir la cantidad de veces que se quiere enviar el paquete podemos usar la opción -c la cual especifica el número de paquetes que queremos enviar (Si no, envía paquetes hasta que lo cortemos con un control c).
- Para elegir el intervalo (la rapidez) con que envia los paquetes usamos -i y como argumento el intervalo de tiempo (en segundos) entre paquete y paquete. Si quisieramos usar microsegundos en lugar de segundos utilizamos u100 para 100 microsegundos.
Ademas, podemos usar los alias –fast, –faster o –flood para enviar paquetes a 10000 microsegundos, 1000 microsegundos o tan rápido como se pueda respectivamente.
Finalmente quiero recalcar el uso del -z , -Z, –scan y ++ :
La combinación de teclas Control Z, esta ligada por defecto a aumentar el numero de puerto al que estamos enviando el paquete (para tcp y udp), de esta manera podemos escanear un host aumentando en 1 el numero de puerto.
Isis:~# hping3 -n -p 1 -S myfriend.dyndns.org HPING myfriend.dyndns.org (eth0 186.143.34.194): S set, 40 headers + 0 data bytes len=46 ip=186.143.34.194 ttl=255 id=6804 sport=1 flags=RA seq=0 win=0 rtt=1.1 ms len=46 ip=186.143.34.194 ttl=255 id=2354 sport=1 flags=RA seq=1 win=0 rtt=1.0 ms len=46 ip=186.143.34.194 ttl=255 id=29089 sport=1 flags=RA seq=2 win=0 rtt=1.0 ms 2: len=46 ip=186.143.34.194 ttl=255 id=1722 sport=2 flags=RA seq=3 win=0 rtt=1.0 ms 3: len=46 ip=186.143.34.194 ttl=255 id=5979 sport=3 flags=RA seq=4 win=0 rtt=1.1 ms len=46 ip=186.143.34.194 ttl=255 id=10915 sport=3 flags=RA seq=5 win=0 rtt=1.1 ms 4: len=46 ip=186.143.34.194 ttl=255 id=32111 sport=4 flags=RA seq=6 win=0 rtt=1.0 ms 5: len=46 ip=186.143.34.194 ttl=255 id=12237 sport=5 flags=RA seq=7 win=0 rtt=1.1 ms len=46 ip=186.143.34.194 ttl=255 id=538 sport=5 flags=RA seq=8 win=0 rtt=1.0 ms ^C --- netuniverse.dyndns.org hping statistic --- 9 packets transmitted, 9 packets received, 0% packet loss round-trip min/avg/max = 1.0/1.1/1.1 ms
Cada vez que presionamos control Z, el puerto aumenta en uno, como dijimos.
Si en este mismo ejemplo, usaramos -z en lugar de aumentar el puerto aumenta el numero de TTL como veremos más adelante. Y si usamos -Z (z en mayuscula) simplemente al presionar control Z el programa pasará a estado suspendido.
Para poder scanear varios puertos de un tiron, podemos usar la opcion –scan:
hping –scan 1-1024 -S mytarget.com
Donde scaneamos los puertos del 1 al 1024, también lo veremos mas adelante.
Firewall Testing ( en modo TCP )
Hping puede crear paquetes del tipo IP crudo, ICMP, TCP y UDP. Para seleccionar el tipo de paquete que queremos crear, debemos seleccionar el Modo (Mode) en que ejecutaremos hping.
El modo por defecto es TCP, en este modo, hping nos permite crear un paquete TCP a nuestra medida, es decir, especificando los valores de los distintos campos de un paquete TCP. Los valores que no sean explícitos, serán puestos en sus valores por defecto (calculados si fuera necesario). Al usar el modo TCP (al igual que en UDP e ICMP), podemos modificar también los valores de los campos del protocolo IP.
Veamos un ejemplo:
Isis:~# hping3 -p 80 192.168.1.1HPING 192.168.1.1 (eth0 192.168.1.1): NO FLAGS are set, 40 headers + 0 data bytes^C--- 192.168.1.1 hping statistic ---3 packets transmitted, 0 packets received, 100% packet lossround-trip min/avg/max = 0.0/0.0/0.0 ms
Al ejecutar hping sin ningún parámetro, solo especificando una ip, hping crea un paquete tcp sin ningún flag, el cual monta sobre un paquete IP modificando el campo de su destino a “192.168.1.1″. De aquí que todas las opciones no especificadas son calculadas por hping. En este ejemplo, al no configurar los flags del paquete tcp, hping crea un paquete tcp sin flags y sin puerto de destino, y comienza a enviarlo iterativa mente como lo hace el programa ping. Como es de esperarse ningún sistema debería responder a este tipo de paquetes ya que el RFC indica que deben ser descartados sileciosamente.
Si bien puede parecer un ejemplo simple, este ejemplo es la base para el NULL Scan, ya que podemos verificar la respuesta a un paquete TCP sin las flags correspondientes. Especificando el puerto tcp, es suficiente para realizar el NULL Scan sobre ese puerto. Si probamos agregando la opcion -p seguido de cualquier numero de puerto, es probable que la respuesta sea idéntica. En este caso (NULL Scan), hping no nos permite ver el WIN devuelto, que es lo interesante de un NULL Scan.
Tanto el modo TCP y UDP comparten la opción de poder seleccionar el puerto de origen ( con -s, esto toma importancia en algunos sistemas que validan, por ejemplo si el puerto de origen es inferior al 1024 ), el cual si no es explicitado se elije de forma aleatoria, y el puerto de destino, como lo hicimos anteriormente con -p.
Una de las opciones mas interesantes de hping, encontramos la posiblidad de selecionar los flags de un paquete TCP, estos son a saber SYN, ACK, RST, PUSH, URG y FIN.
Los que mas nos interesan por el momento son:SYN: Sincroniza la conexión, es usado durante toda la conexión.
ACK: Confirmación de datos recibidos
FIN: Solicitud para cerrar la conexión.
RST: Aborta la conexión sin negociación ( a diferencia de FIN).
Como dije anteriormente, para comprender esta parte del uso de hping debemos saber como se usan en una conexión TCP dichos flags, ya que si no, no comprenderemos los resultados obtenidos. A pesar de eso, es probable que si seguis leyendo, los ejemplos te hagan comprender un poco.
Vemos en la ayuda de hping, las siguientes opciones:
-F --fin set FIN flag -S --syn set SYN flag -R --rst set RST flag -P --push set PUSH flag -A --ack set ACK flag -U --urg set URG flag
Con estas opciones podemos decidir las flags que llevará los paquetes TCP, de esta forma simple, podemos elegir que las lleve todas, ninguna, o las que querramos.
La mayoria de los distintos tipos de escaneos TCP dependen de estos flags. El mas común, utilizado por los scanners mas simples, es el SYN scan, el cual consiste en enviar un SYN ( indicador de inicio de conexión ) y esperar la respuesta ( normalmente SYN/ACK si el puerto esta abierto, y RST si esta cerrado ).
Comprendiendo esto, podemos comenzar a usar hping como un escaneador de puertos:
Isis:~# hping -c 5 -p 80 -S 192.168.1.1 HPING 192.168.1.1 (eth0 192.168.1.1): S set, 40 headers + 0 data bytes len=46 ip=192.168.1.1 ttl=64 id=17576 sport=80 flags=SA seq=0 win=8192 rtt=2.0 ms len=46 ip=192.168.1.1 ttl=64 id=17578 sport=80 flags=SA seq=1 win=8192 rtt=1.5 ms len=46 ip=192.168.1.1 ttl=64 id=17580 sport=80 flags=SA seq=2 win=8192 rtt=1.5 ms len=46 ip=192.168.1.1 ttl=64 id=17582 sport=80 flags=SA seq=3 win=8192 rtt=1.5 ms len=46 ip=192.168.1.1 ttl=64 id=17584 sport=80 flags=SA seq=4 win=8192 rtt=1.5 ms --- 192.168.1.1 hping statistic --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 1.5/1.6/2.0 ms
Un ejemplo simple, pero eficiente para mostrar el funcionamiento de esta dichosa herramienta:
Con -c 5 le pedimos a hping que solo envie 5 paquetes, al puerto 80, con el SYN activado en la cabecera TCP, en consecuencia, el host target, nos responde un paquete TCP, con puerto de origen 80, y los flags SYN y ACK.
Esta respuesta, corresponde a un host target con el puerto 80 abierto, ya que los flags SYN/ACK son indicadores de que el SYN inicial fue recibido.
Si recordamos lo que mas arriba mencioné acerca de la opcion de Control Z, podemos convertir a hping en un tcp-port-scanner:
Isis:~# hping3 -p 1 -S 192.168.1.1 HPING 192.168.1.1 (eth0 192.168.1.1): S set, 40 headers + 0 data bytes 2: 3: 20: len=46 ip=192.168.1.1 ttl=64 id=40704 sport=20 flags=RA seq=24 win=0 rtt=1.3 ms len=46 ip=192.168.1.1 ttl=64 id=40706 sport=20 flags=RA seq=25 win=0 rtt=1.3 ms len=46 ip=192.168.1.1 ttl=64 id=40708 sport=20 flags=RA seq=26 win=0 rtt=1.3 ms 21: len=46 ip=192.168.1.1 ttl=64 id=40710 sport=21 flags=RA seq=27 win=0 rtt=1.4 ms len=46 ip=192.168.1.1 ttl=64 id=40712 sport=21 flags=RA seq=28 win=0 rtt=1.4 ms len=46 ip=192.168.1.1 ttl=64 id=40714 sport=21 flags=RA seq=29 win=0 rtt=1.4 ms 22: 23: len=46 ip=192.168.1.1 ttl=64 id=40716 sport=23 flags=RA seq=32 win=0 rtt=1.3 ms35: z^C --- 192.168.1.1 hping statistic --- 45 packets transmitted, 7 packets received, 85% packet loss round-trip min/avg/max = 1.3/1.3/1.4 ms
Observemos que el parametro de -p es 1 (es decir puerto TCP 1), y al no haber respuesta (ni un RST de parte del host target) Hping no muestra ninguna respuesta. Luego, al presionar Control Z, en lugar de enviar los paquetes al puerto número 1, lo hace al puerto 2, así sucesivamente, hasta el puerto 20, donde comenza a recibir respuestas RA (RST / ACK ).
Interpretar esta respuesta, involucra un poco de estudio acerca del host objetivo, sin embargo, a priori, podemos ver, que los puertos del 1 al 19, no responden nada, y sin embargo, el puerto 20 responde RST/ACK. Es decir, que el objetivo, reacciona de manera distinta frente al puerto 20 (lo mismo pasa en el puerto 21 y 23 ).
Esto se debe generalmente, a reglas de filtrado, como podemos ver los puertos del 1 al 19, han de estar cerrados, y existe una regla que impide todo tipo de egreso y/o ingreso desde/a estos puertos (aún las respuestas RST), a diferencia de los puertos 20, 21, y 23, en los cuales, nuestro paquete con flag SYN, es recibido, procesado y respondido, indicando que el puerto correspondiente esta cerrado.
Nmap tambien nos muestra esta diferencia, de la siguiente forma:
Starting Nmap 4.90RC1 ( http://nmap.org ) at 2010-05-31 15:56 ART Interesting ports on Orus (192.168.1.1): Not shown: 995 filtered ports PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp closed ftp 23/tcp closed telnet
Este caso puede darse por ejemplo, en un host, donde el puerto esta abierto en el firewall, pero no existe ningún daemon/sistema/programa “escuchando” en dicho puerto. También puede darse de un router haciendo forwarding a un puerto cerrado.
Para dar un cierre a esta primera parte, imitaremos con hping los algunos de los distintos tipos de escaneos que pueden realizarse con nmap, para que comprendamos exactamente como funcionan:
Como vimos anteriormente, un SYN scan ó TCP SYN (en nmap la opcion -sS ) lo hacemos de la siguiente manera:
Isis:~# hping -c 1 -S -p 80 google.com HPING google.com (eth0 74.125.65.147): S set, 40 headers + 0 data bytes len=46 ip=74.125.65.147 ttl=53 id=13915 sport=80 flags=SA seq=0 win=5720 rtt=155.5 ms--- google.com hping statistic --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 155.5/155.5/155.5 ms
Enviamos un paquete TCP con flag SYN activado y recibimos uno con flags SYN/ACK, verificando que el puerto 80 esta abierto, si la respuesta fuera RA, es decir RST/ACK, estaríamos frente a un puerto cerrado, y si no hubiera respuesta, el puerto 80, está de alguna manera filtrado.
El FIN Scan consiste en eviar al paquete TCP con el flag FIN activado (en nmap -sF ), algo que no sucede en ninguna conexión normal.
Isis:~# hping -c 1 -F -p 443 mytarget.com HPING mytarget.com (eth0 201.235.102.256 ): F set, 40 headers + 0 data bytes --- mytarget.com hping statistic --- 1 packets transmitted, 0 packets received, 100% packet loss round-trip min/avg/max = 0.0/0.0/0.0 msIsis:~# hping -c 1 -F -p 80 mytarget.com HPING mytarget.com (eth1 201.235.102.256 ): F set, 40 headers + 0 data bytes len=46 ip=9.13.80.179 ttl=64 DF id=42533 sport=80 flags=RA seq=0 win=0 rtt=0.7 ms --- mytarget.com hping statistic --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.7/0.7/0.7 ms
Aqui vemos dos respuestans distintas, en dos puertos distintos.
En el primer caso, enviamos un “FIN Scan” al puerto 443, y no obtenemos respuesta y en el segundo caso lo enviamos al puerto 80 y recibimos un RST/ACK ( flags=RA).
Mytarget.com, es en este ejemplo un FreeBSD, y responde como lo indica el RFC de TCP, enviando un RST/ACK en los puertos cerrados y no envia respuesta en los puertos abiertos. Sin embargo, esto varia de sistema en sistema, por lo que realizar un FIN Scan no es la última palabra, si no, solo una comprobación más.
Del mismo modo que el FIN Scan, Xmas consiste en enviar un paquete TCP con flags que nunca deberían ir activadas en el primer paquete de la conexión, estas son FIN, URG y PUSH (en nmap -sX)
Isis:~# hping -c 1 -F -P -U -p 443 mytarget.com HPING mytarget.com (eth0 201.235.102.256 ): FPU set, 40 headers + 0 data bytes --- mytarget.com hping statistic --- 1 packets transmitted, 0 packets received, 100% packet loss round-trip min/avg/max = 0.0/0.0/0.0 ms Isis:~# hping -c 1 -F -P -U -p 80 mytarget.com HPING mytarget.com (eth1 201.235.102.256 ): FPU set, 40 headers + 0 data bytes len=46 ip=9.13.80.179 ttl=64 DF id=42533 sport=80 flags=RA seq=0 win=0 rtt=0.7 ms --- mytarget.com hping statistic --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.7/0.7/0.7 ms
El analisis de las respuestas es el mismo, RA para los puertos cerrados, y sin respuesta para los abiertos / filtrados.
Sin embargo, insisto, estas respuestas van a variar contra que sistema se prueben.
Nota: en lugar de usar -F -P -U, podemos abreviar usando -X
Para culminar esta primera parte, abandonamos un poco los flags TCP, y nos concentramos en otro parámetro de la cabezera, a saber, el “Win”.
Al iniciarse una conexión TCP, se negocia el tamaño de los paquetes que cada parte de la conexión puede procesar antes de enviar una confirmación (ACK) , este “tamaño” es el “Window Size” (aka Win).
Ahora bien, observemos esta respuesta:
Isis:~# hping3 -c 1 -S -p 21 mytarget.com HPING mytarget.com (eth0 201.235.102.256): S set, 40 headers + 0 data bytes len=46 ip=201.235.102.256 ttl=64 id=47842 sport=21 flags=RA seq=0 win=9192 rtt=1.6 ms --- 201.235.102.256 hping statistic --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 1.6/1.6/1.6 ms
En este caso, si jusgamos la respuesta por las flags (RA), el puerto pareceria cerrado, sin embargo, si esto fuera así, el win de respuesta debería ser 0, como en el ejemplo del Xmas scan, por ejemplo.
Queda claro entonces, que alguna regla/firewall/router esta filtrando la respuesta, para saber si este filtro esta en el mismo host o en otro distinto, vas a tener que esperar a la segunda parate de este manual.
Por el momento, solo hemos visto como usar hping como un simple scanner de puertos TCP. Comparamos el uso de hping con el de nmap, para quienes esten famialiarizados con el el uso de esta herramienta, pero veremos que aún tiene mas potencial que el que hemos mostrado hasta ahora. Sin embargo, tendrán que esperar a la segunda parte del manual! Hasta la próxima!
Comments
Pingback from OPERACIÓN PAYBACK| About| aRFeGo
Time 10 diciembre 2010 at 01:43
[...] -d hping3 hping3 -S -i u10000 -p Ej: hping3 -S -i u10000 -p 443 api.paypal.com Mas sobre HPING: http://www.netsecure.com.ar/2010/05/20/manual-tutorial-de-hping-con-ejemplos-i/ [...]
Pingback from Operación Payback « aRFeGo WeBLoG
Time 4 enero 2011 at 19:41
[...] -d hping3 hping3 -S -i u10000 -p Ej: hping3 -S -i u10000 -p 443 api.paypal.com Mas sobre HPING: http://www.netsecure.com.ar/2010/05/20/manual-tutorial-de-hping-con-ejemplos-i/ [...]
Pingback from Shadow Security – NetFilter / IPTables
Time 2 marzo 2011 at 16:56
[...] de bulma /* Para realizar pruebas de filtrado, podemos utilizar hping, te recomiendo estos tutos I y II [...]
Pingback from NetFilter / IPTables – ferpectamente.es
Time 29 marzo 2011 at 03:49
[...] de bulma /* Para realizar pruebas de filtrado, podemos utilizar hping, te recomiendo estos tutos I y II [...]
Pingback from Nuevo post en Netsecure.com.ar « NetVulcano
Time 9 junio 2010 at 16:07
[...] encontrar en http://netsecure.com.ar/2010/05/20/manual-tutorial-de-hping-con-ejemplos-i/, el primer artículo que conformará un manual lo mas completo posible de Hping y sus posibles [...]