Nmap を使用してファイアウォールの制限を検出し、バイパスする

NmapBeginner
オンラインで実践に進む

はじめに

この実験では、ネットワークセキュリティの分野において、Nmap を使用してファイアウォールの制限を検出し、回避する方法を学びます。ファイアウォールは、事前に定義されたルールに従ってネットワークトラフィックをフィルタリングする重要なセキュリティ要素です。セキュリティ専門家として、包括的なセキュリティ評価や脆弱性の特定のために、ファイアウォールを回避する方法を理解することは非常に重要です。

強力なネットワークスキャンツールである Nmap を使って、様々なファイアウォール回避技術を探索します。これらの技術により、セキュリティ専門家は、潜在的な攻撃者がセキュリティ対策を回避しようとする試みを模倣して、ネットワーク防御をテストすることができます。この実験の終了時には、Nmap のファイアウォール回避機能を実際に操作する経験を積み、ネットワークセキュリティにおけるそれらの応用を理解することができるようになります。

スキャン用のローカルサービスを設定する

Nmap のスキャン技術の練習を始める前に、スキャン対象となるサービスを用意することが重要です。これは射撃場で標的を用意するのと同じようなものです。このステップでは、ローカルマシン上に簡単な HTTP サーバを作成します。このサーバが、すべてのスキャン演習の対象となります。

まず、ターミナルを開く必要があります。ターミナルは、コンピュータに命令を与えることができるコマンドセンターのようなものです。ターミナルを開いたら、HTTP サービス用のディレクトリ構造を作成します。ディレクトリはコンピュータ上のフォルダに似ており、ファイルを整理するのに役立ちます。

mkdir -p /home/labex/project/http_service

mkdir コマンドは「ディレクトリを作成する」という意味です。-p オプションは、パス内の中間ディレクトリが存在しない場合にそれらを作成することを保証します。したがって、このコマンドは /home/labex/project パス内に http_service という名前のディレクトリを作成します。

次に、新しく作成したディレクトリに移動する必要があります。コンピュータ上のフォルダを開いてその内容にアクセスするのと同じように、cd コマンドを使用してディレクトリに移動します。

cd /home/labex/project/http_service

ここで、簡単な HTML ファイルを作成します。HTML はウェブページを作成するために使用される言語です。HTTP サーバは、誰かが要求したときにこの HTML ファイルを提供します。

echo "<html><body><h1>Welcome to the StarPath Exploration Server</h1></body></html>" > index.html

echo コマンドは引用符内のテキストを出力します。> 記号はその出力を index.html という名前のファイルにリダイレクトします。したがって、このコマンドは指定された基本的な HTML コンテンツを持つ index.html という名前のファイルを作成します。

ファイルが正しく作成されたことを確認するために、その内容を表示することができます。この目的のために cat コマンドを使用します。

cat index.html

cat コマンドはファイルの内容を読み取り、ターミナルに表示します。先ほど作成した HTML コンテンツが表示されるはずです。

<html><body><h1>Welcome to the StarPath Exploration Server</h1></body></html>

ここで、簡単な HTTP サーバを起動する時が来ました。Python の組み込み http.server モジュールを使用します。Python はプログラミング言語であり、このモジュールを使用するとすぐにウェブサーバをセットアップすることができます。

python3 -m http.server 8000

Python の -m オプションは、モジュールをスクリプトとして実行するために使用されます。ここでは、http.server モジュールを実行し、ポート 8000 で待機するように指示しています。ポートは、データがコンピュータに出入りするドアのようなものです。

このコマンドを実行した後、次のような出力が表示されるはずです。

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

この出力は、HTTP サーバが実行中で、ポート 8000 で接続を待機していることを示しています。このターミナルウィンドウを開いたままにすることが重要です。なぜなら、閉じるとサーバが停止するからです。

ローカルサービスのセットアップが成功しました。次のステップでは、このサービスを Nmap のスキャン演習の対象として使用します。

ホスト発見回避を伴う基本的な Nmap スキャン

このステップでは、初めての Nmap スキャンを実行します。ただし、始める前に重要な概念を理解しましょう。多くのファイアウォールは、一般に「ping」として知られる ICMP エコー要求をブロックするように設定されています。Nmap は通常、ポートをスキャンする前に、これらの ping 要求を使用してホストがオンラインかどうかを確認します。しかし、このホスト検出フェーズを回避することで、ICMP トラフィックがファイアウォールによってブロックされている場合でも、ターゲットをスキャンすることができます。

まず、前のターミナルで HTTP サーバが実行されていることを確認してください。次に、新しいターミナルウィンドウを開きます。この新しいターミナルでは、プロジェクトディレクトリに移動する必要があります。プロジェクトディレクトリは、この実験に関連するすべてのファイルと設定が保存されている場所です。これを行うには、「change directory」(ディレクトリを変更する)の略である cd コマンドを使用します。以下がそのコマンドです。

