Divide Et Impera And Scan(以及合并扫描结果)
DivideAndScan 用于通过将端口扫描流程分为三个阶段来高效自动化端口扫描:
第一阶段使用 快速端口扫描器,其输出被解析并存储在单个文件数据库(TinyDB)中。接着,在第二阶段,根据数据库数据为每个目标及其开放端口启动单独的 Nmap 扫描(支持多进程)。最后,在第三阶段,使用 nMap_Merger 将独立的 Nmap 输出合并为不同格式的单个报告(XML / HTML / 纯文本 / grepable)。可视化部分由 DrawNmap 提供。
潜在使用场景:
* 可用的端口扫描器:
免责声明。 本仓库中的所有信息仅供教育和研究目的。作者不对任何非法使用本工具的行为负责。

为了成功进行“分而扫描”,我们需要获取一些优秀的端口扫描工具(在下面的示例中,GitHub 发行版通过 eget 获取)。
📑 注意: 如果你不想在宿主操作系统上折腾依赖关系,请跳转到 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 提供,但我建议使用 pipx 从 GitHub 安装,以便始终拥有最新版本:
~$ pipx install -f "git+https://github.com/snovvcrash/DivideAndScan.git"
~$ das
# 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。在第二张截图中,我按主机和端口查看扫描结果:~$ 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 实现一个针对其输出的 parse 方法(位于 das/parsers/DUMMY_SCANNER.py,见 masscan 示例),将你最喜欢的端口扫描器与 DivideAndScan 配对:
from das.parsers import IAddPortscanOutput
class AddPortscanOutput(IAddPortscanOutput):
"""用于处理 DUMMY_SCANNER 输出的子类。"""
def parse(self):
"""
DUMMY_SCANNER 原始输出解析器。
:return: 一对值(端口扫描原始输出文件名,添加到数据库的主机数)
: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} |
-----------------------------------------------------------------------------------------------
位置参数:
{db,add,scan,dns,report,parse,draw,tree,help}
db 手动操作数据库的工具
add 运行完整端口扫描并将输出添加到数据库
scan 针对数据库中的主机和端口运行指定 Nmap 扫描
dns 将输入文件中的域名映射到数据库中对应的 IP 地址
report 将独立的 Nmap 输出合并为单个报告 (https://github.com/CBHue/nMap_Merger)
parse 按服务名称解析原始 Nmap XML 报告,并打印格式为 {service}://{host}:{port} 的条目
draw 可视化 Nmap XML 报告 (https://github.com/jor6PS/DrawNmap)
tree 使用 tree 命令显示 ~/.das/ 目录的内容
help 显示所选端口扫描器的内置 --help 对话框
选项:
-h, --help 显示此帮助信息并退出
-db DB 要操作的数据库名称
嘿,朋友……想来点有组织的端口扫描吗?
fuff 开关以自动化 Web 目录模糊测试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 进程,请指定 输出格式通过 此外,你可以在实际启动扫描之前使用 |
|
为了独立于 📑 注意: 请记住, |