¿Cómo creo un paquete UDP?

15

Cuando realizo el siguiente comando de Netcat y veo los paquetes con Wireshark , dice que el paquete UDP está mal formado.

$ echo "this is a test" | nc -u 127.0.0.1 53

Del mismo modo, el uso de comandos como $ echo "this is a test" > /dev/udp/127.0.0.1/53producir errores de "paquete mal formado" en Wireshark.

Ingrese la descripción de la imagen aquí

El comando echo se envía / entrega al servidor Netcat sin errores. Pero esto me hizo preguntarme: ¿ es posible construir manualmente un paquete UDP adecuado con echo o alguna otra herramienta (s) nativa de Unix?

Estoy usando Debian y macOS.

user322500
fuente
10
Según su captura de pantalla, no es el paquete udp en sí mismo el que tiene un formato incorrecto, sino su contenido, ya que el puerto 53 se usa para DNS y su paquete no contiene una solicitud de DNS válida.
tkausl
@tkausl tienes toda la razón. No hay errores "malformados" cuando se utilizan puertos que no sean 53. Gracias por señalarlo.
user322500 el
1
Si no está utilizando protocolos estándar, se supone que debe usar puertos en el rango de 49152 a 65535. Dado que Linux usa de manera predeterminada el rango de 32768 a 60999 como puertos efímeros, recomiendo no elegirlos para protocolos no estándar. Sin embargo, 61000 a 65535 son juegos justos para protocolos no estándar. Usualmente uso echo $[61002+RANDOM%4532]para elegir un número de puerto aleatorio en ese rango.
kasperd el
1
No inicies sesión como root. Debe realizar la mayor parte de su actividad como usuario no root. Si hace cosas como root, volverá aquí preguntando cómo reparar su máquina, y no podremos ayudarlo (excepto recomendar una reinstalación).
ctrl-alt-delor
1
@tkausl Mira lo que has perdido por no publicar tu comentario como respuesta ...
George Vasiliou

Respuestas:

41

Su paquete es completamente válido, desde el punto de vista de IP y UDP. Si expande los detalles del protocolo para Ethernet / IP / UDP en el panel inferior de Wireshark, verá que el paquete se ha analizado correctamente.

Sin embargo, como está destinado al puerto 53, Wireshark intenta analizarlo como un paquete DNS, lo que no puede hacer (ya que la cadena "esto es una prueba" no es una solicitud DNS válida según la especificación RFC 1035 ).

Si sigue la especificación en ese enlace, podrá construir un paquete que sea válido cuando se analice como una solicitud DNS. Si envía el paquete a otro puerto, notará que Wireshark ya no lo analizará como una solicitud de DNS y, por lo tanto, no mostrará esa advertencia.

Restablece a Mónica - ζ--
fuente
15

Puede enviarlos a Bash alias especiales con redireccionamiento.

De las páginas de manual de Bash:

/ dev / tcp / host / port Si el host es un nombre de host o una dirección de Internet válidos, y el puerto es un número de puerto entero o un nombre de servicio, bash intenta abrir el socket TCP correspondiente.

/ dev / udp / host / port Si el host es un nombre de host o una dirección de Internet válidos, y el puerto es un número de puerto entero o un nombre de servicio, bash intenta abrir el socket UDP correspondiente.

Esto enviará un paquete UDP a 192.168.2.11 al puerto 8080:

echo "This is a test" > /dev/udp/192.168.2.11/8080
rAlen
fuente
Gracias por esta respuesta He actualizado mi pregunta. El uso de su método también produce un mensaje de error de "paquete mal formado", desafortunadamente.
user322500 el
-1

Hay varias preguntas aquí; el reclamo de un "paquete con formato incorrecto" puede deberse a la descarga de la suma de comprobación y, de ser así, es un error falso, ya que refleja que la captura de paquetes no tiene una vista completa; parte del trabajo se realizó en el hardware de la red. WireShark debería tener documentación sobre esto.

De lo contrario, varias herramientas (como socat, nco netcat, o mediante características extremadamente similares en shells como ksh93o bash) pueden tomar bytes de la entrada estándar y volcarlos en lo que se convierte en un paquete UDP. Si esto es "apropiado" depende del protocolo; en teoría, se podría construir y enviar un paquete DNS o DHCP de esta manera, aunque con mayor frecuencia la gente usa una biblioteca o software dedicado que (con suerte) implementa correctamente el protocolo en cuestión, ya que generalmente hay mucho más involucrado que establecer algunos bits en el cuerpo de un paquete y enviarlo a través del cable, en particular manejando respuestas, reintentando después de tiempo de espera o error, campos de encabezado de paquete, etc. Los protocolos generalmente están muy bien documentados en RFC, o vea la serie de libros "TCP / IP Illustrated" por Stevens para aún más documentación.

Herramientas específicas como nmaphacer cosas muy personalizadas con la construcción de paquetes. De lo contrario, para la construcción manual de paquetes, generalmente se usa un lenguaje de programación, aunque nuevamente la mayoría del software usará las bibliotecas existentes o los servicios del sistema para enviar DNS o DHCP u otros paquetes UDP, ya que son mucho menos trabajo y mucho menos propensos a errores que la creación manual de un raw paquete desde cero.

thrig
fuente