使用 Python 和 ZMap 进行网络扫描的入门指南
网络扫描是信息安全领域中常用的一种技术,可以用于发现网络中的漏洞和弱点,从而提高网络安全性。本文将介绍如何使用 Python 和 ZMap 进行网络扫描。
- 安装 ZMap
ZMap 是一款快速的端口扫描工具,支持多种协议和端口扫描。在使用之前,需要先安装 ZMap。可以从官网 https://zmap.io/ 下载并安装。
- 安装 Python 库
Python 作为一种脚本语言,可以非常灵活地运用于网络扫描中。本文使用 Python 3.x 版本,需要安装以下两个库:scapy 和 ipaddress。
首先安装 scapy:
pip install scapy
然后安装 ipaddress:
pip install ipaddress
- 使用 Python 和 ZMap 进行端口扫描
有了 ZMap 工具和 Python 库,我们就可以开始编写代码了。本文以扫描目标主机上开放的端口为例。
首先,我们需要定义目标 IP 地址。这里使用了 ipaddress 库,可以通过传入字符串直接设置目标 IP。
import ipaddress target = ipaddress.IPv4Address('192.168.0.1')
接下来,我们需要定义端口范围。这里使用了一个字典,将端口号和端口协议储存在一起。
port_ranges = { 'HTTP': (80, 81), 'HTTPS': (443,), 'FTP': (20, 21), 'SSH': (22,), 'SMTP': (25,), 'POP3': (110,), }
然后,我们可以编写一个函数来扫描目标主机的端口。这里使用了 scapy 库,首先通过 ICMP 包来获取目标主机的 MAC 地址,然后通过 TCP 包来扫描端口。
from scapy.all import * def scan_port(ip, port): src_port = RandShort() dst_port = port[0] prot = port[1] # 构造 ICMP 包,获取目标主机的 MAC 地址 icmp = IP(dst=ip)/ICMP() resp = sr1(icmp, timeout=2) if resp is None: print(f"{port[0]}/{port[1]}: filtered") return else: hw_src = resp.src # 构造 TCP 包,开始扫描端口 tcp = IP(dst=ip)/TCP(sport=src_port, dport=dst_port, flags="S") resp = sr1(tcp, timeout=2) if resp is None: print(f"{port[0]}/{port[1]}: closed") return elif int(resp[TCP].flags) == 18: print(f"{port[0]}/{port[1]}: open") return else: print(f"{port[0]}/{port[1]}: closed") return
接下来,我们可以定义一个循环来对每一个端口进行扫描。
if __name__ == '__main__': for key, val in port_ranges.items(): print(f"Scanning for {key}:") for port in val: scan_port(str(target), (port, key))
这个脚本将会扫描所有指定的端口,并输出端口状态(closed/filtered/open)。
- 使用 ZMap 进行快速扫描
如果需要扫描某个子网中的所有主机和端口,单纯使用 Python 可能速度会比较慢。这时可以结合使用 ZMap 进行快速扫描。
import json import subprocess def zmap_scan(port, cidr): process = subprocess.Popen(['sudo', 'zmap', '-p', port, '-o', '-', cidr], stdout=subprocess.PIPE) out, err = process.communicate() json_data = "[" + out.decode().replace('\n', ',')[:-1] + "]" data = json.loads(json_data) for d in data: if d['saddr']: print(f"{d['saddr']}:{port} {d['status']}")
这个脚本使用了 subprocess 库来执行 ZMap 命令,并将输出转化为 JSON 数据。扫描结果以 IP:PORT 的形式输出。
以上就是使用 Python 和 ZMap 进行网络扫描的入门指南。网络扫描是一项很复杂的工作,需要高度谨慎和技术支持,请在合适的情况下使用。
相关文章