
TCPポートスキャナー、SYNパケットを非同期に大量送信し、5分未満でインターネット全体をスキャンします。
これはインターネット規模のポートスキャナです。1台のマシンから1秒間に1000万パケットを送信し、5分未満でインターネット全体をスキャンできます。
使い方(パラメータ、出力)は、最も有名なポートスキャナである nmap と似ています。迷ったら、それらの機能のいずれかを試してみてください。多くのマシンの広範囲スキャンをサポートする機能は対応していますが、単一マシンの詳細スキャンは対応していません。
内部的には、scanrand、unicornscan、ZMap などのポートスキャナと同様の非同期送信を使用しています。より柔軟で、任意のポート範囲とアドレス範囲を指定できます。
注: masscan は独自の アドホック TCP/IP スタック を使用しています。単純なポートスキャン以外の操作を行うと、ローカルの TCP/IP スタックと競合する可能性があります。つまり、異なる IP アドレスから実行するために --src-ip オプションを使用するか、--src-port を使用して masscan が使用するソースポートを設定し、さらに内部ファイアウォール(pf や iptables など)を設定して、それらのポートを OS の他の部分から隔離する必要があります。
このツールは無料ですが、開発への寄付を検討してください: Bitcoin ウォレットアドレス: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
Debian/Ubuntu では、以下のような手順になります。実際には C コンパイラ(gcc や clang など)以外の依存関係はありません。
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
これにより、プログラムは masscan/bin サブディレクトリに配置されます。
インストールするには(Linux 上で)以下を実行します:
make install
ソースは多数の小さなファイルで構成されているため、マルチスレッドビルドを使用するとビルドが大幅に高速化されます。ただし、Raspberry Pi では 2GB を超えるメモリが必要になり(失敗する可能性があります)、すべてのスレッドを使用する代わりに -j4 のような小さい数を使用した方がよい場合があります。
make -j
Linux が主要なターゲットプラットフォームですが、コードは他の多くのシステム(Windows、macOS など)でも問題なく動作します。追加のビルド情報を以下に示します:
make と入力make と入力gmake と入力cc src/*.c -o bin/masscanmacOS では、x86 バイナリは ARM エミュレーション下でも同様に高速に動作するようです。
使い方は nmap と似ています。ネットワークセグメントの特定のポートをスキャンするには:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
これにより:
10.x.x.x サブネットと 2603:3001:2d00:da00::x サブネットをスキャンします<stdout> に出力を表示しますオプションの完全なリストを表示するには、--echo 機能を使用します。これにより、現在の設定がダンプされて終了します。この出力は、プログラムへの入力として再利用できます:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
Masscan はポートが開いているかどうかを検出するだけではありません。TCP 接続を完了し、そのポートのアプリケーションと対話して、簡単な「バナー」情報を取得することもできます。
Masscan は以下のプロトコルのバナーチェックをサポートしています:
これに関する問題は、masscan が実行中のシステムとは別の独自の TCP/IP スタックを持っていることです。ローカルシステムがプローブ対象から SYN-ACK を受信すると、RST パケットで応答し、masscan がバナーを取得する前に接続を切断します。
これを防ぐ最も簡単な方法は、masscan に別の IP アドレスを割り当てることです。これは以下のいずれかの例のようになります:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
選択するアドレスはローカルサブネット上にあり、他のシステムで使用されていない必要があります。Masscan は間違いを警告しますが、数分間他のマシンの通信を妨害する可能性があるため、注意してください。
WiFi などの場合、これが不可能なこともあります。そのような場合は、masscan が使用するポートをファイアウォールでブロックできます。これにより、ローカルの TCP/IP スタックはパケットを見ることができなくなりますが、masscan はローカルスタックをバイパスするため、引き続きパケットを見ることができます。Linux では次のようになります:
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
おそらく、Linux がソースポートとして選択する可能性のあるポートと競合しないポートを選択する必要があります。Linux が使用する範囲を確認し、その範囲を再設定するには、次のファイルを確認します:
/proc/sys/net/ipv4/ip_local_port_range
最新の Kali Linux(2018年8月)では、その範囲は 32768 から 60999 なので、32768 未満または 61000 以上のポートを選択する必要があります。
iptables ルールの設定は、次回の再起動までしか持続しません。iptables-save や iptables-persistent などを使用して、ディストリビューションに応じて設定を保存する方法を調べる必要があります。
Mac OS X および BSD でも同様の手順が必要です。回避すべき範囲を調べるには、次のようなコマンドを使用します:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
FreeBSD および古い MacOS では、ipfw コマンドを使用します:
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
新しい MacOS および OpenBSD では、pf パケットフィルターユーティリティを使用します。
次の行を追加するためにファイル /etc/pf.conf を編集します:
block in proto tcp from any to any port 40000:40015
その後、ファイアウォールを有効にするには、次のコマンドを実行します:
# pfctl -E
ファイアウォールが既に実行中の場合は、次のコマンドでルールをリロードするか、再起動します:
# pfctl -f /etc/pf.conf
Windows は RST パケットで応答しないため、これらの手法は必要ありません。ただし、masscan は独自の IP アドレスを使用するように設計されているため、厳密に必要でない場合でも、可能な限りそのように実行する必要があります。
--heartbleed チェックなど、他のチェックでも同じことが必要です。これらはバナーチェックの一種です。
小規模な内部ネットワークには便利ですが、このプログラムは実際にはインターネット全体を念頭に置いて設計されています。次のようになります:
# masscan 0.0.0.0/0 -p0-65535
インターネット全体をスキャンするのは良くありません。第一に、インターネットの一部はスキャンに悪影響を及ぼします。第二に、一部のサイトはスキャンを追跡し、あなたを禁止リストに追加し、有用なインターネットの部分からファイアウォールで遮断される可能性があります。したがって、多くの範囲を除外する必要があります。範囲をブラックリストまたは除外するには、次の構文を使用します:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
これにより、結果がコマンドラインに出力されるだけです。代わりにファイルに保存したいでしょう。そのためには、次のようなものを使用します:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
これにより、結果が XML ファイルに保存され、データベースなどに簡単にダンプできます。
ただし、これはデフォルトのレート 100 パケット/秒でしか動作しないため、インターネットのスキャンには永遠に時間がかかります。次のように速度を上げる必要があります:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
これによりレートが 100,000 パケット/秒に増加し、インターネット全体(除外範囲を除く)を 1 ポートあたり約 10 時間(全ポートをスキャンする場合は 655,360 時間)でスキャンします。
このコマンドラインで注目すべき点は、これらがすべて nmap 互換のオプションであることです。さらに、nmap 互換の「不可視」オプションも自動的に設定されます: -sS -Pn -n --randomize-hosts --send-eth。同様に、XML ファイルの形式も nmap に触発されています。もちろん、プログラムの非同期的性質が問題への根本的に異なるアプローチにつながるため、多くの違いがあります。
上記のコマンドラインは少し面倒です。すべてをコマンドラインに置く代わりに、ファイルに保存することもできます。上記の設定は次のようになります:
# My Scan
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
この設定ファイルを使用するには、-c を使用します:
# masscan -c myscan.conf
これにより、スキャンを繰り返すときにも簡単になります。
デフォルトでは、masscan は最初に設定ファイル /etc/masscan/masscan.conf を読み込みます。後続の設定パラメータは、このデフォルト設定ファイルの内容を上書きします。私はここに "excludefile" パラメータを記述して、忘れることがないようにしています。自動的に動作します。
デフォルトでは、masscan はかなり大きなテキストファイルを生成しますが、他の形式に簡単に変換できます。サポートされている出力形式は 5 つあります:
xml: パラメータ -oX <filename> を使用するだけです。
または、パラメータ --output-format xml と --output-filename <filename> を使用します。
binary: これは masscan の組み込み形式です。ファイルサイズがはるかに小さくなるため、インターネットをスキャンしてもディスクが満杯になりません。ただし、解析する必要があります。コマンドラインオプション --readscan はバイナリスキャンファイルを読み取ります。--readscan を -oX オプションと一緒に使用すると、結果ファイルの XML バージョンが生成されます。
grepable: これは Nmap の -oG 出力の実装で、コマンドラインツールで簡単に解析できます。パラメータ -oG <filename> を使用するだけです。または、パラメータ --output-format grepable と --output-filename <filename> を使用します。
json: 結果を JSON 形式で保存します。パラメータ -oJ <filename> を使用するだけです。または、パラメータ --output-format json と --output-filename <filename> を使用します。
list: これは、1行に1つのホストとポートのペアを持つ単純なリストです。パラメータ -oL <filename> を使用するだけです。または、パラメータ --output-format list と --output-filename <filename> を使用します。形式は次のとおりです:
<port state> <protocol> <port number> <IP address> <POSIX timestamp>
open tcp 80 XXX.XXX.XXX.XXX 1390380064
合理的であれば、nmap ユーザーにとって使い慣れたものにするためにあらゆる努力が払われていますが、本質的には異なります。Masscan は多数のマシンの広範囲スキャンに調整されており、nmap は単一のマシンまたは小規模範囲の集中スキャン向けに設計されています。
2 つの重要な違いは次のとおりです:
-p <ports> を指定する必要がありますnmap が使用する変則的なサブネット範囲(10.0.0-255.0-255 など)ではありません。masscan は、次の設定が永続的に有効になっていると考えることができます:
-sS: SYN スキャンのみを実行します(現在、将来変更される可能性があります)-Pn: ホストに ping を実行しません。これは非同期動作の基本です-n: DNS 解決は行われません--randomize-hosts: スキャンは常に完全にランダム化され、これは変更できません--send-eth: 生の libpcap を使用して送信します追加の nmap 互換設定のリストが必要な場合は、次のコマンドを使用します:
# masscan --nmap
このプログラムはパケットを非常に高速に送出します。Windows または VM からは 300,000 パケット/秒を処理できます。Linux(仮想化なし)では、160 万パケット/秒を処理します。これは、ほとんどのネットワークを溶かすのに十分な速度です。
なお、溶かすのは自分のネットワークだけです。ターゲット IP アドレスがランダム化されているため、遠くのネットワークを圧倒することはありません。
デフォルトでは、レートは 100 パケット/秒に設定されています。レートを 100 万に上げるには、--rate 1000000 のようなものを使用します。
IPv4 インターネットをスキャンする場合、多数のサブネットをスキャンすることになるため、多くのパケットが送出されていても、各ターゲットサブネットが受信するパケットレートは低くなります。