🌤
📍 Определение...
📅 23.10.2026
👤 16
← Назад к новостям

Прокачать Nmap. Учимся писать свои скрипты для самого важного хакерского инструмента

Се­год­ня я рас­ска­жу, как начать раз­рабаты­вать свои сце­нарии для Nmap. В статье раз­берем осно­ву и обя­затель­ные эле­мен­ты кода, а затем напишем три пол­ноцен­ных скрип­та для пен­теста.

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

Скрип­ты — это фай­лы с рас­ширени­ем .nse. Они лежат в пап­ке Nmap. В Kali Linux путь выг­лядит так:

/usr/share/nmap/scripts/

Код пишут на язы­ке прог­рамми­рова­ния Lua, который име­ет мно­го обще­го с Python. В целом, если ты уме­ешь писать на любом сов­ремен­ном язы­ке, тебе пот­ребу­ется пара дней, что­бы осво­ить необ­ходимую часть Lua и начать писать для Nmap.

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

Ду­маю, ты уже запус­кал Nmap со скрип­тами, нап­ример так: --script vuln. Наз­вание 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(level, fmt, ...) или обра­бот­ка дан­ных fromhex(hex_val). Пол­ный спи­сок смот­ри в офи­циаль­ных доках.

Ли­ба 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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

📊 Источник: Xakep | Оригинал
← Предыдущая From attendee badge to speaker badge: My first KubeCon at KubeCon + CloudNativeCon India 2026 Следующая → Как я переносил работающую Windows-ВМ с Hyper-V на Proxmox, не выключая исходную машину