Netcat

netcatは、Unix系OSコマンドラインアプリケーションの一つ。TCPやUDPのパケットを読み書きするバックエンドとして機能するツールで、ネットワークを扱う万能ツールとして知られる。オリジナル版より機能的に優位な派生・互換ツールが開発され、用いられている。

 概要 
netcatは、UNIX系OSで動作するコマンドラインアプリケーションである。TCPやUDPを扱う万能ツールとして知られ、しばしばネットワークのスイスアーミーナイフ、TCP/IPのアーミーナイフ、ハッカーのアーミーナイフなどのように評される。その万能性ゆえ、nmapの作者として知られるセキュリティ専門家のが管理するInsecure.orgにおいて、ネットワークセキュリティツール部門の常に上位5位以内にランキングされているツールである。

 歴史 
*Hobbit*によって作成、1995年10月12日にバージョン1.00がリリースされる。その後、ドキュメント整備や機能強化（hexdump機能など）の末、1996年にバージョン1.10がリリースされる。この時点で既に機能面では充分なものに仕上がっており、それ以降、10年以上に渡ってバージョン更新されていないが、未だに「ネットワークの万能ツール」の名は健在である。このことは、ツールの完成度の高さを物語っているといえる。そのため、このツールはバージョン番号を含めたアーカイブファイル名である「nc110.tgz」の名前で検索することで容易に見つかるものとなっている。

Insecure.orgのネットワークセキュリティツール部門において、このツールは2000年に2位、2003年から2006年まで4位といったように、常に上位ランキングされている。また、同サイトでは「TCP/IPパケットの読み書きを行うツール」を意味する分類名としても用いられている。

 機能 
このツールの対象はIPv4におけるTCPパケットとUDPパケットであり、これらのパケットの読み書きが主な機能となる。以下、同ソフトウェアに同梱されている文書から機能を抜粋して説明する。

 TCPおよびUDPの、任意のポートを対象とした読み書き
 基本機能である。
 DNSフォワード/リバースチェック
 DNSの逆引きチェックを行うようになっている
 ローカルソースポートの指定
 送信元ポート番号を指定することが可能である。
 ローカルソースアドレスの指定
 送信者IPアドレスの詐称が可能である。
 ポートスキャン機能
 Zero-I/Oモードと呼ばれる、ポートオープンのみを行い、コネクション確立後にパケット送受信を行わずにセッション切断する機能が設けられている。また、ポート番号を範囲指定する機能、指定範囲内でポート番号をランダム化する機能も併用可能となっている。
 ルーズソースルーティング機能
 IPv4におけるソースルーティングの1つである、ルーズソースルーティングを行うためのIPアドレス指定が可能となっている。
 標準ストリームの読み書き
 ネットワークからの読み込みの結果は、指定がない限り、標準出力に書き出される。また、ネットワークへの書き出しには、指定がない限り、標準入力の内容が用いられる。
 低速送信モード
 送信行単位で一定時間ウエイトを設ける機能が設けられており、この機能を用いることで、あたかも受け答えをしているかのように振舞うことが可能となっている。
 サーバーモード
 TCPにおけるサーバーとして機能させることができる。accept成功時、事前に指定したコマンドを実行し、そのコマンドの標準入出力をソケットのI/Oに接続することも可能となっている（GAPING_SECURITY_HOLE付でコンパイルした場合）。
 telnetモード
 telnetプロトコルを話すことが可能となっている。

 使用例 
以下のように多彩な使い道があり、そのような使い方の例は、同ツールのアーカイブ内（scriptsディレクトリ内）にも含まれている他、使い道をスクリプトとして集めたサイトもいくつか存在する。

 Webサーバーからの情報取得 
nc servername 80 << !
GET / HTTP/1.0

!

http://servername:80/ にブラウザでアクセスした場合と同等の結果を、HTTPヘッダ付で取得し、HTMLレンダリングを行わずに生データのまま画面に表示する。なお、記事冒頭に示した画像も、接続先がlocalhostになっているが、同様の処理を行うサンプルである。

 簡易Webサーバー 
( echo "HTTP/1.0 200 Ok"; echo; cat -u return_file ) | nc -l -p 8080

他の端末からhttp://servername:8080/のようにアクセスすることで、指定されたファイルreturn_fileを送出するWebサーバーとして機能する。なお、他の端末からのアクセス時には、netcatを実行した端末にHTTPリクエストが表示されることになる。

 簡易telnetサーバー 
nc -l -p 10025 -e /bin/sh

他の端末からポート10025にアクセスすることで、入出力が/bin/shにリダイレクトされるようになる。すなわち、バックドアとして機能するようになる。もちろん認証機能は存在せず、実行権限はnetcatの実行権限と同一となる。Windows版では以下のように指定すれば同様にバックドアとして機能するようになる。

start nc -d -L -p 10025 -e cmd.exe

オプション-Lは、セッション切断後も継続してlistenするためのオプションである。また、オプション-dはステルスモードとなり、コマンドプロンプト・ウィンドウなしで動作するようになる。このような使い方が可能なツールゆえ、netcatのWindows版は主要なウィルススキャナの半数以上によってウィルス（リモートAdminツール）として判定されるものとなっている。

 ポートスキャン 
nc -v -n -z -w 1 servername 1-1000

指定されたサーバーに対してポートスキャンを行う。ポート番号の範囲は1 - 1000で、スキャン間隔は1秒。

 プロクシ 
nc -l -p 8080 -e nc servername 80

指定されたWebサーバーに接続するWebプロクシとして機能する。

 メール送信 
nc -i 2 mailserver 25 <<!
MAIL FROM:<test@example.com>
RCPT TO:<test@example.com>
DATA
Hi, This is test mail.
.
QUIT
!

指定されたメールアドレスにメールを送る。行単位での送信間隔（-i）を2秒に指定しているが、このオプションを指定しない場合、MAIL FROMを投げてもよいというサーバーからのメッセージ（200番台のステータスコード）が送られてくるまでにMAIL FROMやそれ以降のデータを送信してしまうこととなるため、具合が悪い。サーバーからの応答を待ってから送信する仕組みを即席で作りたい場合に、このオプションは有用である。

 派生・互換ツール 
netcatにはいくつかの派生・互換ツールが存在する。

 Ncat（nmap付属）
 nmapの一部として開発された。GPLライセンス。
 OpenBSD netcat
 0から書き直されたnetcat互換ツールでIPv6に対応しているnetcat。BSDライセンス。
 GNU netcat
 0から書き直されたnetcat互換ツール。GPLライセンス。
 Netcat Darwin Port
 Mac OS Xで使用可能なnetcatである。
 Windows版netcat
 Windows上で使用可能なnetcatである。
 Jetcat
 netcatの一部の機能をJavaで実現したものである。
 socat