Como hacer pings UDP como su fueran ICMP

Como pinguear vía UDP

El protocolo UDP es diferente al de TCP, no existe SYN, SYN ACK y RST (El 3-Way Handshake), por lo cual es difícil tener una respuesta de un servidor UDP sin enviar datos validos al servidor

Como encontrar datos para enviar

Se puede usar netcat / nc con el argumento -u para hacer una conexión UDP al servidor

nc -u <IP> <puerto>

Una vez netcat este conectado al servidor, puedes usar “Wireshark” para capturar el trafico de red

Necesitaras poner los filtros de ip.addr == <IP> && udp para poder excluir otros paquetes innecesarios y luego empiezas a capturar el trafico (Recuerda que tienes que reemplazar <IP> por la IP del servidor)

wiresharkFilter.png

Luego puedes empezar a escribir números u cualquier otra cosa dentro de NetCat para revisar si el servidor responde a los datos enviados, en mi caso, yo envié un 1 al servidor y me responde con un . (que en hexadecimal es 0e y al ASCII es SO)

serverresponse

Ahora que ya tenemos datos para enviar, ahora lo usaremos una de estas 2 herramientas, una llamada nping o hping3, estos dos sirven para generar paquetes personalizados.

nping

Usar nping es bastante simple, y para poder hacer un ping UDP, hay que escribir esto en la consola:

nping --udp --data-string "1" -p <puerto> <IP>

(Si necesitas información sobre que hace cada comando, escribe nping --help o lee los manuales con man nping)

Con este comando, se enviara un 1 al servidor cada segundo, así siendo posible estimar la latencia entre cliente y servidor udppingnping

hping3 (Recomendado)

Al igual que nping, hping3 también sirve para ejecutar pings, pero este tiene opciones más útiles y da más información acerca de la latencia, no tienes que esperar a que termine el comando para ver la latencia como nping

Primero que todo, hay que crear un archivo con los datos que queremos enviar, si sabemos que el servidor responde a 1, se crea un archivo con un 1 dentro usando este comando:

echo "1" > data

Luego usamos este comando de hping para mandar pings al servidor

hping3 -2 -d 1 -E data -p <puerto> <IP>

(El argumento -d es dinámico y hay que cambiarlo dependiendo de lo largo que sean los datos)

pinginrtt

Y listo, así podemos obtener la latencia entre cliente y servidor a través de un puerto UDP

Problemas Comunes

Que hacer en caso de que el servidor no responda

Aveces, hay servidores que no entregan ninguna respuesta a la hora de mandar datos aleatorios, para eso necesitamos el software que interactua con el servidor (el cliente)

En este caso tomare como ejemplo los servidores comunitarios de CS:GO

Iniciamos Wireshark y ponemos los filtros de ip.addr == <IP> && udp, reemplazando <IP> por la IP del servidor comunitario y empezamos a capturar trafico

Ahora le das a Refresh para tener respuesta del servidor csgoserver

Ahora volvemos a Wireshark y veremos si el servidor nos da una respuesta

wsinfo

Como podemos ver, lo que necesitamos enviar para poder obtener respuesta es ....TSource Engine Query pero hay que estar atento, por que los puntos .... pueden no ser los correctos y no funcionaran a la hora de hacer ping, esto es debido a que la mayoria de los paquetes envian caracteres en Hexadeciamal, entonces lo que tenemos que hacer para obtener los datos correctos, es darle click al primer paquete enviado por nosotros (Donde el Source es la IP local), ir a la parte de abajo, expandir la sección de Data, darle Click derecho > Copy > …as Printable Text y tendremos copiado los datos.

cpdata

Yo en mi caso consigo ÿÿÿÿTSource Engine Query, y como se puede ver, los .... fueron cambiados por ÿÿÿÿ, que son los datos correctos para poder enviar un ping.

Estos datos se pueden copiar a un archivo para usarlos con hping3 o directamente copiarlos entre comillas con en el argumento --data-string de nping (Si esto no funciona, ve la siguiente sección)

He usado las explicaciones de arriba y sigo sin recibir respuesta

A veces, usar la opción de Copy > …as Printable Text puede no funcionar si lo copiamos en un archivo de texto (para hping3) o usándolo con --data-string de nping , en ese caso, lo que hay que hacer, es copiar el Valor. Entonces en vez de ir a Copy > …as Printable Text, seleccionas Value, así obtenemos los datos en Hexadecimal

ffffffff54536f7572636520456e67696e6520517565727900

es lo mismo que

ÿÿÿÿTSource Engine Query

Ya teniendo el valor en Hexadecimal, lo podemos usar directamente desde nping con el argumento --data "<valor>" en vez de usar --data-string

Ej:

nping --udp --data "ffffffff54536f7572636520456e67696e6520517565727900" -p <puerto> <IP>

Con hping3 es algo más complicado ya que en hping3 no hay un equivalente a --data como nping, si se necesitan enviar datos personalizados, se necesitan escribir en un archivo primero. Entonces ¿Como escribo Hexadecimal directamente en un archivo?

Eso se puede hacer utilizando este comando:

echo '<datos>' | xxd -r -p > <nombre del archivo>

(Necesitaras tener instalado el paquete de vim o xxd-standalone desde AUR en caso que uses una distro basada en Arch Linux) (Si estas usando otra distribución que no sea Arch Linux, solo instala el paquete vim)

Reemplaza <datos> por el valor en Hexadecimal y <nombre del archivo> por el nombre que quieras y ya tendrás un archivo con los datos necesarios para usarlos con hping3