ネットワーク診断の現場から(netcat編・その1)
はじめに
ネットワーク診断では、脆弱性スキャナーや侵入テストツールなどのさまざまなソフトウェアを使用します。これらはどれも複雑なソフトウェアであるため、インストール方法から実際の操作まで、事前に多くのことを学ぶ必要があります。
しかしネットワーク診断の現場では、コマンド1つで提供されるシンプルなツールも多く利用されています。そのような簡単なツールでも、うまく使いこなせばさまざまなセキュリティチェックを行うことができます。
このコラムではネットワーク診断で使われるツールの中から、一般的なUNIX/Linuxで標準パッケージとして提供されており、簡単に利用できるコマンドを紹介していきます。これらのツールはネットワークのトラブルシューティングにも使われることが多いため、ふだんサーバー・ネットワークの構築をしている方々にも役立てていただきたいというのがこのコラムのねらいです。
今回のコラムでは、非常にシンプルかつ強力なコマンドである「netcat」を紹介します。なお、以下の実行例ではLinux(CentOS 6.6)を利用していますが、netcatは多くのUNIX/Linuxに移植されていますから、実行する環境はSolarisやFreeBSDなどでも構いません。
netcatとは
netcatとは、TCPもしくはUDP接続などを利用して、コマンドラインからデータを送受信するためのツールです。宛先を指定して対象ホストに接続するだけでなく、自らがサーバーになりコネクションを待ち受けるなど、さまざまな通信を行うことができます。
netcatでどのようなことができるのか、まずは使用例を見た方が分かりやすいでしょう。netcatは通常「nc」というコマンド名で提供されており、 nc <接続先ホスト> <ポート番号> の形で利用します。次の例ではWebサーバーである192.168.2.66というホストのHTTPサービス(80/tcp)へ接続しています。コマンドを実行して接続した後に、キーボードから「HEAD / HTTP1.0<改行><改行>」というテキストを入力しており、この内容がそのまま接続先ホストに送信されます。
$ nc 192.168.2.66 80 HEAD / HTTP/1.0
上記のコマンドを実行すると、次のようにWebサーバーからの応答内容が表示されます。これはHTTPの通信で、レスポンスヘッダを表示した例です。
$ nc 192.168.2.66 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Sun, 14 Jun 2015 13:47:00 GMT Server: Apache Last-Modified: Sun, 14 Jun 2015 13:46:14 GMT ETag: "c06fc-45-5187a909b0945" Accept-Ranges: bytes Content-Length: 69 Connection: close Content-Type: text/html; charset=UTF-8
皆さんがWebページを閲覧する際には、Internet ExplorerやFirefoxなどのWebブラウザを利用していることでしょう。Webブラウザではレスポンスボディのみが表示されますが、実際のWebサーバーからの応答内容にはこのようなレスポンスヘッダが付加されており、その中にはセキュリティ上、問題となるような情報が含まれていることもあります。
netcatを利用すると、余計な加工をされずにサーバー接続時の情報をそのまま扱うことができます。セキュリティチェックやトラブルシューティング時には、このように生の情報(raw data)を扱えるツールが便利です。
netcatの種類
netcatは歴史の古いソフトウェアであることから、さまざまな派生版が存在します。基本的な使い方はどれも同じですが、実装している機能やオプション指定には微妙に差があるため注意が必要です。2015年現在、よく利用されているnetcatは以下の3種類です。
- オリジナル版netcat (netcat-traditional)
- OpenBSD版netcat
- Nmap付属netcat
オリジナル版netcatは、*Hobbit*氏により1995年にリリースされた最初のnetcatです。これはたとえばUbuntuでは、nc.traditional(伝統的nc)というコマンド名で実装されています。古典的なコマンドであるためIPv6が扱えないなどの制限はあるものの、完成度は高く、現在でも十分に実用的です。
OpenBSD版netcatは、その名の通りOpenBSDで提供されていたものを各種UNIX/Linuxに移植したものです。Red Hat Enterprise Linuxをはじめ多くのUNIX/Linuxで標準パッケージとして採用されており、ncという名前のコマンドとして実装されています。オリジナル版に比べ、IPv6やUNIXドメインソケットに対応するなどの拡張が図られています。
最後のNmap付属netcatは、ポートスキャナーとして有名なNmapに付属するコマンドです。これはそのコマンド名からncatと呼ばれます。ncatは現在も開発が続いており、SSL接続に対応するなど他のnetcatに比べて高機能であることから、これからの主流になっていくと思われます。
このコラムでは、現在一般的によく使われている2つのnetcat、「OpenBSD版netcat」と「Nmap付属netcat」の2つについて解説することとしましょう。これ以降、ncと書いたときはOpenBSD版netcatを、ncatと書いたときはNmap付属netcatを示します。
netcatの準備
netcatは多くの環境で標準パッケージとして提供されているため、インストールは簡単です。CentOS 6.6では、ncコマンドとncatコマンドは、それぞれncパッケージおよびnmapパッケージに付属しています。このため次のように、yumコマンドで簡単にインストールすることができます。
# yum install nc nmap
その他の多くのOSでも、同様にnc(もしくはnetcat)とnmapという2つのパッケージ名で提供されています。またFreeBSDのように、ncコマンドはデフォルトでインストールされているOSもあります。
netcat = network + cat ?
netcatは、その名の通りnetwork対応のcatコマンドというイメージで使うことができます。そこでnetcatについて詳しく見ていく前に、まずはcatコマンドの動作について確認しておきましょう。何を今さらと思われるかもしれませんが、catコマンドの標準入出力に対する動作への理解が曖昧な場合、netcatをシェルスクリプトなどから利用する際につまずくことになります。
catコマンドとはなんだろう
catコマンドは、多くのUNIX/Linuxで基本となるコマンドです。これは何をするコマンドか、皆さん説明できるでしょうか。この質問をすると多くの場合、「catコマンドとは、指定されたファイルの内容を表示するコマンドである」という答えが返ってきます。これは、誤りとまでは言えませんが不正確です。
たとえば次のようなコマンドラインでは、catコマンドにファイルを指定していません。
$ echo "Hello, World." | cat Hello, World.
ここではパイプでつながれたechoコマンドの出力を、catコマンドが表示しています。このとき、catコマンドは次のように動作しています。
UNIX/Linuxでは、コマンドを実行すると「標準入力(stdin)」「標準出力(stdout)」「標準エラー出力(stderr)」の3つの入出力チャネルが開かれます。この際、標準入力から受け取ったデータストリームをコマンド内で処理し、その結果を標準出力に出力するコマンドを「フィルタ」と呼びます(*1)。grep、sort、uniqなど、UNIX/Linuxの多くのコマンドはフィルタです。
(*1) フィルタについて詳しくは、Mike Gancarz著「UNIXという考え方 - その設計思想と哲学」(オーム社)を読まれることをおすすめします
catコマンドはもっとも原始的なフィルタです。標準入力からデータストリームを受け取り、処理を行い(catコマンドの場合は「何もしない」という動作をすることになります)、その結果を標準出力に出力しているわけです。
netcatはネットワーク接続するフィルタ
netcatもフィルタとして動作するコマンドです。そのためnetcatの動作は、細かく書くと次のようになります。これはncコマンド、ncatコマンドのどちらでも共通です。
- 標準入力(stdin)からデータストリームを受け取り、
- そのデータストリームを引数で指定された接続先ホストにそのまま送り込み、
- 接続先ホストからの応答を、そのまま標準出力(stdout)に出力する
このことをきちんと理解しておけば、netcatをパイプやリダイレクトで利用するシェルスクリプトを書く際に迷うことがありません。
はじめに「netcatとは」の節でncコマンドの使用例を紹介しましたが、そこではキーボードからHTTPリクエストを入力しました。これは次のように、request.txtというテキストファイルにHTTPリクエストを書いておき、それを入力リダイレクトしてもかまいません。
$ cat request.txt HEAD / HTTP/1.0 $ nc 192.168.2.66 80 < request.txt HTTP/1.1 200 OK Date: Sun, 14 Jun 2015 13:58:05 GMT Server: Apache Last-Modified: Sun, 14 Jun 2015 13:46:14 GMT ETag: "c06fc-45-5187a909b0945" Accept-Ranges: bytes Content-Length: 69 Connection: close Content-Type: text/html; charset=UTF-8
あるいはパイプを利用して、別のコマンドの出力結果を対象ホストに直接送り込むこともできます。次の例では、echoコマンドの出力をそのままmail.example.comというメールサーバーのSMTPサービス(25/tcp)に送り込み、HELPコマンドが動作するかを確認しています。
$ echo "HELP" | nc mail.example.com 25 220 ubuntu ESMTP Sendmail; Thu, 4 Jun 2015 02:22:39 +0900; 214-2.0.0 This is sendmail version 8.14.4 214-2.0.0 Topics: 214-2.0.0 HELO EHLO MAIL RCPT DATA 214-2.0.0 RSET NOOP QUIT HELP VRFY 214-2.0.0 EXPN VERB ETRN DSN AUTH 214-2.0.0 STARTTLS 214-2.0.0 For more info use "HELP". 214-2.0.0 To report bugs in the implementation see 214-2.0.0 http://www.sendmail.org/email-addresses.html 214-2.0.0 For local information send email to Postmaster at your site. 214 2.0.0 End of HELP info
上の例では、「This is sendmail version 8.14.4」という応答がありました。SMTPサーバーの設定によっては、このようにHELPコマンドによってソフトウェア名およびバージョン番号を取得することができます。このような情報を攻撃者に収集されることが、セキュリティ上の問題となる可能性があります。
こうしてパイプやリダイレクトを利用することで、netcatを他のコマンドと組み合わせてシェルスクリプトなどから柔軟に扱うことができます。セキュリティチェックのためのツールなどを作る際、netcatはとても便利なコマンドです。
netcatを利用する上での注意点
最後に、netcatを利用する際の注意点についてお知らせしておきましょう。
Windows版netcatとウイルス対策ソフト
netcatは便利で強力なツールですが、その高機能さが災いし、バックドアの設置などに悪用されるケースもあります。このため多くのウイルス対策ソフトでは、netcatは危険なソフトウェアとして検知されます。たとえばトレンドマイクロ社のウイルスバスターは、Windows版netcatの実行ファイルnc.exeを「HKTL_NETCAT」というスパイウェアとして検出します。
このため、社内LANなどでWindows版netcatを利用することは避けた方が良いでしょう。本コラムでは、CentOS 6.6での実行例を紹介しています。
自分の管理していないホストには接続しない
netcatでは対象ホストに通常では送られないようなリクエストを送信したり、ポートスキャンを行ったりすることができます。これらの機能を第三者のホストに対して実行すると攻撃とみなされ、場合によっては犯罪行為となる可能性もあります。そのためnetcatの利用において、対象ホストを指定する際には十分注意し、自らの管理下にあるホストのみに実行するようにしてください。
まとめ
今回は、netcatの概要について紹介しました。次回以降はOpenBSD版netcatとNmap付属netcatの違いや、netcatのさまざまなオプション、netcatを利用した簡単なセキュリティチェックの方法を紹介します。
Writer Profile
大角 祐介
Tweet