我想在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's answer:
使用pyip python包并创建一个原始套接字。不要忘记是root用户,因为只有root可以发送原始数据包(这不是Python的限制,但是操作系统限制,这是为了防止安全问题,所以要以用户身份发送原始数据包,你需要调整你的操作系统配置)。
答案 0 :(得分:1)
在python中没有用于发送带有已定义源端口的UDP数据包的API,也没有在大多数(全部?)操作系统上运行python而不首先将套接字绑定到本地端口。
因此,如果要控制源端口,则必须绑定()套接字。
如果bind()"不起作用",那么您要么绑定到另一个进程拥有的端口,要么绑定端口号<只有root用户可以绑定的1024,或者你给bind()提供了一些其他错误的参数 - 但是我们需要更多的信息来帮助你,例如你得到的错误信息,传递给bind的实际参数等等。