Perl でrawソケットを取得するにはどうすればよいでしょうか? また、それを使用するためのパケットを構築する最良の方法は何ですか?
7 に答える
Cで行うのと同じ方法...ソケットを作成するときにソケットタイプを設定します。
CPANの例では、 SOCK_DGRAM (UDP) またはSOCK_STREAM (TCP)ではなく、SOCK_RAWを使用します。
注: raw ソケットの作成には通常、管理者権限 (つまり、UNIX の root) が必要です。Windows OS では、raw ソケットを作成する機能が無効になっている可能性があります。テストして確認する必要があります。
最初は、以前の回答のほとんどが質問に反応していないと思っていました。さらに考えてみると、著者はおそらく正しい質問をしていないと思います。
アプリケーションを作成している場合、通常、「パケットの構築」について考えることはありません。ソケットを開き、データ ペイロードをフォーマットするだけで、データでパケットを構築するのはプロトコル スタックです。OK、データグラムを使用している場合は、ペイロードを定義、生成、および解析する必要があります。しかし、通常はネットワーク レベル (例: IP ヘッダーの追加) またはリンク レイヤー (例: イーサネット フレームの追加) でカーネルにカプセル化させます。通常、pcap は使用しません。場合によっては、パックしてアンパックするだけで、おそらく vec で十分です。
アクティブな敵対的攻撃ツール、man-in-the-middle プロセス、またはトラフィック シェーピング デバイスなどの異常なパケット プロセッサを作成している場合は、「パケットを作成」して pcap を使用する可能性が高くなります。多分 Net::Packet もあなたのためです。
Net::RawIPが私が探していたもののようです:
use Net::RawIP;
$a = new Net::RawIP;
$a->set({ip => {saddr => 'my.target.lan',daddr => 'my.target.lan'},
tcp => {source => 139,dest => 139,psh => 1, syn => 1}});
$a->send;
$a->ethnew("eth0");
$a->ethset(source => 'my.target.lan',dest =>'my.target.lan');
$a->ethsend;
$p = $a->pcapinit("eth0","dst port 21",1500,30);
$f = dump_open($p,"/my/home/log");
loop $p,10,\&dump,$f;
austirg や他の人が言ったように、Socket はこれを問題なく実行します。
use Socket;
socket my $socket, PF_INET, SOCK_RAW, 0 or die "Couldn't create raw socket: $!";
send $socket, $message, $flags, $to or die "Couldn't send packet: $!";
my $from = recv $socket, $message, $length, $flags or die "Couldn't receive from socket: $!";
ソケットを取得するための基本的な呼び出しは... socket() です。これは perl 5 に標準で付属しています。perl 5 は基本的に、従来の UNIX が行う標準の socket()、bind()、listen()、accept() 呼び出しを提供します。
よりオブジェクト指向のモデルについては、IO::Socket を調べてください。
raw ソケットを使用して SYN パケットの山を送信しようとしていて、「ソケットを使用する」だけであることに注意してください。それはあなたのARPテーブルをいっぱいにし、「利用可能なバッファスペースがありません」と「netstat」の「CLOSE_WAIT」エントリのスタックで爆撃します(これにより、マシンは、それらのいくつかが解放されるまで、あらゆる種類の接続を停止します)。
言い換えれば、Net::RawIP が本当に必要なのです - それが違いを生むのです。