Nmap Scripting Engine (NSE) встроен в Nmap и позволяет создавать собственные модули для сбора информации и эксплуатации уязвимостей. Скрипты пишут на Lua — языке с синтаксисом, похожим на Python. Если ты программируешь на современном языке, пары дней хватит, чтобы освоить нужную часть Lua и начать писать для Nmap.

Главное преимущество разработки для Nmap в том, что ты работаешь с готовой, стабильной инфраструктурой.

Скрипты и категории

Скрипты хранятся в файлах с расширением .nse в папке Nmap. В Kali Linux это обычно /usr/share/nmap/scripts/.

Когда запускаешь Nmap с параметром вроде --script vuln, ты обращаешься к категориям скриптов. Полный список стандартных категорий:

  • default — базовая проверка: заголовки HTTP, анонимный вход на FTP, сроки действия сертификатов. Запускается с -sC или --script default
  • safe — гарантированно безопасные скрипты, которые не могут вызвать сбои
  • version — расширенное определение версий сервисов
  • broadcast — поиск хостов в локальной сети
  • discovery — сбор информации о хостах и разведка сети
  • auth — проверка аутентификации и возможности обхода защиты
  • brute — перебор учетных данных
  • fuzzer — атака случайными данными на формы и приложения
  • intrusive — агрессивные скрипты, заметные для систем защиты
  • vuln — проверка известных уязвимостей
  • exploit — попытки эксплуатации уязвимостей
  • dos — проверка на DoS-уязвимости
  • malware — поиск бэкдоров и вредоноса
  • external — интеграция с внешними ресурсами (GeoIP и другие)

Категории определяет автор скрипта. Ты можешь добавить собственные — например, отдельный набор для тестирования конкретного ПО или уязвимостей.

Структура скрипта

Любой модуль начинается с метаданных:

description = [[
Краткое описание того, что делает скрипт.
Может быть многострочным.
]]

author = 'Ваше Имя'
license = 'Same as Nmap--See https://nmap.org/book/man-legal.html'
categories = {'discovery', 'safe'}

Поля лицензии необязательны, но желательны, если планируешь делиться скриптом с сообществом.

Затем подключаешь библиотеки:

local stdnse = require 'stdnse'
local shortport = require 'shortport'

stdnse содержит функции-утилиты NSE: вывод отладочной информации, обработка данных. shortport помогает построить правила для запуска скрипта по портам и сервисам.

Правила запуска

Перед выполнением Nmap проверяет условия запуска скрипта. Одно из них — проверка по портам:

portrule = shortport.port_or_service(80, 'http')

Nmap предварительно собирает информацию об открытых портах и сервисах. Функция port_or_service проверяет, есть ли в данных нужный порт или сервис. Если есть — скрипт запустится, если нет — пропустится.

Для нескольких портов передавай массивы:

shortport.port_or_service({80, 443, 8080}, {'http', 'https', 'http-proxy'})

Или используй предопределенные константы:

portrule = shortport.http

Помимо portrule, есть другие правила запуска:

  • prerule — выполнить один раз перед сканированием всех хостов
  • hostrule — выполнить один раз для каждого хоста
  • postrule — выполнить один раз после завершения всех сканов

Правило — это функция. Вместо готовых вариантов можешь написать собственное условие:

portrule = function(host, port)
    return port.protocol == 'tcp'
        and port.state == 'open'
        and (port.service == 'http' or port.number == 8080)
end