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パッケージを使用して、rawソケットを作成します。ルートのみが生のパケットを送信できるため、ルートであることを忘れないでください(これは、Pythonの制限ではなく、OSの制限です。これは、セキュリティの問題を防ぐためです。したがって、ユーザーとして生のパケットを送信するには、OS構成を微調整する必要があります。 )。