在本文中,我将向您展示如何使用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获得响应需要多长时间。
用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作为网络安全专业人员的有用。