清く、正しい、nmapの使い方


 ここでは、表題にもあるとおり、nmapという、セキュリティ確保に非常に役立つツールについて説明します。
 ただし、この文章、長いですよぉ(笑)。

 このツールは、ネットワーク上のサーバーが、「どの様なサービスを提供している(可能性があるか)をリモート(ネットワーク越し)に調査するためのものです。

 なぜ、提供しているサービスを調査することが、セキュリティ確保につながるのでしょう?
 どんなサービスが動いていたっていいじゃん、とか、俺はどんなサービスを使っているか知っているから、なんていう声が聞こえてきそうです。

 しかし、多くの場合、使っているつもりのないソフトが動いていたりなんかして、サービスが知らぬ間に動いていたりします。
 知らぬ間に動くんだから、ろくな設定がされておらず、余計にセキュリティ上危ない、ということになりますねぇ。
 また、トロイの木馬のように、勝手にサービスとして動いてしまう悪意のツールだってあります。
 サービスを全部覚えている人も、ハッカーが仕掛けたサービスまでは覚えていないでしょ?:-)
 そこで、ネットワーク越しにサービスがどれだけ動いているか、を調査できるツールが有効なのです。

 さぁ、能書きはこれくらいにして、早速ここで説明するツール、nmapの紹介をしましょう。

 nmapは、上記のような、提供サービスの調査を行うことができると共に、どんなコンピュータがサーバーとして動いているか、調査することができます。
 また、ステルススキャンと呼ばれる、内緒のスキャンや、囮を使ってばれないようにスキャンする、などの機能などがあります。

 「おいおい、それじゃ攻撃用のツールじゃん」と思われるでしょう。
 そうです、これはナイフです。
 便利な武器、それがnmapなどのようなセキュリティツールなのです。
 攻撃者が使う前に、自ら試し、その効果を知っておくこと、これがとても重要なのです。

 ただし、ナイフですから相手に向けてはいけません。
 不正アクセス法に抵触はしませんが、十分疑われます。
 自分のコンピュータ、サイトを調べるためのツールである、と固く心に誓ってこのツールを使ってください。

 なにかあっても、それは私の責任ではなく、あくまで使ったあなたの責任です。お忘れなきよう。

 さて、まずはLinuxマシンにインストールをしましょう(別にWindowsでもいいですけどね、やり方は自分で調べてね)。

 まずはプログラムを取ってきましょう。
 作者のサイトにいって、バイナリなりソースなりを取ってきてください(現在最終stableバージョンは2.53、βバージョンは2.54です)。
 この時、バイナリを取ってくる人は、nmap(本体)とnmapFE(GUI)がありますので、必要ならnmapFEも落としてください(ここではGUIは扱いません)。

 バイナリ(rpmファイル)を落とした人は
 "rpm -ivh nmap-〜.rpm"
 でインストールしてください。 tar玉と呼ばれるソースファイル(tar.gzファイル)を落とした人は、
 "tar xvfz nmap〜.tar.gz"
 でソースを展開し、できたディレクトリに移って
 "./configure"、"make"、"su"、"make install"
 でインストールされます。
