通过这些出色的脚本提高NMAP性能
#python #网络安全 #nmap #scripts

在本文中,我将向您展示如何使用Python脚本来修复Nmap性能问题。到本文结束时,您将更好地了解NMAP的工作原理以及如何使用Python扩展其功能。

识别NMAP中的性能瓶颈

在开始解决NMAP性能问题之前,您需要在扫描过程中识别瓶颈。我亲身知道什么是瓶颈,因为我曾经尝试在非常慢的计算机上进行NMAP扫描。可以说我有足够的时间吃午餐。

要识别NMAP中的瓶颈,您需要了解其执行这些技术的方法。您可以使用–d标志来增加NMAP的调试级别,并查看引擎盖下发生的事情。

例如,如果您想查看NMAP执行TCP端口扫描时在做什么,则可以使用以下命令:

nmap -d -p 1-65535 <target>

这将运行具有用于TCP端口扫描的调试输出的NMAP扫描。查看输出,看看NMAP大部分时间都在哪里花费。

在NMAP中识别性能瓶颈的另一个有用的工具是Wireshark。通过捕获NMAP生成的网络流量,您可以看到发送和接收到哪些数据包以及NMAP获得响应需要多长时间。

Wireshark Terminal

用Python优化NMAP性能

现在,您已经确定了NMAP中的性能瓶颈,开始使用Python优化其性能。有几种方法可以做到这一点,包括:

加快NMAP扫描的最有效方法之一是使它们并行。 NMAP支持使用-PN标志的并行扫描,该标志告诉NMAP跳过主机发现,并假设所有主机都已上升。您可以将此标志与Python的多处理库并行运行多个NMAP扫描。

这是一个示例Python脚本,它使用多处理并行运行NMAP扫描:

import multiprocessing
import subprocess

def nmap_scan(ip):
    command = "nmap -Pn " + ip
    subprocess.call(command, shell=True)

if __name__ == '__main__':
    ips = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
    with multiprocessing.Pool(processes=3) as pool:
        pool.map(nmap_scan, ips)

此脚本将使用三个进程并行运行三个IP地址的NMAP扫描。您可以根据计算机上的核心数量调整过程数量。

此外,您可以通过限制扫描端口的数量来进一步提高脚本的性能。默认情况下,NMAP扫描所有65,535个端口,但是在大多数情况下,您只需要扫描这些端口的一个子集。

要限制扫描端口的数量,您可以在NMAP中使用-P标志,并指定要扫描的端口范围。例如,如果您只想扫描前1000个端口,则可以使用标志 - p1â1000。

这是脚本的更新版本:

import nmap
import multiprocessing

def nmap_scan(ip):
    nm = nmap.PortScanner()
    nm.scan(ip, arguments='-sS -p 1-1000')
    print(nm.csv())

if __name__ == '__main__':
    ips = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
    processes = []
    for ip in ips:
        p = multiprocessing.Process(target=nmap_scan, args=(ip,))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

通过限制扫描的端口数量,您可以减少NMAP完成扫描所需的时间,从而更快地进行整体性能。

现在添加了错误处理和参数解析,脚本现在看起来像这样:

import argparse
import nmap
import multiprocessing

def nmap_scan(ip):
    try:
        nm = nmap.PortScanner()
        nm.scan(ip, arguments='-sS -p 1-1000')
        print(nm.csv())
    except nmap.PortScannerError as e:
        print(f"Error while scanning {ip}: {e}")

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--ips', nargs='+', required=True, help='List of IP addresses to scan')
    parser.add_argument('--processes', type=int, default=multiprocessing.cpu_count(), help='Number of processes to use')
    args = parser.parse_args()

    processes = []
    for ip in args.ips:
        p = multiprocessing.Process(target=nmap_scan, args=(ip,))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

然后将IP地址传递到运行脚本时扫描为命令行参数,例如:

python nmap_scan.py --ips 192.168.1.1 192.168.1.2 192.168.1.3

最后,通过实施asyncio的使用,可以同时进行多次扫描而无需进行多个过程,这可以显着提高我们代码的效率:

import argparse
import nmap
import asyncio

async def nmap_scan(ip):
    try:
        nm = nmap.PortScanner()
        nm.scan(ip, arguments='-sS -p 1-1000')
        print(nm.csv())
    except nmap.PortScannerError as e:
        print(f"Error while scanning {ip}: {e}")

async def run_scans(ips):
    tasks = [asyncio.create_task(nmap_scan(ip)) for ip in ips]
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--ips', nargs='+', required=True, help='List of IP addresses to scan')
    args = parser.parse_args()

    asyncio.run(run_scans(args.ips))

在此代码中,您将NMAP_SCAN函数定义为使用异步关键字的异步函数。然后,您定义一个新函数run_scans,该功能为每个IP地址创建一个任务列表,并使用asyncio.gather()method。

最后,您使用asyncio.run()调用run_scans函数,该函数在事件循环中运行函数并返回结果。

得出结论,您探索了如何通过实施多处理和错误处理技术来使用Python来提高NMAP扫描的效率。通过这些改进,您可以大大减少扫描多个IP地址所需的时间,并确保您不会错过任何潜在的漏洞。我希望我能展示Python作为网络安全专业人员的有用。