🚸

ncコマンドでチャットをする

2023/03/07に公開

ncコマンドとは?

ncはNetCatの略で、Networkをcatenate(連結)するという意味。

クライアントとサーバの間に入って繋ぐコマンドで、チャットや、ファイル転送といった、さまざまな用途に使うことができ、サイバー攻撃にも使用されているそう。

もう少し詳しく言うと、Unix系OSコマンドラインアプリケーションの一つ。

TCPやUDPのパケットを読み書きをおこなう、バックエンドとして機能するツールで、ネットワークを扱う万能ツールとして知られている。

基本的な使い方

$ nc [options] [hostname(接続先のこと)] [port] 

$ nc -h でオプション一覧を確認することができる。

環境

Windows11
WSL2
Ubuntu 20.04.5 LTS

ポートスキャン

サーバーに接続要求を行なうことで、解放されているポートを確認する手法。

クライアント側にて
$ nc -zv localhost 123

オプション -zv の意味は以下。

-z  Zero-I/O mode [used for scanning] 
TCPの場合は相手先のポートに接続した後、すぐに接続を切断する。
UDPでは相手のポートにパケットを送り、一定時間反応を待った後に処理を終了する。
つまりZero-I/O modeでは、実際のデータ通信は行われない。

-v  Verbose
「多弁、詳細」という意味で、接続の可否や、名前解決結果など、詳細な情報を表示するようになる。

123ポートでサーバーが起動していないので、以下のようなメッセージが出力される。

nc: connect to localhost port 123 (tcp) failed: Connection refused

チャット

サーバーの準備

サーバー側にて
$ nc -lk localhost 123

(ぼくの環境では、実行するのにsudoコマンドが必要だった。)

オプション -lk の意味は以下。

-l –listen  Bind and listen for incoming connections
Netcatをリッスンモードで起動。
相手側からの接続が切れるとリッスンしているNetcatは終了。
(ちなみにWindows版Netcatには「-L」オプションがあり、このオプションで起動した場合、Netcatは接続が切れても繰り返しリッスンモードで待ち受けるようになる。UNIX版Netcatにはない機能。)

-k Keep inbound sockets open for multiple connects

コマンドの実行により、サーバー側が入力待ち状態になる。

クライアント側でポートスキャンしてみる

クライアント側にて
$ nc -zv localhost 123

今回は、123ポートでサーバーが起動しているので、以下のようなメッセージが出力される。

Connection to localhost 123 port [tcp/*] succeeded!

クライアント側でサーバーに接続

クライアント側にて
$ nc localhost 123

これでクライアント側も入力待ち状態になる。

片方の端末で入力した情報が、もう片方の端末で表示されるようになる。

Discussion