Nmap — культовый сканер, без которого не может обойтись практически ни один хакер, поэтому тема расширения его возможностей, я думаю, интересует многих. Использовать в паре с Nmap другие инструменты — обычная практика. В статье речь пойдет о том, как легко автоматизировать работу Nmap со своими любимыми инструментами. Удобнее же «нажать одну кнопку» и получить результат, чем постоянно проделывать одну и ту же последовательность действий. Использование скриптов в Nmap может помочь хакерам более автоматизированно взламывать системы, а сисадминам проверять системы на наличие дефолтных дыр и своевременно их устранять.

 

Пару слов про Nmap

Уверена, что большинство читателей журнала «Хакер» знают, что такое Nmap, и наверняка не раз использовали его для исследования сети и сбора информации. Для тех же, кто подзабыл или не знает, на всякий случай напомню:

  • Nmap — кросс-платформенный инструмент для сканирования сети, проверки ее безопасности, определения версий ОС и различных сервисов и многого другого. Это очень гибкая и легко расширяемая утилита, а делает ее такой скриптовый движок NSE;
  • NSE (Nmap Scripting Engine) — компонент Nmap, обладающий мощными возможностями, что позволяет пользователям писать скрипты для автоматизации широкого круга сетевых задач: более гибкого взаимодействия с имеющимися возможностями Nmap, обнаружения и эксплуатации уязвимостей и прочего. В основе NSE — интерпретатор языка Lua;
  • Lua — скриптовый язык, похожий на JavaScript.
Рис. 1. Вывод таблицы Nmap
Рис. 1. Вывод таблицы Nmap
 

Постановка задачи

Как уже было сказано, сегодня мы будем заниматься расширением функционала Nmap за счет написания собственных скриптов. Любой взлом/пентест обычно начинается с разведки и сбора данных. Одним из первых проверяется наличие на исследуемом хосте открытых портов и идентификация работающих сервисов. Лучшего инструмента для сбора такой информации, чем Nmap, пожалуй, нет. Следующим шагом после сканирования обычно бывает либо поиск сплоита под найденный уязвимый сервис, либо подбор пары логин:пароль с помощью метода грубой силы.

Допустим, ты активно используешь брутфорсер THC-Hydra для подбора паролей нескольких сервисов (например, HTTP-Basic, SSH, MySQL). В таком случае приходится натравливать гидру на каждый сервис отдельно, нужно запоминать особенности сервисов и необходимые для запуска гидры флаги. А если появится необходимость брутить намного больше, чем пять сервисов?.. Почему бы не автоматизировать это?

Поэтому давай напишем простенький скрипт, который будет автоматизировать процесс запуска Hydra для подбора логинов/паролей к одному сервису (например, PostgreSQL). Для этого нам понадобятся следующие инструменты:

  • Nmap;
  • THC-Hydra;
  • любой текстовый редактор.

Если у тебя еще не установлен Nmap и/или Hydra, немедленно исправь это:

$ sudo apt-get install nmap hydra

О’кей, начнем. Скрипты для Nmap представляют собой обычные текстовые файлы с расширением *.nse. Поэтому открывай свой любимый текстовый редактор и создавай новый файл. Я буду использовать Vim:

$ vim hydra.nse
 

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

Перед тем как перейти к написанию, надо сказать, что все скрипты имеют определенную структуру. Помимо самого кода, автоматизирующего те или иные действия, в нем присутствует описание скрипта (для чего предназначен и как использовать), информация об авторе, лицензии, зависимость от других скриптов, категории, к которым относится скрипт, и так далее. Давай подробней рассмотрим каждую из этих частей.

 

Описание скрипта (description)

Данный раздел содержит описание скрипта, комментарии автора, пример отображения результата выполнения скрипта на экран, дополнительные возможности.

Для нашего скрипта, подбирающего логины/пароли к PostgeSQL, описание будет выглядеть следующим образом:

description = [[
Brute force all services running on a target host. The results are returned in a table with each path, detected method, login and/or password.
]]

---
-- @usage
-- nmap --script hydra [--script-args "lpath=<file_logins>, ppath=<file_passwords>"] <target_ip>
--
-- @output
-- PORT     STATE SERVICE
-- 80/tcp   open  http
-- | hydra:
-- |   path                            method  login  password
-- |   127.0.0.1/private/index.html    Digest  log    pass
-- |_  127.0.0.1/simple/index.txt      Basic   user   qwerty
--
-- @args hydra.lpath: the path to the file with logins. For example,
--         nmap --script hydra --script-args="lpath=/home/my_logins.txt" <target_ip>
-- @args hydra.ppath: the path to the file with passwords. For example,
--         nmap --script hydra --script-args="ppath=/home/my_pass.txt" <target_ip>

