>
Декабрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Ноя    
 123
45678910
11121314151617
18192021222324
25262728293031

Практика использования сканера уязвимостей NMAP

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

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

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

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

Рис. 1. Вывод таблицы Nmap

Рис. 1. Вывод таблицы Nmap

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

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

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

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

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

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

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

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

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

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

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

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

Здесь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как и в любом языке, для того чтобы использовать переменные, нужно их сначала объявить и проинициализировать. В Lua все просто: все переменные объявляются через local:

Но прежде всего нам необходимо подключить библиотеки. В Lua такая возможность реализуется с помощью ключевого слова require. Добавим в самое начало нашего скрипта:

Таким образом мы подключили следующие библиотеки:

  • nmap — библиотека NSE, содержит внешние функции и структуры данных Nmap;
  • shortport — библиотека NSE, содержит функции для указания сервисов, портов и так далее, для которых будет запускаться скрипт;
  • stdnse — библиотека NSE, содержит стандартные NSE-функции;
  • string — библиотека Lua, содержит функции для работы со строками;
  • table — библиотека Lua для создания и модификации таблиц (ассоциативных массивов);
  • tab — библиотека NSE для работы с таблицей Nmap для вывода результата.

Nmap Libs

Подробнее про библиотеки можно почитать тут в разделе Libraries.

Обращаясь к этим глобальным переменным, мы будем иметь доступ к функциональности библиотек.

Инструкции скрипта (action)

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

Структура action-блока выглядит следующим образом:

Прежде всего объявим все необходимые переменные внутри action-блока:

Названия некоторых сервисов не совпадают для Nmap и для гидры, как, например, в нашей ситуации. Nmap хранит значение postgresql, а Hydra как один из флагов принимает значение postgres. Поэтому нам придется корректировать это значение, используя условие:

Заодно мы указали количество потоков для распараллеливания для этого сервиса (переменная task).

Теперь создадим таблицу, в которую будем складывать результаты брутфорса (логины и пароли), и добавим в нее значения первой строки (названия столбцов):

В первой строке таблицы мы указали имена столбцов. На следующем шаге проверим, открыт ли порт, и сформируем строку с нужными флагами для запуска гидры:

Флаги при запуске гидры:

В конце сформированной строки указывается IP (или диапазон) и название сервиса.

Флаги Hydra

Подробнее о флагах и использовании THC-Hydra можно почитать здесь.

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

В переменной s лежит результат работы гидры (показан на рис. 2).

Рис. 2. Вывод результата работы Hydra на экран

Рис. 2. Вывод результата работы Hydra на экран

Мы хотим понять, получилось ли сбрутить какую-нибудь пару login:password, для этого нам поможет regex. В библиотеке string есть метод match, который сравнит нашу строку и регулярное выражение и в переменные loginи password положит соответствующие значения, если они есть.

Значения, попадающие в ([^%s]*), присваиваются переменным в порядке их следования (%s — пробел). Добавим найденные логин и пароль в таблицу, предварительно проверив на их наличие:

На этом заканчиваем обработку сервиса и закрываем цикл ( if (port.state == "open") then … end ). Наконец, проверяем таблицу. Если в нее были добавлены новые строки, кроме первой с заголовками, выводим значения в таблицу Nmap.

Если объект представляет собой таблицу, то Lua использует операцию # взятия длины таблицы. Другие варианты использования # можно найти в документации. Сейчас нам осталось только закрыть action-блок (поставить недостающий end).

Lua Docs

Желающие поближе познакомиться с Lua могут пройти по этой ссылке.

Сохраняем скрипт в директорию //nmap/scripts/. Теперь его можно запустить и посмотреть на результат. Но перед этим установим, настроим и добавим пользователя PostgreSQL.

Настройка PostgreSQL

  1. Установка и запуск. PostgreSQL должен быть в репозиториях (если нет — качаем и устанавливаем по инструкциям):
    • $ sudo apt-get install postgresql
    • Проверим состояние сервиса: $ sudo service postgresql status
    • Если сервис не запущен: $ sudo service postgresql start
  2. Добавим Linux-пользователя. Пусть у нас будет postgresql:qwerty. Последовательность действий:
    • $ sudo su
    • $ adduser postgresql (попросит ввод пароля, вводим qwerty)
    • $ exit
  3. Далее подключимся к базе данных и добавим пользователя postgresql:

Теперь сервис запущен и настроен и мы добавили юзера с логином и паролем.

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

Для начала добавим в файл login.txt наш логин postgresql и в файл password.txt — пароль qwerty:

Рис. 3. Пример содержимого файлов с логинами и паролями

Рис. 3. Пример содержимого файлов с логинами и паролями

Теперь запустим скрипт:

В результате его работы мы получаем таблицу, представленную на рис. 4.

Рис. 4. Найденные логин и пароль внутри таблицы Nmap

Рис. 4. Найденные логин и пароль внутри таблицы Nmap

Аргументы

В начале статьи я писала о том, что при данной реализации файл с логинами и файл с паролями должны лежать в текущей директории с именами login.txt и password.txt соответственно. Такой вариант может не всех устраивать, поэтому давай добавим скрипту входные параметры lpath (путь до файла с логинами) и ppath (путь до файла с паролями). То есть запуск скрипта будет выглядеть следующим образом:

Для этого понадобятся некоторые модификации. В начале action-блока, после объявления переменных зарегистрируем аргументы lpath и ppath следующим образом:

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

Все готово, можно попробовать воспользоваться аргументами.

Расширение

Какую цель я ставила перед собой? Автоматизация работы Nmap и Hydra. Чем больше сервисов возможно брутить одним скриптом, тем лучше. Давай сделаем это. Теперь уже это очень просто. Добавим в portrule другие порты и сервисы:

С такими изменениями скрипт будет прекрасно работать и для добавленных сервисов. Можно добавлять и другие сервисы, но для некоторых нужно немного дописывать скрипт. Эти изменения обычно незначительные и очевидные (например, уменьшить/увеличить количество потоков для распараллеливания).

Hydra.nse

С полной версией скрипта, поддерживающей расширенный список сервисов, ты можешь ознакомиться в моем репозитории на GitHub.

Отладка скриптов

После написания скрипта при его запуске могут возникнуть ошибки (например, синтаксиса или неправильного использования). В таких случаях Nmap предупреждает о невозможности выполнения скрипта и советует использовать флаг -d (см. рис. 5). Соответственно, запуск будет выглядеть примерно следующим образом:

При таком вызове Nmap сообщит о совершенных ошибках. Если же проблема не в синтаксисе, а в логике скрипта, то здесь поможет отладочный вывод (print).

Рис. 5. Пример вывода ошибки

Рис. 5. Пример вывода ошибки

Заключение

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

[Всего голосов: 7    Средний: 3.9/5]
Share Button

Вам может быть интересно также:

Last updated by at .

2 комментария Практика использования сканера уязвимостей NMAP

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">