Содержание статьи
Nmap Scripting Engine (NSE) — встроенный в Nmap движок для создания кастомных модулей. Можешь писать не только дополнительные способы сбора информации, но и полноценные скрипты автоматической эксплуатации под конкретную CVE.
Скрипты — это файлы с расширением .. Они лежат в папке Nmap. В Kali Linux путь выглядит так:
/usr/share/nmap/scripts/
Код пишут на языке программирования Lua, который имеет много общего с Python. В целом, если ты умеешь писать на любом современном языке, тебе потребуется пара дней, чтобы освоить необходимую часть Lua и начать писать для Nmap.
Основной плюс разработки для Nmap в том, что ты используешь уже готовую инфраструктуру, которая стабильно работает.
Думаю, ты уже запускал Nmap со скриптами, например так: --script . Название vuln — это категория скрипта. Вот полный список стандартных категорий:
default— базовый аудит. Собирает информацию вроде заголовков HTTP, проверяет анонимный вход на FTP, чекает сроки действия сертификатов. Запустить Nmap с этим набором можно с помощью параметра-sCлибо привычным способом —--script;default safe— это гарантированно безопасные скрипты. Они не могут вызвать сбоев на таргете. Отсюда стоит сделать вывод, что в категорииdefaultможет попасться скрипт, который случайно что‑то сломает. На практике не сталкивался с этим, но теоретическая возможность есть;version— расширенное определение версий;broadcast— широковещательный поиск хостов в локальной сети;discovery— разведка сети, сбор информации о хостах;info— еще одна категория скриптов, которые не относятся однозначно кdiscoveryилиinfo;auth— проверка аутентификации. Скрипты нужны для оценки безопасности и возможности обхода аутентификации. Например,http-method-tamperпытается обойти защиту ресурса паролем, подменяя метод HTTP;brute— классический брутфорс. Эти скрипты пытаются подобрать учетные данные;fuzzer— скрипты атаки случайными данными. Не путай с фаззингом с помощью ffuf или подобных утилит. Это именноhttp-form-fuzzer, который атакует формы, пытаясь вызвать код ответа 500;intrusive— агрессивные скрипты, заметные для систем защиты;vuln— чекает известные уязвимости;exploit— попытка эксплуатации уязвимостей;dos— чекает на DoS;malware— ищет признаки вредоносного ПО и бэкдоров;external— интеграция с внешними ресурсами (например, GeoIP).
Сами категории определяет автор скрипта. Технически ты можешь добавить собственные категории скриптов. Например, написать набор для тестирования Nginx, WordPress или набора CVE и запускать их отдельной группой.
Ключевые моменты скрипта
Любой модуль должен содержать метаданные. Думаю, тут все будет понятно:
description = [[Краткое описание того, что делает скрипт.Может быть многострочным.]]author = "Ваше Имя"license = "Данные по лицензии"categories = {"discovery", "safe"}Данные по лицензии необязательны, по крайней мере у меня не возникало проблем с тем, чтобы опустить их. Но если планируешь продвигаться в сообществе, лучше заполняй. Например, сошлись на общую лицензию в сообществе:
Same as Nmap--See https://nmap.org/book/man-legal.html
На следующем шаге подключаем библиотеку. Сам импорт похож на JavaScript: через require указываем имя либы. Ссылку кладем в переменную:
local stdnse = require "stdnse"local shortport = require "shortport"В библиотеке stdnse лежит набор функций‑утилит движка NSE. Например, вывод отладочной информации debug( или обработка данных fromhex(. Полный список смотри в официальных доках.
Либа shortport нужна для построения правил порта. NSE дает возможность выбирать, когда именно запускать скрипт. Один из вариантов — совпадение по порту. Выглядит это так:
portrule = shortport.port_or_service(80, "http")Сначала Nmap собирает базовую информацию о хосте, включая открытые порты и службы, которые висят на нем. После мы сможем проверить, есть ли в данных нужный порт или служба. Для этого юзай port_or_service из либы shortport. Если служба есть, в portrule упадет правило, разрешающее запуск скрипта. Соответственно, NSE выполнит его. Если службы или порта нет, то твой скрипт не запустится.
Часто тебе потребуется передавать массив значений:
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
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее