3

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構成を微調整する必要があります。 )。

4

1 に答える 1

1

Pythonで定義された送信元ポートを使用してUDPパケットを送信するためのAPIはありません。また、ほとんどの(すべて?)オペレーティングシステムでは、最初にソケットをローカルポートにバインドせずにPythonが実行されます。

したがって、送信元ポートを制御する場合は、ソケットをbind()する必要があります。

bind()が「機能しない」場合は、別のプロセスが所有するポートにバインドしているか、rootユーザーのみがバインドできるポート番号が1024未満であるか、バインドする他の間違ったパラメーターを指定しています。 ()-しかし、あなたを助けるためにもっと多くの情報が必要です。例えば、あなたが受け取るエラーメッセージ、あなたがバインドするために渡す実際のパラメータなど。

于 2013-02-24T18:52:32.767 に答える