使用 Python 和 ZMap 进行网络扫描的入门指南

2023-04-21 00:00:00 扫描 入门 指南

网络扫描是信息安全领域中常用的一种技术,可以用于发现网络中的漏洞和弱点,从而提高网络安全性。本文将介绍如何使用 Python 和 ZMap 进行网络扫描。

  1. 安装 ZMap

ZMap 是一款快速的端口扫描工具,支持多种协议和端口扫描。在使用之前,需要先安装 ZMap。可以从官网 https://zmap.io/ 下载并安装。

  1. 安装 Python 库

Python 作为一种脚本语言,可以非常灵活地运用于网络扫描中。本文使用 Python 3.x 版本,需要安装以下两个库:scapy 和 ipaddress。

首先安装 scapy:

pip install scapy

然后安装 ipaddress:

pip install ipaddress
  1. 使用 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)。

  1. 使用 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 进行网络扫描的入门指南。网络扫描是一项很复杂的工作,需要高度谨慎和技术支持,请在合适的情况下使用。

相关文章