Masscanの使い方:インターネット規模の高速ポートスキャンを実行する

セキュリティツール

この記事では、非常に高速なポートスキャナーであるMasscanのインストール方法、基本的な使い方、主要なオプション、そして実践的な利用例について詳しく解説します。

Masscanとは? 🤔

Masscanは、Robert David Graham氏によって開発された、インターネット全体を非常に高速にスキャンすることを目的としたオープンソースのポートスキャナーです。その最大の特徴は、非同期送信とカスタムTCP/IPスタックを採用することにより、1台のマシンから毎秒1000万パケット以上を送信できる驚異的なスキャン速度です。理論上、インターネット全体(IPv4)の単一ポートをわずか数分でスキャン完了できるとされています。

Masscanは、多くのコマンドラインオプションや出力形式において、有名なポートスキャナーであるNmapと似た使用感を提供しますが、目的と内部動作は大きく異なります。Nmapが特定のターゲットに対する詳細な調査(OS検出、サービスバージョン検出、脆弱性スキャンなど)を得意とするのに対し、Masscanは広範囲のIPアドレスに対して、どのポートが開いているかを迅速に特定することに特化しています。

主な特徴:

  • 圧倒的なスキャン速度: 非同期アーキテクチャにより、毎秒数百万〜千万パケットの送信が可能。
  • スケーラビリティ: インターネット全体のような広大なネットワーク範囲のスキャンに適しています。
  • 柔軟性: 任意のIPアドレス範囲とポート範囲を指定できます。
  • Nmap互換性(一部): 多くのオプションや出力形式がNmapと似ており、Nmapユーザーにとって学習コストが比較的低いです。
  • バナー取得機能: 単純なポートの開閉だけでなく、TCP接続を確立して一部プロトコル(HTTP, SSH, FTPなど)のバナー情報を取得できます。
  • クロスプラットフォーム: Linux, macOS, Windowsで動作します(ただし、パフォーマンスはLinuxが最も高い傾向にあります)。

注意: Masscanは非常に強力なツールですが、その高速性ゆえに、ターゲットネットワークや自身のネットワークに予期せぬ負荷をかける可能性があります。必ず許可されたネットワークに対してのみ使用し、法的・倫理的な問題を十分に考慮してください。無許可のスキャンは法律に違反する可能性があり、深刻な結果を招くことがあります。

インストール方法 💻

Masscanは主要なOSにインストールできます。ここでは一般的な方法をいくつか紹介します。

Linux (Debian/Ubuntu系)

aptパッケージマネージャを使用して簡単にインストールできます。

sudo apt update
sudo apt install masscan -y

Linux (CentOS/Fedora/RHEL系)

yum/dnfパッケージマネージャを使用します。

sudo yum update  # CentOS 7など
sudo dnf update  # Fedora, RHEL 8+など
sudo yum install masscan -y # CentOS 7など
sudo dnf install masscan -y # Fedora, RHEL 8+など

もしディストリビューションのリポジトリに含まれていない場合は、ソースからコンパイルする必要があります。

macOS

Homebrewを使用するのが最も簡単です。

brew update
brew install masscan

ソースからコンパイル (Linux/macOS)

最新版を使いたい場合や、ディストリビューションのパッケージがない場合は、GitHubリポジトリからソースコードを取得してコンパイルします。

まず、必要な開発ツールとライブラリをインストールします。

Debian/Ubuntu系:

sudo apt update
sudo apt install git gcc make libpcap-dev -y

CentOS/Fedora/RHEL系:

sudo yum update # または dnf update
sudo yum groupinstall "Development Tools" -y # または dnf groupinstall "Development Tools" -y
sudo yum install git libpcap-devel -y # または dnf install git libpcap-devel -y

次に、Masscanのソースコードをクローンしてコンパイル、インストールします。

git clone https://github.com/robertdavidgraham/masscan
cd masscan
make -j$(nproc) # nprocでCPUコア数を取得し並列コンパイル
sudo make install

make install を実行すると、通常 /usr/local/bin に実行ファイルが配置されます。

Windows

