Nmap 高度なポートスキャン
ファイアウォールやIDSシステムを回避するためのオプションとテクニックについて説明する。
また、 Nmapからより詳細な情報を取得するためのオプションについても説明する
改めて
TCP Header
https://scrapbox.io/files/67283faf1c66598a4fe9d8e2.png
TCP Null Scan, FIN Scan, and Xmas Scan
NullScan
-sNオプション
何もフラグを設定しないTCPパケットを送信する
仕組み
到達しても何も起きない
open | filtered (ポートが開いている or ファイアーウォール)がパケットをブロックしている
RSYパケットが返される
ポートが閉じている
UDPでポートが空いているか空いていないかを確認する方法と同じ
ポートが閉じているときパケットが届いたらICMPのRSTパケットが届く
FINScan
FINフラグが設定されたTCPパケットを送信する
-sFオプション
仕組み
-sN、-sUと同じ
Xmas Scan(クリスマススキャン)
FIN、PSH、URGフラグを同時に設定したパケットを送信する
-sX-オプション
仕組み
-sN、-sUと同じ
これら3つのスキャンタイプが効果的なシナリオの1つは、ステートレス(非ステートフル)ファイアウォールの背後にあるターゲットをスキャンする場合
ステートレスファイアウォールは、接続試行を検出するために、入力パケットにSYNフラグが設定されているかどうかをチェックする
SYNパケットに一致しないフラグの組み合わせを使用することで、ファイアウォールを欺き、その背後にあるシステムに到達することが可能
ただし、ステートフルファイアウォールは、このような細工されたパケットを実質的にすべてブロックし、この種のスキャンを無効にする
ステートレスファイアーウォール
各パケットを独立して検査します
パケットの「状態」や「コンテキスト」を追跡しません
単純なルールに基づいて判断します(例:「SYNフラグが立っているかどうか」だけを確認)
メモリ使用量が少なく、処理が高速です
セキュリティレベルは比較的低いです
ステートフルファイアウォール
通信の「状態」を追跡・記憶します
パケットの文脈を理解します(どの接続に属しているのか等)
より複雑な判断が可能です(正当な通信の一部なのかどうかを判断できる)
メモリ使用量が多く、処理が若干遅くなります
セキュリティレベルが高いです
TCP Maimon Scan
1996年にUriel Maimonによって説明
FINとACKが設定されたビットを送信する
-sMオプション
ターゲットは応答としてRSTパケットを送信するはずだが、特定のBSD派生システムでは開いているポートの場合にパケットをドロップする
その結果として、開いているポートが露呈する
現代のネットワークで遭遇するほとんどのターゲットでは機能しない
ほとんどのターゲットシステムはTCPが開いているかどうかに関係なく、RSTパケットで応答する。
そのような場合、開いているポートを発見することはできない
TCP ACK, Window, and Custom Scan
TCP ACK Scan
ACKスキャンはACKフラグが設定されたTCPパケットを送信する
-sAオプション
パケットの「応答があるかないか」だけを見る
unfiltered(フィルタなし):応答があった場合
filtered(フィルタあり):応答がない場合
ファイアウォールの有無を単純に判断できます
ターゲットはポートの状態に関係なく、ACKに対してRSTで応答する
ACKフラグが設定されたTCPパケットは、データの受信を確認応答するために受信したTCPパケットへの応答としてのみ送信されるべきだから
このスキャンは単純な設定では、ターゲットポートが開いているかどうかを教えてくれない
ターゲットの前にファイアウォールがある場合に役立つ
どのACKパケットが応答を得たかに基づいて、ファイアウォールにブロックされていないポートを知ることができる
STATE unfilteredとなっているものは、ファイアーウォールでブロックされていない
TCP Window Scan
-sWオプション
TCP ASKスキャンとほぼ同じだけど、応答パケット(RST)の「TCPウィンドウフィールド」の値を詳しく分析するところに違いがある
結果は3種類
open(開いている):特定のシステムでウィンドウ値が正の場合
closed(閉じている):ウィンドウ値が0の場合
filtered(フィルタあり):応答がない場合
特定のシステムでは、これによってポートが開いていることが明らかになる場合がある
-sAオプションと同様に、ファイアウォールのないLinuxシステムに対してTCPウィンドウスキャンを実行しても、多くの情報は得られない
TCP ACKスキャンは「ファイアウォールがパケットを通すか通さないか」を知るのに適している
TCP Window スキャンは「さらに一歩踏み込んで、ポートの状態についての追加情報」を得ようとしている
Custom Scan
TCP スキャンタイプを超えて、新しいTCPフラグの組み合わせを試してみたい時に有用
--scanflags
例えば、SYN、RST、FINを同時に設定したい場合は、--scanflags RSTSYNFIN
ACKスキャンとウィンドウスキャンは、サービスではなくファイアウォールルールを露呈させるもの
サービスが動いているかを調べるオプション
-sVオプション
サービスが動いているかどうかの確認
Spoofing and Decoys
一部のネットワーク設定では偽造したipアドレスや偽装されたMACアドレスを使用してターゲットシステムをスキャンすることができる
このようなスキャンは応答を確実にキャプチャできる状況でのみ有効
ランダムなネットワークから偽装されたIPアドレスを使用してターゲットをスキャンしようとすると、応答がルーティングされない可能性が高く、スキャン結果は信頼できない可能性がある
攻撃元IPアドレスの偽装
-S SPOOFED_IPで、ipを偽装することができる
流れ
攻撃者が偽装された送信元IPアドレスを持つパケットをターゲットマシンに送信する
ターゲットマシンが偽装されたIPアドレスに宛先として応答する
攻撃者が応答をキャプチャして、開いているポートを特定する
一般的に-eを使用してネットワークインターフェースを使用して-Pnでpingスキャンを明示的に無効にする必要がある
nmap -S SPOOFED_IP TARGET_IPではなく
nmap -e NET_INTERFACE -Pn -S SPOOFED_IP TARGET_IPの方がいい
使用するネットワークインターフェースを明示的にNmapに指示し、ping応答を期待しないようにする必要がある
攻撃者システムが応答を監視できない場合、このスキャンは無意味になる
攻撃元MACアドレスの偽装
--spoof-mac SPOOFED_MACオプション
攻撃者とターゲットマシンが同じイーサネット(802.3)ネットワークまたは同じWiFi(802.11)上にある場合上にいる場合、MACアドレスも偽装することができる
デコイの使用
偽装は特定の条件が満たされた限られたケースでのみ機能する
そのため、攻撃者は特定されにくくするためにデコイ(おとり)を使用することがある
コンセプトは単純で、多くのIPアドレスからスキャンが来ているように見せかけ、攻撃者のIPアドレスをその中に紛れさせること
ターゲットマシンのスキャンは3つの異なるソースから来ているように見え、その結果、応答もデコイに送られる
https://scrapbox.io/files/67286e177b99561bbc7bbeab.png
-Dオプションの後に特定のIPアドレスまたはランダムなIPアドレスを指定することで、デコイスキャンを実行できる
例えば、nmap -D 10.10.0.1,10.10.0.2,ME TARGET_IPは、10.10.29.87のスキャンがIPアドレス10.10.0.1、10.10.0.2から来ているように見せ、MEは自分のIPアドレスが3番目の順序で表示されることを示す
nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME TARGET_IPでは、3番目と4番目の送信元IPアドレスはランダムに割り当てられてデコイとなる、5番目のソースは攻撃者のIPアドレスになる
MEは本当にMEのまま使用する、自分のipアドレスを入れなくていい
断片化パケット
Firewall
パケットの通過を許可またはブロックするソフトウェアまたはハードウェア
従来のファイアウォールは、少なくともIPヘッダーとトランスポート層ヘッダーを検査します。より高度なファイアウォールは、トランスポート層で運ばれるデータも検査しようとします。
IDS(侵入検知システム)
特定の動作パターンや特定のコンテンツシグネチャについてネットワークパケットを検査します。悪意のあるルールに合致すると、アラートを発令する
IDSは、IPヘッダーとトランスポート層ヘッダーに加えて、トランスポート層のデータ内容を検査し、悪意のあるパターンと一致するかどうかをチェックする
Nmapの活動をFWやIDSに邪魔されないようにするにはどうすればいいか
ファイアウォール/IDSのタイプによっては、パケットをより小さなパケットに分割することで効果が得られる場合がある
フラグメントパケット
-fオプションでパケットをフラグメント化することができる
IPデータは8バイト以下に分裂される
-ff
IPデータは16バイトのフラグメントに分割される
デフォルト値は--mtuを使用して変更できるが、常に8の倍数を選択する必要がある
https://scrapbox.io/files/67287623a0d42b0d4b7a5ef1.png
逆にパケットを無害に見せるためにサイズを大きくしたい場合は、--data-length <NUM>オプションを使用できる
ゾンビスキャン
送信元 IP アドレスを偽装することは、ステルススキャンを行うための優れた方法
ただし、偽装は攻撃者とターゲットマシンが同じネットワークにいるときだけに役にたつ
トラフィックを監視できる位置にいる必要がある
ゾンビスキャンでアップグレードできる
ゾンビスキャンには、通信可能なネットワークに接続された待機システムが必要
実際には、Nmapは各プローブがゾンビホストから送信されているように見せかけ、その後、ゾンビホストがスプーフィングされたプローブに対する応答を受信したかどうかの指標をチェックする
IPヘッダーのIP識別子(IP ID)値をチェックすることでできる
IP IDとは
各IPパケット(ネットワーク上を流れるデータ)に付けられる「識別番号」のようなもの
パケットを送るたびに1ずつ増える通し番号のようなもの
特に古いプリンターなどは、この番号が単純に1,2,3...と増えていく
アイドルスキャンはnmap -sI ZOMBIE_IP TARGET_IPを使用して実行できる
ステップ
ステップ1: プリンターのIP ID確認
- プリンターに話しかけて、現在のIP IDをメモ
例)ID = 100
ステップ2: チェックしたいポートに対してプリンターになりすまして、サーバーのポート80に接続してみる
サーバーが応答すれば → プリンターに返信が行く
サーバーが応答しなければ → 何も起きない
ステップ3: もう一度プリンターのIP IDを確認
ID = 102 なら → ポート80は開いている!
(サーバーからプリンターへの応答があった)
- ID = 101 なら → ポート80は閉じている!
(サーバーから応答がなかった)
注意点
時間がかかる(1つ1つ確認するので)
プリンターは本当に静かでないといけない
最近の機器だとIP IDがランダムなので使えない
だから、この方法は
ステルス性が必要な時
古い機器がネットワークにある時
時間に余裕がある時に使われる特殊なテクニック
詳しい情報をnmapに出力させる
通常のスキャン
基本的な情報のみ表示
ポートの状態と実行中のサービスを表示
--reasonを追加
なぜポートが開いていると判断したのかの理由を表示
どのような応答があったかを示す
-v または -vvを追加
スキャンの詳細なプロセスを表示
タイミングや送受信したパケットの情報も表示
-d または -ddを追加
デバッグレベルの詳細情報を表示
非常に詳細な技術情報が得られる