
全ポートスキャン結果を分割し、対象を絞ったNmap実行に活用する
Divide Et Impera And Scan(そしてスキャン結果も統合)
DivideAndScan(ディバイド・アンド・スキャン)は、ポートスキャン処理を3つのフェーズに分割することで効率的に自動化するために使用されます。
第1フェーズでは高速ポートスキャナーを使用することを想定しており、その出力は解析されて単一ファイルのデータベース(TinyDB)に保存されます。次に、第2フェーズでは、データベースのデータに基づいて、各ターゲットの開いているポートのセットに対して個別のNmapスキャンが開始されます(マルチプロセッシング対応)。最後に、第3フェーズでは、個別のNmap出力がnMap_Mergerを使用して、異なる形式(XML / HTML / 簡易テキスト / grepable)の単一レポートに統合されます。可視化部分はDrawNmapによって提供されます。
考えられるユースケース:
* 利用可能なポートスキャナー:
免責事項. このリポジトリに含まれるすべての情報は、教育および研究目的でのみ提供されています。作者は本ツールの不正使用に対して一切の責任を負いません。

divide and scan を正常に行うには、優れたポートスキャンツールをいくつか入手する必要があります(以下の例では、GitHubリリースはeget経由で取得しています)。
📑 注: ホストOSに依存関係をインストールしたくない場合は、Dockerのセクションに進んでください。
sudo apt install nmap xsltproc -y
sudo nmap --script-updatedb
pushd /tmp
wget https://github.com/ivre/masscan/archive/refs/heads/master.zip -O masscan-master.zip
unzip masscan-master.zip
cd masscan-master
make
sudo make install
popd && rm -rf /tmp/masscan-master*
eget -t 2.0.1 -a amd64 RustScan/RustScan --to /tmp/rustscan.deb
sudo dpkg -i /tmp/rustscan.deb && rm /tmp/rustscan.deb
sudo wget https://gist.github.com/snovvcrash/8b85b900bd928493cd1ae33b2df318d8/raw/fe8628396616c4bf7a3e25f2c9d1acc2f36af0c0/rustscan-ports-top1000.toml -O /root/.rustscan.toml
sudo mkdir /opt/naabu
sudo eget -s linux/amd64 projectdiscovery/naabu --to /opt/naabu
sudo ln -sv /opt/naabu/naabu /usr/local/bin/naabu
sudo mkdir /opt/nimscan
sudo eget -a NimScan elddy/NimScan --to /opt/nimscan
sudo ln -sv /opt/nimscan/nimscan /usr/local/bin/nimscan
sudo mkdir /opt/sx
sudo eget -s linux/amd64 v-byte-cpu/sx --to /opt/sx
sudo ln -sv /opt/sx/sx /usr/local/bin/sx
sudo mkdir /opt/pd
sudo eget -s linux/amd64 projectdiscovery/dnsx --to /opt/pd
sudo ln -sv /opt/pd/dnsx /usr/local/bin/dnsx
DivideAndScan は PyPI に divideandscan として公開されていますが、最新版を常に利用できるようにするため、GitHub から pipx を使用してインストールすることをお勧めします:
~$ pipx install -f "git+https://github.com/snovvcrash/DivideAndScan.git"
~$ das
shiv でパッケージ化された リリース もあります(ただしファイルサイズは大きめです):
# shiv -e das.divideandscan:main -o das.pyz divideandscan
~$ wget https://github.com/snovvcrash/DivideAndScan/releases/latest/download/das.pyz && chmod +x das.pyz
~$ ./das.pyz
デバッグ目的で、poetry を使用して開発環境をセットアップすることもできます:
~$ git clone --recurse-submodules https://github.com/snovvcrash/DivideAndScan
~$ cd DivideAndScan
~$ poetry install
~$ poetry run das
📑 注: DivideAndScan はすべてのポートスキャナーを実行する際に sudo を使用するため、スキャンコマンドを実行するときにパスワードの入力を求められます。
Docker コンテナ内で DivideAndScan を次のように実行できます:
~$ docker run --rm -it --name das -v ~/.das:/root/.das -v `pwd`:/app -p 8050:8050 snovvcrash/divideandscan
ツールは入力データを必要とし、出力データを生成するため、現在の作業ディレクトリをコンテナ内の /app にマウントポイントとして指定する必要があります。また、ホスト側でポート8050を公開すると、Nmapレポートの可視化に使用されるDashアプリにアクセスできます。
エイリアスを設定してベースコマンドを短くすることもできます:
~$ alias das='docker run --rm -it --name das -v ~/.das:/root/.das -v `pwd`:/app -p 8050:8050 snovvcrash/divideandscan'
~$ das

