Анатомия атаки
Введение
Атака с нулевой сессией существует со времен Windows 2000, но, как это ни удивительно, системные администраторы часто пренебрегают ею при защите сетей. Это может привести к катастрофическим результатам, поскольку перечисление нулевого сеанса может привести к разглашению почти каждого бита полезной информации, необходимой злоумышленнику для удаленного доступа к системе. Несмотря на старую шляпу, атаки с нулевой сессией сейчас так же распространены, как и много лет назад. На самом деле, даже несмотря на то, что современные системы больше не являются полностью уязвимыми, при выполнении упражнений по тестированию на проникновение для устройств Windows перечисление нулевых сеансов по-прежнему является одной из первых вещей, которые я пытаюсь сделать. Цель этой статьи — объяснить, как именно работает атака с нулевой сессией, а затем объяснить, как предотвратить это в ваших системах.
Как работают нулевые сеансы
Удаленный сеанс создается, когда пользователь входит в систему удаленно, используя имя пользователя и пароль, которые имеют доступ к системным ресурсам. Это достигается с помощью протокола блока сообщений сервера (SMB) и службы Windows Server. Эти соединения являются полностью законными, если предоставлены надлежащие учетные данные.
Нулевой сеанс возникает, когда пользователь подключается к системе Windows без имени пользователя или пароля. Этот тип подключения не может быть установлен ни к какому обычному общему ресурсу Windows, но его можно установить к административному общему ресурсу Interprocess Communication (IPC). Общий ресурс IPC, как следует из названия, используется процессами Windows (через имя пользователя SYSTEM) для связи с другими процессами в сети. Общий ресурс IPC используется исключительно протоколом SMB.
Использование общего ресурса IPC без учетных данных обычно зарезервировано для программ, взаимодействующих друг с другом, но ничто не говорит о том, что вместо этого пользователь не может подключиться к машине через соединение IPC. Это не позволит получить неограниченный доступ к машине, но позволит довольно обширное перечисление, которое может помочь злоумышленнику.
Перечисление через нулевую сессию
Теперь, когда мы знаем, как работают нулевые сеансы, насколько легко злоумышленнику использовать этот вектор атаки? К сожалению, это довольно легко. Соединение с нулевым сеансом можно создать прямо из командной строки Windows без дополнительных инструментов, просто используя команду NET. Команду NET можно использовать для различных административных функций. Используя команду NET, мы можем попытаться установить соединение со стандартным общим ресурсом на нашем целевом хосте (соответствующим образом названным HACKME), но это не удастся, поскольку мы не предоставили надлежащие учетные данные.
Рисунок 1: Неудачная попытка подключения к общему ресурсу с помощью команды NET
Используя ту же команду NET, мы можем изменить имя общего ресурса для подключения к административному общему ресурсу IPC$. Это дает более положительный результат.
Рис. 2. Успешное подключение к нулевому сеансу с помощью команды NET
На данный момент мы установили соединение нулевого сеанса с нашей жертвой. Так что же дальше? У нас нет административного доступа к машине, поэтому мы не можем просто начать просматривать жесткий диск или извлекать хэши паролей. Помните, что общий ресурс IPC используется для связи между процессами, поэтому наш доступ ограничен именем пользователя SYSTEM. Мы можем использовать команду NET, чтобы извлечь больше информации из цели, но есть автоматизированные инструменты, которые возьмут на себя часть работы по уравнению.
Мой любимый инструмент для извлечения информации из нулевых сессий — это утилита под названием Enum. Enum — это бесплатная утилита на основе командной строки, которую мы можем использовать для извлечения имен пользователей, имен групп, системной информации и многого другого. Для меня, как для злоумышленника, одной из самых важных вещей является список пользователей в системе. С помощью этого списка я могу начать угадывать пароли и даже пытаться взломать их методом грубой силы. Чтобы получить список пользователей с помощью Enum, вы можете ввести следующую команду:
Рисунок 3: Использование Enum для перечисления пользователей в системе
Имея под рукой список пользователей, мы можем затем получить системную политику паролей, чтобы лучше помочь нашим попыткам угадать пароль:
Рисунок 4: Использование Enum для перечисления политики паролей в системе
Если пойти еще дальше, мы можем собрать список общих ресурсов на машине-жертве:
Рисунок 5: Использование Enum для перечисления общих ресурсов в системе
Enum предоставляет несколько других опций, которые можно использовать для извлечения информации того же типа, и даже включает базовый механизм атаки по словарю, который можно использовать для взлома паролей на основе предоставленного пользователем списка слов.
Рисунок 6: Все возможные флаги для Enum
Эти штуки точно не выдают ключи от замка, но являются хорошим стартом и важным элементом для злоумышленника, пытающегося получить доступ к жертве.
Защита от нулевых сеансов
Первый вопрос, который вы зададите себе: «Я уязвим?» Ответ на этот вопрос зависит от операционных систем в вашей сетевой среде. Если вы используете Windows XP, Windows Server 2003 или Windows 2000, то ответ положительный, по крайней мере, в некоторой степени. Это может показаться неприменимым, так как большинство людей уже давно используют эти версии операционных систем, но Windows XP и Server 2003 по-прежнему являются самыми распространенными операционными системами в производстве. Есть еще несколько вещей, которые вы можете сделать, чтобы предотвратить создание нулевых сеансов.
Ограничить нулевые сеансы в реестре
Совместимость с устаревшим программным обеспечением, а также тот факт, что большинству компаний приходится придерживаться жесткого бюджета, — это всего лишь несколько причин, по которым я все еще вижу рабочие станции и серверы Windows 2000. Если вам по-прежнему требуются клиенты Windows 2000, вы можете применить простое изменение реестра, чтобы предотвратить извлечение информации через нулевые сеансы.
Если вы откроете regedit и перейдете к HKLM/System/CurrentControlSet/Control/LSA/RestrictAnonymous, вы сможете настроить три возможных параметра.
- 0 – настройка по умолчанию. Неограниченный доступ к нулевой сессии
- 1 — не устраняет нулевые сеансы, но предотвращает перечисление имен пользователей и общих ресурсов.
- 2 — практически исключает любую ценность нулевых сеансов, ограничивая доступ практически ко всему.
Как видите, вы не можете на 100% исключить нулевые сеансы, но вы можете сильно ограничить их мощность, установив для этого параметра значение 2. Будьте осторожны при настройке этого параметра на сервере Windows 2000, так как это может нарушить работу кластера.
Вы можете выполнить аналогичное действие в Windows XP и 2003 Server через три отдельных раздела реестра.
HKLMSystemCurrentControlSetControlLsaRestrictAnonymous
- 0 – настройка по умолчанию. Нулевые сеансы могут использоваться для перечисления общих ресурсов.
- 1 — Нулевые сеансы нельзя использовать для перечисления общих ресурсов.
HKLMSystemCurrentControlSetControlLsaRestrictAnonymousSAM
- 0 — нулевые сеансы могут перечислять имена пользователей
- 1 – настройка по умолчанию. Нулевые сеансы не могут перечислять имена пользователей
HKLMSystemCurrentControlSetControlLsaEveryoneIncludesAnonymous
- 0 – настройка по умолчанию. Нулевые сеансы не имеют особых прав
- 1 — Нулевые сеансы считаются частью группы «все» (довольно опасны и могут разрешить общий доступ).
Рисунок 7: Изменение ключа RestrictAnonymous в реестре
Из рисунка выше ясно видно, что по умолчанию Windows XP разрешает перечисление общих ресурсов только с помощью функции по умолчанию. Это более безопасно, чем то, что мы видим в Windows 2000, но по-прежнему предоставляет информацию потенциальному злоумышленнику.
Блокировать доступ на сетевом уровне
Если вы не можете внести изменения в реестр, перечисленные выше, вы можете заблокировать их с помощью брандмауэра Windows или сетевого брандмауэра. Это можно сделать, заблокировав доступ к портам, связанным с NetBIOS и SMB, через TCP/IP. Это:
- TCP-порт 135
- UDP-порт 137
- UDP-порт 138
- TCP-порт 139
- TCP- и UDP-порт 445
Эти порты используются для всех видов сетевых функций Windows, включая общий доступ к файлам, сетевую печать, кластеризацию и удаленное администрирование. При этом блокирование доступа к этим портам следует тщательно протестировать, прежде чем применять его вслепую к множеству хостов.
Определение нулевых сеансов с помощью IDS
Если изменения реестра или правила брандмауэра, упомянутые ранее, нарушают функциональность сетевых приложений, то вы должны переключиться на реактивный подход, а не на проактивный. Вместо того, чтобы предотвращать перечисление через нулевые сеансы, лучшее, на что мы можем надеяться, — это поймать его, когда оно произойдет, и отреагировать на него, как на обычный инцидент сетевой безопасности.
Если вы используете Snort, самую популярную на сегодняшний день IDS, то следующее правило обнаружит нумерацию нулевого сеанса (взято из книги Jack Koziol «Обнаружение вторжений с помощью Snort»):
alert tcp $EXTERNAL_NET any -> $HOME_NET 139 (msg:"NETBIOS NT NULL session"; поток:to_server.establshed;
содержимое: '|00 00 00 00 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 20 00 4E 00 54 00 20 00 31 00 33 00 38 00 31|'; тип класса: попытка разведки;)
Это не предотвратит возникновение нулевых сеансовых подключений, но предупредит вас, когда они это сделают, чтобы вы могли отреагировать соответствующим образом.
Вывод
Концепция нулевого сеанса ни в коем случае не является новой угрозой, но о ней часто забывают и неправильно понимают. Это по-прежнему очень жизнеспособная тактика подсчета потенциальных злоумышленников, и ее даже преподают на большинстве профессиональных курсов этического взлома. Понимание того, как работают нулевые сеансы, является обязательным, если вы отвечаете за безопасность систем в сети.