WindowsでMasscanを使用するには、いくつかの準備が必要です。

  1. Npcapのインストール: Masscanは低レベルのネットワークアクセスにNpcap (WinPcapの後継) を使用します。Npcap公式サイトからダウンロードしてインストールしてください。インストール時には「WinPcap API互換モード」を有効にすることをおすすめします。
  2. Masscanの取得:
    • コンパイル済みバイナリ: 時折、GitHub ReleasesページにWindows用のコンパイル済みバイナリが提供されることがあります。ただし、常に最新とは限りません。
    • ソースからコンパイル:
      1. Visual Studio (Community Editionで可) とC/C++開発ツールをインストールします。
      2. GitHubからソースコードをダウンロードまたはクローンします (git clone https://github.com/robertdavidgraham/masscan)。
      3. Npcap SDK (Npcapインストール時にオプションで導入可能) を適切な場所に配置し、Visual Studioがヘッダファイルやライブラリを見つけられるように設定します。
      4. Masscanソース内のVisual Studioプロジェクトファイル (masscan-1.3.2/vs10 などにある .sln ファイル) を開き、必要に応じてプロジェクト設定を調整 (プラットフォームターゲット、SDKバージョンなど) してビルドします。特定のVisual Studioバージョンでコンパイルエラーが出る場合、ソースコード (例: string_s.h) のバージョンチェック部分の修正が必要になることがあります。

Windowsでの利用はLinuxやmacOSに比べてパフォーマンスが劣る傾向がある点に注意してください。

基本的な使い方 🚀

Masscanの基本的な構文は以下の通りです。

sudo masscan [ターゲットIP/範囲] -p[ポート] [オプション]

注意: Masscanはrawソケットを使用してパケットを送受信するため、通常root権限 (sudo) が必要です。

単一IP・単一ポートのスキャン

特定のIPアドレスの特定のポート(例: 80番ポート)をスキャンします。

sudo masscan 192.168.1.1 -p80

単一IP・複数ポートのスキャン

カンマ区切りで複数のポートを指定できます。

sudo masscan 192.168.1.1 -p80,443,22

ポート範囲を指定することも可能です。

sudo masscan 192.168.1.1 -p1-1024

リストと範囲を組み合わせることもできます。

sudo masscan 192.168.1.1 -p21-23,80,443,8000-8080

IPアドレス範囲のスキャン

CIDR表記を使ってネットワーク範囲を指定できます。

sudo masscan 192.168.1.0/24 -p22

ハイフンを使った範囲指定も可能です。

sudo masscan 10.0.0.1-10.0.0.255 -p445

複数のターゲットをカンマ区切りやスペース区切りで指定することもできます。

sudo masscan 192.168.1.0/24 10.0.0.5 -p53

ファイルからターゲットを読み込む

スキャン対象のIPアドレスや範囲を記述したファイルを指定します (-iL オプション)。

targets.txt の例:

192.168.1.0/24
10.0.0.5
172.16.10.1-172.16.10.50

コマンド:

sudo masscan -p80,443 -iL targets.txt

スキャン速度の指定

--rate オプションで1秒あたりに送信するパケット数を指定します。デフォルトは100 pps (packets per second) と非常に遅いため、通常はこの値を大きくする必要があります

# 毎秒10,000パケットでスキャン
sudo masscan 192.168.1.0/24 -p1-1000 --rate 10000

非常に重要: --rate を高く設定しすぎると、自身のネットワーク機器(ルーター、ファイアウォール)や回線、あるいはスキャン対象のネットワークに過負荷をかける可能性があります。特に内部ネットワークをスキャンする場合は注意が必要です。インターネットをスキャンする場合でも、自身のISPから警告を受けたり、接続を制限されたりするリスクがあります。最初は低いレートから試し、徐々に上げていくことを推奨します。適切なレートは環境に大きく依存します。

主要なオプション ⚙️

Masscanには多くのオプションがありますが、ここでは特によく使われるものを紹介します。

オプション 説明
-p <ports>
--ports <ports>
スキャンするポートを指定します。必須オプションです。単一(80)、範囲(20-25)、リスト(80,443)、組み合わせ(U:53,T:21-25,80)が可能です。U:でUDPポート、T:(デフォルト)でTCPポートを指定できます。 -p80,443
-p1-65535
--ports U:161,T:22
--rate <pps> 1秒あたりの送信パケット数を指定します。デフォルトは100。環境に合わせて調整が必要です。 --rate 100000
--banners TCP接続を確立し、対応プロトコル(HTTP, SSH, FTP, SMTP, POP3, IMAP, SMB, Telnet, RDP, VNC, Memcachedなど)のバナー情報を取得しようと試みます。スキャン速度は低下します。 --banners
-oX <filename> 結果をXML形式でファイルに出力します。NmapのXML形式に似ています。 -oX scan_results.xml
-oG <filename> 結果をGrepable形式(各ホスト:ポートが1行)でファイルに出力します。コマンドラインツールでの処理に適しています。 -oG scan_results.grep
-oJ <filename> 結果をJSON形式でファイルに出力します。プログラムでの扱いに便利です。 -oJ scan_results.json
-oL <filename> 結果をリスト形式(1行に1つのホストとポート)でファイルに出力します。シンプルで扱いやすい形式です。 -oL scan_results.list
-oB <filename> 結果をMasscan独自のバイナリ形式で出力します。ファイルサイズが小さくなりますが、--readscanで読み込む必要があります。 -oB scan_results.bin
--readscan <binary-file> -oBで保存したバイナリファイルを読み込み、他の形式 (-oX, -oJ など) で出力します。 masscan --readscan results.bin -oX results.xml
--exclude <ip/range> 指定したIPアドレスまたは範囲をスキャン対象から除外します。 --exclude 192.168.1.1
--excludefile <filename> ファイルに記述されたIPアドレスや範囲をスキャン対象から除外します。特に広範囲をスキャンする際に、スキャンしてはいけない範囲(DoDなど)を指定するのに役立ちます。 --excludefile exclude.txt
-iL <filename> ファイルからスキャン対象のIPアドレスや範囲を読み込みます。 -iL targets.txt
-e <interface>
--adapter <interface>
使用するネットワークインターフェースを指定します(例: eth0, en0)。複数のインターフェースがある場合に便利です。 -e eth1
--adapter-ip <ip> 指定したインターフェース上で、このIPアドレスを送信元として使用します。OSのTCP/IPスタックとの衝突を避けるために推奨される方法です。 --adapter-ip 192.168.1.101
--source-ip <ip> 送信元IPアドレスを偽装します。通常、--adapter-ip が推奨されます。ファイアウォールのバイパスなどに使われることがありますが、注意と権限が必要です。 --source-ip 10.1.2.3
--source-port <port> 送信元ポートを指定します。特定のポートからのトラフィックを許可するファイアウォールを回避するために使用されることがあります。範囲指定も可能ですが、範囲サイズは2のべき乗である必要があります (例: 40000-40003)。 --source-port 53
--source-port 40000-40003
--wait <seconds> パケット送信完了後、応答を待機する時間(秒)を指定します。デフォルトは10秒。foreverを指定すると無期限に待機します。 --wait 30
--resume <filename> 中断されたスキャン(Ctrl+Cで停止すると paused.conf が生成される)を再開します。 --resume paused.conf
--top-ports <number> Nmapで定義されている上位N個のTCPポートをスキャンします。ポート番号を個別に指定する手間が省けます。 --top-ports 100
--ping TCP/UDPスキャンに加えてICMP Echoリクエスト(ping)を送信します。 --ping
--nmap Nmap互換のオプションを表示します。 masscan --nmap
--echo スキャンを実行せず、現在の設定をファイル (通常 echo.conf) に出力します。デバッグや設定確認に便利です。 --echo
-c <filename>
--conf <filename>
設定ファイルを読み込みます。コマンドライン引数よりも優先順位が低いです。デフォルトで /etc/masscan/masscan.conf (存在する場合) が読み込まれます。 -c my_scan.conf

実践的な使い方と例 ✨

特定のサブネットのWebサーバー(HTTP/HTTPS)を高速スキャン

192.168.0.0/16 の範囲にあるWebサーバー(ポート80と443)を、毎秒5万パケットの速度でスキャンし、結果をJSONファイルに保存します。

sudo masscan 192.168.0.0/16 -p80,443 --rate 50000 -oJ web_servers.json

インターネット全体から特定の脆弱なポートを探す (注意!)

⚠️ 警告: 以下のコマンドはインターネット全体をスキャンします。実行する前に、法的・倫理的な影響、ISPの利用規約、そして自身のネットワークへの影響を十分に理解し、必要な許可を得てください。無許可での広範囲スキャンは絶対に避けてください。

例として、特定の古いプロトコルのポート(例: Telnet 23番)がインターネット上でどれだけ開いているかを調査する場合(レートは低めに設定)。除外リスト (exclude.txt) を使用して、既知のセンシティブな範囲を除外することが強く推奨されます。

exclude.txt の例:

# DoD Networks, etc.
3.0.0.0/8
6.0.0.0/8
... (その他、スキャンすべきでない範囲)

コマンド:

sudo masscan 0.0.0.0/0 -p23 --rate 100000 --excludefile exclude.txt -oL open_telnet.list

このコマンドは、0.0.0.0/0 (インターネット全体) の23番ポートを毎秒10万パケットでスキャンし、exclude.txt に記載された範囲を除外し、結果をリスト形式で open_telnet.list に保存します。--rate は状況に応じて調整が必要です。

Nmapでよく使われる上位ポートをスキャン

--top-ports オプションを使うと、よく開いているとされるポートを簡単にスキャンできます。

sudo masscan 10.0.0.0/8 --top-ports 100 --rate 50000 -oG top100_scan.grep

バナー情報を取得する

SSHサーバー(ポート22)を探し、バナー情報を取得してみます。OSのスタックとの衝突を避けるため --adapter-ip を使うことが推奨されます。

# 事前に未使用のIPアドレス 192.168.1.200 を用意しておく
sudo masscan 192.168.1.0/24 -p22 --banners --adapter-ip 192.168.1.200 --rate 1000 -oJ ssh_banners.json

スキャンの中断と再開

大規模なスキャンは時間がかかることがあります。途中で中断したい場合は Ctrl+C を押します。これにより paused.conf というファイルが生成されます。

sudo masscan 0.0.0.0/0 -p443 --rate 1000000 -oX massive_scan.xml
^C  # Ctrl+C を押す
waiting 10-secs for response packets -- saving partial results to 'paused.conf'

後でスキャンを再開するには、--resume オプションを使用します。

sudo masscan --resume paused.conf

paused.conf はテキストファイルなので、再開前にレートなどの設定を変更することも可能です。

設定ファイルの使用

繰り返し行うスキャンや複雑な設定は、設定ファイルにまとめておくと便利です。設定ファイルの書式は オプション名 = 値 です。

my_scan.conf の例:

# スキャン対象の範囲
range = 10.0.0.0/8, 192.168.1.0/24
# スキャンするポート
ports = 21-25,80,110,143,443,445,3389
# スキャンレート (pps)
rate = 50000.00
# 出力形式とファイル名
output-format = json
output-filename = scan_output.json
# 除外リストファイル
excludefile = /etc/masscan/global_exclude.txt
# バナー取得
banners = true
# 待機時間
wait = 15
# 使用インターフェース
adapter = eth0
adapter-ip = 10.0.0.100

コマンド:

sudo masscan -c my_scan.conf

デフォルトで /etc/masscan/masscan.conf が読み込まれるため、ここに共通の除外リストなどを記述しておくと便利です。

出力形式について 📄

Masscanは複数の出力形式をサポートしており、目的に応じて選択できます。

  • 標準出力 (デフォルト): 基本的な情報がコンソールに表示されますが、通常はファイルに出力します。
  • XML (-oX): Nmap互換のXML形式。構造化されており、他のツールでの解析やインポートに適しています。
  • Grepable (-oG): 1行に1つの発見(ホストとポート)が出力されます。grep, awk, sort などのコマンドラインツールでの処理が容易です。
  • JSON (-oJ): JSON形式。Web APIやスクリプトでの利用、データベースへのインポートに適しています。
  • List (-oL): シンプルなリスト形式。1行に「状態 ポート/プロトコル IPアドレス タイムスタンプ」が出力されます。
  • Binary (-oB): Masscan独自のバイナリ形式。ファイルサイズが最も小さくなりますが、人間が直接読むことはできず、masscan --readscan コマンドで他の形式に変換する必要があります。大規模スキャンでディスク容量を節約したい場合に有効です。

例: バイナリ形式で保存し、後でXMLに変換する

# スキャンを実行し、バイナリで保存
sudo masscan 192.168.1.0/24 -p1-1000 --rate 10000 -oB scan_data.bin

# バイナリファイルを読み込み、XML形式で出力
masscan --readscan scan_data.bin -oX scan_data.xml

パフォーマンスと注意点 ⚡️⚠️

Masscanの最大の利点は速度ですが、それに伴う注意点も理解しておく必要があります。

  • レート (--rate): 最も重要なパラメータです。高すぎると自身やターゲットのネットワークに問題を引き起こす可能性があります。Linux環境(物理マシン)が最も高いレートを出しやすく、仮想環境やWindows/macOSではパフォーマンスが低下する傾向があります。PF_RINGドライバを使用するとさらに高速化できますが、別途インストールと設定が必要です。
  • 応答待機時間 (--wait): パケット送信完了後に応答を待つ時間です。ネットワークの遅延が大きい場合や、応答が遅いサーバーがある場合は、この値を増やす必要があるかもしれません。デフォルトは10秒です。
  • OSのTCP/IPスタックとの衝突: Masscanは独自のTCP/IPスタックを使用するため、特にバナー取得 (--banners) などでTCP接続を確立する場合、OS側のスタックが予期せぬRSTパケットなどを送信し、スキャン結果に影響を与えることがあります。これを避けるために、--adapter-ip でMasscan専用のIPアドレスを割り当てるか、OSのファイアウォール (iptablesなど) でMasscanが使用する送信元ポート範囲からのRST送信をブロックする設定が推奨されます。
  • ランダム化: MasscanはターゲットIPアドレスとポートをランダムな順序でスキャンします。これにより、特定のサブネットへの負荷集中を防ぎ、検知されにくくする効果があります。この動作は変更できません。
  • SYNスキャン: デフォルトではSYNスキャン(Nmapの-sSに相当)を実行します。これは比較的ステルス性が高く高速ですが、完全なTCP接続を確立しません(--bannersなしの場合)。
  • Pingなし: デフォルトではホストの生存確認(Ping)を行いません(Nmapの-Pnに相当)。これにより、ファイアウォールでICMPがブロックされているホストも見つけられますが、存在しないIPアドレスにもパケットを送信します。
  • DNS解決なし: MasscanはIPアドレスまたは範囲のみを扱います。ホスト名の解決は行いません(Nmapの-nに相当)。

倫理的な考慮事項と合法性 ⚖️

Masscanはその能力の高さから、使い方を誤ると深刻な問題を引き起こす可能性があります。

  • 許可なきスキャンは禁止: 自身が所有または管理するネットワーク、あるいは明示的な書面による許可を得たネットワーク以外をスキャンすることは、多くの国や地域で違法行為とみなされます。
  • 利用規約の確認: クラウドプロバイダーやホスティングサービスなどは、そのネットワーク内でのスキャン行為に関して独自の利用規約を定めている場合があります。規約を確認し、遵守してください。
  • DoS攻撃と誤解されるリスク: 高速なスキャンは、ターゲットから分散型サービス妨害(DDoS)攻撃の一部と誤解される可能性があります。
  • 責任ある使用: ネットワークの所有者に迷惑をかけないよう、レート制限を適切に行い、不必要なスキャンは避けてください。--excludefile を活用し、重要なインフラやスキャンすべきでない範囲を除外しましょう。
  • 目的の明確化: セキュリティ評価、脆弱性調査、ネットワークインベントリ作成など、正当な目的のためにのみ使用してください。

技術的な好奇心や学習目的であっても、許可なく他者のネットワークをスキャンする行為は絶対に避けるべきです。自身の管理下にある実験環境など、安全かつ合法的な範囲でツールを使用してください。

Masscanは、セキュリティ専門家やネットワーク管理者が広範囲のネットワークを効率的に調査するための強力なツールですが、その力には大きな責任が伴います。常に倫理観を持ち、法律を遵守して使用することが不可欠です。

まとめ ✅

Masscanは、インターネット規模のネットワークや大規模な内部ネットワークに対して、ポートスキャンを驚異的な速度で実行できるツールです。非同期送信メカニズムにより、従来のポートスキャナよりもはるかに高速なスキャンを実現します。

主なポイント:

  • インストールは各OSのパッケージマネージャやソースコンパイルで行えます。
  • 基本的な使い方は sudo masscan [ターゲット] -p[ポート] --rate [速度] です。
  • --rate の調整がパフォーマンスとネットワークへの影響の鍵となります。
  • XML, JSON, Grepable, List, Binaryなど多様な出力形式をサポートします。
  • --banners でサービス情報を取得できますが、速度は低下し、OSスタックとの干渉に注意が必要です。
  • スキャンの中断 (Ctrl+C) と再開 (--resume) が可能です。
  • 最も重要なこととして、常に許可されたネットワークに対してのみ、責任を持って使用してください。

Masscanを適切に活用することで、ネットワークの状況把握やセキュリティ評価を効率的に行うことができます。ただし、その強力な機能を理解し、倫理的かつ合法的に使用することが求められます。 Happy (responsible) scanning! 😊

コメント

タイトルとURLをコピーしました