Улучшите производительность Nmap с помощью этих замечательных скриптов
В этой статье я покажу вам, как устранить проблемы с производительностью Nmap с помощью скриптов Python. К концу этой статьи вы будете лучше понимать, как работает Nmap и как вы можете использовать Python для расширения его возможностей.
Выявление узких мест в производительности в Nmap
Прежде чем приступить к устранению проблем с производительностью Nmap, вам необходимо определить узкие места в процессе сканирования. Я не понаслышке знаю, что такое узкие места, поскольку однажды пытался запустить сканирование Nmap на очень медленном компьютере. Давайте просто скажем, что у меня было достаточно времени, чтобы пообедать.
Чтобы определить узкие места в Nmap, вам нужно понять, как он выполняет каждый из этих методов. Вы можете использовать флаг -d
, чтобы увеличить уровень отладки Nmap и посмотреть, что происходит под капотом.
Например, если вы хотите увидеть, что делает Nmap, когда он выполняет сканирование TCP-порта, вы можете использовать следующую команду:
nmap -d -p 1-65535 <target>
Это запустит сканирование Nmap с включенным отладочным выводом для сканирования TCP-портов. Посмотрите на выходные данные и посмотрите, где Nmap проводит большую часть своего времени.
Другим полезным инструментом для выявления узких мест производительности в Nmap является Wireshark. Фиксируя сетевой трафик, генерируемый Nmap, вы можете видеть, какие пакеты отправляются и принимаются и сколько времени требуется Nmap для получения ответа.
Оптимизация производительности Nmap с помощью Python
Теперь, когда вы определили узкие места производительности в 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)
Этот скрипт будет запускать сканирование Nmap для трех IP-адресов параллельно, используя три процесса. Вы можете настроить количество процессов в зависимости от количества ядер на вашем компьютере.
Кроме того, вы можете еще больше повысить производительность нашего скрипта, ограничив количество сканируемых портов. По умолчанию Nmap сканирует все 65 535 портов, но в большинстве случаев вам нужно сканировать только подмножество этих портов.
Чтобы ограничить количество сканируемых портов, вы можете использовать флаг -p
в Nmap и указать диапазон сканируемых портов. Например, если вы хотите сканировать только первые 1000 портов, вы можете использовать флаг -p 1–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
как асинхронную функцию, используя ключевое слово async. Затем вы определяете новую функцию run_scans
, которая создает список задач для каждого IP-адреса и запускает их асинхронно с помощью метода asyncio.gather()
.
Наконец, вы вызываете функцию run_scans
с помощью asyncio.run()
, которая запускает функцию в цикле событий и возвращает результаты.
В заключение вы узнали, как использовать Python для повышения эффективности сканирования Nmap за счет реализации методов многопроцессорной обработки и обработки ошибок. Благодаря этим улучшениям вы можете значительно сократить время, необходимое для сканирования нескольких IP-адресов, и убедиться, что вы не пропустите ни одной потенциальной уязвимости. Я надеюсь, что продемонстрировал, насколько полезен Python для специалиста по кибербезопасности.