はじめに
この実験では、ネットワーク探索とセキュリティ監査に欠かせないツールである Nmap について学びます。Nmap はネットワーク管理者やセキュリティ専門家に広く使用されており、開いているポートの特定、実行中のサービスの検出、潜在的なネットワーク脆弱性の発見に役立ちます。
この実験では、基本的な Nmap スキャン技術についても学びます。スキャンを通じてネットワーク構成を理解することは、基本的なサイバーセキュリティスキルです。最後まで学習することで、基本的な Nmap スキャンを実行し、その出力を解釈できるようになり、高度なネットワークセキュリティタスクのためのしっかりした基礎を築くことができます。
スキャン用の Web サーバーをセットアップする
このステップでは、Docker を使用して簡単な Web サーバーをセットアップします。Docker は強力なプラットフォームで、アプリケーションとその依存関係をすべてコンテナと呼ばれる標準化されたユニットにパッケージ化することができます。これらのコンテナは、異なるシステムで簡単にデプロイして実行できます。この Web サーバーをセットアップすることで、次のステップで Nmap を使用してスキャンするターゲットができます。
1. 作業ディレクトリへの移動
まず、ターミナルウィンドウを開きます。ターミナルは、システムと対話するためのコマンドを入力できるコマンドラインインターフェイスです。ターミナルを開いたら、プロジェクトディレクトリに移動する必要があります。このディレクトリは、この実験の作業領域として機能します。
プロジェクトディレクトリに移動するには、cd コマンドを使用します。cd コマンドは "change directory" の略です。実行する必要があるコマンドは次のとおりです。
cd /home/labex/project
2. Dockerfile の作成
Dockerfile は Docker イメージを構築する上で重要な部分です。これは、Docker がイメージを構築するために使用する一連のコマンドが含まれたテキストドキュメントです。この場合、人気のある Web サーバーソフトウェアである Nginx をベースにした簡単な Web サーバー用の Dockerfile を作成します。
Dockerfile という名前の新しいファイルを作成するには、nano テキストエディターを使用します。nano は、ターミナルで直接使用できるシンプルで使いやすいテキストエディターです。次のコマンドを実行します。
nano Dockerfile
このコマンドを実行すると、nano エディターが開き、Dockerfile に内容を追加できます。ファイルに次の行を追加します。
## Use the nginx image as the base
FROM nginx
## Expose port 80
EXPOSE 80
FROM コマンドは、新しいイメージのベースとして nginx イメージを使用するよう Docker に指示します。EXPOSE コマンドは、コンテナがポート 80 でリッスンすることを示します。
ファイルを保存するには、Ctrl+O を押してから Enter を押します。エディターを終了するには、Ctrl+X を押します。
3. Docker イメージの構築
これで Dockerfile が準備できたので、Docker イメージを構築できます。イメージは、アプリケーションを実行するために必要なすべてのファイルと構成が含まれた青写真のようなものです。
イメージを構築するには、次のコマンドを実行します。
docker build -t cyber-seed-portal .
このコマンドでは、-t フラグを使用してイメージにタグを付けます。私たちはイメージに "cyber - seed - portal" というタグを付けています。コマンドの最後の . は、現在のディレクトリをビルドコンテキストとして使用するよう Docker に指示します。
このコマンドを実行すると、Docker はビルドプロセスを開始し、出力は次のようになります。
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
a803e7c4b030: Pull complete
8b625c47d697: Pull complete
4d3239651a63: Pull complete
0f816efa513d: Pull complete
01d159b8db2f: Pull complete
5fb9a81470f3: Pull complete
Digest: sha256:32da30332506740a2f7c34d5dc70467b7dfe6c23451f6c66c84eeb3cdadab213
Status: Downloaded newer image for nginx:latest
---> 61395b4c586d
Step 2/2 : EXPOSE 80
---> Running in 1c2d5e2a8e7f
Removing intermediate container 1c2d5e2a8e7f
---> 7683abcf62b0
Successfully built 7683abcf62b0
Successfully tagged cyber-seed-portal:latest
4. Docker コンテナの実行
イメージが構築されたら、それからコンテナを作成して実行できます。コンテナはイメージの実行中のインスタンスです。
コンテナを実行するには、次のコマンドを使用します。
docker run --name cyber-seed-server -d -p 8080:80 cyber-seed-portal
このコマンドを分解してみましょう。
--name cyber-seed-server: これはコンテナに "cyber - seed - server" という名前を付けます。コンテナに名前を付けることで、管理と識別が容易になります。-d: これはコンテナをデタッチドモードで実行します。つまり、コンテナはバックグラウンドで実行され、ターミナルを他のタスクに使用し続けることができます。-p 8080:80: これはマシンのポート 8080 をコンテナのポート 80 にマッピングします。したがって、マシンのポート 8080 にアクセスすると、コンテナ内のポート 80 にリダイレクトされます。cyber-seed-portal: これはコンテナがベースとするイメージを指定します。
このコマンドを実行すると、出力はコンテナ ID になり、次のようなものになります。
3a7b1a23c3c5d17b3e4b3e5e6f7g8h9i
これで、Docker コンテナで実行される Web サーバーを正常にセットアップしました。このサーバーには http://localhost:8080 からアクセスできます。このサーバーは、次のステップでの Nmap スキャンのターゲットになります。
Nmap でオープンポートを発見する
このステップでは、Nmap を使ってローカルマシンで開放されているポートを調べます。開放ポートを理解することは、ネットワークセキュリティにおける基本的で重要なスキルです。ポートは、ネットワーク上のコンピュータへの「ドア」のようなものです。各ポートは異なるサービスによって使用されることがあり、どのポートが開放されているかを知ることで、ネットワーク上で利用可能なサービスを把握することができます。
Nmap の理解
Nmap は Network Mapper の略で、無料のオープンソースツールです。主にネットワーク探索とセキュリティ監査に使用されます。ネットワークの「探偵」のようなものだと考えてください。システム管理者やネットワーク管理者は、Nmap を使ってネットワーク上に何があるかを把握し、サービスのアップグレード時期を計画し、ホストやサービスが稼働しているかどうかを確認することがよくあります。
開放ポートのスキャン
では、Nmap を使って IP アドレスが 127.0.0.1 の localhost をスキャンし、開放されているポートを探しましょう。Nmap の -p- オプションは、コンピュータ上のすべての「ドア」(ポート)をチェックするよう指示するものです。TCP ポートは合計 65535 個あり、このオプションを使うと Nmap がすべてのポートを調べます。
ターミナルで次のコマンドを実行します。
nmap -p- localhost
このコマンドは多くのポートをスキャンするため、少し時間がかかります。完了すると、出力は次のようになります。
Starting Nmap 7.80 at 2024-03-15 10:59 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 65529 closed ports
PORT STATE SERVICE
22/tcp open ssh
3000/tcp open ppp
3001/tcp open nessus
3002/tcp open exlm-agent
8080/tcp open http-proxy
36921/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 2.12 seconds
スキャン結果の理解
スキャン結果は、マシンに関する多くの有用な情報を提供します。各列を見ていきましょう。
- PORT: この列はポート番号とプロトコル(この場合は TCP)を示しています。ポート番号はコンピュータ上の特定の「ドア」のアドレスのようなもので、TCP はその「ドア」を通じてデータが送信される方法です。
- STATE: この列は、ポートが開放されている、閉じている、またはフィルタリングされているかを示します。開放されているポートは、そのポートでサービスが待機しており、接続を受け入れる準備ができていることを意味します。閉じているポートは、そこにサービスが待機していないことを意味します。フィルタリングされているポートは、ファイアウォールによってブロックされている可能性があります。
- SERVICE: この列は、通常そのポートを使用する一般的なサービスを示しています。
スキャン結果では、ポート 8080/tcp が開放されていると表示されているはずです。前のステップで、このポートを Docker コンテナにマッピングしました。「http - proxy」サービスは、このポートが通常 HTTP プロキシサービスに使用されることを示していますが、今回の場合は Nginx Web サーバーによって使用されています。
他に開放されているポートとして、次のようなものがあるかもしれません。
- ポート 22 (SSH): このポートは安全なリモートアクセスに使用されます。他の場所からコンピュータに安全に接続することができます。
- ポート 3000 - 3002: これらのポートは様々なサービスに使用されます。開発環境やマシン上で実行されている他のアプリケーションに関連している可能性があります。
- ポート 36921: これは不明なサービスです。カスタムサービスか、Nmap がすぐに識別できないものかもしれません。
これで、マシン上の開放ポートを見つけることができ、最初の Nmap スキャンを成功させました。次のステップでは、より高度な Nmap スキャン技術を学びます。
Nmap を使用したサービスバージョンの検出
このステップでは、Nmap のサービスバージョン検出機能の使い方を探っていきます。これは強力な機能で、ターゲットシステムの開放ポートで動作しているサービスを特定するのに役立ちます。サービスとそのバージョンを理解することは、セキュリティ評価やネットワーク管理において重要です。
サービスバージョン検出の理解
ポートが開放されていることだけを知るだけでも基本的な情報が得られます。しかし、具体的なサービスとそのバージョンを特定することで、はるかに価値のある洞察が得られます。サービスの異なるバージョンには、異なるセキュリティ脆弱性が存在する可能性があります。たとえば、古いバージョンの Web サーバーには、新しいリリースで修正された既知のセキュリティ上の欠陥があるかもしれません。サービスのバージョンを知ることで、既知の脆弱性があるかどうかを確認し、ネットワークを安全に保つための適切な対策を講じることができます。
サービスバージョンスキャンの実行
Nmap はサービスバージョン検出を有効にする -sV オプションを提供しています。このオプションを使用すると、Nmap はターゲットシステムの開放ポートに特殊なプローブを送信します。これらのプローブは、それらのポートで動作しているサービスに関する情報(サービス名やバージョンなど)を収集するように設計されています。
では、localhost(自分のコンピュータ)に対してサービスバージョンスキャンを実行しましょう。これを行うには、ターミナルで次のコマンドを実行します。
nmap -sV localhost
このコマンドは、Nmap にローカルマシンに対するサービスバージョンスキャンを実行するよう指示します。コマンドを実行すると、Nmap は localhost の開放ポートにプローブを送信し、それらのポートで動作しているサービスに関する情報を収集し始めます。
コマンドの出力は次のようになります。
Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 11:30 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
3000/tcp open ppp?
3001/tcp open nessus?
3002/tcp open ssl/nessus?
8080/tcp open http nginx 1.23.4
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.94 seconds
サービスバージョンスキャン結果の理解
サービスバージョンスキャンの出力は、各開放ポートで動作しているサービスに関する詳細な情報を提供します。重要な部分を分解してみましょう。
- ポート 22: 出力によると、ポート 22 は開放されており、SSH (Secure Shell) サービスが動作しています。具体的なバージョンは OpenSSH 8.2p1 で、Ubuntu システム上で動作しています。SSH はコンピュータへの安全なリモートアクセスに使用されるプロトコルです。
- ポート 8080: このポートは開放されており、HTTP サービス、具体的には Nginx Web サーバーのバージョン 1.23.4 が動作しています。Nginx は Web ページを配信するために使用される人気のある Web サーバーです。
ポート 3000 - 3002 については、サービス名の横に疑問符が付いていることに気付くでしょう。これは、Nmap がこれらのポートで動作している正確なサービスを確実に特定できなかったことを意味します。このような場合、さらなる調査が必要になるかもしれません。他のツールや技術を使用して、これらのサービスに関するより多くの情報を収集することができます。
このサービスバージョンに関する詳細な情報は、セキュリティ評価に非常に価値があります。この情報を使って、特定のサービスバージョンに既知の脆弱性があるかどうかを確認することができます。たとえば、古いバージョンの Nginx を使用していることがわかった場合、そのバージョンに関連するセキュリティ問題があるかどうかを調べ、より新しく安全なバージョンにアップグレードすることを検討することができます。
Nmap のサービスバージョン検出機能を使用することで、単に開放ポートを特定するだけでなく、システム上で動作しているネットワークサービスについてより深い理解が得られます。これは、安全で適切に管理されたネットワークを維持するために不可欠です。
Nmap を使った OS 検出
このステップでは、Nmap のオペレーティングシステム(OS)検出機能の使い方を学びます。まずは、これがなぜ重要なのかを理解しましょう。ターゲットマシンで動作している OS を知ることは、ネットワーク管理者やセキュリティ専門家にとって重要な情報を手に入れることに相当します。これにより、そのマシンに関連する潜在的な脆弱性やセキュリティリスクを理解することができます。
OS 検出の理解
OS 検出は Nmap のより高度な機能です。この機能を使用すると、Nmap はターゲットマシンに特殊なパケットを送信し、返ってきた応答を分析します。これらの応答に基づいて、Nmap はターゲットで動作している OS を推測します。異なる OS はネットワーク要求の処理方法が異なり、Nmap はこれらの違いを利用して相手側で動作しているものを特定します。この情報はセキュリティ評価において重要です。なぜなら、異なる OS には異なる脆弱性のセットが存在するからです。たとえば、古いバージョンの Windows には、新しい Linux ディストリビューションにはない既知のセキュリティホールがあるかもしれません。
OS 検出スキャンの実行
OS 検出スキャンを実行するには、Nmap の -O オプションを使用します。ただし、この機能にはルート権限が必要です。なぜなら、通常のユーザーが送信することを許可されていない特定の種類のネットワークパケットを送信する必要があるからです。そのため、sudo を使用して管理者権限でコマンドを実行する必要があります。
ターミナルで次のコマンドを実行します。
sudo nmap -O localhost
このコマンドを実行すると、sudo パスワードの入力を求められることがあります。これは、管理者権限でのアクションを実行できるのは承認されたユーザーのみであることを確認するためのセキュリティ対策です。パスワードを入力すると、Nmap がスキャンを開始します。
出力は次のようになります。
Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:00 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open ssh
3000/tcp open ppp
3001/tcp open nessus
3002/tcp open ssl/nessus
8080/tcp open http-proxy
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.36 seconds
OS 検出結果の理解
OS 検出結果は、ターゲットの OS に関する多くの有用な情報を提供します。結果の異なる部分を分解してみましょう。
- Device type: これはデバイスの一般的なカテゴリを示します。たとえば、汎用コンピュータ、ルーター、またはプリンターなどです。今回の場合は「general purpose」と表示されており、これは通常のコンピュータである可能性が高いことを意味します。
- Running: これは検出された OS のファミリとバージョン範囲を示します。ここでは「Linux 4.X|5.X」と表示されており、Nmap がマシンで動作している OS がカーネルバージョン 4.X または 5.X の Linux であることを検出したことを意味します。
- OS CPE: これは Common Platform Enumeration の略です。OS の標準化された識別子を提供し、さらなる調査や脆弱性分析に使用することができます。
- OS details: これは OS バージョンに関するより具体的な情報を提供します。この例では「Linux 4.15 - 5.6」と表示されており、カーネルバージョンが 4.15 から 5.6 の間であることを意味します。
- Network Distance: これはターゲットまでのネットワークホップ数を示します。
localhost(ローカルマシン自体)をスキャンしているため、ネットワーク距離は 0 ホップです。
この場合、Nmap はマシンが Linux を実行していること、具体的にはカーネルバージョンが 4.15 から 5.6 の間であることを正しく識別しています。
この情報はセキュリティ評価において非常に有用です。OS バージョンを知ることで、セキュリティ専門家はそのバージョンに関連する既知の脆弱性を調べ、システムを安全に保つための適切な対策を講じることができます。また、ネットワークインベントリと管理にも役立ちます。なぜなら、ネットワーク内の異なるマシンで動作している OS を把握するのに役立つからです。
Nmap の OS 検出機能を使用することで、開放されているポートや動作しているサービスを知るだけでなく、ターゲットシステムについての理解が深まりました。ネットワークセキュリティと管理にとって重要な情報である基盤となる OS について、より良い理解が得られました。
Nmap を使用したスクリプトスキャン
この最後のステップでは、Nmap のスクリプトエンジン(NSE)を探索します。NSE は Nmap の非常に重要な部分で、Nmap をさらに便利にします。ユーザーはこれを使って、さまざまなネットワークタスクを自動化するスクリプトを作成し、共有することができます。つまり、手動で行うよりも、スクリプトを使ってタスクをより迅速かつ効率的に実行できます。
Nmap スクリプトエンジン(NSE)の理解
Nmap スクリプトエンジン(NSE)は、Nmap の最も強力で柔軟な機能の 1 つです。これを、ネットワーク操作に役立つ追加ツールを備えたツールボックスと考えてください。スクリプトは Lua プログラミング言語で記述できます。Lua は簡単で学びやすい言語なので、このようなスクリプトの作成に最適です。
これらのスクリプトは、さまざまな目的に使用できます。
- ネットワーク探索:ネットワーク上にあるデバイスを特定するのに役立ちます。
- バージョン検出:デバイスで動作しているソフトウェアのバージョンを特定できます。
- 脆弱性検出:システムのセキュリティ上の弱点を見つけることができます。
- バックドア検出:攻撃者がシステムにアクセスするために使用する隠された方法を見つけるのに役立ちます。
- 脆弱性悪用:ただし、これは合法的かつ倫理的なテスト環境で行う必要がありますが、攻撃者が脆弱性を利用する方法を示すことができます。
Nmap には、事前に作成された多数のスクリプトが付属しています。これらのスクリプトは、その機能に基づいてライブラリに分類されています。したがって、特定のタスクを実行したい場合、関連するライブラリから適切なスクリプトを簡単に見つけることができます。
基本的なスクリプトスキャンの実行
基本的なスクリプトスキャンを開始するには、-sC オプションを使用します。このオプションは、Nmap にデフォルトのスクリプトセットを実行するよう指示します。これらのデフォルトのスクリプトは、安全で非侵入的に設計されています。つまり、ターゲットシステムに何らかの損害を与えることなく、そのタスクを実行します。
次のコマンドを実行しましょう。
nmap -sC localhost
このコマンドを実行すると、Nmap はローカルマシンのスキャンを開始します。デフォルトのスクリプトを使用して、開放されているポートとそれらのポートで動作しているサービスに関する情報を収集します。出力は次のようになります。
Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:30 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open ssh
| ssh-hostkey:
| 3072 01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef (RSA)
| 256 fe:dc:ba:98:76:54:32:10:fe:dc:ba:98:76:54:32:10 (ECDSA)
|_ 256 01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef (ED25519)
3000/tcp open ppp
3001/tcp open nessus
3002/tcp open ssl/nessus
8080/tcp open http-proxy
|_http-title: Welcome to nginx!
Nmap done: 1 IP address (1 host up) scanned in 1.31 seconds
特定のスクリプトの実行
特定のスクリプトを実行したい場合は、--script オプションを使用できます。このオプションの後に、スクリプトの名前またはそれが属するカテゴリを指定する必要があります。
たとえば、Web ページのタイトルを取得したいとしましょう。http - title というスクリプトがこのタスクを実行できます。このスクリプトを実行するには、次のコマンドを使用します。
nmap --script=http-title -p 8080 localhost
このコマンドは、Nmap にローカルマシンのポート 8080 で http - title スクリプトを実行するよう指示します。出力は次のようになります。
Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:35 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
PORT STATE SERVICE
8080/tcp open http-proxy
|_http-title: Welcome to nginx!
Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
スクリプトスキャン結果の理解
スクリプトスキャンの結果は、開放されているポートで動作しているサービスに関するより詳細な情報を提供します。
- ポート 22 の SSH サービスについては、
ssh - hostkeyスクリプトがホストキーを取得しました。これらのキーは、SSH を介した安全な通信に重要です。 - ポート 8080 の HTTP サービスについては、
http - titleスクリプトが Web ページのタイトル「Welcome to nginx!」を取得しました。
このような情報は、セキュリティ評価に非常に有用です。ターゲットシステム上のサービスがどのように構成され、どのように動作するかを理解するのに役立ちます。
Nmap のスクリプトエンジンを使用することで、Nmap の最も強力な機能の 1 つを探索しました。この機能は、ネットワーク探索やセキュリティ評価タスクにおいて、多くの時間と労力を節約することができます。
クリーンアップ
これですべてのスキャンステップが完了したので、クリーンアップの時間です。実験の前半で、Docker コンテナを作成しました。システムをきれいに保つために、このコンテナを停止して削除する必要があります。
次のコマンドを実行します。
docker stop cyber-seed-server && docker rm cyber-seed-server
このコマンドは、まず cyber - seed - server という名前の実行中の Docker コンテナを停止します。その後、コンテナをシステムから削除します。
おめでとうございます!この実験のすべてのステップを正常に完了しました。さまざまな Nmap スキャン技術に関する貴重な実践経験を獲得しました。
まとめ
この実験では、人気があり強力なサイバーセキュリティツールである Nmap を使用したネットワークスキャンの基本を学びました。スキャン対象として Docker コンテナをセットアップし、新しく習得したスキルを適用する実践的な環境を作成しました。
ローカルマシンでの基本的なポートスキャンから始めて、一連の高度な Nmap スキャン技術を学びました。その後、サービスバージョン検出、OS 検出を学び、Nmap のスクリプトエンジンを使用してタスクを自動化し、ターゲットに関するより多くの情報を収集しました。これらのスキルは、ネットワークセキュリティ評価の基礎であり、ネットワーク管理者やセキュリティ専門家にとって不可欠です。これらの Nmap 技術を習得することで、ネットワークインベントリからセキュリティ評価まで、実際のシナリオで強力なツールを手に入れることができます。



