【Nmap】各スキャンタイプの特徴や振る舞いについて理解してオプションを使い分けよう
MacOS 15.0
zsh
Nmap 7.95
NmapはGUIにも対応しているポートスキャンを行うことができるツールです。
使い方は非常に簡単ですが、様々なスキャン方法がある上、スクリプトを使用した高度なスキャンも行うことができます。
ただ、仕組みを理解するのは難しく、なんとなくで使ってしまいがちです。
なので、しっかり理解した上でスキャン方法を使い分けられるようになれたら良いなと思いまとめてみました。
Kali Linuxなどを除き、多くのOSには元からインストールされていません。
ですが、こちらの公式サイトやパッケージマネージャを使用して簡単にインストールできます。
それでは、Nmapのスキャン方法の詳細についてそれぞれ解説していきます。
ここで解説している内容はターゲットのシステムや、ファイアウォールの設定により変わる事があるので、そこを理解したうえでご覧ください。
また、ターゲットはLAN内の自分の端末を選択し、間違っても他人のIPアドレスで試すことのないようにしましょう。
スキャン結果の見方
まずは軽く表示される項目について見ていきましょう。
下の画像は、スキャンタイプのオプション以外は何も指定せずに行ったスキャンの結果です。
- ターゲットがUbuntu22.04.2というホスト名で、IPアドレスが10.211.55.7であることを示しています。
- ターゲットがオンラインであり、応答時間が0.000027秒であったことを示しています。
- 997個のTCPポートが閉じている(RSTパケットが返された)ことを示しています。
- スキャン結果が一覧表示されます。今回の場合はTCPポートの22,80,631が開いている、もしくはフィルタリングされていると判断しています。さらにそのポートで利用されているサービスも予想してくれています。
- ターゲットのMACアドレスが00:1C:42:21:60:57でありparallels仮想環境上で動作していることを示しています。
- 1つのIPアドレスをスキャンし、そのうちの1つがオンラインで、所要時間が1.51秒だったことを示しています。
基本的なスキャン方法
ここで紹介する3つのスキャン方法だけでも十分に役に立ってくれます。
スタンダードなだけあって、よく使うスキャン方法です。
TCPコネクトスキャン -sT
TCPポートの開閉状態を判断することができます。
root権限がなくても使用できる唯一のオプションで、一般ユーザーのデフォルトのスキャン方法です。
TCPコネクションを確立するための3ウェイハンドシェイクを最後まで行うためスキャンに時間がかかる傾向にあります。
正規のTCPコネクションを行うので正確にサービスを特定することに対して有利ですが、ターゲットに対してログを残すことになりステルス性に欠けます。
ターゲットup かつ ポートopen
スキャン結果:open
ターゲットからSYN/ACKパケットが返ってくることによりポートが開いていると判断します。
それに対してACKパケットを返しTCPコネクションを確立した後、続けてRST/ACKパケットを送信し通信を終了します。
ターゲットup かつ ポートclosed
スキャン結果:closed
ターゲットからRST/ACKパケットが返ってくるが、こちらは何もせず通信を終了させます。
ターゲットdown 又は フィルタリングされている
スキャン結果:なし
ターゲットから何も返ってきません。
TCP SYNスキャン -sS
TCPポートの開閉状態を判断することができます。
実行にはroot権限が必要で、root権限で実行したときのデフォルトのスキャン方法です。
3ウェイハンドシェイクを途中で終了させるためTCPコネクトスキャンより早いことが多いです。
さらに通信が確立されないためステルス性が高く、サービスの検出もしっかり行ってくれるので、最初に選択するスキャン方法として最適だと思います。
ターゲットup かつ ポートopen
スキャン結果:open
ターゲットからSYN/ACKパケットが返ってくることによりポートが開いていると判断します。
それに対してRSTパケットを送信し、3ウェイハンドシェイクを完了させずに通信を終了します。
ターゲットup かつ ポートclosed
スキャン結果:closed
ターゲットからRST/ACKパケットが返ってきますが、こちらは何もせず通信を終了させます。
ターゲットdown 又は フィルタリングされている
スキャン結果:なし
ターゲットから何も返ってきません。
UDPスキャン -sU
UDPポートの開閉状態を判断することができます。
実行にはroot権限が必要です。
UDPは、もともとパケットの到達を保証しない上、Nmapは相手から反応がない場合に開いているかフィルタリングされていないと判断するため、信頼性はあまり高いとは言えないでしょう。
また、応答がない場合に複数回試行するためスキャンに時間がかかります。
ですがUDPポートの開閉状態を調べられるオプションは実質的にこれだけなので選択権はありません。
ポートopen 又は フィルタリングされている
スキャン結果:open | filtered
コネクションレス型のUDPでは、送ったUDPデータグラムに対してターゲットから何も返ってきません。
UDPスキャンは、ターゲットポートが閉じている場合にICMPパケットが返ってくることを予期しているため、返って来なかった場合にopenと判断しています。
ですのでopenなのかフィルタリングされているかどうか確定させるのが難しくなっています。
ポートclosed
スキャン結果:closed
ターゲットからICMPパケットの宛先到達不能(Port unreachable)が返されます。
TCPフラグを調整したスキャン方法
これ以降のスキャン方法は送信するTCPパケットのフラグの組み合わせを変えています。
それにより応答パケットに違いが出て、結果が変わってくる可能性があります。
また、--scanflags
オプションを使用することで、自分の好きなフラグを設定してスキャンすることも出来ます。
TCP Nullスキャン -sN
実行にはroot権限が必要です。
フラグに何も設定しないTCPパケットを送信します。
ポートが開いている場合は何も反応がなく、ポートが閉じている場合にRSTパケットで応答されることにより判断します。
つまり、UDPスキャンと同じように判定しています。
Nullスキャン・FINスキャン・Xmasスキャンを使う場面は、ターゲットがステートレスファイアウォールによって守られている場合です。
ステートレスファイアウォールは到達パケットにSYNパケットが設定されているかをチェックします。
そこにSYNパケットと一致しないパケットを送信することで、ファイアウォールを欺きターゲットにアクセスすることができます。
ただし、ステートフルファイアウォールに対してはほぼブロックされるので役に立ちません。
ポートopen 又は フィルタリングされている
スキャン結果:open | filtered
相手からの反応がないので、開いている、もしくはフィルタリングされていると判断します。
ポートclosed
スキャン結果:closed
ターゲットからRSTパケットが返されます。
TCP FINスキャン -sF
実行にはroot権限が必要です。
FINフラグを設定して送信します。
振る舞いはTCP Nullスキャンとほぼ一緒です。
TCP Xmasスキャン -sX
実行にはroot権限が必要です。
FINフラグを設定して送信します。
名前はクリスマスツリーのイルミネーション由来らしいのですが、よく分かりません。
振る舞いはTCP Nullスキャンとほぼ一緒です。
TCP ACKスキャン -sA
実行にはroot権限が必要です。
いきなりACKパケットを送りつけるため、ポートの開閉状態にかかわらずRSTパケットが返されます。
そのためポートが開いているのか閉じているのか判断することはできません。
では何のために使うのかというと、ターゲットのファイアウォールルールや構成を把握するためです。
ファイアウォールが設定されている場合、ACKパケットに応答がなかったポートはファイアウォールによってフィルタリングされていると判断されます。
ただ、TCP SYNスキャンなどを行う事でも、結果的にファイアウォールルールを把握することができます。
ですが、フィルタリング状態を知りたい状況では効率の面で勝るため、そのような場合に使用するのが良いでしょう。
ファイアウォール未設定
スキャン結果:unfiltered
全てのポートからRSTパケットが返ってくるのでファイアウォールルールが設定されていないことは分かりますが、どのポートが開いているかは分かりません。
フィルタリングされていない
スキャン結果:unfiltered
ポートに到達できたACKパケットに対してRSTパケットが返されるため、特定のポートがフィルタリングされていないと判断できます。
TCP Windowスキャン -sW
実行にはroot権限が必要です。
こちらはほぼTCP ACKスキャンと同じでファイアウォールルールの把握に使用します。
違いはターゲットから返ってくるRSTパケットのウィンドウフィールドを調べてポートの開閉状態も調べられることです。
とは言ったものの、開いているポートをclosedと判断することも多く信頼性はかなり低いです。
ですのでTCP ACKスキャンと同じでファイアウォールの判断のために使うべきだと考えます。
フィルタリングされていない
スキャン結果:open, closed
TCP Maimonスキャン -sM
実行にはroot権限が必要です。
FIN,ACKフラグの二つを設定したTCPパケットを送信します。
現代のシステムに対しては、ほとんどの場合うまく機能しませんが、過去にBerkeley Software Distribution由来のシステムに対しては有効だったようです。
つまり、このオプションは実際の場面で有効に使えるものではありません。
ですが、TCPフラグの組み合わせによってターゲットの反応が変化することを理解するのに一役買ってくれると思うので紹介しました。
おわりに
色々なスキャン方法を紹介しましたが、基本的にTCP SYNスキャンをメインにし、うまくいかない場合に他のスキャン方法を試してみる、というのが良いでしょう。
同じスキャン方法でも相手によって本当に色々な反応を見せてくれるのがNmapの面白いところであり難しいところです。
これからも使いながらもっと深く理解していければいいなと思います。