nc(netcat)コマンドのいろんな使い方

こんにちは
CLIでの操作が好きなSRE課の栩野です。

nc(netcat)コマンドのいろんな使い方

今回はTCP/IPやネットワーク周りの調査等でいろいろ使い方ができる
ncコマンドついての使い方を紹介してみたいと思います。

ncコマンドとは

ncはNetCatの略で、Networkをcatenate(連結)するという意味で
イメージとしてはクライアントとサーバの間に入って繋ぐコマンドです。

ちなみにWikipediaには...

TCPやUDPを扱う万能ツールとして知られ、しばしばネットワークのスイスアーミーナイフ
TCP/IPのアーミーナイフ、ハッカーのアーミーナイフなどのように評される。

TCP/IPのアーミーナイフと超かっこよく評されてました。

・参考:Wikipedia

ncコマンドの様々な使い方紹介

それでは本題であるncコマンドの使い方について
今回は6種類の使い方だけ紹介していきます。

今回使用する環境

  • CentOS Linux release 7.8
  • Ncat: Version 7.50

    ncコマンドがインストールされていない場合は
    yumコマンドで簡単にインストールできます。

 # yum install nmap-ncat

これでインストール完了!
CentOS7系の場合ncとncat二つのコマンドがインストールされますが...

# nc -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: You must specify a host to connect to. QUITTING.

# ncat -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: You must specify a host to connect to. QUITTING.

どちらも同じコマンドが動作してます。

1.ncでクライアントサーバシステムを作成

ncコマンドを利用して、簡単にクライアントとサーバを繋ぐだけの
クライアントサーバシステムを作成してみます。

  • サーバ側でのコマンド
// -l オプションはLISTENするポート番号を指定することが可能
// ここでは適当に9999番のポートを指定
# nc -l 9999
  • クライアント側
// IPは上記ncコマンドを実行したサーバのIP、ポートは先ほどLISTENさせたポート番号を指定
# nc サーバのIPアドレス 9999

ちなみに上記実施する場合、サーバ側のファイアウォールで9999ポートを開放しておく必要があります。

この状態で、サーバ側もしくはクライアント側で適当に文字を打つと...

このように打った文字がお互いの画面に表示されて簡易チャットみたいになりました。

2.ncでWEBに接続してみる

ncコマンドを使って、HTTPポートに対してヘッダ情報をして接続するような
curlコマンドみたいな使い方をすることもできます。

接続例として、下記ヒアドキュメントを使って複数のヘッダ情報を指定して
WEBサーバにリクエストを送信することができます。

# nc サーバのIPアドレス 80 << EOS
 > GET / HTTP/1.1
 >
 > EOS
※EOSを入力する前に一つ改行を入れる必要があります。

GETのヘッダを入力と併せて
Hostでバーチャルホストの指定や、User-AgentやReferer等の
ヘッダを指定することも可能です。

このようにncコマンドはWEBサーバへの接続テストにも利用することができます。

3.ncでWEBサーバたてる

ncコマンドばWEBサーバになることもできます。

例としてpタグで文字を返すだけのWEBページを80番ポートで公開してみます。

// 200番の正常ステータスで、pタグの文字列を返す記述
// ncコマンドの -k は複数のクライアントとの接続を確率するためのオプションになります。
# echo "HTTP/1.1 200 ok"; echo; echo "<p>nc command test</p>" | nc -lk 80

ブラウザにサーバのIPを入力してアクセスしてみると...

先ほどpタグで指定した文字が表示されました!

ファイルをコマンドに渡すことも可能なので、静的なページであれば
ncコマンドを使って公開することも可能です。

4.ncをFTPみたいに使う

FTPみたいにファイルのアップロード、ダウンロードもncコマンドで可能です。

  • サーバ側
// 適当なポート番号をLISTENし、出力先として適当なファイル名を指定しておきます。
# nc -l 9999 > rcv-test.txt

サーバ側ではクライアントからアップロードされたファイルの内容を
出力させる適当なファイル名を指定して受け取り準備しておきます。

  • クライアント側

今回は「こんにちは」だけ書いたファイルをアップロードします。

send-test.txt

こんにちは
// サーバのIPと先ほどLISTENさせたポート番号を指定し、送りたいファイルを流し込みます。
# nc サーバのIPアドレス 9999 < send-test.txt

クライアント側で、送りたいファイルを < を使ってコマンドに
流し込むことで、サーバ側にファイルをアップロードすることが可能になります。

サーバ側で確認してみると...

# cat rcv-test.txt
こんにちは

問題なく「こんにちは」がアップロードされていました。
逆に実行することでファイルをダウンロードすることも可能です。

5.ncでプロキシサーバをたてる

ncコマンドでプロキシサーバをたてることも可能です。
実際プロキシサーバをたてて利用してみます。

  • サーバ側
// --proxy-typeオプションを使いhttpのプロキシサーバとして8080ポートをLISTENさせます。
# nc -l 8080 --proxy-type http
  • クライアント側
    今回はcurlコマンドでncで立てたプロキシサーバを使ってIPアドレスが確認できるサイトにアクセスしてみます。
# curl -x サーバのIPアドレス:8080 http://ifconfig.io

プロキシサーバにしているサーバのIPアドレスが返されれば
問題なくプロキシサーバ経由でアクセスができています。

curl以外にもChrome等のブラウザの設定でncで立ち上げたプロキシサーバを
指定すれば利用することも可能です。

6.telnet接続 (危険)

最後にncコマンドで指定したポートを使ってtelnet接続する方法を紹介します。

  • サーバ側
// 適当なポート番号でLISTENさせ、-e で接続後に実行するコマンドを指定できます。
// 今回は接続後にbashを起動するため、/bin/bashを実行
# nc -l 9999 -e /bin/bash
  • クライアント側
    クライアントはサーバのIPと先ほどLISTENさせたポートに接続するだけになります。
# nc サーバのIPアドレス 9999

試しにクライアント側で適用にコマンドを実行してみると...

# whoami
root

# ls /
add_disk
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

サーバ側でncコマンドを実行しているユーザの権限で行える操作が実行できるようになります。

ただし、認証なしで接続できてしまい非常に危険なため注意が必要です。
実際にこのような形でバックドアを作成するような攻撃手法が存在します。

あとがき

他にもnmapコマンドを組み合わせたりして、主にセキュリティ関連の確認で
ncコマンドが利用されることが多いみたいです。

紹介した使い方以外にも、まだまだできることが多くあるコマンドなので
是非遊びがてらにでも、参考にして使ってみていただければと思います。

参考

・参考:Wikipedia
・参考:netcat(ncコマンド)の使い方 | Linux