发送带有源端口但没有绑定的 UDP 数据包
Posted
技术标签:
【中文标题】发送带有源端口但没有绑定的 UDP 数据包【英文标题】:Sending a UDP packet with source port, but without binding 【发布时间】:2013-02-09 21:44:24 【问题描述】:我想在 Python 中发送一个 UDP 数据包并指定源端口但没有绑定。
与 hping3 等效:
hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr
我尝试过这样做:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((SHOST, SPORT))
当然,Python 尝试绑定,但它不起作用。现在,如果我不绑定,我可以这样做:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.sendto("message", (RHOST, RPORT))
消息已发送,但现在源端口未定义。
有人有想法吗?
编辑:扩展描述:我的 python 脚本补充了另一个应用程序,它是一个绑定到定义端口(1024 以上)的 UDP 服务器。我的脚本只需要将 UDP 数据包发送到远程服务器,但与我的本地 UDP 服务器具有相同的源端口,以便远程 UDP 服务器认为本地 UDP 服务器是数据包的作者,并将继续传输。
我想我也不得不说这是一个完全合法的应用程序,与任何黑客攻击都没有关系(事实上,它已经与 hping3 一起工作,但我想删除这种依赖关系)。
EDIT 2:解决方案在Nos's answer下面的cmets中:
使用 pyip python 包并创建一个原始套接字。不要忘记成为 root,因为只有 root 才能发送原始数据包(这不是 Python 的限制,而是操作系统的限制,这是为了防止安全问题,所以要以用户身份发送原始数据包,您需要调整操作系统配置)。
【问题讨论】:
【参考方案1】:在 python 中没有用于发送具有已定义源端口的 UDP 数据包的 API,在大多数(全部?)python 运行的操作系统上都没有先将套接字绑定到本地端口。
因此,如果您想控制源端口,则必须绑定()您的套接字。
如果 bind() “不起作用”,那么您要么绑定到另一个进程拥有的端口,要么绑定到只有 root 用户可以绑定的端口号
【讨论】:
问题是已经有另一个应用程序在相同的接口和端口上运行(这是整个目标:为我自己的应用程序提供额外的功能,只发送数据包以补充绑定的另一个应用程序到端口,它将回答传入的数据包)。 我按要求添加了扩展描述,但我认为它没有多大帮助。那么在 Python 中真的没有办法做到这一点吗? @user1121352 不是直接的,你可能会使用原始套接字,并制作你自己的 UDP 数据包,只是要注意那个套接字也会接收其他程序重新接收的数据包。 啊好主意!是的,这不是问题,因为我的 python 脚本根本不会监听数据包,所以它根本不会处理它们。任何 ref 以 Python 中的原始套接字开头? 我找到了这篇文章:sk89q.com/2008/10/spoofing-a-udp-packet-in-python谈论pyip包pypi.python.org/pypi/pyip/0.7但是运气不好,在我的Windows机器和Unix机器上都不允许操作,所以我认为这也需要一些棘手的配置.我想我现在会保留我的 hping3 实现,直到 Python 能够更好地处理原始数据包或只是 UDP 数据包。感谢您的帮助!以上是关于发送带有源端口但没有绑定的 UDP 数据包的主要内容,如果未能解决你的问题,请参考以下文章