我想在 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 一起工作,但我想删除这种依赖关系)。
编辑 2:解决方案在Nos 答案下方的评论中:
使用 pyip python 包并创建一个原始套接字。不要忘记成为 root,因为只有 root 可以发送原始数据包(这不是 Python 的限制,而是操作系统的限制,这是为了防止安全问题,所以要以用户身份发送原始数据包,您需要调整操作系统配置)。