Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Копия nmap.doc
Скачиваний:
45
Добавлен:
21.02.2016
Размер:
569.34 Кб
Скачать
    1. Техническая реализация

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

Прежде всего, Nmap выполняет сканирование портов в соответствии с заданными в командной строке параметрами, после чего передает список обнаруженных открытых TCP и/или UDP портов подсистеме определения версий. Работа с этими портами ведется в параллельном режиме, однако мы не будем вдаваться в эти тонкости и рассмотрим, как подсистема работает с одним портом:

  1. Если открытый порт работает по протоколу TCP, Nmap пробует соединиться с ним.

  2. После установления TCP-соединения, Nmap прослушивает его в течении приблизительно 5 секунд. Большинство служб, таких, как ftp, ssh, smtp, telnet, pop3 и imap идентифицируют сами себя путем передачи приветствия подключившейся машине. Nmap относится к этому как к «нуль-тесту», поскольку Nmap просто прослушивает порт и не отправляет никаких данных. Если в процессе этого теста были получены какие-либо данные, Nmap сравнивает их с сигнатурами, приведенными в файле nmap-service-probes. Если служба полностью идентифицирована, тестирование порта считается завершенным. Сигнатура представляет собой не что иное, как регулярные строковые выражения, с помощью которых можно извлечь необходимую информацию из полученных данных. Иногда Nmap определяет лишь тип службы, но не может определить ее версию. В этом случае Nmap продолжит тестирование при помощи передачи запросов на порт для определения версии данного типа службы.

  3. На этом этапе Nmap начинает тестировать протокол UDP, а TCP-соединение завершается, если «нуль-тест» не дал результата или обнаружил частичное соответствие сигнатуре. Поскольку большинство портов жестко закреплены за соответствующими службами (смотрите файл nmap-services), подсистеме тестирования, как правило, передается список портов для выполнения теста. Например, для выполнения теста, называемого GetRequest (определение наличия веб-сервисов) передаются номера портов 80-85, 8000-8010 и 8080-8085. Тестирование списка портов происходит последовательно. В процессе каждого теста на исследуемый порт передается строка (простой текст или двоичная escape-последовательность). Полученный ответ сравнивается со списком регулярных выражений (аналогично «нуль-тесту» описанному выше). В процессе тестирования могут быть получены следующие результаты: полное совпадение с сигнатурой (завершение теста), частичное совпадение (целенаправленный выбор дальнейших тестов для определенной службы), или отсутствие сигнатуры (неизвестная служба).

  4. В большинстве случаев предполагается, что «нуль-тест» или дополнительное тестирование порта все-таки даст результат, и служба будет определена. Поскольку дополнительное тестирование порта происходит после «нуль-теста», подсистема определения версий может успешно завершить работу за один «сеанс связи». Для протокола UDP обычно необходимо отправить лишь один пакет, поэтому сеанс будет весьма коротким. Если же «нуль-тест» и дополнительный опрос порта не дали результатов, Nmap начнет последовательно проводить все тесты. Для протокола TCP, Nmap должен создавать новое соединение для предотвращения искажений результатов предыдущего теста. Этот процесс занимает достаточно много времени, кроме того, результат, получаемый при выполнении «общего» теста, как правило, применим к нескольким службам одновременно. Например, при выполнении теста GenericLines на порт передается две пустые строки (\r\n\r\n). Положительный результат этого теста соответствует 10 типам служб, таким, как ftp, ident, pop3, uucp, postgres и whois. Положительный результат теста GetRequest (строка «help\r\n» и опрос RPC и MS SMB) дает значительно больше различных служб. Любое частичное совпадение с сигнатурой на этом этапе значительно уменьшает число последующих тестов.

  5. Одним из важных тестов является проверка протокола SSL. Если определено наличие SSL (и доступен OpenSSL), Nmap повторно соединится с этим портом по протоколу SSL и повторит тестирование, чтобы определить, какая служба использует порт «за» шифрованием. Специальный набор инструкций позволяет работать с различными портами с использованием обычного и шифрованного (SSL) соединения. Например, Nmap самостоятельно должен начать проверку порта 443 (https) с теста SSL. После того, как будет установлено наличие SSL, Nmap должен запустить тест GetRequest на порт 443.

  6. Если хотя бы один тест прошел результативно (был получен ответ), а Nmap не смог определить службу, содержание ответа на тест будет выведено на экран (по аналогии с отпечатком неизвестной ОС). Одновременно с этим на экран будет выведен адрес, куда необходимо отправить этот «отпечаток». В дальнейшем будет проведена работа по детальному изучению полученной информации, и, возможно, в следующей версии Nmap мы сможем сопоставить этому отпечатку определенную службу.

  7. Для некоторых служб возможно проведение пост-процессинга после основной группы тестов для определения дополнительной информации. Например, любая обнаруженная служба RPC будет передана подсистеме «лобовой атаки» на RPC (-sR) для определения номера программы и ее версии.

Если это описание показалось Вам недостаточным, Вы можете включить опции --version_trace и -d (режим отладки) при запуске Nmap и посмотреть на весь процесс, что называется, «вживую».