• ベストアンサー
  • すぐに回答を!

任意のTCPパケットを送信するプログラムの実装

TCP 通信確立後、任意のパケットを送信するプログラムを 作成しようと考えてます。ここでの任意のパケットとは、 下記のように TCP ヘッダの値を色々と設定したパケットを 指します。 ・TCP ヘッダのすべての制御フラグを有効にしたパケット ・TCP ヘッダのチェックサムを意図的に間違えたパケット 任意のデータを送信するだけであれば、通常の socket プログラムで実装できると思うのですが、TCP ヘッダを 色々と設定するプログラムとなると、どんな実装になるの でしょうか。C だと SOCK_RAW で socket 通信するよう、 実装するのでしょうか。 実装は C、perl を考えてます。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数2665
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

セッションの確立と任意のパケット送信を(スタックから見たときに)同じセッション行うか、そうでないかで話が変わってくると思います。 同じスタックから行う場合は、既存の TCP スタックをいじって何かのタイミングで任意の動作を行うコードを入れることになります。 linux 2.6系の場合は net/ipv4/tcp_output.c あたりを改変することになるでしょう。 kernel space のプログラミンに対して敷居が高いと感じるなら、userlandで動く TCP スタックを探すと良いと思います。 セッションの確立を行ったのとは別のところから、そのセッション内のものと見せかけたパケットを送信するのならばおっしゃる通り SOCK_RAW でパケットを作って流し込めば良いと思います。 セッションの情報(ポート番号, 両方向の ACK 値など)が固定されているのであれば、比較的簡単に書けるでしょう。固定されていないのであれば、毎回パケットを眺めながら調整する必要があるので、ちょっと大変かな。 相手が同じ応答(普通はACK値が変わりますが)を毎回返してくれるのであれば、URLのツールが使えるかもしれません。 http://www.secdev.org/projects/scapy/

共感・感謝の気持ちを伝えよう!

質問者からのお礼

