stihl не предоставил(а) никакой дополнительной информации.
В этой статье я покажу, как мне удалось организовать фишинговую рассылку, используя критическую уязвимость в Exchange Server, чтобы повысить доверие к рассылаемым письмам. Начал с получения списка корпоративных адресов через устаревшую версию мобильного приложения, затем с помощью Evilginx2 и Telegram-бота создал неотличимый от оригинала лендинг и в итоге закрепился в сети организации.
Это исследование получило первое место на Для просмотра ссылки Войдиили Зарегистрируйся в категории «Ловись рыбка». Соревнование ежегодно проводится компанией Awillix.
Ссылка для скачивания приложения появляется, только если зайти с мобильного устройства. Но я просто включил в браузере эмуляцию телефона и скачал приложение на компьютер.
Для просмотра ссылки Войдиили Зарегистрируйся
Дальше я провел разведку по открытым источникам и собрал небольшой список имейлов работников организации. Затем поспреил пароли в приложении, получил доступ к профилю одного из сотрудников и смог вытащить через API уже полный список адресов. Их‑то я и буду использовать для фишинговой рассылки.
Для просмотра ссылки Войдиили Зарегистрируйся
Суть этого бага в том, что сервер некорректно парсит заголовок P2 FROM и этим можно воспользоваться — подделать поле отправителя так, чтобы там были сразу два адреса: реальный (который проверяет Exchange и скрыт от пользователя) и фейковый, который видит жертва. В итоге Exchange успешно подтверждает подлинность, и жертва видит, что получила письмо от доверенного сотрудника.
Если тебе понадобятся другие связки, помимо Gmail → Outlook, то можешь обратиться к Для просмотра ссылки Войди или Зарегистрируйся.
Из‑за лимитов на отправку писем я использовал несколько аккаунтов Gmail. Эти адреса были заведены заранее — для совсем новых учеток у Google порой жесткие ограничения, и можно нарваться на блокировки или лимиты.
На каждом сервере, который я использовал для рассылки, я поместил скрипт на Python для работы с Gmail по API. Скрипт подменяет P2 FROM при отправке письма. Также я добавил рандомные паузы — чтобы не триггерить безопасность Gmail при отправке и корпоративные фильтры — при приеме.
На скриншотах — полный текст каждого из вариантов письма.
Для просмотра ссылки Войдиили ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Я подготовил VPS для работы Telegram-ботов. Визуально боты идентичны, однако каждый вел на свой инстанс фишингового веб‑ресурса.
Для просмотра ссылки Войдиили Зарегистрируйся
Также на отдельной VPS я развернул Evilginx2. Это прокси, который встает между пользователем и настоящим сайтом: созданный с его помощью ресурс полностью имитирует легитимный сайт и перехватывает запросы и ответы между жертвой и реальным сервером. Это позволяет злоумышленникам (или редтимерам) получать учетные данные и сессионные токены.
Правила перехвата валидных учеток и сессионных токенов я написал сам, а также настроил VPS так, чтобы перехваченные токены оставались активными еще некоторое время. Конкретные шаги здесь не привожу.
Так как я использовал Evilginx2, пользователи внутри клиента Telegram видели страницу с привычным для них интерфейсом сайта. Такое решение также позволяло сразу проверять корректность вводимых данных, так как фишинговый сервер проксировал трафик до легитимного ресурса и обратно.
Так я получил дополнительные сессии работников, которые изначально допускали опечатки в своих паролях или вводили устаревшее OTP: жертвы видели привычные сообщения об ошибке входа и вводили свои данные снова — на этот раз корректно.
Для просмотра ссылки Войдиили Зарегистрируйся
Боты, использующие WebApp, — это PWA, то есть Progressive Web Apps, которые запускаются внутри WebView (встроенного в приложение браузера). Открыв переписку с таким ботом, ты никогда не увидишь никаких URL внутри Telegram (что в мобильном приложении, что в десктоп‑версии)!
Да, на ПК можно залезть в экспериментальные настройки и активировать параметр Enable webview inspecting, а затем, кликнув в окне приложения правой кнопкой мыши (или нажав F12), открыть консоль разработчика.
Для просмотра ссылки Войдиили Зарегистрируйся
Но кто этим будет заниматься из рядовых пользователей?
В итоге «регистрация в боте» работает так: жертва фишинга переходит по QR-коду из письма к Telegram-боту и, следуя приложенной к письму инструкции, проходит аутентификацию. Процесс при этом неотличим на глаз от легитимного за счет использования Evilginx2, а проверить его подлинность без специальной подготовки нельзя — поскольку мы находимся внутри веб‑приложения в Telegram.
На скриншоте ниже — код на Python, которым ты можешь вдохновляться, если захочешь создать похожего бота.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
В конце они получали заранее подготовленное сообщение об успешной регистрации. Оно делается с помощью кастомизации фишлета Evilginx.
На одном из моих серверов при этом сохранялись следующие данные:
или Зарегистрируйся
Пример перехваченной сессии одного из первых попавшихся сотрудников
Дальше я продлевал жизнь сессионных токенов с помощью специально разработанного скрипта на Bash. Он крутился на нескольких VPS и использовал curl, чтобы раз в несколько секунд отправлять на целевой ресурс запрос с токенами и поддельными заголовками User-Agent.
Дальше токены можно импортировать в браузер и использовать при атаке на организацию.
Для просмотра ссылки Войдиили Зарегистрируйся
Для защиты от подобных проблем можно дать следующие рекомендации:
Это исследование получило первое место на Для просмотра ссылки Войди
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Как я получил адреса
Исследуя корпоративный веб‑ресурс, я обнаружил, что там в открытом доступе лежала старая версия мобильного приложения. В отличие от актуальной на тот момент, она позволяла залогиниться без второго фактора.Ссылка для скачивания приложения появляется, только если зайти с мобильного устройства. Но я просто включил в браузере эмуляцию телефона и скачал приложение на компьютер.
Для просмотра ссылки Войди
Дальше я провел разведку по открытым источникам и собрал небольшой список имейлов работников организации. Затем поспреил пароли в приложении, получил доступ к профилю одного из сотрудников и смог вытащить через API уже полный список адресов. Их‑то я и буду использовать для фишинговой рассылки.
Выбираем способ доставки
В докладе Елизаветы Тишиной и Всеволода Кокорина «Вам письмо: старые новые атаки на почту», представленном на PHDays 2024, я подсмотрел один замечательный трюк: возможность слать электронные письма клиентам Microsoft Exchange Server с подменой адреса отправителя (за что большое спасибо докладчикам!).Для просмотра ссылки Войди
Суть этого бага в том, что сервер некорректно парсит заголовок P2 FROM и этим можно воспользоваться — подделать поле отправителя так, чтобы там были сразу два адреса: реальный (который проверяет Exchange и скрыт от пользователя) и фейковый, который видит жертва. В итоге Exchange успешно подтверждает подлинность, и жертва видит, что получила письмо от доверенного сотрудника.
info
Во время эксплуатации этой уязвимости патчи от Microsoft и других вендоров еще не были доступными для скачивания.
Если хочешь быстро проверить, можно ли подменять отправителя при пересылке из Gmail в Outlook, вот рабочий PoC (используй его ответственно):
Код:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Твой аккаунт Gmail
sender_email = "ОТКОГООТПРАВИТЬ"
# Пароль приложения, взятый с https://myaccount.google.com/u/0/apppasswords
password = "ПАРОЛЬ_ПРИЛОЖЕНИЯ"
# Email, куда отправить письмо
receiver_email = "<КУДА_ОТПРАВИТЬ>"
# Ящик, который нужно показать получателю
spoofed_email = "<ЖЕЛАЕМЫЙАДРЕСОТПРАВИТЕЛЯ>"
smtp_server = "smtp.gmail.com"
smtp_port = 587
message = MIMEMultipart()
# Здесь можно подменить имя отправителя
message["From"] = f"<{spoofed_email}> "spoofed" <{sender_email}>"
# Текст письма
message.attach(MIMEText('Test for CVE-2024-49040', "plain"))
server = smtplib.SMTP(smtp_server, smtp_port)
server.set_debuglevel(1)
server.starttls()
server.login(sender_email, password)
print(message.as_string())
server.sendmail(sender_email, receiver_email, message.as_string())
Из‑за лимитов на отправку писем я использовал несколько аккаунтов Gmail. Эти адреса были заведены заранее — для совсем новых учеток у Google порой жесткие ограничения, и можно нарваться на блокировки или лимиты.
На каждом сервере, который я использовал для рассылки, я поместил скрипт на Python для работы с Gmail по API. Скрипт подменяет P2 FROM при отправке письма. Также я добавил рандомные паузы — чтобы не триггерить безопасность Gmail при отправке и корпоративные фильтры — при приеме.
Делаем лендинг
Я сделал два варианта фишингового письма с одной темой — «Новая фича: подключение к удалёнке через Telegram». Добавил короткий текст и QR-код внутри — сканируешь и попадаешь в телеграм‑бота злоумышленника.На скриншотах — полный текст каждого из вариантов письма.
Для просмотра ссылки Войди
Я подготовил VPS для работы Telegram-ботов. Визуально боты идентичны, однако каждый вел на свой инстанс фишингового веб‑ресурса.
Для просмотра ссылки Войди
Также на отдельной VPS я развернул Evilginx2. Это прокси, который встает между пользователем и настоящим сайтом: созданный с его помощью ресурс полностью имитирует легитимный сайт и перехватывает запросы и ответы между жертвой и реальным сервером. Это позволяет злоумышленникам (или редтимерам) получать учетные данные и сессионные токены.
Правила перехвата валидных учеток и сессионных токенов я написал сам, а также настроил VPS так, чтобы перехваченные токены оставались активными еще некоторое время. Конкретные шаги здесь не привожу.
Так как я использовал Evilginx2, пользователи внутри клиента Telegram видели страницу с привычным для них интерфейсом сайта. Такое решение также позволяло сразу проверять корректность вводимых данных, так как фишинговый сервер проксировал трафик до легитимного ресурса и обратно.
Так я получил дополнительные сессии работников, которые изначально допускали опечатки в своих паролях или вводили устаревшее OTP: жертвы видели привычные сообщения об ошибке входа и вводили свои данные снова — на этот раз корректно.
Telegram WebApp
Стоит отдельно поговорить про технологию WebApp в Telegram. С недавнего времени самый главный бот Telegram — @BotFather — тоже ее использует.Для просмотра ссылки Войди
Боты, использующие WebApp, — это PWA, то есть Progressive Web Apps, которые запускаются внутри WebView (встроенного в приложение браузера). Открыв переписку с таким ботом, ты никогда не увидишь никаких URL внутри Telegram (что в мобильном приложении, что в десктоп‑версии)!
Да, на ПК можно залезть в экспериментальные настройки и активировать параметр Enable webview inspecting, а затем, кликнув в окне приложения правой кнопкой мыши (или нажав F12), открыть консоль разработчика.
Для просмотра ссылки Войди
Но кто этим будет заниматься из рядовых пользователей?
В итоге «регистрация в боте» работает так: жертва фишинга переходит по QR-коду из письма к Telegram-боту и, следуя приложенной к письму инструкции, проходит аутентификацию. Процесс при этом неотличим на глаз от легитимного за счет использования Evilginx2, а проверить его подлинность без специальной подготовки нельзя — поскольку мы находимся внутри веб‑приложения в Telegram.
На скриншоте ниже — код на Python, которым ты можешь вдохновляться, если захочешь создать похожего бота.
Для просмотра ссылки Войди
Активная фаза проведения фишинга
После рассылки писем некоторое количество работников отсканировали QR-код, перешли к одному из фишинговых Telegram-ботов (какому конкретно — зависело от варианта письма) и авторизовались через фишинговый ресурс.Для просмотра ссылки Войди
В конце они получали заранее подготовленное сообщение об успешной регистрации. Оно делается с помощью кастомизации фишлета Evilginx.
На одном из моих серверов при этом сохранялись следующие данные:
- логин;
- пароль;
- сессионный токен, позволяющий получить доступ к целевому ресурсу организации.
Дальше я продлевал жизнь сессионных токенов с помощью специально разработанного скрипта на Bash. Он крутился на нескольких VPS и использовал curl, чтобы раз в несколько секунд отправлять на целевой ресурс запрос с токенами и поддельными заголовками User-Agent.
Дальше токены можно импортировать в браузер и использовать при атаке на организацию.
Выводы
Особенность работы ботов в Telegram и найденные уязвимости помогли провести эффективный фишинг и закрепиться в сети организации.Для просмотра ссылки Войди
Для защиты от подобных проблем можно дать следующие рекомендации:
- Проводить регулярные учебные фишинговые кампании, в том числе показывающие работникам, что нарушитель может подделывать адрес отправителя.
- Проверить используемые средства защиты на наличие правил обнаружения Evilginx. Evilginx автоматически добавляет свой HTTP-заголовок X-Evilginx с доменом атакующего, что можно использовать как один из потенциальных признаков.
- Запретить подключаться старым версиям мобильного приложения, особенно после изменений механизма аутентификации. В крайнем случае доступ к небезопасному эндпоинту API можно закрыть через WAF.
- Своевременно устанавливать обновления безопасности (в данном случае Exchange Server). В идеале — после тестирования на работоспособность.
- Если используются другие решения для защиты почты, обновлять их. Например, в «Лаборатории Касперского» Для просмотра ссылки Войди
или Зарегистрируйся механизмы детекта спуфинга в своих решениях для защиты корпоративной почты. В том числе должна определяться эксплуатация CVE-2024-49040.