(これでインストール方法がわからない、と思った人はほかのサイトなり本なりで調べてください)。

 さて、まずは一般ユーザでいいですから、nmapを実行してみてください。
 そっけない使い方が(英語で)表示されます。

 ここで、まずは使い方について説明をしておきましょう。
 ざっくり言うと、
 "nmap スキャン方法 オプション 相手コンピュータのIPアドレスまたは相手のネットワークアドレス"
 と入力することで実行できます。

 まず、IPアドレスやネットワークアドレスについてはいいですよね。IPアドレスの替わりにホスト名でもかまいません。

 次に、スキャン方法を説明しましょう、と言いたいところですが、これ、TCP/IP(とりわけ3way-handshake)がわかっていないとちょっと「わけわからん」状態になるかもしれませんので、そんな状態になった方は、(手前味噌ですが)こちらこちらを参照して下さい。
 説明に必要なところでいずれ言及しますけど。

 スキャンタイプは以下のものがあります。
  • -sT(TCPフルコネクトスキャン)
  • -sS(TCPハーフコネクトスキャン)
  • -sU(UDPスキャン)
  • -sP(pingスキャン)
  • -sF(FINスキャン)
  • -sX(Xmasスキャン)
  • -sN(Nullスキャン)
  • -sR(RPCスキャン)
  • -I(Identdスキャン)
  • -sA(ACKスキャン)
  • -sW(Windowスキャン、Windowsじゃないですよ、笑)
  • -b(FTPバウンススキャン)
 とまぁ、いろいろな種類があります。

 一つ一つのスキャン原理とその特徴などを書いていきましょう。
 まず、TCPフルコネクトスキャンはもろに通信を試す、つまり、相手コンピュータにSYNパケット(通信開始要求)を送ります。
 相手サーバから許可(SYN/ACKパケット)が送られたら実際にコネクションを張って(ACKパケットを送信)みてポートが開いていると判断します。
 もし、拒否(RST/ACKパケット)と言われたらあきらめてポートが閉じていると判断します。
 この流れは、普通TCP/IPで通信を開始するときの正規の手順です。
 こういった(正規の)流れでサービスが動いているかどうか確認するので、正確にサービスを特定できます。
 ただし、弱点として、サービスが「つながったよ」「拒否したよ」とログを残すので、スキャンしたことがもろにばれる、と言うことがあげられます。

 次にUDPスキャンですが、これはUDPを使ったサービスが動いているかどうかを確認します。
 具体的には空のパケットを相手コンピュータに送信し、返事が来なかったらポートが開いていると判断し、ICMP-port-unreachableが返ってきたらポートが閉じている、と判断することでスキャンを行います。
 ただし、UDPはもともと信頼性のない通信(こちらの空パケットが届いていない場合だってあり得ます)ですから、スキャン結果も基本的に信頼性に欠けます。

 Pingスキャンは、大抵ネットワークにどれだけ動いているコンピュータが存在するか探すためのスキャン方法です。
 まぁ、手でpingを打つのを自動化している、位に考えていいでしょう。

 さて、この辺からは濃いぃスキャンです(笑)。

 まずTCPハーフコネクトスキャンです。
 これは、通信すると見せかけて、途中で止めてしまうスキャンです。
 きちんと書くと、SYNパケットを送り、相手からSYN/ACKパケット(通信許可)かRST/ACKパケット(通信拒否)のどちらが返ってきたか、によってポートが開いているかどうかを判断します。
 ここまでは正規の手段と変わりありません。
 違うのは、ここから先です。
 SYN/ACKが返ってきた時、通信を確立せずにRSTパケットを送信し、通信を取りやめてしまうのです。
 途中で止めてしまうので、サービス自体はは全くログを残しません。
 このため、ステルススキャンと呼ばれています。

 FINスキャン、Xmasスキャン、Nullスキャン、ACKスキャンは、へんな通信を送って、相手の反応からサービスが動いているかどうか確認するスキャンです。
 一つ一つ見ていきましょう。
 FINスキャンはいきなり通信終了要求(FINパケット)を送って、XmasスキャンはFIN、URG、PUSHの3種のフラグ付きのパケットを送信し、Nullスキャンは何もフラグの立っていないパケットを送信し、それぞれ様子を見る、と言うものです。
 ちなみに、これらのスキャンにWindows系OSは反応しません。
 逆に言えば、この方法でWindowsか否かを判別できる、と言うわけです。
 まぁ、この辺を使うことになるとしたら、相当あなたは深みにはまっているということかも(苦笑)。

 ACKスキャンは、ポートのスキャンというよりも、ファイアウォールのフィルタリング状況を確認するのに役立ちます。
 ファイアウォールの中には、通信開始要求についてフィルタする事で、通信できなくしている(ブロックしている)ものがありますが、そういったファイアウォールを使っているのか、もっと高度なファイアウォールを使っているのかを確認することができます。
 また、前述のファイアウォールの場合、どんなフィルタルールになっているかを確認することができます。
 手法は、いきなりACKパケットを送り、RSTパケットが返ってきたらフィルタされていない事になり、何も返ってこないか、ICMP-unreachableが返ってきたらフィルタされている、と言うことになります。

 RPCスキャンはRPCを用いたサービスをスキャンします。
 まずすべてのTCP/UDPポートをスキャンし、その後、RPCに空のコマンドを送信します。
 で、RPCのポートが開いていたら、相手はバージョンナンバーを返してくる、と言う寸法です。
 まぁ、rpcinfoコマンドを試すのとほとんど変わらないと思います。

 Identdスキャンはその名の通り、Identdに関するスキャンです。
 サービスを実行しているユーザを確認することが可能です。
 ただし、相手サーバでidentdが動作していなかったら意味がないです。

 Windowスキャンは、いくつかのOSでは、TCPのWindowサイズを見ればポートが開いているか閉じているか判別できる、と言う特徴を利用して調査します。

 FTPバウンススキャンはサーバーを(いってみれば)踏み台にしてスキャンを行います。
 (多分、詳細はRFCでFTPのところ(RFC959)を確認してください。)
 まぁ、できなくなっているFTPサーバーもありますし、あまり褒めた方法じゃなさそうです。

 いやぁ、いっぱいありますねぇ。使い分けは後々として、せめて濃くない(笑)スキャンくらいは理解しておいてください。
 これ以降の方がもっと濃いぃですから(笑)。

 ではでは、濃いぃオプションについて説明します。

 まず、濃くないオプションが-hでしょう。要はヘルプです。
 ただ、簡単な要約しか出ませんので、
 "man nmap"
 できちんと確認した人向けです。

 次は、-pオプションです。
 これはポート番号が指定できます。つまり、どんなサービスを調査するか、に相当するオプションですね。  "-p 20-30,139,60000-"
 と指定した場合、ポート番号20〜30と139、それと60000以上のポートをスキャンします。

 -gオプションは、こちらが使うポート番号を指定できます。
 これは、大きな声では言えませんが、簡易ファイアウォールをすり抜けるのに使われたりします。
 また、ファイアウォールの中から外のサイトにポートスキャンするのに使えるでしょう。まぁ、応用編ですね、この辺は(^^)。

 -vオプションは冗長モードで、nmapがいろいろなことを出力しますが、単なる冗長なのではなく、重要な情報を出力する、と言う感じがありますね。
 いつでも-vオプションをつけておいていいと思います。
 
 比較的わかりやすいものから順番に書いているので、次は-Dオプションを説明しましょう。
 これは、スキャンの際には(特別な場合を除く、後述)自分のIPアドレスがかならず向こうに伝わります。
 このため、少しでも見つかりにくくするように、偽のIPアドレスでもスキャンをかけて、こちらのIPアドレスをわかりにくくするためのものです。
 -Dに続いて、囮のIPアドレスと自分のIPアドレスを書いていきます。
 (しかし、姑息な手段ではありますね、苦笑)
 まぁ、使わないに越したことはないです。悪用しないように、ね。

 -P0オプションは、スキャンするときにpingを発信して相手サーバが動いているかどうか調査しない、と言うものです。
 一部のサイトはファイアウォールでpingに応答しないように設定してあったりするので、pingに応答しない->サーバはダウンしている、と言う風に間違ったスキャン結果をもたらしてしまう可能性があるからです。
 デフォルトはpingを使います。pingを使う、と明示的に示すときには-PIオプションを用います。

 -PT(数字)オプションは、pingによるサーバ動作確認をせずに、いきなりTCP ACKパケット(またはSYNパケット)を送ってサーバが生きているかどうか確認する、と言う手法です。
 オプションにある数字の部分をポート番号として指定します。
 WWWサーバ相手のスキャンだったら、-PT80として、http(ポート番号80番)に送ってあげればよい、と言うことになりますね。

 -PSオプションをつけると、ACKパケットによる動作チェックを行わず、SYNパケットによるチェックを行います。

 上記の-P0、-PTオプションをつけていない場合には、サーバが動いているかどうかのチェックはping+ACKパケット(80番に対して)の2つでチェックします。

 -Oオプションは、nmapの高機能さを象徴するオプションかもしれません。
 相手サーバのOSを同定します。
 400種類に及ぶOSやそのバージョンを同定してくれます。
 これがけっこう当たるんですよ。
 ただし、オープンしたポートが全くないと失敗する場合が多いです。
 動作は、いろいろなパケットを送って返ってきた結果をデータベースと照合する、と言うものです。

 -fオプションは、送信するパケットをわざとフラグメント化(断片化)して送信する、と言う手法のためのものです。
 これを用いると、IDS(侵入検知システム)から見つからない、かもしれない(^^;。

 -o[NMS]ファイル名オプションは、ログ出力です。
 Nが人間が見てわかるログ、Mが他のアプリケーションで使うファイル、Sが厨房スタイル(笑)ログです。

 -Fオプションをつけると、オープンポートのリストアップだけを望んでいるときに、早くスキャンしてくれます。

 -Tオプションは、スキャンの速度を指定できます。
 のんびりやるか、速攻やるか。
 速攻は時間がない人向け、のんびりはIDSなどに見つかりたくない人向けですね(^^;;;。

 -Sオプションは、こちらのIPアドレスを指定するものです。
 まぁないとは思いますが、nmap自体がコンピュータのIPアドレスを知らない(わからない)なんて場合用です。
 また、nmapを実行するホストと結果を見るホストを変えたいときに使えるかもしれませんね。
 普通使わないとは思いますが。

 -eオプションはどのインターフェイスでnmapを実行するかを指定するものです。
 ネットワークカードがいっぱい刺さっている場合には必要かもしれません。

 --resumeログファイル名オプションは、スキャン中、コントロール-Cを入力して作業を中断したあと、続きをやりたくなったときに使います。
 ただし、ログファイルが残ってないと意味ないです。

 -iLインプットファイル名オプションは、やりたいことを書いたインプットファイルに記述しておき、それを使ってnmapを実行させるときに使います。
 スクリプトをくんだりしたときには便利かもしれませんね。


 さぁ、すべてではないですが、ほとんどのオプションを網羅してみました。

 実際の作業では上記のオプションを組み合わせて使うことになります。
 まず、簡単パターンのスキャン方法を試してみましょう。

 nmap -v target.example.com

 この方法の場合、/etc/servicesに書いてあるような、メジャーな(予約されている)ポートに関して、SYNフルコネクトスキャンを試します。
 そうすると、ポートの状態が一覧となって出力されているはずです。

 また、(可能なら)相手コンピュータのsyslogを見てみましょう。
 きっといくつかのサーバがコネクトしたよ、なんて情報を出力していると思います。
 これが、フルコネクトスキャンの弱点です。

 次に、OSを判別させてみましょう。例えば、

 nmap -v -O target.example.com

 とすると、ターゲットホストのOSを判別してくれます。

 ところで、Linuxを使っていて、一般ユーザでこのコマンドを実行された方はきっとうまく行かなかったと思います。
 OS判別は、変わったTCPパケットを送る必要があるので、root権限でないと実行できません。
 nmapは、一部を除いてroot権限が必要ですので、それを念頭において使用してください。

 さて、ステルススキャンを試してみましょう。

 nmap -v -sS target.example.com

 多分、最初のフルコネクトと同等の結果になったと思います。
 では、同じようにsyslogを見てください。
 きっとサーバのログが増えていないことに気づくでしょう。
 これをきちんと検知するためにはIDSやIPロギングツールを実行している必要があります。

 まぁ、こんな調子で使っていけばいいわけですが、やはり、こういったオプションだらけのツールは組み合わせが重要だったりします。
 そこで、思いつく限りのスキャン方法を列記してみたいと思います。

 まず、相手ファイアウォールの向こうに相手のイントラネット用WWWサーバがあり、これがIP的にはインターネットから接続可能なはず、と言う場合、これを探したいときにはどうしたらよいでしょうか(相手ネットワークはクラスCだとします)。

 イントラネット用サーバですから、当然インターネット側からは接続できないようになっていると考えた方がよさそうです。
 (そうでなければ、よほどいい加減なサイト運営でしょうから、正面突破してしまえ、って事になりますよねB-) )。
 まず思いつくのはファイアウォールのフィルタリングルールを知るためにACKスキャンをかけてみる、と言う方法がありますね。
 とりあえず、WWWサーバを探すのですし、一部のファイアウォールはポートスキャンを検知すると、そのサイトからのアクセスを遮断したりする場合もありますので、ポート80番を決め打ちしてやるとうまく行くかもしれません。

 nmap -v -sA -p 80 target.com/24

 これならば80番がフィルタされている手法がわかると思います。
 もし、簡単なパケットフィルタだったら、RSTパケットが返ってくると思います。
高機能型ファイアウォールだとICMPで返事が来たり、無視されたりすると思います(ものによってはRSTパケット)。
 これら、返答としてきたパケットをよく見ると、ファイアウォールやOSによって一定の癖があることがわかっていますので、場合によってはどんなファイアウォールを使っているか、すらわかってしまうでしょう。

 つまり、守る側から見ると、ファイアウォールがあり、そのタイプまでばれてしまう、と言うことになります。
 このことから、ファイアウォールはフィルタした場合にはだんまりを決め込む、つまりREJECT(拒否)ではなく、DENY(無視)として設定した方がより安全だ、と言うことになります。

 さて、フィルタされているんだったら、どうしようもないじゃないか、と思われる方もいらっしゃると思うのですが、もし、先に調べたファイアウォールがもし単純なパケットフィルタだったらどうでしょうか?
 簡単なパケットフィルタだったら、フィルタ対象は「SYNパケット」のみです。
 思い出してください。ほかにもいろいろなスキャン方法があることを。
 また、単純なパケットフィルタだったら、フィルタルールに抜け穴があるかもしれません。
 インターナルにおいてあるクライアントからWWWを見たり、FTPでファイルをダウンロードしているとしたら。
 そう、きっと、向こうのフィルタルールは、「相手のポートが20だったら、どんなパケットでも通す」と言う設定になっているでしょう。

 これらのことを考えると、こんなスキャンが思いつきます。

 nmap -v -sF -p 80 target.com/24
 nmap -v -sS -p 80 -g 20 target.com/24

上記パターンのスキャンを実行してみて、もし最初のパターンがかかるのであれば、単純なフィルタリングしか行っていないのでしょう。
また、2番目のパターンがかかるのであれば、フィルタルールが甘いということになりますから、外からコネクションを張ることが可能であると言うことになります。
 つまりイントラネットサーバではなく、インターネットサーバになってしまっている、と言うことになります。
 #あとはやりたい放題・・・・B-)。
 ただし、つなぐのには「こつ」があります。
 ここで紹介することじゃないので各人で「こつ」を探してください。

 次にUDPサービスをチェックする方法を見てみましょう。

 UDPをすべて閉じてしまう、と言う必殺技もありますが、たいていの場合、UDPサービスの代表、DNSが利用できるように、UDPの53番が開いているはずです。
 そこで、このようなスキャンができることになります。

 nmap -v -sU -g 53 -p 161 target.com/24

 このスキャンをしてオープンしていれば、SNMPが動いている事になります。
 SNMPはネットワークのマネージメントに利用されている場合もありますが、多くの場合、「ただ動いているだけ」の様です(笑)。
 そうすると、SNMPとうまくコネクションを張ることができれば、いろいろな情報が得られる、と言うことになります。
 #やり方次第で、このサイト全体を掌握することもできるでしょう。
 #ごちそうさま、と言うことになりますねぇB-)

 このように、フィルタルールを推測するようなスキャンを行うことで、ファイアウォールの中をすり抜けて、内部の情報にアクセスできる可能性を調査することも可能になるのです。
 また、内部サーバを確認されてしまうことで、ユーザのメールなどを利用した攻撃が非常に簡単になる、と言うことも理解してください。
 内部サーバのIPアドレスさえ確認できれば、悪意のあるメールをユーザに送って、ユーザが知らず知らずのうちに攻撃してしまう、と言うメールが非常に作りやすくなります。

 ここまで、どちらかと言えば攻撃者の立場に立った説明をしてきました。
 この攻撃者の立場に立った使い方を「システム管理者が自分の管理するネットワークに試す」事が一番重要なのです。
 これを行うことによって、自分(のサイト)の弱点を見つけることができ、弱点を克服する手段を考えることができるのです。
 しかも、これを「攻撃者が先にやってしまう」前に試さなければなりません。
 弱点を先に知られてしまうことほど悲劇的なことはない、と言うことです。
 これが、この文章を書いた最大の理由なのです。


参考書類:Port scanについて(by Eiji James Yoshida)
     Firewall Penetration Testing Techniques (the same auther)
     man nmap:-)

戻る


突っ込みはしかPまで。スパム、DMおことわり。