DevGang
Авторизоваться

Улучшите производительность 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 для специалиста по кибербезопасности.

Источник:

#Security #Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу