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