Здесь

-- — комментарий;
--[[  ]] — многострочный комментарий;
@usage, @output, @args — пример вызова скрипта, вывода результата на экран, необходимые аргументы при вызове.

Выше в @usage мы видим формат запуска скрипта. В данном случае указано только имя скрипта (hydra). Это становится возможным, если скрипт положить в директорию /<path to nmap>/nmap/scripts/, в противном случае придется указывать абсолютный или относительный путь до него. В последующем сделаем возможным задание аргументов при запуске скрипта. Аргументы задаются с помощью флага --script-args "<some arguments>". В нашем случае мы будем задавать путь до файла с логинами (lpath) и до файла с паролями (ppath). Аргументы необязательны: по умолчанию будем искать файлы с именами login.txt и password.txt в текущей директории.

 

Категории, в которых находится скрипт (categories)

При написании NSE-скрипта можно указать его категорию (или несколько категорий). Это бывает полезно, когда пользователь Nmap хочет использовать не конкретный скрипт, а набор скриптов, находящихся в одной категории. Примеры некоторых категорий:

  • auth — категория, в которой скрипты определяют аутентификационные данные целевого хоста;
  • brute — категория, скрипты которой помогают определить логины и пароли для различных сервисов;
  • default — категория, которая содержит основные скрипты. Есть некоторые критерии, определяющие принадлежность скрипта к данной категории: скорость сканирования, полезность, надежность, конфиденциальность, наглядный вывод;
  • malware — категория, помогающая определять вредоносные программы.

Например, если необходимо запустить все скрипты из категории auth, то команда будет выглядеть следующим образом:

$ nmap --script=auth example.com

В таком случае скрипты этой категории будут по очереди запускаться для указанного хоста. Наш скрипт относится к категории brute. Добавим следующую строку в файл:

categories = {"brute"}
 

Информация об авторе (author)

Каждый скрипт содержит информацию об его авторе. В моем случае:

author = "Olga Barinova"
 

Информация об использующейся лицензии (license)

Nmap приветствует все разработки пользователей и призывает делиться ими, в том числе NSE-скриптами. При указании лицензии ты подтверждаешь право делиться скриптом с сообществом. Стандартная лицензия Nmap выглядит следующим образом:

license = "Same as Nmap--See http://nmap.org/book/man-legal.html"

Добавим также и эту строку в наш скрипт.

 

Зависимости от других скриптов (dependencies)

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

dependencies = {"smb-brute"}.

В нашем случае такая возможность не понадобится, поэтому добавлять dependencies мы не будем.

 

Хост и порт (host & port)

Nmap должен знать, для каких сервисов и на каких портах запускать скрипт. Для этого есть специальные правила:

  • prerule() — скрипт выполняется один раз перед сканированием любого хоста, используется для некоторых операций с сетью;
  • hostrule(host) — скрипт выполняется для каждого хоста из таблицы, которую принимает в качестве аргумента;
  • portrule(host, port) — скрипт выполняется для каждого хоста и для каждого порта из таблиц, которые принимает в качестве аргументов;
  • postrule() — скрипт выполняется один раз после сканирования любого хоста. В основном используется для обработки полученных результатов, подведения статистики и подобного.

Для формирования таких правил есть библиотеки. В нашем скрипте необходимо только указать номер порта (5432) и имя сервиса (postgresql), и тогда он будет работать лишь для данного порта и сервиса. Существует довольно популярная библиотека shortport, встроенная в NSE, в которую включены различные методы. Мы будем использовать метод

port_or_service (ports, services, protos, states)

где ports — номера портов, services — имена сервисов, protos — имена протоколов (например, udp), states — состояния.

Этот метод возвращает true в том случае, если в данный момент анализируется сервис, находящийся на одном из портов из списка ports или соответствующий какому-нибудь сервису из списка services, кроме того, проверяется протокол и состояние на соответствие, иначе возвращается false.
Чтобы наш скрипт работал с PostgreSQL, нужно добавить номер порта и название сервиса:

portrule = shortport.port_or_service({5432}, {"postgresql"})
 

Подключение библиотек

Отвлечемся на секунду от структуры скрипта и рассмотрим, как происходит подключение внешних библиотек, к функциональности которых нам потребуется обращаться.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


4 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…