読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

nmapの使い方

前回ポートの開放について書いたので、今回はその続きとしてnmap の使い方について書いていこうと思います。 まずはインストールから $ sudo aptitude install nmap 知っている人も多いですがnmap はポートスキャニングツールです。 まずは簡単な使い方の例を示し、後半では各オプションの解説をします。ともにほぼソース先の引用です。 ◆LAN内でpingが通るマシンを探す。 LAN内(192.168.1.0/24)にpingスイープを実行してみる。pingが通るか調べるオプションは「-sP」です。 $ nmap -sP 192.168.1.0/24 Starting Nmap 4.20 ( http://insecure.org ) at 2008-03-06 21:06 JST Host 192.168.1.1 appears to be up. Host mikuru (192.168.1.50) appears to be up. Host haruhi (192.168.1.100) appears to be up. Host server (192.168.1.120) appears to be up. Host nagato (192.168.1.150) appears to be up. Nmap finished: 256 IP addresses (5 hosts up) scanned in 2.255 seconds 今回は5ホストみつかりましたね。では続いてこのホストのうち一つに注目して進めていきます。 ◆マシンのどのポートが開いているか調べる $ sudo nmap -sS 192.168.1.120 -p 21-3306 Starting Nmap 4.20 ( http://insecure.org ) at 2008-03-06 21:12 JST Interesting ports on server (192.168.1.120): Not shown: 3276 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 80/tcp open http 110/tcp open pop3 139/tcp open netbios-ssn 143/tcp open imap 443/tcp open https 445/tcp open microsoft-ds 3306/tcp open mysql MAC Address: 00:01:80:**:**:** (AOpen) Nmap finished: 1 IP address (1 host up) scanned in 0.317 seconds いくつかのサービスがポートを使用しているのがわかりますね。 ここでは、21番~3306番までの範囲で調べています。これは「-p」オプションで指定できます。また「-sS」 のオプションを付けることによってステルススキャンを実施しています。注意としてこのオプションを付けて実施するにはroot権限が必要となります。 ◆開いていたポートで稼動しているサービスをより詳細に調査 $ sudo nmap -sS -sV 192.168.1.120 -P0 -p 21,22,80,110,143,3306 Starting Nmap 4.20 ( http://insecure.org ) at 2008-03-06 21:15 JST Interesting ports on server (192.168.1.120): PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd or WU-FTPD 22/tcp open ssh OpenSSH 4.3 (protocol 2.0) 80/tcp open http Apache httpd 110/tcp open pop3 Dovecot pop3d 143/tcp open imap Dovecot imapd 3306/tcp open mysql MySQL (unauthorized) MAC Address: 00:01:80:**:**:** (AOpen) Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap finished: 1 IP address (1 host up) scanned in 6.278 seconds オプション -sV を付けることによって、どのようなサービスが稼動しているかチェックができる。-P0 はホストの発見を省略するオプションです。pingを打ちません。 今回は21,22,80,110,143,3306ポートをピックアップして指定し、それらに対して調査を実施しています。各サービスでどのようなアプリケーションを使っているかがわかります。 ◆スキャンタイプオプション解説 スキャンタイプは以下のものがあります。     -sT(TCPフルコネクトスキャン)     -sU(UDPスキャン)     -sP(pingスキャン)     -sS(TCPハーフコネクトスキャン、ステルススキャン)     -sF(FINスキャン)     -sX(Xmasスキャン)     -sN(Nullスキャン)     -sR(RPCスキャン)     -I(Identdスキャン)     -sA(ACKスキャン)     -sW(Windowスキャン、Windowsじゃないですよ、笑)     -b(FTPバウンススキャン) TCPフルコネクトスキャン 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バウンススキャン サーバーを(いってみれば)踏み台にしてスキャンを行います。まぁ、できなくなっているFTPサーバーもありますし、あまり褒めた方法じゃなさそうです。 ◆その他オプションの解説 -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番)に送ってあげればよい、と言うことになりますね。 -P0、-PTオプションをつけていない場合には、サーバが動いているかどうかのチェックはping+ACKパケット(80番に対して)の2つでチェックします。 -PS ACKパケットによる動作チェックを行わず、SYNパケットによるチェックを行います。 -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でポートスキャン 清く、正しい、nmapの使い方