ネットワークの管理とシステム間のトラフィックデータフローの監視は intimidating に聞こえますが、それは Netcat を使い方を知っていればそうでもありません。
Netcat は、ポートスキャン、ファイル転送、接続アクティビティのテストのための最小限のWebサーバーの作成など、さまざまな目的に使用できるコマンドラインツールです。そして、このチュートリアルでは、Netcat を活用する方法を学び、Netcat の最も一般的な使用例のいくつかを説明します。
準備はいいですか? では、ネットワーキングスキルをさらに高めるために読み進めてください!
前提条件
このチュートリアルは実演形式で行います。一緒に進める場合は、以下のものがあることを確認してください。
- Linux マシンが2つ必要です:1つ(ubuntu1)は受信ホストとして、もう1つ(ubuntu2)は送信ホストとして機能します。このチュートリアルでは、両方のマシンに Ubuntu 20.04 を使用します。
オープンポートのスキャン
ポートは、ネットワークトラフィックがマシンに入出力するための扉です。ポートが閉じていると、そのポートにはサービスがリスニングしておらず、トラフィックは通過しません。しかし、ポートが開いていると、ネットワークは攻撃の対象となります。
特定のポートがマシンのパッチに開いているかどうかを確認したい場合、セキュリティの脆弱性を調査するために、Netcatが役立ちます。ペンテスターとして、攻撃を実行するために開いているポートを知る必要があります。その理由は何であれ、開いているポートをスキャンすることは一般的なニーズです。
Netcatを使用したポートスキャンの基本的な構文は次のとおりです。
host
– スキャンしたいマシンのIPアドレスまたはホスト名。startport
– 開始ポート番号。endport
– 終了ポート番号。
netcatコマンドにはncのエイリアスがあり、コマンドを短縮するのに便利です。ただし、このチュートリアルでは適切なドキュメントのためにnetcatを使用しています。
送信ホスト(ubuntu2)にSSHし、次のコマンドを実行してポート1-100
の間の開いているポートをスキャンします。
このチュートリアルでは、送信ホストのIPアドレスとして149.28.86.131を使用してください。
ほとんどの場合、1-100
のポート範囲で十分です。ほとんどのサービスは、一般的にこの範囲に含まれるデフォルトのポート番号を使用します。例えば、SSHの場合は22
、HTTPの場合は80
などです。
以下のリストは、ポートスキャンの動作を制御する各フラグの説明です:
-z
(ゼロI/Oモード) – Netcatはネットワーク接続から読み取ったり書き込んだりしません。このオプションにより、スキャンプロセスが高速化されます。-n
– NetcatにDNSの検索を無効化して遅延を回避するよう指示します。-v
– Netcatが詳細にすべてのポートスキャンプロセスを表示します。
以下では、ポート22(SSH)への接続が成功しましたが、他のすべてのポートは失敗しました。

netcat
コマンドはスキャンされたすべてのポートをリストアップするため、不要な情報も含まれます。その場合は、以下のコマンドを実行し、grep
コマンドにパイプ処理します。このコマンドは、終わりに"succeeded!"
メッセージがある開いているポートのみをフィルタリングします。
下記では、ポート22がSSH接続に対して正常に開いていることが確認できます。

ホスト間でファイルを安全に送信する
ポートスキャン以外にも、Netcatを使用して2台のマシン間でファイルを安全に転送することができます。Netcatはファイル転送にTCPプロトコルを使用するため、UDPよりも信頼性が高いです。
Netcatを使用してファイルを送信するための基本的な構文は次のとおりです:
ホストから別のマシンにファイルを送信するには:
1. 受信ホスト(ubuntu1)でポート4444で待ち受けを開始するために、以下のコマンドを実行します。
このコマンドには出力がありませんが、以下のオプションはコマンドがリスニングポートを設定する方法に影響します:
-l
– は指定されたTCPポートでの着信接続を待ち受けるようにnetcat
に指示します。ポート番号は任意の番号を使用できますが、他のサービスが選択したポートを使用していないことを確認してください。
> - は、netcatにすべての着信データを指定されたパスのファイル(ata_file)にリダイレクトするように指示します。
ポート番号が1000未満のポートにバインドするには、rootユーザーのみが可能です。したがって、非rootユーザーとしてポート番号1000よりも大きいポートを選択する必要があります。非rootユーザーとして1000未満のポート番号を使用しようとすると、次のエラーが発生します。

