Разведка в локальной сети при помощи nmap

Я тут очередной учебный курс намедни осилил, про nmap, и теперь просто не могу не поделиться восторгом с окружающими. Ведь все же примерно представляют, что nmap — это штука для проверки портов, и как бы всё. По крайней мере именно так меня учили на заре карьеры. Факт я запомнил, положил на полку рядом с другими полезными знаниями, типа «киты — это млекопитающие», и «Лондон — это столица Великобритании», и жизнь продолжила идти своим чередом. Но, оказывается, «проверка портов» — это намного более объёмная штука, чем следует из слов. Там реально можно исследовать, что же творится в локальной сети. В своём же, в домашнем вайфае.

Нахождение хостов

Например, возьмём мою домашнюю сеть. Вполне такая стандартная штука с роутером, двумя вайфай точками, и кучей подключённого к ним хлама. Адресное пространство принадлежит классу С частных айпи адресов, и выглядит примерно как у всех: 192.168.1.0/24.

Но кто вообще в моей сети живёт? Там же до 251-х клиентских устройств поместится (256 минус 2 зарезервированных, минус 3 роутера/вайфай точки). Может, какие нечистоплотные соседи прибились, и теперь интернет подсасывают?

А с nmap такое очень даже легко выяснить. Просто лезем в терминал, и вот:

Используемый для поиска параметр -sn называется ping scan — пингануть хост, и больше ничего не делать. 192.168.1.0/24 задаёт диапазон поиска, и может выглядеть совсем по-разному, от конкретной айпишки вроде 192.168.1.1, до целого диапазона — 192.168.1.1-200. Ну или CIDR, как в моём примере — 192.168.1.0/24.

Теперь я знаю, что на сегодня у меня в сети 15 хостов. Меньше, чем я думал, кстати.

Определение типа хоста

Но просто айпишка ничего не скажет, хорошо бы посмотреть, что именно это за хосты. Что за операционка, например. Делается это тоже очень просто.

«Running: Wind River VxWorks» — я даже не знал, что такое существует. Но, оказывается да, это популярная RTOS для встраиваемой техники. Это, походу, я свой принтер нашёл. Самое прикольное, что без nmap я бы и не узнал, что у него веб-интерфейс есть на 80-м порту.

Но вообще да, -O параметр отвечает за базовое определение операционной системы. «Базовое», потому что точно определить ось достаточно проблематично, и, в зависимости от степени удовлетворительности результатов, параметров поиска можно и довесить.

Например, --osscan-guess разрешит nmap догадываться о происхождении операционки более усердно. А -sC вообще добавит стандартный набор lua скриптов, где умные люди дописывают свои определялки, что в некоторых случаях может сильно улучшить результаты. Правда, за счёт скорости, и, возможно, включения сигнализации у сетевого администратора.

Натравить же всё артиллерию можно опцией -A — aggressive. Она включает самый полный набор догадок о природе вещей, но если в сети была IDS (Intrusion Detection System — система обнаружения проникновений), которая вас до этого не спела заметить, то тут она вполне может и проснуться.

Определение сервисов на хосте

Догадаться, кто именно живёт на хосте можно ещё одной опцией — -sV. Правда, проблема здесь точно такая же, как и с определением операционной системы — это сложно и не на 100% уверенно. Так же, как и в случае с определением операционки, можно подключить набор стандартных Lua скриптов. Ну и для полноты картины можно попросить nmap проверить сервисы на всех портах (-p-), и не только на первой тысяче (как, если мне не изменяет память, он поступает по умолчанию):

Сервисов он нашёл кучу, в том числе весьма неожиданного жильца — какого-то незнакомого веб-сервера на 8200-м порту. Раз уж тот сам предложил nmap редиректнуться на /ui (HTTP/1.0 307 Temporary Redirect), я залез туда хромом, и, блин, там был Hashicorp Vault! Откуда он вообще у меня? Неужели с тех самый пор, как я пост про него писал? Одуреть. И так ведь постоянно. В прошлый раз я бесхозный WordPress обнаружил.

