nc(netcat)コマンドで覚えておきたい使い方8個

Linuxでポートの疎通確認を行う際によく用いるncコマンド。
今回は、このncコマンドで覚えておきたい使い方についてまとめてみる事にする。

使用したのは、Ubuntu 14.04 LTSに入っている以下のもの。

test@test-vm-ubuntu:~$ nc --help
nc: invalid option -- '-'
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
          [-P proxy_username] [-p source_port] [-q seconds] [-s source]
          [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
          [-x proxy_address[:port]] [destination] [port]

1.基本的な使い方・クライアントとして動作させる

ncコマンドで最もよく使われる使い方としては、対象ホストに対してポート指定をして、クライアントとして疎通確認を行うというものだろう。
基本的には、以下のようにコマンドを実行する。

nc 対象ホスト(IPアドレス等) ポート番号

TCPではなく、UDPでの疎通を確認する場合は「-u」オプションを付与する。

nc -u 対象ホスト(IPアドレス等) ポート番号

ただポート確認を行うだけではなく、ヘッダを相手先ポートに送りつける事でその後の処理を実施させることも出来る。
例えば、以下のようにコマンドを実行することでwebサーバへhttp-getリクエストを行う事ができる。

echo -en "GET / HTTP/1.1\n\n" | nc 対象ホスト(IPアドレス等) 80

2.基本的な使い方・サーバとして動作させる

ncでポートの待受側(サーバ側)として動作させる場合は、以下のように「-l」オプションを付与する。

nc -l ポート番号 # TCPのポート番号で待ち受ける
nc -ul ポート番号 # UDPのポート番号で 待ち受ける

ただし、上記のコマンドだと一度疎通に成功するとサーバ側のプロセスが終了してしまう。
サーバ側で明示的にプロセスを終了するまでポートを開けさせたい場合は、TCPの場合は「-k」を、UDPの場合は「-e 'cat'」でポートを開けさせておく事が出来る。

nc -kvl ポート番号 #TCP
nc -e /bin/cat -uvl ポート番号 # UDP

なお、CentOSやUbuntuのパッケージからインストールしたり、バンドルされているコマンドの場合、「-e」オプションが利用出来ないようにしてる可能性がある。
この場合は、別途ソースからインストールして-eオプションを使えるようにしてあげる必要があるので注意。

3.ファイルを転送する

ncコマンドでは、FTPやscpを使わずにクライアント⇔サーバ間で直接ファイルを転送することも出来る。
(セキュリティ考慮する必要がある環境ではおすすめしないけど)

サーバ側からクライアント側にファイルを取得させる場合

nc -l ポート番号 < 転送するファイルPATH # サーバ側
nc 対象ホスト(IPアドレス等) ポート番号 > 転送されたファイルを取得するPATH # クライアント側

画像は、左がサーバ側、右がクライアント側のコンソール。
サーバ側でリダイレクトしてたアーカイブファイルが、無事クライアント側で取得、展開出来ている事がわかる。

クライアント側からサーバ側にファイルを取得させる場合

nc -l ポート番号 > 取得したファイルの保持先PATH # サーバ側
nc 対象ホスト(IPアドレス等) ポート番号 < 転送するファイルPATH # クライアント側

4.IPv4、IPv6を指定する

IPv4の場合は「-4」、IPv6の場合は「-6」を付与することで通信を可能にする。
なお、デフォルトはIPv4。

test@test-vm-ubuntu:~$ # オプション無し
test@test-vm-ubuntu:~$ nc -l 55551 &
[2] 6013
test@test-vm-ubuntu:~$
test@test-vm-ubuntu:~$ # IPv4
test@test-vm-ubuntu:~$ nc -l4 55552 &
[3] 6014
test@test-vm-ubuntu:~$
test@test-vm-ubuntu:~$ # IPv6
test@test-vm-ubuntu:~$ nc -l6 55553 &
[4] 6015
test@test-vm-ubuntu:~$
test@test-vm-ubuntu:~$ netstat -an | grep 5555[1-3]
tcp        0      0 0.0.0.0:55551           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:55552           0.0.0.0:*               LISTEN
tcp6       0      0 :::55553                :::*                    LISTEN

5.通信の詳細を取得する

通信の詳細を表示させる場合は「-v」オプションを付与する。

6.ソースアドレス・ポートを指定する

パケット送信側のホストに割り当てられているIPアドレスであれば、「-s」でアドレスを指定して通信を行わせる事も出来る。
送信側のポートを指定する場合は、「-p」で指定できる。

nc -s ホストに割り当てられているIPアドレス -p 送信時のポート番号 対象ホスト ポート番号

7.ポート範囲を指定してスキャンを行う

nc(netcat)には、「-z」というポートの確認だけをするオプションが存在する。
これと「-v」オプションを組み合わせる事で、対象ホストでListenしているポートを確認することが出来る。

nc -vz 対象ホスト ポート番号-ポート番号

以下の例は、対象のホストで4440-4450の範囲で開いているポートを確認している。

8.ポートへのアクセス時にコマンド(bash等)が実行されるようにする

「-e」オプションを使用することにより、サーバ側で特定のコマンドを実行させることが出来る。
なお、セキュリティの観点からか、UbuntuやCentOSでパッケージからインストールしたコマンドだとこのオプションは使えない。そのため、別途ソースからインストールするなどが必要となる。

nc -l -e 'コマンド' ポート番号

以下の例では、右のサーバ側でbashを待ち受けている。
プロンプトは表示されないが、サーバ側をコマンドで操作出来ている事がわかる。
…まぁ、普通にバックドアですよね、これ。

とりあえず、以上8個を紹介させてもらった。
実際にはまだまだ面白い使い方はあるだろうし、見つけたらまた追記していくことにする。