При проведении теста на проникновение внутренней сети предприятия, одним из первых рассматриваемых векторов атак на сети Windows является поиск и компрометация неподдерживаемых операционных систем с известными и публичными эксплойтами. Чаще других при этом эксплуатируется служба SMB. Другой проблемой системных администраторов является отсутствие документации сети. Пентестер и/или аналитик информационной безопасности сети может столкнуться с разведкой сети по принципу черного ящика в ситуации большой загруженности или при откровенной халатности сотрудников, ответственных за эксплуатацию. В частности, администраторов (тезис подтверждается исследованием коллег из Positive Technologies).
Сформулируем и немного расширим кейс
Необходимо за адекватное время найти все неподдерживаемые операционные системы семейства Windows в локальной сети предприятия с числом хостов более 10 тыс., предположительно имеющих публичные эксплойты SMB.
Ограничением метода может стать сегментация сети, когда некоторые подсети закрыты от хоста исследователя.
Кому интересно, добро пожаловать под кат...
ВНИМАНИЕ! Используемое в данной статье приложение masscan может положить всю сеть, это очень сильный инструмент. Предварительно протестируйте вашу сеть на различных rate параметрах.
- Перечень всех возможных частных IP адресов можно записать тремя масками 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
Заносим их в файл.
root@debSec:~/search_old_os# vim subnet.lst
Для быстрого определения всех используемых подсетей используем masscan в режиме ping сканирования.
root@debSec:~/search_old_os# masscan --ping --rate 10000 -iL subnet.lst -oX fast_ping_scan.xml
В тестируемой сети организации подобное сканирование выполняется примерно за 30 минут. Это зависит от пропускной способности сети.
Данный метод поиска подсетей и хостов имеет ограничения: мы не сможем обнаружить хосты, которые не отвечают на пинг. В условиях ограничения времени пентеста ими можно пренебречь и предположить, что выпавшие хосты не будут уязвимы.
root@debSec:~/search_old_os# masscan --ping --rate 1000 -iL subnet.lst -oX fast_ping_scan.xml
Перечень всех обнаруженных хостов можно увидеть так.
root@debSec:~/search_old_os# cat fast_ping_scan.xml|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
Хотелось бы отметить, что masscan с интенсивностью rate 10000 может пропустить ответ некоторых хостов. Я бы уточнил результат с меньшим rate по уже выявленным сетям, для этого получим все подсети по маске 24.
root@debSec:~/search_old_os# cat fast_ping_scan.xml|grep -Eo '([0-9]{1,3}\.){3}'|sort|uniq|sed -e 's/$/0\/24/'>target_subnet.lst
У меня получилось 499 подсети.
Повторим masscan c более низким rate, например, 1000 по найденным подсетям.
root@debSec:~/search_old_os# masscan --ping --rate 1000 -iL target_subnet.lst -oX target_ping_scan.xml
у меня это заняло 2 минуты, я получил на 28 хостов больше. Если есть время, можно снизить rate до 100. В моем случае это заняло около 20 минут.
В конечном итоге, я обнаружил 10296 хостов и большую часть используемых в сети подсетей.
В моем случае, как я позже узнал, я получил 99.91% всех хостов. Это зависит от многих показателей, в том числе от характеристик пропускной способности сети.
Получим список всех хостов сети.
root@debSec:~/search_old_os# cat target_ping_scan.xml|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|sort|uniq >target_ping_scan.lst
Имея перечень хостов, в принципе, можно начинать поиск любимых уязвимых приложений по номеру соответствующего порта.
В нашем случае мы ищем уязвимые SMB. Следовательно, следующими нашими действием должно быть сужение скоупа хостов по принципу открытых портов 139,445.
Используем msscan в другом его режиме работы, а именно в режим сканирования портов.
root@debSec:~/search_old_os# masscan --port 139,445 --rate 100 -iL target_ping_scan.lst -oX ip_smb.xml
Из найденных хостов с открытым SMB, аналогично методу выше, получим список IP.
root@debSec:~/search_old_os# cat ip_smb.xml|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|sort|uniq >ip_smb.lst
Что дальше?
Тут может быть много вариантов. Можно: сразу искать уязвимые хосты, для этого есть nse скрипты в nmap.
root@debSec:~/search_old_os# nmap -Pn --script smb-vuln* -p139,445 -iL ip_smb.lst -oA nmap_smb_vuln
После получаса работы nmap я получил 71 уязвимую службу в ~10 тысячах хостов.
тут присутствуют разные уязвимости
После проверки исключил 11 ложных срабатываний.
Можно использовать другой скрипт nmap, который определит версию OS по SMB.
root@debSec:~/search_old_os# nmap --script smb-os-discovery.nse -p 445,139 -iL total_smb.lst -oA all_os
(скрипт работал довольно долго, думаю, можно покрутить настройки nmap и оптимизировать его работу)
Можно провести данное сканирование по всем найденным адресам и понять, какие вообще операционные системы присутствуют в нашей сети.
Ввиду того что это исследование реально существующей сети заказчика, перечень всех имеющихся операционных систем с версиями демонстрировать не буду.
Далее грепнем интересующие нас OS. Например, так:
root@debSec:~/search_old_os# cat all_os.nmap |grep -B 10 -E 'Windows v1|Windows Server v2|Windows v3|Windows v4|Windows v5|Windows v6' >FINAL_TOTAL_OLD_WINDOWS_FULL.lst
Грепнем по IP.
root@debSec:~/search_old_os# cat FINAL_TOTAL_OLD_WINDOWS_FULL.lst|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|sort|uniq >FINAL_TOTAL_OLD_WINDOWS_FULL.lst
Мы нашли 65 не поддерживаемых производителем операционных систем.
Далее мы можем использовать metasploit и скомпрометировать уязвимые системы в случае пентеста. Можем составить бумагу в адрес ИТ с требованием исправить ситуацию. В других случаях готовим аудиторский отчет.
В обсуждении данного метода поиска уязвимых хостов с друзьями и коллегами по цеху я услышал некоторые негативные комментарии, относящиеся к данному методу разведки сети.
Коллеги обратили мое внимание на следующие риски:
- Не обнаружение некоторых хостов из за долгого ответа хоста или сегментации сети.
- Риск падения сети из-за высокой нагрузки.
- Данный метод очень "шумный", не подходит для RedTeam.
- Существуют другие более точные способы определения используемых подсетей (не всегда есть способ их использовать).
К плюсам метода могу отнести следующие характеристики:
- Относительно быстрый метод разведки практически всей сетевой инфраструктуры. В некоторых ситуациях — единственный метод оперативного получения информации. Например, когда службы ИТ могут просто скрыть сети от аудитора или когда они не владеют актуальной информацией.
- Легко автоматизируемый алгоритм поиска векторов компрометации сети для дальнейшего горизонтального движения в сторону ActiveDirectory.
- Аналогичным способом после обнаружения хостов можно искать другие уязвимости. Например, в своей работе я использую данный алгоритм для проведения сканирований всей сети, обнаруживая подсети для дальнейшего анализа хостов сканером Nessus. Это существенно сокращает время сканирования, потому что мы не теряем его на запросы в службу ИТ (у нас можно ждать ответ месяц или два).
Метод не единственный и не лучший, но в моих условиях был единственым приемлемым. Надеюсь, кому пригодится...