試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

netcatについて(概要とクライアント用途例、ポートスキャン例)

netcatとその種類

netcat

  • クライアント: 外部もしくは内部マシンの任意のポートに接続して任意の通信を行う
  • サーバ: 手元(ローカル)のマシンの任意のポートを待ち受ける

の両方の機能を持った通信*1ソフトウェア。待ち受けているポートを探し出すポートスキャン機能もある。

などの種類がある。コマンド名は、この中のどれを使用しているかによって異なるが、ncnetcatなどの名前となる。
中にはバックドア(不正侵入用途の「裏口」)機能を持っているものもあるので危ない面もある。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

実行結果は上に同じ。この書き方はヒアドキュメント*2より生プロトコル部分をテキストデータとしてそのまま書けるのが便利。

ポートスキャンの例

下は自身のホストに対して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番はどのデーモンも待ち受けていない。スキャン結果もこの通りとなった。

関連記事:

使用したバージョン:

*1:TCP/IP上で動作する

*2:開始位置から終了の「印」が出てくるまでの間を、改行も含めて書かれたそのままのデータとして解釈する仕組み