Поиск открытых портов

Это именно то, чем в моей прежней картине мира должен заниматься nmap. Вообще, порты он прозванивал и при определении операционки и сервисов, но то было медленно и болтливо. Чтобы просто увидеть номера, можно поступить так:

-sS ищет открытые TCP порты. S вообще означает SYN — первый из трёх сетевых пакетов, устанавливающих TCP соединение. Ведь если на первый пакет ответили, то отвечать уже как бы необязательно. Экономия. Но так как на такое низкоуровневое пакетное общение, как правило, требуются админские права, перед nmap приходится писать sudo. Если админских прав нет, то вместо -sS можно использовать -sT — полноценное TCP соединение. Вместо жонглирования пакетами оно будет опираться на API ядра, на что прав нужно поменьше. Правда, такая детекция будет медленнее и скорее всего засветится в логах машины-получателя.

-sU проверит UDP порты. Я у себя на серваке нашёл три штуки. Зачем — непонятно.

Форматирование вывода

Вот о чем я не задумывался, так это о том, что nmap может выводить результат в разных форматах. Оно на первый взгляд как бы не сильно и интересно: -oN — дефолтный вывод, -oG — чуть упрощённый, чтобы было проще искать (Greppable), и всё такое. Но есть средневековый -oX — вывод в XML, и тут история становится поинтереснее.

Ведь кроме того, что XML гораздо проще программно обрабатывать, существует ещё такая штука как XSLT. Язык трансформаций для XML по-нашему. Про это современные хипстеры скорее всего и не слышали. В своё время, ещё до войны (в Грузии), я на XSLT превращал сгенерированный на базе .NET библиотеки классов XML в полноценный T-SQL, чтобы сделать для них базу данных. Да, порядок раньше был. Не то, что сейчас.

Так вот, в комплекте с nmap идёт XSL-трансформация для превращения XML в очень читабельный HTML. Работает это так:

  • пробиваем порты хоста и сохраняем их в XML
    • sudo nmap -sS 192.168.1.88 -oX server-ports.xml
  • натравливаем на них XSLT
    • xsltproc server-ports.xml -o server-ports.html
  • открываем сгенерированный HTML
    • open server-ports.html
  • любуемся на такую красоту:
Отформатированный nmap отчёт

Короче, прекрасное, сильное колдунство.

Мораль

Блин, неужели вы ещё не в восторге? Простое «nmap — штука для прозвона портов» на самом деле означает классный инструмент, которым можно узнать, и кто в нашей сети живёт, и кто какие сервисы поддерживает, и кто должен был отключить Hashicorp Vault ещё пару лет назад. Обалденная штука, которую некоторый теперь использует по поводу и без оного. Чего и остальным желаю.

Кстати, если залезть в мануал для nmap — man nmap, то, кроме в целом замечательной документации, есть раздел «Port Scanning Techniques», который очень человеческим языком рассказывает, как тулзой пользуются профессионалы.

PS

Блин, я не мог успокоиться, пока не узнал, откуда у меня Vault на 8200-м порту. Так как я ни за что не стал бы ставить Vault на живую машину, то он наверняка поселился в контейнере, поэтому идём на сервер и, таки да, вот он:

Он сидел там год и два месяца, одуреть. Так как кто-то рестартанул его 3 месяца назад, скорее всего я запускал контейнер через docker-compose, и наверное где-то должна быть ссылка на проект:

Ха! Вспомнил. Это же rbc-scrapper. Я когда-то ковырял маленький проектик с Selenium, NodeJS и Vault, чтобы лазить в мой банковский аккаунт и вытягивать оттуда данные, которые банк добровольно не отдал бы. Vault нужен был для коллекции паролей.

Ну да ладно, проектик давно уже остыл, так что docker-compose down, и конец загадке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *