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個を紹介させてもらった。
実際にはまだまだ面白い使い方はあるだろうし、見つけたらまた追記していくことにする。