cd /home/labex/project

適切なディレクトリに移動したので、ローカルの HTTP サーバに対して基本的な Nmap スキャンを実行する時が来ました。Nmap コマンドで -Pn オプションを使用します。このオプションは、Nmap にホスト検出ステップをスキップし、ターゲットがオンラインであると仮定するように指示します。以下がそのコマンドです。

nmap -Pn --reason -p 8000 localhost

コマンドオプションを分解して、それぞれの機能を理解しましょう。

  • -Pn: このオプションはホスト検出プロセスをスキップします。ping を使用してターゲットがオンラインかどうかを確認する代わりに、Nmap は直接ターゲットがオンラインであると仮定し、ポートのスキャンを開始します。
  • --reason: このオプションは、Nmap にポートが特定の状態にある理由を表示させます。たとえば、ポートが開いている場合、なぜそのポートが開いていると見なされるのかを教えてくれます。
  • -p 8000: このオプションは、Nmap にポート 8000 のみをスキャンするように指示します。ローカルの HTTP サーバがこのポートで実行されているため、この特定のポートに関心があります。
  • localhost: これはスキャンしたいターゲットです。この場合、localhost はローカルマシンを指します。

コマンドを実行した後、次のような出力が表示されるはずです。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-09-05 15:30 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up, received localhost-response (0.000097s latency).

PORT     STATE SERVICE      REASON
8000/tcp open  http-alt     syn-ack

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

この出力は、ポート 8000 が開いており、HTTP サービスが実行されていることを示しています。「REASON」列には「syn-ack」と表示されています。これは、Nmap がポートに接続しようとしたときに、ポートが SYN-ACK パケットで応答したことを意味します。これは、TCP プロトコルにおいてサーバが接続要求を受け入れる標準的な方法です。

次に、スキャン結果をファイルに保存します。結果を保存することは、後で分析したり、他の人と共有したり、将来のスキャンと比較したりすることができるため、便利です。結果を保存するには、> 記号を使用します。この記号は、Nmap コマンドの出力をファイルにリダイレクトします。以下がそのコマンドです。

nmap -Pn --reason -p 8000 localhost > /home/labex/project/nmap_scan.txt

最後に、保存されたスキャン結果を確認しましょう。「concatenate」(連結する)の略である cat コマンドを使用します。このコマンドは、ファイルの内容を読み取り、ターミナルに表示します。以下がそのコマンドです。

cat /home/labex/project/nmap_scan.txt

以前にターミナルに表示されたのと同じスキャン結果が表示されるはずです。

この基本的なスキャンは、-Pn オプションを使用して、ping プローブをブロックするファイアウォールルールを回避する方法を示しています。実際のシチュエーションでは、ICMP トラフィックをブロックするファイアウォールで保護されたホストをスキャンする必要がある場合、この技術は非常に有用です。

パケットフラグメンテーションによる高度なファイアウォール回避

このステップでは、パケットフラグメンテーションと呼ばれる、より高度なファイアウォール回避技術を探索します。取り組む前に、パケットフラグメンテーションが何かを理解しましょう。ネットワークを介してデータを送信する際、データはパケットと呼ばれる小さな単位に分割されます。一部のファイアウォールや侵入検知システム(Intrusion Detection Systems, IDS)は、これらのパケットを検査して悪意のある活動の兆候を探すように設計されています。しかし、これらのセキュリティシステムは、さらに小さな断片に分割されたフラグメント化されたパケットの処理に苦労することがあります。この困難性が、スキャン中に特定のセキュリティ対策を回避する機会を生み出すことがあります。

スキャンのターゲットとして、引き続きローカルの HTTP サーバを使用します。まず、前回のスキャンを行ったターミナルで適切なディレクトリに移動する必要があります。このディレクトリにはプロジェクトファイルが格納されており、コマンドが正しく動作するためにはこのディレクトリにいることが重要です。これを行うには、次のコマンドを実行します。

cd /home/labex/project

適切なディレクトリに移動したので、Nmap のフラグメンテーションオプションを使用してスキャンを実行する準備ができました。このオプションは、IP パケットをより小さな断片に分割し、パケットフィルタがスキャンを検出しにくくします。使用するコマンドは次の通りです。

sudo nmap -f -Pn --reason -p 8000 localhost

このコマンドの追加オプション -f を分解してみましょう。-f オプションは、Nmap に IP パケットをフラグメント化するように指示します。これにより、パケットフィルタがパケットを分析し、スキャンを検出することがより困難になります。

コマンドを実行した後、次のような出力が表示されるはずです。

