在网络安全领域,端口扫描是一项重要的基础操作,Zmap 作为一款高效的端口扫描工具,备受关注。本文将详细介绍在 Kali 系统上利用 Zmap 搭建攻击炮台的相关内容,包括 Zmap 的介绍、安装、用法以及一些拓展应用。
一、Zmap 介绍
Zmap 是由美国密歇根大学的研究者开发的一款快速端口扫描工具。其独特之处在于采用了高效的扫描方式,能够在极短时间内对大量的 IP 地址进行扫描,为网络安全研究和相关工作提供了有力支持。
(一)工作原理
Zmap 基于 ICMP 协议工作,它通过向目标主机发送大量的 ICMP Echo Request 包来探测目标主机上的端口状态。具体而言,如果目标主机的某个端口处于开放状态,那么它会返回一个 ICMP Echo Reply 包;反之,若端口未开放,则不会有任何响应。借助这种机制,Zmap 能够迅速识别出目标主机上的开放端口。
为进一步提升扫描效率,Zmap 运用了多线程技术,可同时向多个目标主机发送 ICMP Echo Request 包,并快速处理响应,大大缩短了扫描所需的时间。
二、Zmap 安装
在 Kali 系统上安装 Zmap,需要按照以下步骤进行操作:
(一)更新系统和安装依赖(环境准备)
在终端中依次执行以下命令,以更新系统并安装所需的依赖包:
sudo apt-get update
sudo apt install -y build-essential cmake git
(二)克隆 Zmap 项目仓库
使用 git
命令克隆 Zmap 项目仓库到本地,并进入该目录:
git clone https://github.com/zmap/zmap.git
cd zmap
(三)编译和安装 Zmap
在 Zmap 项目目录下创建 build
文件夹,进入该文件夹后,使用 cmake
进行配置,最后执行安装命令:
mkdir build
cd build
cmake..
sudo make install
(四)测试 Zmap 是否安装成功
安装完成后,在终端中输入以下命令,若能正确输出版本信息,则说明 Zmap 已成功安装:
zmap --version
三、Zmap 用法
在使用 Zmap 扫描器之前,务必确保该扫描工具能够找到网关,否则将无法发送数据包。Zmap 的使用涉及众多参数,下面将详细介绍其基本用法和参数说明。
(一)基本用法示例
例如,要扫描 80 端口的 IP,并将结果输出到 output/scan_resutle_ips.txt
文件中,可使用以下命令:
zmap -p 80 -O output/scan_resutle_ips.txt
(二)参数用法说明
Zmap 的参数众多,涵盖基本参数、扫描选项、网络选项、探测模块、数据输出、日志和元数据以及其他选项等多个方面。
-
基本参数: -
-p, --target-port=port
:指定要扫描的端口号,适用于 TCP 和 UDP 扫描。 -
-o, --output-file=name
:设置输出文件。 -
-b, --blacklist-file=path
:指定要排除的子网文件,采用 CIDR 表示法,例如192.168.0.0/16
。 -
-w, --whitelist-file=path
:指定要限制扫描的子网文件,同样使用 CIDR 表示法,例如192.168.0.0/16
。 -
扫描选项: -
-r, --rate=pps
:设置每秒发送的数据包速率。 -
-B, --bandwidth=bps
:设置每秒发送的比特速率,支持 G、M 和 K 后缀。 -
-n, --max-targets=n
:限制要探测的目标数量,可以是数字或地址空间的百分比。 -
-t, --max-runtime=ses
:限制发送数据包的时间长度。 -
-N, --max-results=n
:限制返回的结果数量。 -
-P, --probes=n
:向每个 IP 发送的探测包数量,默认为 1。 -
-c, --cooldown-time=secs
:发送最后一个探测包后继续接收的时间长度,默认为 8 秒。 -
-e, --seed=n
:用于选择地址排列的种子。 -
--retries=n
:如果发送失败,尝试发送数据包的最大次数,默认为 10 次。 -
-d, --dryrun
:不实际发送数据包。 -
--shards=N
:设置总分片数,默认为 1。 -
--shard=n
:设置此扫描的分片编号,从 0 开始索引,默认为 0。 -
网络选项: -
-s, --source-port=port|range
:指定扫描数据包的源端口。 -
-S, --source-ip=ip|range
:指定扫描数据包的源地址。 -
-G, --gateway-mac=addr
:指定网关 MAC 地址。 -
--source-mac=addr
:指定源 MAC 地址。 -
-i, --interface=name
:指定要使用的网络接口。 -
-X, --vpn
:发送 IP 数据包而不是以太网数据包,适用于 VPN 环境。 -
探测模块: -
-M, --probe-module=name
:选择探测模块,默认为tcp_synscan
。 -
--probe-args=args
:传递给探测模块的参数。 -
--list-probe-modules
:列出可用的探测模块。 -
数据输出: -
-f, --output-fields=fields
:指定结果集中应输出的字段。 -
-O, --output-module=name
:选择输出模块,默认为default
。 -
--output-args=args
:传递给输出模块的参数。 -
--output-filter=filter
:对响应字段指定一个过滤器,以限制发送到输出模块的响应。 -
--list-output-modules
:列出可用的输出模块。 -
--list-output-fields
:列出选定探测模块可以输出的所有字段。 -
日志和元数据: -
-v, --verbosity=n
:设置日志详细程度,范围为 0 - 5,默认为 3。 -
-l, --log-file=name
:将日志条目写入文件。 -
-L, --log-directory=directory
:将日志条目写入此目录中的带时间戳的文件。 -
-m, --metadata-file=name
:指定扫描元数据的输出文件(JSON 格式)。 -
-u, --status-updates-file=name
:将扫描进度更新写入 CSV 文件。 -
-q, --quiet
:不打印状态更新。 -
--disable-syslog
:禁用向 syslog 发送日志消息。 -
--notes=notes
:将用户指定的注释插入扫描元数据中。 -
--user-metadata=json
:将用户指定的 JSON 元数据插入扫描元数据中。 -
其他选项: -
-C, --config=filename
:读取配置文件,可在其中指定上述任何选项,默认配置文件为/etc/zmap/zmap.conf
。 -
--max-sendto-failures=n
:在扫描中止之前,NIC 发送失败的最大次数,默认为 -1。 -
--min-hitrate=n
:在扫描中止之前,扫描可以达到的最小命中率,默认为 0.0。 -
-T, --sender-threads=n
:用于发送数据包的线程数,默认为 1。 -
--cores=STRING
:指定要绑定的核心列表,用逗号分隔。 -
--ignore-invalid-hosts
:忽略白名单/黑名单文件中的无效主机。 -
-h, --help
:打印帮助并退出。 -
-V, --version
:打印版本并退出。
(三)示例
以下是一些常见的 Zmap 使用示例:
-
zmap -p 80
:扫描互联网上的 tcp/80 端口主机,并将结果输出到标准输出(stdout)。 -
zmap -N 5 -B 10M -p 80
:以 10 Mb/s 的速度扫描,找到 5 个 HTTP 服务器。 -
zmap -p 80 10.0.0.0/8 192.168.0.0/16 -o
:在 tcp/80 上扫描这两个子网。 -
zmap -p 80 1.2.3.4 10.0.0.3
:在 tcp/80 上扫描 1.2.3.4 和 10.0.0.3。
(四)探测模块(tcp_synscan)帮助
tcp_synscan
探测模块通过发送 TCP SYN 数据包到特定端口进行探测。可能的分类有 synack
和 rst
,其中 SYN - ACK 数据包被视为成功响应,重置数据包则被认为是失败响应。
(五)输出模块(csv)帮助
默认情况下,ZMap 以 ASCII 形式(例如:192.168.1.5
)将唯一的、成功的 IP 地址(例如,来自 TCP SYN 扫描的 SYN - ACK)输出到标准输出(stdout)或指定的输出文件。这一过程由 “csv” 输出模块内部处理,等效于运行 zmap --output-module=csv --output-fields=saddr --output-filter="success = 1 && repeat = 0"
。
四、测试 IP 地址存活性
为了确保扫描得到的 IP 地址可用,我们可以编写测试代码来验证。以下是一个使用 Python 和 requests
库实现的 IP 地址存活性测试示例:
import requests
import re
defload_proxies(file_path):
proxies = []
pattern = re.compile(r"(d{1,3}(?:.d{1,3}){3})(?::(d+))?")
with open(file_path, 'r') as file:
for line in file:
line = line.strip()
match = pattern.search(line)
if match:
ip = match.group(1) # 提取 IP
port = match.group(2) or"80"# 如果未指定端口,则默认 80
proxies.append(f"{ip}:{port}")
return proxies
defcheck_proxy(proxy):
"""验证代理是否可用"""
test_url = "http://www.baidu.com"
proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}
try:
response = requests.get(test_url, proxies=proxies, timeout=2)
if response.status_code == 200:
returnTrue
except Exception:
pass
returnFalse
defsave_proxies(proxies, output_file):
# """保存可用代理到文件"""
with open(output_file, 'w') as file:
for proxy in proxies:
file.write(proxy + 'n')
defmain(input_file, output_file):
proxies = load_proxies(input_file)
print(f"总共加载了 {len(proxies)} 个代理,正在验证...")
valid_proxies = []
for proxy in proxies:
if check_proxy(proxy):
print(f"可用代理: {proxy}")
valid_proxies.append(proxy)
else:
print(f"无效代理: {proxy}")
save_proxies(valid_proxies, output_file)
print(f"验证完成!共找到 {len(valid_proxies)} 个可用代理,已保存到 {output_file}")
if __name__ == "__main__":
# 输入文件和输出文件路径
input_file = f"IP 地址测活\raw_ips.txt"# 输入的代理文件
output_file = f"IP 地址测活\valid_proxies.txt"# 输出的可用代理文件
main(input_file, output_file)
五、BP 添加扩展设置
在某些情况下,我们可能需要为 BP(Burp Suite,一款常用的 Web 安全测试工具)添加扩展设置,以下是相关步骤:
(一)配置 Python 环境
下载 jython.jar
文件,下载地址为:https://repo1.maven.org/maven2/org/python/jython - standalone/2.7.4/
(二)添加环境插件到 BP 工具
完成 jython.jar
文件下载后,按照 BP 工具的相关操作指引,将其添加为环境插件。
(三)设置插件模块
-
下载插件模块:访问链接 https://github.com/Maikefee/BurpAutoProxySwitcherPlugins_Maikefee/tree/main
下载所需的插件模块。 -
添加插件模块:将下载好的插件模块按照 BP 工具的规定方式添加到相应位置。 -
启用插件模块:在 BP 工具中找到已添加的插件模块,并将其启用,使其能够在后续的操作中发挥作用。
原文始发于微信公众号(泷羽Sec-慕云):在 Kali 上利用 Zmap 搭建攻击炮台
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论