はじめに
この実験では、サイバーセキュリティ分野でネットワーク探索やセキュリティ監査によく使われる強力なネットワークスキャンツールである Nmap の基本を学びます。Nmap を使ってネットワークをスキャンし、開いているポートを発見し、実行中のサービスを特定する方法を探ります。
これらの技術を習得することで、ネットワーク管理とセキュリティ評価に必要なスキルを身につけます。この実践的な経験は、実世界のシナリオに適用できる実用的な知識を提供し、ネットワークインフラストラクチャとセキュリティに関する考慮事項を理解するのに役立ちます。
Nmap の基本を理解する
Nmap(Network Mapper の略)は、ネットワーク探索とセキュリティ監査において重要な役割を果たすオープンソースのツールです。サイバーセキュリティの世界では、生の IP パケットを使って情報を収集する探偵のような存在です。Nmap を使うと、ネットワーク上に存在するホスト、それらのホストが提供しているサービス、実行中のオペレーティングシステム、その他の重要な特性を把握することができます。
では、Nmap の基本から始めましょう。まず、ターミナルを開く必要があります。ターミナルは、コマンドを入力してシステムと対話するためのコマンドセンターのようなものです。タスクバーのターミナルアイコンをクリックするか、Ctrl+Alt+T を押すことで開くことができます。
ターミナルが開いたら、プロジェクトディレクトリにいることを確認する必要があります。プロジェクトディレクトリは、この実験に関連するすべてのファイルと操作が行われる特定のフォルダです。プロジェクトディレクトリに移動するには、次のコマンドを使用します。
cd /home/labex/project
これで適切な場所にいるので、システムにインストールされている Nmap のバージョンを確認しましょう。バージョンを知ることは重要です。なぜなら、異なるバージョンでは異なる機能や動作を持つ場合があるからです。バージョンを確認するには、次のコマンドを実行します。
nmap --version
コマンドを実行した後、次のような出力が表示されるはずです。この出力には、システムにインストールされている Nmap のバージョンと、コンパイルに使用されたライブラリや利用可能な nsock エンジンに関するその他の情報が表示されます。
Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f libpcre-8.39 libpcap-1.9.1 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select
では、最初の基本的な Nmap スキャンを実行しましょう。ローカルホストをスキャンします。これは、自分自身のシステムの自己チェックのようなものです。このスキャンにより、システム上で開いているポートを確認することができます。ポートは、建物のドアのようなもので、異なるサービスが通信に異なるポートを使用します。次のコマンドを実行します。
nmap localhost
このコマンドは、ローカルホスト上の最も一般的な 1000 個のポートをスキャンします。コマンドを実行した後、次のような出力が表示されるはずです。この出力は、システム上で開いているポートを教えてくれます。たとえば、ポート 22 は通常、SSH(Secure Shell)に使用されます。SSH は、リモートコンピュータに安全にアクセスするためのプロトコルであり、ポート 80 は HTTP(ウェブサービス)に使用されます。システム上で実行されているサービスに応じて、出力に表示される開いているポートが異なる場合があることに注意してください。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:45 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
次の演習では、スキャンするサービスが必要です。万能なネットワーキングユーティリティである netcat を使用して、簡単なサービスを作成します。このサービスは、ポート 8888 で待機します。次のコマンドを実行します。
nc -lk 8888 &
このコマンドを分解してみましょう。-l オプションは、netcat に着信接続を待機させることを指示します。-k オプションは、クライアントが切断された後も netcat が待機し続けるようにします。末尾の & は、コマンドをバックグラウンドで実行するため、ターミナルを他のタスクに引き続き使用することができます。
サービスが実行されていることを確認するには、次のコマンドを使用できます。
netstat -tuln | grep 8888
このコマンドは、すべてのネットワーク接続をリストし、出力をフィルタリングしてポート 8888 に関連する情報のみを表示します。サービスが実行されている場合、次のような出力が表示されるはずです。
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
この出力は、モックサービスが実行されており、ポート 8888 で待機していることを確認します。
Nmap のポートスキャン技術を探索する
Nmap はサイバーセキュリティ分野で強力なツールであり、特にポートスキャンにおいて重要です。ポートスキャンは、ターゲットシステム上でどのポートが開いているか、それらのポートでどのようなサービスが実行されているかを発見するための方法です。様々な種類のポートスキャン技術が存在し、それぞれ独自の利点と特定の使用シナリオがあります。このステップでは、モックサービスをスキャンすることで、これらの技術のいくつかを探索します。
まず、ポート 8888 を対象とした基本的な TCP コネクトスキャンを実行しましょう。TCP コネクトスキャンは、ポートが開いているかどうかを確認する簡単な方法です。ターゲットポートに完全な TCP 接続を確立しようとすることで機能します。接続が成功した場合、そのポートは開いているとみなされます。
nmap -p 8888 localhost
このコマンドでは、-p オプションを使用してスキャンするポートを指定しています。ここでは、localhost(現在のマシン)のポート 8888 をスキャンするよう Nmap に指示しています。このコマンドを実行した後、次のような出力が表示されるはずです。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:50 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
この出力は、ポート 8888 が開いていることを確認しています。Nmap はまた、内部データベースに基づいてこのポートに関連付けられたサービス名も特定しています。
では、SYN スキャンを試してみましょう。SYN スキャンは、TCP コネクトスキャンに比べてより隠密なアプローチです。完全な TCP 接続を完了しないため、侵入検知システムに検知されにくくなります。
sudo nmap -sS -p 8888 localhost
-sS オプションは、SYN スキャンを実行することを指定しています。このタイプのスキャンは、生のネットワークパケットを送信する低レベルの操作を伴うため、ルート権限が必要です。そのため、sudo コマンドを使用しています。出力は前のスキャンと似ているはずです。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:55 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
次に、UDP スキャンを試してみましょう。UDP(User Datagram Protocol)は、TCP とは異なるタイプのネットワークプロトコルです。TCP が信頼性の高い接続指向型サービスを提供するのに対し、UDP は非接続型プロトコルです。UDP スキャンを使用して、ポート 8888 が UDP トラフィックに対して開いているかどうかを確認します。
sudo nmap -sU -p 8888 localhost
-sU オプションは、UDP スキャンを指定しています。UDP スキャンは、UDP には TCP のような組み込みの確認機構がないため、Nmap がポートが開いているか閉じているかを判断するのに長い時間がかかるため、TCP スキャンよりも時間がかかる場合があります。出力は次のようになるかもしれません。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE
8888/udp closed sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
UDP ポートが閉じていると表示されていることに注意してください。これは、netcat サービスが TCP 接続を待機しているため、予想される結果です。
最後に、サービスバージョン検出スキャンを実行しましょう。このタイプのスキャンは、特定のポートで実行されている具体的なサービスとそのバージョンを特定するのに役立ちます。
nmap -sV -p 8888 localhost
-sV オプションは、Nmap にサービス/バージョン検出を実行するよう指示します。開いているポートに特定のプローブを送信し、応答を分析してサービスとそのバージョンを判断しようとします。出力は次のようになるかもしれません。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:05 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE VERSION
8888/tcp open http Apache httpd
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap done: 1 IP address (1 host up) scanned in 6.51 seconds
バージョン検出は、netcat サービスを本物のアプリケーションとして正確に識別できない場合がありますが、Nmap が開いているポートで何が実行されているかを判断しようとする方法を示しています。
調査結果を後で参照するためにファイルに保存しましょう。スキャン結果を保存することで、後でレビューしたり、他の人と共有したり、さらなる分析に使用したりすることができます。
nmap -p 8888 localhost > /home/labex/project/nmap_scan_results.txt
このコマンドでは、> 記号を使用して、Nmap スキャンの出力を /home/labex/project ディレクトリにある nmap_scan_results.txt という名前のファイルにリダイレクトしています。
保存された結果を次のコマンドで表示できます。
cat /home/labex/project/nmap_scan_results.txt
cat コマンドは、ファイルの内容を表示するために使用されます。
以上で、Nmap の様々なポートスキャン技術の探索を終了します。
タイミングとパフォーマンステンプレートの理解
Nmap スキャンを行う際、タイミングは重要な役割を果たします。スキャンが過度に攻撃的である場合、侵入検知システム(IDS: Intrusion Detection System)に検知される可能性があります。IDS は、ネットワークトラフィックを監視して疑わしい活動を検出するセキュリティツールです。攻撃的なスキャンは、ターゲットシステムを圧倒し、誤動作や応答不能にすることもあります。一方で、スキャンが遅すぎると、完了までに非現実的な時間がかかり、特に多数のターゲットをスキャンする場合には非効率的です。
Nmap は、スキャンの速度と攻撃性を制御できるタイミングテンプレートを提供しています。これらのテンプレートは、T0(Paranoid: 極度に慎重)から T5(Insane: 非常に攻撃的)までの範囲です。数字が高いほど、スキャンは速く、攻撃的になります。
以下はタイミングテンプレートの詳細な説明です。
-T0(Paranoid): これは非常に遅いタイミングテンプレートです。主に侵入検知システムを回避する場合に使用されます。リクエストを非常にゆっくりと送信することで、IDS でアラームが発生する可能性が低くなります。-T1(Sneaky): 極度に慎重なテンプレートと同様に、遅く、IDS 回避に使用されます。極度に慎重なテンプレートよりも少し速いペースでリクエストを送信しますが、依然として検知を回避するのに十分な速度です。-T2(Polite): このテンプレートは、ターゲットマシンの帯域幅とリソースの使用を減らすためにスキャンを低速化します。ターゲットシステムに何らかの混乱を引き起こしたくない場合に適しています。-T3(Normal): これは Nmap のデフォルトのタイミングテンプレートです。速度と信頼性のバランスを取り、ほとんどの汎用スキャンに適しています。-T4(Aggressive): このテンプレートは、適度に高速で信頼性の高いネットワークで作業していることを前提に、スキャンを高速化します。リクエストをより迅速に送信することで、全体のスキャン時間を短縮できます。-T5(Insane): これは非常に攻撃的なタイミングテンプレートです。非常に高速なネットワークを持っていることを前提としています。非常に高いレートでリクエストを送信するため、スキャン時間を大幅に短縮できますが、検知されるリスクも増加します。
まず、デフォルトのタイミングテンプレート(T3)でスキャンを試してみましょう。time コマンドを使用して、スキャンにかかる時間を測定します。time コマンドは、コマンドの実行にかかる実時間、ユーザ時間、システム時間を表示する便利なツールです。
time nmap -T3 -p 8888 localhost
このコマンドを実行した後、次のような出力が表示されるはずです。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:10 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
real 0m0.115s
user 0m0.033s
sys 0m0.015s
では、より攻撃的なタイミングテンプレート(T4)を試してみましょう。同じ time コマンドを使用して、スキャン時間を測定します。
time nmap -T4 -p 8888 localhost
スキャンが少し早く完了することに気づくかもしれません。以下は出力の例です。
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:15 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
real 0m0.105s
user 0m0.032s
sys 0m0.014s
スキャン時間のより顕著な違いを確認するために、T3 と T4 の両方のテンプレートですべてのポートをスキャンしてみましょう。
time nmap -T3 -p- --max-retries 0 localhost | grep "open" > /dev/null
-p- オプションは、Nmap にターゲットシステムのすべての 65535 個のポートをスキャンするよう指示します。--max - retries 0 オプションは、各ポートスキャンのリトライ回数を減らし、スキャンを高速化するのに役立ちます。出力を grep にリダイレクトして、「open」という単語を含む行のみをフィルタリングし、結果を /dev/null にリダイレクトすることで、スキャンのタイミングに集中できます。
time nmap -T4 -p- --max-retries 0 localhost | grep "open" > /dev/null
これらの包括的なスキャンでは、スキャン時間により大きな違いが見られるはずです。
では、元の実験で要求されているように、隠密なスキャン結果をファイルに保存しましょう。速度と信頼性のバランスを取るために、T4 タイミングテンプレートを使用します。
nmap -T4 -p 8888 localhost > /home/labex/project/nmap_stealthy_scan.txt
保存された結果は、cat コマンドを使用して表示できます。
cat /home/labex/project/nmap_stealthy_scan.txt
T4 タイミングテンプレートは、速度と信頼性のバランスが取れているため、ほとんどのシナリオで適しています。セキュリティ評価を行う際には、ネットワーク速度、ターゲットシステムの敏感度、検知されるリスクなど、特定の要件と制約に基づいてタイミングテンプレートを調整することが重要です。
出力形式とスキャン結果の分析
Nmap は複数の出力形式を提供しており、様々な目的に非常に役立ちます。たとえば、スキャン結果を記録するためのドキュメント作成、さらなる詳細分析、または他のセキュリティツールとの統合に使用できます。このステップでは、これらの出力形式を詳しく見て、スキャン結果を効果的に分析する方法を学びます。
Nmap は以下の主な出力形式をサポートしています。
- 通常出力(デフォルト): これは人間が読みやすいテキスト形式です。スキャン結果をレポートのように一目で理解しやすい形で表示します。
- XML 出力 (
-oX): XML は構造化された形式です。データを階層的かつ整理された方法で配置するため、プログラムが解析および処理するのに非常に便利です。 - Greppable 出力 (
-oG): この形式は、grepや他のテキスト処理ユーティリティを使用して簡単に解析できるように設計されています。関連情報を抽出するのが簡単な特定の構造を持っています。 - 全形式 (
-oA): このオプションを使用すると、Nmap はスキャン結果を通常、XML、および Greppable 形式で同時に保存します。異なるニーズに対応するためにすべてのタイプの出力を持ちたい場合に便利です。
これらの形式を順番に試してみましょう。
まず、通常形式でスキャン結果を保存します。次のコマンドは、localhost のポート 8888 をスキャンし、結果をテキストファイルに保存します。
nmap -p 8888 localhost -oN /home/labex/project/normal_output.txt
次に、XML 形式でスキャン結果を保存します。このコマンドは、localhost のポート 8888 で同じスキャンを実行し、結果を XML ファイルに保存します。
nmap -p 8888 localhost -oX /home/labex/project/xml_output.xml
次に、Greppable 形式でスキャン結果を保存します。以下のコマンドは、localhost のポート 8888 をスキャンし、結果を grep で簡単に解析できるファイルに保存します。
nmap -p 8888 localhost -oG /home/labex/project/grep_output.txt
最後に、全形式でスキャン結果を保存します。次のコマンドは、localhost のポート 8888 で同じスキャンを行い、3 つの異なる形式のファイルを作成します。
nmap -p 8888 localhost -oA /home/labex/project/all_formats
これにより、all_formats.nmap、all_formats.xml、および all_formats.gnmap の 3 つのファイルが作成されます。
では、これらのファイルをそれぞれ調べて、形式の違いを理解しましょう。
通常出力を表示するには、cat コマンドを使用します。
cat /home/labex/project/normal_output.txt
人間が読みやすい標準的な Nmap 出力が表示されるはずです。以下はその例です。
## Nmap 7.80 scan initiated Mon Oct 30 16:45:00 2023 as: nmap -p 8888 -oN /home/labex/project/normal_output.txt localhost
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
## Nmap done at Mon Oct 30 16:45:00 2023 -- 1 IP address (1 host up) scanned in 0.04 seconds
XML 出力を表示するにも、cat コマンドを使用します。
cat /home/labex/project/xml_output.xml
この形式は、プログラムが解析しやすいように構造化されています。以下は XML 出力の例です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<nmaprun scanner="nmap" args="nmap -p 8888 -oX /home/labex/project/xml_output.xml localhost" start="1698684307" startstr="Mon Oct 30 16:45:07 2023" version="7.80" xmloutputversion="1.04">
<scaninfo type="connect" protocol="tcp" numservices="1" services="8888"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1698684307" endtime="1698684307"><status state="up" reason="conn-refused" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="user"/>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="8888"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="sun-answerbook" method="table" conf="3"/></port>
</ports>
<times srtt="100" rttvar="5000" to="100000"/>
</host>
<runstats><finished time="1698684307" timestr="Mon Oct 30 16:45:07 2023" elapsed="0.04" summary="Nmap done at Mon Oct 30 16:45:07 2023; 1 IP address (1 host up) scanned in 0.04 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>
Greppable 出力を表示するには、再び cat コマンドを使用します。
cat /home/labex/project/grep_output.txt
この形式は、grep のようなツールで簡単に解析できるように設計されています。以下は Greppable 出力の例です。
## Nmap 7.80 scan initiated Mon Oct 30 16:45:15 2023 as: nmap -p 8888 -oG /home/labex/project/grep_output.txt localhost
Host: 127.0.0.1 (localhost) Status: Up
Host: 127.0.0.1 (localhost) Ports: 8888/open/tcp//sun-answerbook///
## Nmap done at Mon Oct 30 16:45:15 2023 -- 1 IP address (1 host up) scanned in 0.04 seconds
Greppable 出力から特定の情報を抽出するために grep を使用する練習をしましょう。次のコマンドは、開いているポートが記載されたすべての行を表示します。
grep "open" /home/labex/project/grep_output.txt
出力は次のようになるはずです。
Host: 127.0.0.1 (localhost) Ports: 8888/open/tcp//sun-answerbook///
より複雑なフィルタも使用できます。次のコマンドは、開いているポートのポート番号のみを抽出します。
grep -E "Ports:.*open" /home/labex/project/grep_output.txt | cut -d':' -f3 | cut -d'/' -f1
出力は次のようになります。
8888
これらの異なる出力形式により、Nmap のスキャン結果を他のツールやワークフローと統合できるため、セキュリティツールキットに非常に便利な追加要素となります。
まとめ
この実験では、強力なネットワークスキャンおよびセキュリティ評価ツールである Nmap の基本を学びました。まず、ホストのスキャンや開いているポートの識別など、Nmap の基本的な使い方を習得しました。その後、TCP connect スキャン、SYN スキャン、UDP スキャンなど、それぞれ独自の利点と使用例を持つ様々なポートスキャン技術を探索しました。
また、タイミングテンプレートを使用して、スキャン速度と隠密性のバランスを取る練習も行いました。最後に、スキャン結果を異なる形式で保存し、テキスト処理ツールで分析する方法を学びました。これらのスキルは、ネットワーク探索、セキュリティ評価、および脆弱性識別の基礎を形成します。Nmap は、ネットワーク管理者、セキュリティ専門家、およびエシカルハッカーにとって重要なツールです。これらのツールを責任を持って、倫理的に使用し、未知のネットワークやシステムをスキャンする前に常に適切な許可を得ることを忘れないでください。