Starting Nmap 7.80 ( https://nmap.org ) at 2025-03-18 16:46 CST
Nmap scan report for localhost (127.0.0.1)
Host is up, received user-set (0.000062s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE  REASON
8000/tcp open  http-alt syn-ack ttl 64

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

この出力は、スキャンの結果を示しています。ホスト(localhost)が稼働しており、ポート 8000 が開いていることを教えてくれます。

次に、これらの結果を別のファイルに保存します。こうすることで、後で結果を参照し、他のスキャン結果と比較することができます。結果を保存するには、次のコマンドを実行します。

sudo nmap -f -Pn --reason -p 8000 localhost > /home/labex/project/nmap_frag_scan.txt

このコマンドの > 記号は、Nmap スキャンの出力を指定されたファイルにリダイレクトします。

ここで、このファイルの内容を確認して、結果が正しく保存されたことを確認しましょう。ファイルの内容を表示するために使用される cat コマンドを使用します。

cat /home/labex/project/nmap_frag_scan.txt

スキャン結果は前回のスキャンと似ているかもしれませんが、根底にある技術は異なります。この場合、Nmap は IP パケットを小さな断片に分割しているため、ステートレスなパケットフィルタがスキャンを検出することが難しくなります。

これまでに使用した 2 つのスキャン方法、通常のスキャンとフラグメント化されたスキャンを比較しましょう。この比較を保存するための新しいファイルを作成します。そのためのコマンドは次の通りです。

echo "Comparing regular scan vs. fragmented scan:" > /home/labex/project/scan_comparison.txt
echo "---------------------------------------------" >> /home/labex/project/scan_comparison.txt
echo "" >> /home/labex/project/scan_comparison.txt
echo "1. Regular scan with -Pn:" >> /home/labex/project/scan_comparison.txt
cat /home/labex/project/nmap_scan.txt >> /home/labex/project/scan_comparison.txt
echo "" >> /home/labex/project/scan_comparison.txt
echo "2. Fragmented scan with -f -Pn:" >> /home/labex/project/scan_comparison.txt
cat /home/labex/project/nmap_frag_scan.txt >> /home/labex/project/scan_comparison.txt

これらのコマンドは、まず比較ファイルにヘッダーを書き込み、次に通常のスキャンとフラグメント化されたスキャンの結果をファイルに追加します。

では、比較ファイルの内容を表示して、比較を確認しましょう。

cat /home/labex/project/scan_comparison.txt

制御された環境では、2 つのスキャンの結果は似ているかもしれません。しかし、実際のシナリオでは、これらの異なる技術は、異なるファイアウォール構成に対してさまざまなレベルの成功を収めることができます。パケットフラグメンテーション(-f)は、ステートレスなパケットフィルタに対して特に有効です。ステートレスなパケットフィルタは各パケットを独立して検査し、多くの場合、断片を再組み立てて完全なパケットを検査することができません。これにより、フラグメント化されたスキャンがこれらのフィルタを回避する可能性が高くなります。

さらに高度なフラグメンテーションを行うために、Nmap では複数の -f フラグ(例:-ff)を使用するか、--mtu オプションでカスタムの最大転送単位(Maximum Transmission Unit, MTU)サイズを指定することで、フラグメンテーションのレベルを上げることができます。MTU は、ネットワークを介して送信できるパケットの最大サイズです。カスタムの MTU を指定することで、パケットがどのようにフラグメント化されるかを制御することができます。

この技術は、セキュリティ評価を行う際に、パケットフラグメンテーションがファイアウォール検出を回避する追加の方法としてどのように使用できるかを示しています。

まとめ

この実験では、Nmap のファイアウォール回避技術を使用して、ファイアウォールの制限を特定し、回避する方法を学びました。まず、スキャンのターゲットとしてローカルの HTTP サーバをセットアップし、外部システムに影響を与えることなく、さまざまなスキャン方法を練習する安全な環境を作成しました。次に、-Pn オプションを使用して基本的な Nmap スキャンを実行し、ホスト検出を回避しました。これは、ファイアウォールが ICMP エコー要求をブロックしている場合に役立ちます。これにより、ファイアウォールルールの背後に隠されている可能性のあるポートをスキャンすることができました。

次に、高度な回避技術である -f オプションを使用したパケットフラグメンテーションを探索しました。この方法は IP パケットをフラグメント化し、ステートレスなパケットフィルタがスキャンを検出してブロックすることを困難にします。両方の技術の結果を比較することで、それらの違いと用途を理解することができました。これらの技術は、セキュリティ専門家が徹底的なセキュリティ評価を行うために不可欠です。ただし、法律やポリシーに違反しないように、適切な許可を得た承認済みの評価でのみ使用することを忘れないでください。