Русский
Русский
English
Статистика
Реклама

Аудит иб

Как мы нашли уязвимость в почтовом сервере банка и чем она грозила

16.10.2020 20:06:22 | Автор: admin
Мы часто проводим пентесты для банков и других финансовых организаций. Так же часто обнаруживаем уязвимости разного уровня критичности. Этот пост про один из таких кейсов.

Недавно, проверяя защищенность веб-ресурсов банка, мы нашли уязвимость в почтовом сервере Exim 4.89, которая может приводить к удаленному выполнению кода. Уязвимость известна как CVE-2018-6789. Применив PoC-эксплойт, мы получили Reverse Shell к удаленной машине, а затем и доступ к веб-сайту банка.



Естественно, мы заинтересовались, почему такая эксплуатация уязвимости стала возможной.

Откуда взялась CVE-2018-6789


Если совсем коротко, уязвимость существует из-за ошибки вычисления длины буфера в функции base64.c:b64decode, используемой в Exim. Подробнее об этом можно прочитать здесь (на английском).

Если подать на вход строку особой длины, можно перезаписать один байт информации и с помощью несложных действий изменить команды сервера, тем самым выполнив произвольный код (RCE).

Exim выделяет буфер размером 3*(len/4)+1 байт для хранения декодированных данных. Однако если на вход функции подать некорректную по длине base64-строку, например длинной 4n+3, то Exim выделит 3n+1 байт под буфер. Но при этом запишет в буфер 3n+2 байта данных. Это вызывает перезапись одного байта в куче.

В Exim существуют функции store_malloc_3 и store_free_3 обертки для функций malloc и free из Glibc. Glibc выделяет большой блок данных, затем сохраняет в первых 0x10 байтах свои метаданные и возвращает указатель на память куда уже пользователь может записывать свои данные. Вот как это выглядит:


Метаданные включают размер предыдущего блока (тот, который находится в памяти выше), размер текущего блока и некоторые флаги. Первые три бита размера используются для хранения флагов. В примере размер 0x81 подразумевает, что текущий фрагмент составляет 0x80 байтов, а предыдущий фрагмент уже используется.

Освобожденные блоки, когда-то используемые в Exim, помещаются в двусвязный список. Glibc поддерживает его в соответствии с флагами и объединяет смежные освобожденные фрагменты в более крупный фрагмент, чтобы избежать фрагментации. Для каждого запроса на выделение памяти Glibc проверяет эти фрагменты в порядке FIFO и повторно их использует.


Для повышения производительности Exim использует свою надстройку для управления памятью; в ее основе лежит структура storeblock. Основная особенность storeblock заключается в том, что каждый из них имеет размер не менее 0x2000 байт, что становится ограничением для эксплуатации. Обратите внимание, что storeblock также является данными блока. Вот как это выглядит в памяти:


Команды, поддерживаемые почтовым сервером, для организации данных в куче:

  • EHLO hostname. При каждом выполнении команды EHLO hostname сохраняется в переменную sender_host_name. Соответственно, сначала выполняется store_free для старого имени и store_malloc для нового.
  • Любая неопознанная команда. Для каждой нераспознанной команды, составленной из непечатаемых символов, Exim выделит буфер для конвертации ее в читаемые символы.
  • AUTH. В большинстве процедур аутентификации Exim использует кодировку base64 для связи с клиентом. Строка кодирования и декодирования хранится в буфере, выделенном store_get (). Буфер под закодированную и декодированную строку выделяется с помощью store_get().
  • Reset в командах EHLO/HELO, MAIL, RCPT. Когда команды завершаются корректно, Exim вызывает smtp_reset. Она в свою очередь вызывает store_reset для того, чтобы сбросить цепочку блоков до точки сброса. Это значит, что все storeblock-и выделенные store_get после последней команды будут освобождены.

Как эксплуатируется уязвимость


Для того что использовать однобайтовое переполнение в куче, у нас должна быть возможность освободить блок данных, который находится под декодированной base64 строкой. Для этого подойдет sender_host_name.

Необходимо сформировать кучу таким образом, чтобы оставить освобожденным блок данных над блоком, содержащим sender_host_name.


Для этого нужно:

1. Положить большой блок в unsorted bin. Прежде всего, мы отправляем сообщение EHLO с именем хоста избыточной длины, чтобы он выделил и освободил кусок длиной 0x6060 в unsorted bin.

2. Выделить первый storeblock. Затем мы отправляем нераспознаваемую команду для того, чтобы вызвать store_get () и выделяем storeblock внутри освобожденного фрагмента.

3. Выделить второй блок и освободить первый. Отправляем EHLO, чтобы получить второй блок. Первый блок освобождается последовательно из-за smtp_reset, вызываемого после завершения EHLO.

После того как куча подготовлена, мы можем использовать ее для перезаписи исходного размера, блока. Модифицируем 0x2021 на 0x20f1, что немного расширяет блок.



4. Отправить данные base64 и переполнить 1 байт на куче. Запускаем команду AUTH для отправки данных base64.

