netcatについて(概要とクライアント用途例、ポートスキャン例)
netcatとその種類
netcatは
- クライアント: 外部もしくは内部マシンの任意のポートに接続して任意の通信を行う
- サーバ: 手元(ローカル)のマシンの任意のポートを待ち受ける
の両方の機能を持った通信*1ソフトウェア。待ち受けているポートを探し出すポートスキャン機能もある。
- オリジナル版/バージョン1.10(http://nc110.sourceforge.net/)
- OpenBSD版
- netcat6(http://www.deepspace6.net/projects/netcat6.html)
- GNU netcat(http://netcat.sourceforge.net/)
などの種類がある。コマンド名は、この中のどれを使用しているかによって異なるが、ncやnetcatなどの名前となる。
中にはバックドア(不正侵入用途の「裏口」)機能を持っているものもあるので危ない面もある。GNU版のバックドア機能については別記事で扱う。オリジナル版(バージョン1.10)にもバックドア機能があるが、マクロGAPING_SECURITY_HOLEを手動で定義しない限りは無効となっている。OpenBSD版には-eオプションがないので安心して使えそう。
クライアント用途の例
下はHTTP/1.0でwww.example.comのトップページにアクセスする例。HTTPに限らず、任意の通信規約(プロトコル)で通信することができる。
$ nc www.example.com 80[Enterを押す] GET / HTTP/1.0[Enterを押す] [Enterを押す] (以下サーバからの応答が表示される) HTTP/1.1 200 OK Date: Thu, 22 Jan 2009 13:00:00 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT ETag: "b80f4-1b6-80bfd280" Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8 <HTML> <HEAD> <TITLE>Example Web Page</TITLE> </HEAD> <body> (中略) </BODY> </HTML>
これは下のように非対話的に実行することもできる。
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc www.example.com 80 HTTP/1.1 200 OK (以下略)
これに似た方法で下のようなシェルスクリプトを記述して実行する方法もある。
#! /bin/sh nc www.example.com 80 << EOF GET / HTTP/1.0 EOF
ポートスキャンの例
下は自身のホストに対して7001-8000番の範囲で開いているポートをスキャンしている。
(OpenBSD版) $ nc -z 127.0.0.1 7001-8000 && echo "SUCCEEDED" || echo "FAILED" Connection to 127.0.0.1 7634 port [tcp/*] succeeded! SUCCEEDED $ nc -z 127.0.0.1 8001-9000 && echo "SUCCEEDED" || echo "FAILED" FAILED (GNU版) $ netcat -zv 127.0.0.1 7001-8000 && echo "SUCCEEDED" || echo "FAILED" localhost [127.0.0.1] 7634 open SUCCEEDED $ netcat -zv 127.0.0.1 8001-9000 && echo "SUCCEEDED" || echo "FAILED" FAILED
成功した場合と失敗したときとで終了ステータスが異なるため、if文に使うこともできる。
手元の環境では、7634番はhddtempのデーモンが待ち受けていて、8001-9000番はどのデーモンも待ち受けていない。スキャン結果もこの通りとなった。
関連記事:
使用したバージョン: