Nmap (Network Mapper の略) は、ローカルネットワークとリモートネットワークのスキャンを実行できるオープンソースツールです。Nmap は、ネットワークプロトコルの検出、開いているポートのスキャン、リモートマシンで動作しているオペレーティングシステムの検出など、非常に強力な機能を備えています。このツールは、ネットワークデバイスのインベントリー作成、リモートホストの状態の監視、後で参照できるようスキャン結果を保存しておくなどの用途でネットワーク管理者に利用されています。
[ ネットワーキングを始めたばかりの方は、Linux ネットワークキング・チートシートをご覧ください ]
Nmap スイートには、高度なグラフィカル・ユーザー・インタフェースと結果ビューア (Zenmap)、データ転送、リダイレクト、デバッグのための柔軟なツール (Ncat)、スキャン結果を比較するためのユーティリティ (Ndiff)、パケット生成および応答分析ツール (Nping)が含まれています。
Nmap を使用する理由
Nmap は無料であるだけでなく、非常に柔軟で可搬性に優れ、ドキュメントも充実しており、使いやすいツールです。これから Nmap のインストール方法、使い方、そして最も重要な、ネットワークの詳細情報を取得する方法について詳しく説明していきます。
Nmap のインストール
Red Hat Enterprise Linux 8 または Fedora で Nmap をインストールするには、次のコマンドを実行します。
# dnf -y install nmapRed Hat Enterprise Linux 7 以降をお使いの場合は、yum ではなく dnf を使用してください。Nmap をインストールした後、nmap コマンドを引数なしで実行すると、すべてのオプションが表示されます。また、man nmap を実行して Nmap の man ページを見ておくとよいでしょう。
Nmap の使用
ローカルネットワークが 192.168.0.0/24 で、このネットワーク上でスキャンを実行するとします。ネットワークアドレス以外の引数を指定せずにスキャンを実行すると、以下の結果が得られます。
# nmap 192.168.0.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-06 21:00 CET
Nmap scan report for Archer.lan (192.168.0.1)
Host is up (0.0046s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
1900/tcp open upnp
20005/tcp open btx
MAC Address: 50:ff:BF:ff:ff:AC (Tp-link Technologies)
Nmap scan report for Lyric-1111C2.lan (192.168.0.101)
Host is up (0.013s latency).
Not shown: 999 closed ports
PORT STATE SERVICE0
80/tcp open http
MAC Address: B8:dd:A0:dd:dd:C2 (Resideo)
Multiple networks can be scanned at once. For example
nmap 192.168.0.0/24 10.80.0.0/24複数のネットワークを一度にスキャンすることもできます。以下に例を示します。
# nmap 192.168.0.0/24 10.80.0.0/24ポートが開いているかどうかを確認せずにネットワーク内のマシンのクイックスキャンを実行したい場合は、次のコマンドを実行します。
# nmap -sn 192.168.0.0/24上記のコマンドの出力は以下のようになります。
# nmap -sn 192.168.0.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-06 21:24 CET
Nmap scan report for Archer.lan (192.168.0.1)
Host is up (0.016s latency).
MAC Address: 50:C7:FF:FF:15:FF (Tp-link Technologies)
Nmap scan report for Lyric-1111C2.lan (192.168.0.101)
Host is up (0.96s latency).
MAC Address: B8:FF:FF:11:FF:C2 (Resideo)
MAC Address: 88:DD:EA:DD:CE:37 (Texas Instruments)
Nmap scan report for SoundTouch-Kitchen.lan (192.168.0.160)
Host is up (0.39s latency).
MAC Address: 5C:DD:DD:FF:FF:B5 (Texas Instruments)
Nmap scan report for 192.168.0.181
Host is up (0.60s latency).
MAC Address: 40:DD:DD:8F:FF:F5 (Asustek Computer)
Nmap scan report for TL-WPA4220.lan (192.168.0.225)
Host is up (0.61s latency).
MAC Address: 50:DD:FF:AA:DD:BA (Tp-link Technologies)
Nmap scan report for f3d0r4.lan (192.168.0.165)
Host is up.
Nmap done: 256 IP addresses (7 hosts up) scanned in 9.11 secondsなお、-sn は Nmap の以前のバージョンでは -sP と呼ばれていました。-sP の使用は下位互換性があり、最近のバージョンの Nmap でも動作するはずです。
[ 無料の e ブック:成功するための Linux 環境管理 ]
Nmap の man ページはわかりやすく書かれており、多くの例が掲載されていますが、 man ページには記載されていない事柄もあります。たとえば、上記の出力から IP アドレスをファイルに保存したい場合はどうすればよいでしょうか。これは、Nmap の man ページには記載されていない具体的な用法です。出力を自分で解析し、IP アドレスのみを抽出する必要があります。
以下に例を示します。
# nmap -sn 192.168.0.0/24 | awk '/Nmap scan/{gsub(/[()]/,"",$NF); print $NF > "nmap_scanned_ips"}'Nmap ではスキャン出力をさまざまな形式で保存することができます。
以下に例を示します。
-oN/-oX/-oS/-oG
なので、次のように実行すると、
# nmap -sn 192.168.0.0/24 -oG nmap_output以下の出力が生成されます。
# cat nmap_output
# Nmap 7.80 scan initiated Fri Mar 6 22:01:57 2020 as: nmap -sn -oG nmap_output 192.168.0.0/24
Host: 192.168.0.1 (Archer.lan) Status: Up
Host: 192.168.0.101 (Lyric-1111C2.lan) Status: Up
Host: 192.168.0.151 (SoundTouch-VW-benee.lan) Status: Up
Host: 192.168.0.160 (SoundTouch-VW-keuken.lan) Status: Up
Host: 192.168.0.181 () Status: Up
Host: 192.168.0.225 (TL-WPA4220.lan) Status: Up
Host: 192.168.0.165 (f3d0r4.lan) Status: Up
# Nmap done at Fri Mar 6 22:02:06 2020 -- 256 IP addresses (7 hosts up) scanned in 9.45 seconds特定のポートのスキャン
Nmap では、特定のターゲット上の特定のポートをスキャンすることができます。ポート 22 と 443 (デフォルトでは TCP プロトコルを使用) の状態を確認したい場合は、次のコマンドを実行します。
# nmap -sV -p 22,443 192.168.0.0/24-sV の機能をよく知らない場合は、次のコマンドを実行してみてください。
# nmap | grep -- -sV上記のコマンドは、ポートの状態 (開いている、閉じている、フィルタリングされているなど) に関係なくポートを表示します。多くの場合、確認したいのは開いているポートであるため、–open フラグを追加します。上記のコマンドを少し変更して、以下を実行します。
# nmap -sV -p 22,443 192.168.0.0/24 –openポートは、コンマを使わずに範囲で指定することもできます。これはより柔軟な方法で、判読しやすくなります。以下に例を示します。
# nmap -p 54-111 192.168.0.0/24[チートシート:古い Linux コマンドとそれを置き換える最新のコマンド ]
高度な Nmap スキャン
ここまで Nmap の基本とその機能について見てきました。次は、ターゲットのスキャン、ターゲットからの詳細情報の取得、パケットトレースの使用に関する、より高度なアプローチについて見ていきましょう。
単一 IP アドレス上のパケットのトレース
この記事を書いている現在、私は SSH 経由でサーバーに接続しています。Nmap を使ったパケットトレースの仕組みと、その出力がどのようなものになるかをお見せするために、以下の Nmap 構文を使用して、以下の出力を生成します。
# nmap -vv -n -sn -PE -T4 --packet-trace 192.168.2.3
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-06 23:14 CET
Initiating Ping Scan at 23:14
Scanning 192.168.2.3 [1 port]
SENT (0.0282s) ICMP [192.168.0.165 > 192.168.2.3 Echo request (type=8/code=0) id=8524 seq=0] IP [ttl=43 id=25141 iplen=28 ]
RCVD (0.0336s) ICMP [192.168.2.3 > 192.168.0.165 Echo reply (type=0/code=0) id=8524 seq=0] IP [ttl=63 id=27840 iplen=28 ]
Completed Ping Scan at 23:14, 0.03s elapsed (1 total hosts)
Nmap scan report for 192.168.2.3
Host is up, received echo-reply ttl 63 (0.0055s latency).
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
Raw packets sent: 1 (28B) | Rcvd: 1 (28B)上記の各フラグの意味は以下のとおりです。
-vv(詳細度を上げる)-n(DNS 解決を行わない:これによりスキャン速度が上がる)-sn(ポートスキャンを行わない)-PE(ICMP エコー要求クエリを使用する:この結果が上記の出力に表示されている)-T4(TCP ポートの動的スキャン遅延が 10 ミリ秒を超えることを禁止する:man nmapを参照してください)--packet-trace(送受信パケットをトレースする)
再帰 DNS プロキシを使用したターゲットのステルススキャン
Nmap はデフォルトで、応答可能なホストに対して rDNS (逆引き DNS) 解決を実行します。特定のネットワークに関する情報を匿名性を維持したまま収集できるかどうか確認してみましょう。匿名性を維持するのは、再帰クエリを実行するためにパブリック DNS サーバー (8.8.4.4 と 8.8.8.8) を使用するからです。
[ ネットワークが制御不能になっているのでしたら、Red Hat の無料 e ブック「あらゆる人のためのネットワーク自動化」をご覧ください ]
まず、Google のパブリック DNS サーバーを使用して redhat.com を解決すると、以下のようになります。
# host redhat.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:
redhat.com has address 209.132.183.105
redhat.com mail is handled by 10 us-smtp-inbound-2.mimecast.com.
redhat.com mail is handled by 10 us-smtp-inbound-1.mimecast.com.次に、IP アドレス 209.132.183.105 に対してリストのステルススキャン -sL を実行してみましょう。
# nmap --dns-servers 8.8.4.4,8.8.8.8 -sL 209.132.183.105/24
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-07 00:22 CET
Nmap scan report for network (209.132.183.0)
Nmap scan report for elvis.redhat.com (209.132.183.1)
Nmap scan report for ns2.redhat.com (209.132.183.2)
Nmap scan report for ovpn-phx2.redhat.com (209.132.183.3)
Nmap scan report for mimecast-mx01.redhat.com (209.132.183.4)
Nmap scan report for selfservice.redhat.com (209.132.183.5)
Nmap scan report for unused (209.132.183.6)
Nmap scan report for unused (209.132.183.7)
Nmap scan report for siperimeter.redhat.com (209.132.183.8)
< –----- >
< –----- >
< –----- >ほんのいくつかの簡単なテクニックを使うだけで、特定のネットワークに関する多くの情報を得ることができます。
NSE スクリプト
前述の通り、Nmap には多くの高度な機能が搭載されており、その 1 つが NSE (Nmap Scripting Engine) スクリプトです。Nmap で NSE スクリプトを使用すると、さまざまなホストをスキャンし、ホスト上で動作しているサービスの脆弱性を発見したり、これらのサービスに対してブルートフォース攻撃を仕掛けてログインしたりすることが可能になります。
NSE スクリプト構文の使い方は次のとおりです。
# nmap --script="name_of_script" --script-args="argument=arg" targetこの時点でおそらく、これらの NSE スクリプトはどこにあるのか、どのスクリプトがどの引数を使うのかをどうやって確認すればいいのか、疑問に思われているでしょう。まずは man nmap を実行してみてください。以下のコマンドで、目的のセクションに直接アクセスすることもできます。
# PAGER='less "+/NMAP SCRIPTING ENGINE"' man nmapNmap で使える NSE スクリプトはこちらにあります。
/usr/share/nmap/scripts/
次のコマンドを実行して NSE スクリプトを見つけることもできます。
# dnf -y install mlocate ; updatedb ; locate nmap/scriptsNSE スクリプトの場所がわかったところで、これらのスクリプトを使用して、Web サーバーを実行しているターゲットに関する情報を取得する方法を見てみましょう。
WAF が Web サイトを保護しているかどうかを確認する
Web アプリケーション・ファイアウォール (WAF) は、SQL インジェクション、クロスサイト・スクリプティング、不正な HTTP パケットなどから Web サイトを保護するために特別に設計されています。Nmap を使用すると、Web サイトがこのような WAF によって保護されているかどうかを検出できます。以下に、NSE スクリプトの 1 つとその引数の使い方を示します。
# nmap -p443 --script http-waf-detect --script-args="http-waf-detect.aggro,http-waf-detect.detectBodyChanges" www.slimmer.ai
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-09 22:38 CET
Nmap scan report for www.slimmer.ai (172.104.131.188)
Host is up (0.023s latency).
rDNS record for 172.104.131.188: li1647-188.members.linode.com
PORT STATE SERVICE
443/tcp open https
| http-waf-detect: IDS/IPS/WAF detected:
|_www.slimmer.ai:443/?p4yl04d=id;uname%20-a
Nmap done: 1 IP address (1 host up) scanned in 1.37 seconds上記のように、Web アプリケーション・ファイアウォールはターゲットの Web サイトを保護しています。
その他の NSE スクリプト
繰り返しになりますが、Nmap はシステム管理者が環境のインベントリーを作成し、ネットワークの脆弱性を検出することで、侵入者からシステムを保護するためによく使用されます。一方、侵入者も同じようにしてリモートシステムを探索し、そのシステムに関する可能な限り多くの情報を収集しようとします。
権限のない人物がネットワークをスキャンし、いくつかの開いているポートやサービスを発見したとしましょう。その人物は Nmap で NSE スクリプトを使用し、これらのサービスが脆弱かどうかを確認するでしょう。その場合、次のようなことが起こります。
# nmap -Pn -sV --script=vulners 37.xx.xx.xx
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-09 22:41 CET
Nmap scan report for some.domain.nl (37.xx.xx.xx)
Host is up (0.016s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| vulners:
| cpe:/a:openbsd:openssh:7.4:
| CVE-2018-15919 5.0 https://vulners.com/cve/CVE-2018-15919
|_ CVE-2017-15906 5.0 https://vulners.com/cve/CVE-2017-15906
25/tcp open smtp Postfix smtpd
Service Info: Host: some.domain.nlService detection performed. Please report any incorrect results at https://nmap.org/submit/
Nmap done: 1 IP address (1 host up) scanned in 18.20 secondsリモートシステムで OpenSSH 7.4 が実行されていることがわかります。Nmap は公開されている脆弱性データベースを照会し、既知の CVE を検出しました。
まとめ
Nmap はシステムインベントリーとポートスキャンのための非常に強力なツールであり、良い目的にも悪い目的にも使用できます。どう使うかは使用者次第です。Nmap を習得する上で最良の方法は、man ページを読み、man ページに示されている例を使用し、NSE スクリプトを試してみることです。また、Zenmap も試してみてください。ポートスキャンとそれを支える科学的な仕組みについて詳しく知りたい場合は、Nmap のドキュメントを参照してください。
執筆者紹介
Valentin is a system engineer with more than six years of experience in networking, storage, high-performing clusters, and automation.
He is involved in different open source projects like bash, Fedora, Ceph, FreeBSD and is a member of Red Hat Accelerators.
チャンネル別に見る
自動化
テクノロジー、チームおよび環境に関する IT 自動化の最新情報
AI (人工知能)
お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート
オープン・ハイブリッドクラウド
ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。
セキュリティ
環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報
エッジコンピューティング
エッジでの運用を単純化するプラットフォームのアップデート
インフラストラクチャ
世界有数のエンタープライズ向け Linux プラットフォームの最新情報
アプリケーション
アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細
仮想化
オンプレミスまたは複数クラウドでのワークロードに対応するエンタープライズ仮想化の将来についてご覧ください