tthe_mineさん、回答ありがとうございます。 >同じスタックから行う場合は、既存の TCP スタックをいじって何かのタイミングで任意の動作を行うコードを入れることになります。 >linux 2.6系の場合は net/ipv4/tcp_output.c あたりを改変することになるでしょう。 >kernel space のプログラミンに対して敷居が高いと感じるなら、userlandで動く TCP スタックを探すと良いと思います。 うーん、TCP スタックまで弄らないとダメなんですね。。。 kernel の TCP スタック以外の TCP スタックを利用することは 考えにありませんでした。例えば、userland で動く TCP スタックをご存知であれば教えてください。 >セッションの確立を行ったのとは別のところから、そのセッション内のものと見せかけたパケットを送信するのならばおっしゃる通り SOCK_RAW でパケットを作って流し込めば良いと思います。 >セッションの情報(ポート番号, 両方向の ACK 値など)が固定されているのであれば、比較的簡単に書けるでしょう。固定されていないのであれば、毎回パケットを眺めながら調整する必要があるので、ちょっと大変かな。 直近でやりたいことが TCP セッション後に TCP ヘッダを いじった 1 パケットを送信するだけだったので、 netcat で TCP セッションを張って、パケットジェネレータで パケットを送信することで実現できました。 ただ、tthe_mineさんがおっしゃったように調整が面倒ですね(^^; >相手が同じ応答(普通はACK値が変わりますが)を毎回返してくれるのであれば、URLのツールが使えるかもしれません。 >​http://www.secdev.org/projects/scapy/ ありがとうございます。 あとでサイトを確認してみます。

関連するQ&A

  • C言語でTCPの3way handshake

    (C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。 RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。 wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。 そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

  • TCPヘッダのチェックサムについて

    通信エラーが発生し、 エラーが発生した時のパケットのTCPヘッダの チェックサムが"FFFF"だったのですが チェックサムで"FFFF"はありえるのでしょうか?

  • 無線LANで任意のパケットを作成し送信する方法について

    無線LANで任意のパケットを作成し送信する方法について linux(ubuntu)を使用しています。C言語を使い無線LANで、有線みたいにパケットを作成して目的のアドレス宛に送信したいと考えています。ですが、どのようにしたらよいのかよく分かりません。(IP、TCPヘッダーを作成できた様に無線LANでも同じことが出来るのですか?) プログラムの仕方等、どなたか分かる方教えていただけませんか? なにかそのようなことが載っているサイトや本はご存知ないですか? どうぞよろしくお願いします。

その他の回答 (2)

  • 回答No.3

> 例えば、userland で動く TCP スタックをご存知であれば教えてください。 私も探さないで書いてしまったのですが、あまり見当たらないですね ^^; 参考URLに書いた MuXTCP という python のプログラムはユーザランドで動きそうですよ。

参考URL:
http://kybkreis.org/wiki/MuXTCP

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 MuXTCP がどんなものか確認してみました。 ちょうど自分の望むことができそうです。 まだ開発途中のようですので、今後に期待ですね(^^

  • 回答No.2

前の回答で「ACK値」と書いたのは「SEQ値」の間違いでした。訂正します。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • IPv4パケットについて

    最近インターネットについての勉強を始めました。 IPv4パケットのヘッダについてなのですが、ここにある主なフィールドって4つ挙げるとしたら、 ・TTL ・ヘッダチェックサム ・フラグ ・プロトコル で正しいですか?

  • パケットを送信しているプログラムを特定するには?

    パケットを送信しているプログラムを特定するソフト等はありますか? tcp モニタでパケットを覗いたところ、どうも色々なホストに接続を 試みているプログラムが走っているようなのですが。 一応ワームウェアやウィルスチェックはしています。

  • TCP/IPで同じパケットが2つ送信される。なぜ?

    Windows8 PC上のブラウザから、LAN上の機器(HTTPサーバ)にアクセスしようとしています。 Wiresharkでそのときの通信を覗いてみると、PCから送信されるパケットはなぜか2回同じものが短時間の間に連続して送信されているようです。その理由に心当たりがある方がいらっしゃいましたら、教えて下さいませんか? また、設定で回避できるのであれば、その設定項目などもわかるとありがたいです。 詳しい状況です。Wiresharkのキャプチャ画像と合わせて見て下さい。 *PC側IPは192.168.0.12、HTTPサーバは192.168.0.18です。 *Wiresharkでは、パケット6と7、9と11、10と12、14と15は内容的に同じパケットのようです(seqとackが同じ) *同じパケットのうち、前の方のパケットではIPパケットのチェックサムが0000hとなっているようです(チェックサムオフロード?)。後の方のパケットには、具体的なチェックサムの値が入っています。 *前のパケットが短い場合(54バイトとか)、後のパケットにはパディングとして00hが追加されて、60バイト長となるようです。それ以上の長さのパケットは、前述のチェックサム以外には違いは見られません。 *同じ2つのパケットは、極短い期間で連続して送信されているので、HTTPサーバからの応答タイムアウトで再送しているという風には思えないです。 *PC側のブラウザは、ChromeでもIEでも同じように2つの同じパケットが送信されていました。しかし、LANの外(ルーター外のインターネット)に接続するときは、このように2つの同じパケットはWiresharkで見ると出ていないようです。 *ちなみに、PC側のLANはRealtekのGigabit Ether(有線)です。 よろしくお願いいたします。

  • パケット受信 recvfrom( )について

    お世話になります。 WinSockを用いてUDPパケット受信プログラムを作成しています。 環境はVC++です。ダイアログベースで、 STARTボタンを押すと受信開始します。 送信側よりパケットを1000個送信した場合、受信側では、 int num; SOCKET sock; char buf[1500]; //ソケットの設定は省略 while(1){ num = recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL);  printf("%d",num ); if( num == SOCKET_ERROR){ break; } } recvfrom()で受信していますが、送信側で送信が完了しても while()を抜けないのか、応答なし(フリーズ)してしまいます。 printf()で表示してみると、 ちゃんと送信パケット個数回表示されています。 送信パケット数は変動するため、受信側のプログラムには 個数がわかりませんため、while()でループしています。 while()を抜ける条件はどうしたらいいのでしょうか? ちなみにrecvfrom()の戻り値として SOCKET_ERROR,0を指定してもエラーになります。 長くなりましたが、どうぞよろしくお願い致します。

  • パケットの捕捉

    ターゲットとなるパケットの送信元IP、送信先IP、シーケンス番号を補足するようなプログラムCでを実装したいのですが、どのようにすればよいのでしょうか? ソケットライブラリを使用するつもりでしたが、ソケットではパケットのヘッダを捕捉できない感じだったので...。 すいませんが、よろしくお願い致します。

  • データ通信にかかるパケットについて

    質問です。書籍やWEBで検索しても一向に分かりませんでした。 問題 MTUが1500バイトの通信回線システムにおいて、300KBのデータを送信することを考える。このとき下記の問いに答えなさい。ただし、1KB=1024Bとして計算しなさい。 (1)IPヘッダに20バイト、TCPヘッダに20バイト付加して送信する。すべてのデータを送るためには、何パケットに分割すればよいか。

  • C++言語でのWinsock2を使用したパケットモニタの作成

    こんにちは 現在Winsock2を使用したパケットモニタを作成しています パケットを受信できるプログラムは作成することができましたが、TCPパケットが期待した順番通りに受信できません 例えば、3WAYハンドシェイクのパケットのやり取りで、期待しているパケットの受信順は 1. host ---> net: SYN 2. host <--- net: SYN,ACK 3. host ---> net: ACK ですが、パケットモニタでは以下の順番でパケットを受信しています 1. host ---> net: SYN 2. host ---> net: ACK 3. host <--- net: SYN,ACK hostから送信されるパケットが先に受信されているような感じですが、これらを時刻順に受信するオプションなどはあるのでしょうか? もしあるならどのように設定すればよろしいのでしょうか? (ソケットなどの設定内容) 初期化  WSADATA wsd;  WSAStartup(MAKEWORD(2, 2), &wsd) ソケット作成  SOCKET sock;  sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED) 無差別受信モードに設定  int op = RCVALL_ON;  WSAIoctl(sock, SIO_RCVALL, &op, sizeof(op), NULL, 0, &dword, NULL, NULL) パケットの受信  WSABUF wsb;  DWORD len = 0;  DWORD flag = 0;  WSARecv(sock, &wsb, 1, &len, &flag, NULL, NULL)

  • パケットのフィルタリング

    どうぞお知恵をお貸しください。 別プロセスからインターネット上のサーバ宛に送信されるパケットを監視し、 データ部に特定の文字列が含まれる場合、パケットをブロック(破棄)したいと考えております。 WPE Pro と言うソフトのフィルタ機能が、まさに理想なのですが 実現するにはどのような方法を取ればよいのか悩んでおります。 現在、C#のSocketクラスを使い、以下の流れまでは出来たのですが、 送信パケットをブロックする方法が分からず困っております。 アダプタ(IPアドレス)の取得 -> RAWソケットの作成 -> 非ブロッキングモードの設定 -> ネットワークカードをプロミスキャスモードに設定 -> パケットの取得 -> ヘッダ&データ部の解析 言語・開発環境は問いません。 何かヒントだけでも与えて頂ければ幸いです。

  • TCPについて

    TCP/IPで100バイトのデータを送信するとき,物理層からネットワーク上に出力されるTCPパケットは最小何ビットになるか、という問題に悩んでいます。 付加情報として160ビットがヘッダに加わるのはわかりますが、オプションの部分がよくわかりません(32の倍数で増えていくようですが)。この問題の答えや、ヒントなどを教えていただけないでしょうか。

  • TCPヘッダのヘッダ長について

    誰か知っていましたら御教示ください。 TCPヘッダのヘッダ長は,通常5または6を使用するものだと考えてました 7を使用するのは,どのような場合でしょうか? なぜこのような質問するかは,以下のことをおこなって専用制御装置とPCでTCP/IPの通信が出来なくなっためです。 (1)PC側のOSを winNT→2Kへ変えたところ専用制御装置との通信断となりました。 (2)イーサアナライザで解析したらPCからのSYN送信にてTCPヘッダにおけるヘッダ長がNTの時は,6(24バイト)なのにwin2Kでは,7(28バイト)になった (3)専用制御装置側はTCPヘッダのヘッダ長7は,エラーと判定し通信しない設計になってました (4)PCのアプリはwinsockの単なるソケット通信 そのため,TCPヘッダを書き換えることはできません (5)おそらくOSがwin2Kになったことが原因だと思います。 win2KでwinNTの時のように SYN送信でTCPヘッダのヘッダ長を6にする方法は,あるのでしょうか? 大変恐縮ですが誰か御回答ください。