Nmapでサーバーをポートスキャン

Nmapとは

Nmapとは、クライアント側から対象サーバーのポートスキャンやOSスキャンなどを実施できるセキュリティスキャナです。100を超えるオプションが用意されており、対象サーバーのミドルウェアのバージョンなどを調査することもできます。今回はポートスキャンに焦点を当てて、Nmapの使い方をご紹介します。

サーバーでポートが空いているかどうかを確認する方法として、対象サーバーにログインし、netstat -anなどのコマンドでポートの開放状況を確認する方法は広く知られています。あるいは、iptables -Lなどでファイアウォールの空き状況を確認する方もいるでしょう。しかし、この方法では、サーバー内部での実行のため、本当にクライアントから見てポートが開放されているのか(何らかの要因:例えばL3スイッチ・ルーター・ファイアウォールなど中間のネットワーク機器によって接続が遮断されていないか)、確認することはできません。

そこで便利なのがNmapです。Nmapは、クライアント側から実行することができ、対象サーバーのポートの空き状況を全てチェックすることができます。

注意:Nmapを自分の管理外のサーバーに対して実行すると、不正アクセス禁止法に抵触する恐れがあります。あくまで自分のサーバーのセキュリティチェックにご活用ください。

Nmapは公式サイトでも配られていますが、Linuxならば標準のパッケージレポジトリに含まれていることが多く、CentOSならば以下のコマンドでインストールできます。

sudo yum install -y nmap

openSUSEならば以下のコマンドでインストールします。

sudo zypper install nmap

Macの場合は、Homebrewでインストールできます。

brew install nmap

Windowsで実行したい場合は、公式サイトからダウンロードしてください。GUIツール版もあります。

Nmapでのポートスキャンの使い方

Nmapでポートスキャンを実行する方法は簡単です。Nmapをインストールしたクライアントマシンから、以下のコマンドを実行します。今回は私の自宅サーバーに対して、クライアントから実行してみます。

nmap www.geek.sc

そうすると、以下の結果が返ってきます。

nmap www.geek.sc

Starting Nmap 5.51 ( http://nmap.org ) at 2013-02-26 00:58 JST
Nmap scan report for www.geek.sc (180.131.119.243)
Host is up (0.021s latency).
rDNS record for 180.131.119.243: 243.119.131.180.tokyo.global.crust-r.net
Not shown: 844 filtered ports, 151 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
443/tcp  open  https
587/tcp  open  submission
1723/tcp open  pptp

Nmap done: 1 IP address (1 host up) scanned in 3.51 seconds

これで、 www.geek.scのサーバーは22番ポート(SSH)、80番ポート(http)、443ポート(https)、587ポート(submission)、1723(VPN)がクライアント側から見て空いているのが分かります。意図しないポートが空いているならば、ポートを塞いでおいたほうがいいでしょう。また、よく攻撃されるポートは、ポート番号を変更するのも手です(特にSSHはできれば22番ポートから変更しておいた方がいいでしょう)

Nmapのその他の使い方

Nmapで対象サーバーのOSのバージョンを知りたい時は、-Oオプションを付けます。今回はクライアントから私の借りているさくらVPSのOSのバージョンを調べてみます(-Oオプションはrootユーザーで実行する必要があります)。

# nmap -O www.testvps.info

Starting Nmap 6.01 ( http://nmap.org ) at 2013-02-26 01:28 JST
Nmap scan report for www.testvps.info (133.242.176.20)
Host is up (0.027s latency).
Not shown: 997 filtered ports
PORT    STATE  SERVICE
22/tcp  open   ssh
80/tcp  open   http
443/tcp closed https
Device type: general purpose
Running (JUST GUESSING): Linux 2.6.X (87%)
OS CPE: cpe:/o:linux:kernel:2.6.39
Aggressive OS guesses: Linux 2.6.39 (87%)
No exact OS matches for host (test conditions non-ideal).

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.46 seconds

OSがLinuxでカーネル2.6を使っている可能性が87%であると出ました。このように、外部からOSのバージョンを調査することも可能です。

ミドルウェアのバージョンを調べる時は、-sVオプションを付けます。今度は自宅サーバーに対して行なってみます。

nmap -O -sV www.geek.sc    

Starting Nmap 5.51 ( http://nmap.org ) at 2013-02-26 11:12 JST
Nmap scan report for www.geek.sc (180.131.119.243)
Host is up (0.021s latency).
rDNS record for 180.131.119.243: 243.119.131.180.tokyo.global.crust-r.net
Not shown: 844 filtered ports, 151 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 6.0 (protocol 1.99)
80/tcp   open  http    nginx 1.3.12
443/tcp  open  http    nginx 1.3.12 
587/tcp  open  smtp    Postfix smtpd
1723/tcp open  pptp    YAMAHA Corporation (Firmware: 45076)

Service Info: Hosts:  geek.sc, NVR500

何と!HTTPがNginxであること、Nginxのバージョン、SMTPがPostfixであること、VPNルーターがYAMAHA製であることも特定されました。さらに最後にはルーターがYAMAHA NVR500であることも特定されています。

セキュリティ対策

最初に注意書きで書かせて頂いたように、Nmapは自分の管理内のサーバーで行うようにしましょう。ただ、このように簡単にポートスキャンやOSのバージョン、ミドルウェアのバージョンを外部から調べられるという点には、日頃から充分に注意する必要があります。

意図しないポートは絶対に閉じておくと同時に、ポート番号を標準から変えたり隠蔽したりするのも手です(にわか対策ではありますが)。また、外部からポートスキャンが行われたら、そのIPをログに落として置くことも可能です。