5. Создать и отправить строку подходящего размера. Поскольку мы расширили блок данных, начало следующего фрагмента теперь будет лежать где-то внутри. Теперь нам нужно исправить его для того, чтобы пройти проверку целостности Glibc. Мы отправляем сюда еще одну строку base64.

6. Освободить расширенный блок. Чтобы контролировать содержимое расширенного блока, нам нужно сначала освободить блок, потому что мы не можем редактировать его напрямую. То есть мы должны отправить новое сообщение EHLO, чтобы освободить старое имя хоста. Однако обработка команды EHLO вызывает smtp_reset после ее успешного выполнения. Это может привести к прерыванию программы или ее аварийному завершению. Чтобы этого избежать, мы отправляем недопустимое имя хоста, например а+.

7. Перезаписать следующий указатель перекрывающегося блока storeblock.


После того, как фрагмент освобожден, мы можем получить его с помощью AUTH и перезаписать часть перекрывающегося блока storeblock. Здесь мы используем прием, называемый частичной записью. Благодаря этому мы можем изменить указатель, не нарушая ASLR. Мы частично изменили следующий указатель на блок, содержащий строки ACL. Строки ACL указываются набором глобальных указателей, например uschar *acl_smtp_helo;

Эти указатели инициализируются в начале процесса Exim и устанавливаются в соответствии с конфигурацией. Например, если в конфигурации есть строка acl_smtp_mail = acl_check_mail, указатель acl_smtp_mail указывает на строку acl_check_mail.

Каждый раз, когда сервер получает команду MAIL FROM, Exim выполняет проверку ACL, которая сначала раскрывает acl_check_mail. При раскрытии, если Exim встретит строку $ {run {cmd}}, то он попытается выполнить команду cmd,, поэтому удаленный злоумышленник может добиться выполнения кода.

8. Сбросить storeblock и получить storeblock, содержащий ACL. Теперь блок ACL находится в цепочке блоков. Он будет освобожден после выполнения smtp_reset (), а затем мы сможем получить его снова, выделив несколько блоков.

9. Перезаписать строки ACL и запустить проверку ACL. Наконец, мы перезаписываем весь блок, содержащий строки ACL. Теперь мы отправляем такие команды, как EHLO, MAIL, RCPT для запуска проверки ACL.

К слову, эксплуатацию уязвимости облегчила выключенная по какой-то неведомой нам причине ASLR.

Какие проблемы были у заказчика


Первая отсутствие управления обновлениями. Из-за того, что использовалась старая версия Exim, удалось организовать компрометацию системы. Чтобы избежать этого, мы рекомендуем организовать регулярную проверку и установку обновлений безопасности на компоненты информационной инфраструктуры.

Проверку наличия новых обновлений безопасности и критических обновлений рекомендуем проводить не реже раза в месяц. Для проверки обновлений лучше использовать сайты/рассылки производителей оборудования или информацию с репозиториев.

Также в банке отсутствовал процесс управления уязвимостями, из-за чего уязвимость не была вовремя обнаружена. Исправить ситуацию помогло бы использование специализированных сканеров уязвимостей например, OpenVAS, Nessus, xSpider и т. п. А также проведение регулярных тестирований на проникновение и контроль сроков устранения уязвимостей.

И последнее, но немаловажно. В банке отсутствовал процесс управления изменениями. Все изменения делались администраторами сразу в production-среде. Следовательно, никто это не контролировал и не мониторил. Это и привело к тому, что на сервере был выключен ASLR.

Вывод


Несколько, казалось бы, несвязанных между собой нарушений привели к тому, что сайт банка был скомпрометирован. Этим могли воспользоваться злоумышленники, чтобы, например, поменять реквизиты банка на собственные.

История закончилась хорошо. После компрометации мы сразу же оповестили клиента о ситуации. Банк в срочном порядке обновил Exim-сервер до актуальной версии, для которой уязвимость уже не актуальна. Однако если бы уязвимость была выявлена не во время пентеста, а реальными злоумышленниками, исход мог бы быть другим.
Подробнее..

Меня развели мои же коллеги как и зачем мы проводим внутренние фишинговые рассылки

24.12.2020 10:15:09 | Автор: admin
Привет! Меня зовут Саша, и уже полтора года я периодически промышляю фишингом. Только не ради наживы, а для повышения киберграмотности коллег. Такие рассылки помогают нам проверить, насколько вероятна утечка из-за человеческого фактора, кому и какое обучение порекомендовать по основам кибербезопасности. В итоге грамотность сотрудников повышается: к концу года доля попавшихся снизилась с 17% до 2%.

Это помогает проходить аудит по стандарту ISO/IEC 27001. Такая рассылка со сбором статистики и последующим обучением встраивается в систему внутреннего аудита по требованиям стандарта.

В посте покажу примеры, как мы проводили внутреннюю фишинговую рассылку и какие результаты она дает.



С чего начать