2. 送信ホスト(ubuntu2)で、以下のエコー コマンドを実行します。このコマンドには出力がありませんが、Hello from ATA という内容のata_fileという名前のファイルが作成されます。
3. 今度は、以下のnetcatコマンドを使用してata_fileを受信ホスト(ubuntu1)に送信します。送信ホストと同じポート番号(4444)を使用していることを確認してください。
このコマンドには出力がありませんが、<オプションはnetcatに指定されたファイルから入力を取るように指示します。
4. 最後に、受信ホスト(ubuntu1)に切り替えて、以下のcatコマンドを実行してata_fileの内容を確認します。
転送が成功したことを示すHello from ATAメッセージが表示されます。

別のホストにディレクトリを送信する
これまで、1つのホストから別のホストに単一のファイルを送信することができました。しかし、すべてのサブディレクトリとファイルを含むディレクトリ全体を送信したい場合はどうなりますか?Netcatはディレクトリも送信できます!
送信元ホスト(ubuntu2)には、apache_backupという名前のバックアップディレクトリがあります。まず、ディレクトリを圧縮し、次にそのディレクトリを受信ホスト(ubuntu1)に送信して展開する必要があります。
1. 受信ホスト(ubuntu1)で、以下のコマンドを実行して新しいディレクトリ(apache_backup)を作成し、そのディレクトリに移動(cd)します。

2. 次に、以下のコマンドを実行して、ポート4444でリッスンを開始し、送信ホスト(ubuntu2)が受信ホスト(ubuntu1)に送信する圧縮ファイルを展開します。
このコマンドには出力がありませんが、tar xf – フラグはNetcat(標準入力)からの入力を取り、すべてのファイルを現在のディレクトリに展開します。
3. 送信ホスト(ubuntu2)で、以下のコマンドを実行してディレクトリ(apache_backup)とテキストファイルを作成し、それらを受信ホスト(ubuntu1)に送信します。
これらのコマンドには出力がありませんが、次のステップで転送が正常に行われたかどうかを確認します。
4. 最後に、受信ホスト(ubuntu1)に切り替えて、ポート4444のリスニングを停止するためにCtrl+Cを押し、lsコマンドを実行してapache_backupディレクトリ内のファイルをリストします。
以下のように、apache_backupディレクトリのファイルが正常に受信ホストのapache_backupディレクトリに転送されていることがわかります。

他のホストにディスク全体またはパーティションを送信する
Sending your entire disk or partition to another host may seem ambitious, but this task is achievable apart from sending files and directories. This feat comes in handy, especially if you need to backup your entire disk before taking drastic measures, such as moving or deleting tons of files.
1. 受信ホスト(ubuntu1)でポート4444でリッスンを開始するために以下のコマンドを実行します。このコマンドには出力がありませんが、すべての着信データ(bzip2 -d | dd)を/dev/sdbに解凍します。
/dev/sdbはマシンの2番目のハードディスクです。ただし、この場合、/dev/sdbはこのチュートリアルのためにこのマシンに接続された空のハードディスクです。
2. 送信ホスト(ubuntu2)で、以下のfdiskコマンドを実行して、マシンのすべてのディスクとパーティションを検索します。
以下に示すように、/dev/vda1/がこのチュートリアルの送信ホストのルートパーティションです。マシンの構成に応じて出力が異なる場合があります。