|
|
Hack The Box 上のすべての稼働マシンの開いているポートを列挙してみましょう。
-p1-49151 を使用して動的ポート範囲を除外し、不要な情報を避けます。2つ目のスクリーンショットでは、ホスト別とポート別にスキャン結果を確認しています:~$ das -db htb add -rm masscan '-e tun0 --rate 1000 -iL hosts.txt -p1-49151 --open'
~$ das -db htb scan -hosts all -show
~$ das -db htb scan -ports all -show
~$ das -db htb scan -hosts all -oA report
~$ das -db htb scan -hosts all -oA report -nmap '-Pn -sVC -O' -parallel
お気に入りのポートスキャナーをDivideAndScanと連携させるには、das/parsers/DUMMY_SCANNER.py にその出力のための単一の parse メソッドを実装してください(masscanの例を参照):
from das.parsers import IAddPortscanOutput
class AddPortscanOutput(IAddPortscanOutput):
"""DUMMY_SCANNER出力を処理するための子クラス."""
def parse(self):
"""
DUMMY_SCANNERの生出力パーサー.
:return: 2つの値のペア(ポートスキャン生出力のファイル名、DBに追加されたホスト数)
:rtype: tuple
"""
hosts = set()
for line in self.portscan_raw:
# DUMMY_SCANNERパーサーの実装
pass
return (self.portscan_out, len(hosts))
usage: das [-h] [-db DB] {db,add,scan,dns,report,parse,draw,tree,help} ...
-----------------------------------------------------------------------------------------------
| ________ .__ .__ .___ _____ .____________ |
| \______ \ |__|__ _|__| __| _/____ / _ \ ____ __| _/ _____/ ____ _____ ____ |
| | | \| \ \/ / |/ __ |/ __ \ / /_\ \ / \ / __ |\_____ \_/ ___\\__ \ / \ |
| | ` \ |\ /| / /_/ \ ___// | \ | \/ /_/ |/ \ \___ / __ \| | \ |
| /_______ /__| \_/ |__\____ |\___ >____|__ /___| /\____ /_______ /\___ >____ /___| / |
| \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ |
| {@snovvcrash} {https://github.com/snovvcrash/DivideAndScan} {vX.Y.Z} |
-----------------------------------------------------------------------------------------------
positional arguments:
{db,add,scan,dns,report,parse,draw,tree,help}
db DBの手動操作のためのユーティリティ
add フルポートスキャンを実行し、出力をDBに追加
scan DB内のホストとポートに対してターゲットNmapスキャンを実行
dns 入力ファイルのドメイン名をDB内の対応するIPアドレスにマッピング
report 個別のNmap出力を単一のレポートに統合(https://github.com/CBHue/nMap_Merger)
parse Nmapの生XMLレポートをサービス名で解析し、{service}://{host}:{port} 形式でエントリを出力
draw Nmap XMLレポートを可視化(https://github.com/jor6PS/DrawNmap)
tree ~/.das/ ディレクトリの内容をtreeを使用して表示
help 選択したポートスキャナーの組み込み --help ダイアログを表示
options:
-h, --help このヘルプメッセージを表示して終了
-db DB 操作するDB名
Psst, ちょっと聞いてくれよ... 組織的なp0r7 5c4nn1n6をやってみないか?
fuff スイッチを追加parse モジュールを追加)⚠️ 警告: ポートスキャンツールのほとんどは、不適切に使用するとシステムに損傷を与える可能性があるため、使用する内容をよく理解していることを確認してください。
# Nmap, 正しく解析するには -v フラグが常に必要です!
~$ das add nmap '-v -n -Pn -e eth0 --min-rate 1000 -T4 -iL hosts.txt -p1-65535 --open'
# Masscan
~$ das add masscan '--rate 1000 -iL hosts.txt -p1-65535 --open'
# RustScan
~$ das add rustscan '-b 1000 -t 2000 -u 5000 -a hosts.txt -r 1-65535 -g --no-config'
# Naabu
~$ das add naabu '-rate 1000 -iL hosts.txt -p - -silent -s s'
# NimScan
~$ das add nimscan '192.168.1.0/24 -vi -p:1-65535 -f:500'
# sx
~$ sudo sx arp -i eth0 192.168.1.0/24 --json | tee arp.cache
~$ das add sx 'tcp syn -a arp.cache -i eth0 --rate 1000/s 192.168.1.0/24 -p 445,3389'
モジュールが動作を開始すると、~/.das/db ディレクトリが作成され、モジュールルーチンが完了するとデータベースファイルと生のスキャン結果が配置されます。
|
複数のプロセスでNmapを同時に起動するには、 出力形式は、 また、実際にスキャンを開始する前に、 |
|
📑 注: |