如何创建UDP数据包?


15

当我执行以下Netcat命令并使用Wireshark查看数据包时,它说UDP数据包格式错误。

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

同样,$ echo "this is a test" > /dev/udp/127.0.0.1/53在Wireshark中使用类似的命令会产生“格式错误的数据包”错误。

在此处输入图片说明

echo命令被发送/传递到Netcat服务器,没有错误。但这让我感到奇怪:是否可以通过echo或其他一些本机Unix工具手动构建适当的UDP数据包?

我正在使用Debian和macOS。


10
根据您的屏幕截图,不是udp数据包本身格式错误,而是其内容,因为端口53用于DNS,并且您的数据包中不包含有效的DNS请求。
tkausl

@tkausl,您绝对正确。使用53以外的端口时,没有“格式错误”的错误。感谢您指出这一点。
user322500 '18

1
如果您不使用标准协议,则应该使用49152到65535范围内的端口。由于Linux默认使用32768到60999范围作为临时端口,因此我建议不要为非标准协议选择端口。但是61000到65535对于非标准协议来说是公平的游戏。我通常echo $[61002+RANDOM%4532]会选择一个在该范围内的随机端口号。
kasperd

1
不要以root用户身份登录。您应该以非root用户身份执行大部分活动。如果您以root用户身份进行操作,您将回到此处询问如何修复计算机,我们将无能为力(建议重新安装除外)。
ctrl-alt-delor

1
@tkausl看看有没有你没有张贴作为回答您的评论失去了什么....
乔治·瓦西利乌

Answers:


41

从IP和UDP的角度来看,您的数据包是完全有效的。如果在Wireshark的下部窗格中展开Ethernet / IP / UDP的协议详细信息,您将看到该数据包已成功解析。

但是,由于发往端口53,Wireshark尝试将其解析为DNS数据包,但它不能这样做(因为根据RFC 1035规范,字符串“ this is a test”不是有效的DNS请求)。

如果您遵循该链接上的规范,则将能够构造一个在解析为DNS请求时有效的数据包。如果将数据包发送到另一个端口,您会注意到Wireshark将不再将其解析为DNS请求,因此不会显示该警告。


15

您可以通过重定向将它们发送到Bash特殊别名。

从Bash手册页:

/ dev / tcp / host / port如果host是有效的主机名或Internet地址,而port是整数端口号或服务名,则bash尝试打开相应的TCP套接字。

/ dev / udp / host / port如果host是有效的主机名或Internet地址,而port是整数端口号或服务名,则bash尝试打开相应的UDP套接字。

这将向端口8080发送UDP数据包到192.168.2.11:

echo "This is a test" > /dev/udp/192.168.2.11/8080

感谢您的回答。我已经更新了我的问题。不幸的是,使用您的方法还会产生“格式错误的数据包”错误消息。
user322500

-1

这里有多个问题。声称“格式错误的数据包”可能是由于校验和卸载,如果是这样,则是错误错误,因为它反映了没有完整视图的数据包捕获-有些工作是在网络硬件上完成的。WireShark应该对此有文档。

否则,各种工具(例如socatncnetcat,或者通过外壳中极其相似的功能(例如ksh93bash))可以从标准输入中获取字节并将其转储为UDP数据包。是否合适取决于协议。从理论上讲,可以用这种方式构造和发送DNS或DHCP数据包,尽管人们通常使用一种库或专用软件(希望)正确地实现了所讨论的协议,因为通常涉及的工作远不止在其中设置几位。数据包的主体并将其发送出去,特别是处理响应,超时或错误后重试,数据包头字段等。协议通常在RFC中有很好的记录,或者请参阅“ TCP / IP图解”系列丛书史蒂文斯(Stevens)撰写的更多文档。

诸如nmap打包工具之类的特定工具可以做非常定制的事情。否则,对于手动数据包构造,通常会使用编程语言,尽管大多数软件会再次使用现有的库或系统服务来发送DNS或DHCP或其他UDP数据包,因为与手工制作原始数据包相比,这些数据包的工作量少且错误率低从头开始的数据包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.