3. 送信ホスト(ubuntu2)で以下のコマンドを実行します。このコマンドには出力がありませんが、/dev/vda1パーティションを受信ホスト(ubuntu1)にポート4444を介して送信します。
パーティションを圧縮して受信ホストに送信するには、パーティションのサイズに応じて時間がかかります。
4. プロセスが完了したら、受信ホスト(ubuntu1)に切り替えて、以下の出力が表示されます。
デバイスエラーの空き容量がないのは、おそらく/dev/vda1が/dev/sdbよりも大きいためです。でもアイディアはわかりますよね!Netcatを使用して、自分のハードディスクやパーティション全体を別のマシンに送信できます。

5. 最後に、受信ホスト(ubuntu1)で以下のコマンドを実行して、/dev/vda1パーティションをマウントし、パーティション内のすべてのファイルをリストします。
下記のように、/dev/vda1からのすべてのファイルとディレクトリが/dev/sdbに正常に転送されました。

最小のWebサーバーを作成
Webサーバーの問題を診断するためにApacheやNGINXのような本格的なWebサーバーを設定するのは面倒です。代わりに、Netcatを使用して最小限のWebサーバーを作成し、Webサーバーの問題を素早く特定します。
最小限のWebサーバーを作成するには:
1. 受信ホストに切り替えて、以下のコマンドを実行して、Webサーバーのルートディレクトリ(nc-webserver-docroot)とHTTP応答を生成するシェルスクリプト(httpresponse.sh)を作成します。

2. 次に、お好みのエディタを使用して/root/nc-webserver-docroot/ディレクトリにindex.htmlファイルを作成し、以下のコードでファイルを埋めます。このHTMLファイルには、Netcatウェブサーバーが提供するコンテンツが含まれます。
3. httpresponse.shという名前のシェルスクリプトファイルを/root/nc-webserver-docroot/ディレクトリに作成し、以下のコードを埋めます。
このシェルスクリプトは、Netcatウェブサーバーにリクエストを送信するクライアントに対して、/root/nc-webserver-docroot/index.html ファイルの内容をHTTPレスポンスとして返します。
4. 以下のchmodコマンドを実行して、httpresponse.shファイルを実行可能にします(+x)。
5. 以下のncatコマンドを実行して、ポート7777でNetcatウェブサーバーを起動します。
システムで他のサービスが使用していないポート番号で、ポート7777を選択してください。
次のオプションは、Netcatウェブサーバーの動作に影響します。
-l
– Ncatが着信接続を待機することを指示します。
-v
– 全ての着信HTTPリクエストをターミナルに表示する詳細モードを有効にします。
-c - httpresponse.shスクリプトへのパスを指定します。
- -keep-open – 最初の接続が閉じられてもNcatリスナーを開いたままにします。このオプションは、複数のクライアントでウェブサーバーをテストする場合に便利です。
Netcatウェブサーバーがポート7777で実行され、利用可能なすべてのネットワークインターフェイスで待機していると、以下の出力が表示されます。

6. 今、別のターミナルを開いて、次のコマンドを実行して、Netcatウェブサーバーをテストします(http://localhost:7777)。
以下の出力は、Netcatウェブサーバーが期待どおりに機能し、/root/nc-webserver-docroot/index.htmlファイルの内容をHTTPレスポンスとして返すことができることを示しています。

7. 最後に、Netcatウェブサーバーが実行されているターミナルに戻ります。curlクライアントからのHTTPリクエストをNetcatウェブサーバーが受信し、処理したことがわかります。
おめでとうございます! ネットワーキング接続をテストするために、最小限のNetcatウェブサーバーを正常に作成しました!

結論
このチュートリアルでは、Netcatを使用してネットワーキングおよびデバッグスキルを向上させる方法を学びました。開いているポートをスキャンし、ファイルを転送し、最小限のウェブサーバーを作成しました。そして、この時点で、この強力なネットワーキングユーティリティを使用して、多くの現実世界のネットワーキング問題を解決できるようになりました!
この新しい知識を活用して、なぜさらにネットワーキングスキルを向上させ、サイバーセキュリティのパワーユーザーにならないでしょうか?