Внутренняя рассылка должна быть максимально похожей на реальное письмо: именно такого эффекта добиваются мошенники при фишинге. Нужно решить сразу несколько творческих задач:
  1. Придумать сценарий фишинга.
  2. Зарегистрировать домен, настроить почту.
  3. Создать письмо с привлекательной ссылкой.
  4. Создать правдоподобный лэндинг, где пользователи оставят свои данные.
  5. Собрать базу для рассылки. Можно сделать выборку по внутренней адресной книге. А можно собрать базу из открытых источников и проверить более уязвимых пользователей с засвеченными учетками.
  6. Сделать рассылку и собрать статистику, кто и как отреагировал.
  7. Провести обучение для пользователей по итогам.


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

Опыт коллеги: письмо про икру


Пробную рассылку устроили еще в конце прошлого года. Коллега создал фальшивый адрес, который имитировал почту сотрудницы HR. Сотрудникам от ее имени предложили оставлять заявки на икру и алкоголь для новогоднего стола:

Не забыли добавить в текст орфографические ошибки и смайлы.

Многие стали обращаться к сотруднице лично. Предупреждать ее заранее об этом не стали, чтобы было реалистичнее. Но икра по цене 400 рублей за кг была интересна такому количеству людей, что потребовалось опровержение от Василия, директора центра киберзащиты:


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

После рассылки подготовили и разослали всем видеоинструкцию по противодействию фишингу: на что обращать внимание, как проверить ресурсы и так далее.

Рассылка от сервиса видеоконференций


C переходом на удаленку мы обнаружили рост фишинговых атак, связанных с темой COVID-19. В апреле всем сотрудникам отправили рассылку-предупреждение:


В мае решили протестировать, как усвоилась информация. Идею ковидных рассылок отмели как слишком очевидную. Придумали другой заход: в марте всем сотрудникам установили Webex систему для веб-конференций. За пару месяцев все к ней привыкли, пора проверить бдительность.

Мы посмотрели на стандартную рассылку от Webex и создали похожее письмо:


Кнопка вела на подставной домен с формой для ввода логина и пароля:

Почта пользователя сразу подставилась в приветствие и поле с логином.

После ввода пароля шел редирект на реальный ресурс Cisco, чтобы пользователь ничего не заподозрил (часто так и бывает!).

Всего мы отправили 88 писем, по ссылке перешел 21 пользователь. Ввели данные 15 сотрудников это 17% от всей рассылки. После этого снова отправили всей компании напоминание про фишинг: раскрыли карты, разобрали пример нашей рассылки, объяснили, что делать.

Было забавно, когда один из коллег в личке пожаловался мне на мою же фишинговую рассылку. Чтобы сохранить чистоту эксперимента, об учениях я умолчал. Просто ответил: да, хорошо, разберемся, спасибо за бдительность.

За лето мы отправили сотрудникам целую серию обучающих писем с примерами фишинга из нашей практики. Следующий тест решили провести осенью в предновогодний сезон.

Рассылка в честь киберпонедельника


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

В этот раз я создал отдельный домен dataline-cybermonday.ru. Взял дизайн одного популярного сайта и сверстал письмо посимпатичнее:

Для правдоподобия добавил социальные кнопки, они ведут на официальные аккаунты.

Сайт тоже получился максимально правдоподобным:


Но сотрудники стали бдительнее: логин и пароль ввели только двое.

Рассылка от мэрии Москвы


С этой рассылкой я заморочился еще сильнее и решил провести фейковый опрос жителей Москвы о новогодних праздниках. Сначала создал домен opros-mos.ru. Прототипом для письма стала муниципальная рассылка в честь Дня города. Взял из нее фото и подпись мэра, герб города, ссылки на страницы в соцсетях. Получилось очень похоже:

Стишок взял первый попавшийся на странице поиска.

Так выглядела страница для ввода логина и пароля. Тоже использовал изображения и кнопки с официального сайта:


На это письмо реагировали еще меньше: открыли письмо 14 человек, перешли по ссылке пятеро. Делаем вывод, что рассылки на нерабочие темы для пользователей корпоративной почты не так интересны.

Немного статистики и ссылок на инструментарий


Отдельно покажу, как мы считаем данные по рассылкам. Для всех писем отслеживаем, какая доля пользователей открыла письмо, перешла по ссылке и ввела свои данные. Разослать и зафиксировать данные по переходам помогает GoPhish опенсорсный фреймворк для фишинга.

Рассылку делаем не по всей компании, а по группе от 50 до 100 сотрудников, так что считаем долю от общего числа отправленных писем.

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


Отдельно отмечаем тех пользователей, которые сообщают в центр киберзащиты о подозрительном письме. По 4 письмам за год статистика такая:


Процент открывших письмо
Процент перешедших по ссылке
Процент тех, кто ввел данные
Процент уведомивших
Service desk
38
28
7
22
Webex
35
24
17
24
Новый год, Собянин
20
10
4
6
Wildberries
24
13
2
8


Опираясь на наш опыт, мы отточили фишинговые скиллзы и продолжаем совершенствоваться. Сейчас такие рассылки предлагаем нашим клиентам в рамках услуги по аудиту ИБ и берем на себя как работу с опенсорс-инструментами, так и создание сценариев, подготовку писем и лэндингов, обход спам-фильтров и рекомендации для пользователей.

В ближайшее время напишем про другие составляющие этого сервиса: проверку паролей и разведку по открытым источникам (OSINT).
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru