Долгие годы парадигма корпоративной безопасности строилась вокруг защиты периметра. Идея проста: мы ставим на границе сети мощный шлюз, который не пускает «плохих парней» из интернета к «хорошим парням» внутри.

Эта концепция мертва. Сегодня периметра нет. Сотрудники работают из дома, подрядчики подключаются через VPN, а облачные сервисы интегрированы напрямую в ядро сети. Рано или поздно злоумышленник окажется внутри. И если ваша внутренняя сеть «плоская», игру можно заканчивать, не начав.

Иллюзия внутренней безопасности

Плоская сеть – это архитектура, при которой любые узлы могут свободно устанавливать сетевые соединения друг с другом. Это когда ваш сетевой принтер внезапно может решить пообщаться с сервером баз данных о смысле жизни (и заодно передать ему шифровальщик).

Представьте. Хакер отправляет письмо с зараженным макросом рядовому менеджеру по продажам. NGFW на периметре гордо пропускает трафик, антивирус не замечает свежий обфусцированный пейлоад (попытайтесь выговорить это быстро). Злоумышленник получает доступ к одному компьютеру без прав администратора.

Что он делает дальше? Он не ломает контроллер домена в лоб. Он начинает «жить с земли» (Living off the Land) и оглядываться по сторонам.

Enter BloodHound: Картография уязвимостей

Для поиска пути к захвату всей компании атакующие используют BloodHound – инструмент на базе графовой базы данных Neo4j (ссылка на статью о том, что это за зверь).

Он использует легитимные запросы к Active Directory (часто даже не требующие прав админа), чтобы выгрузить:

  • Кто в каких группах состоит.
  • У кого где есть права локального администратора.
  • Какие сессии сейчас активны (кто на какой машине залогинен).

BloodHound строит визуальный граф. Хакер просто вбивает: «Найти кратчайший путь от пользователя Vasya.Pupkin до группы Domain Admins» и получает пошаговую инструкцию. Удобнее, чем навигатор в Яндекс Картах.

Святая троица горизонтального перемещения (Lateral Movement)

Как именно атакующий прыгает по графу BloodHound от обычного ПК до контроллера домена?

1. Pass-the-Hash (PtH) и кража учетных данных из памяти Служба IT-поддержки часто использует свои административные учетные записи для подключения к машинам пользователей (через RDP или удаленный софт). Проблема Windows в том, что хеши этих паролей могут оставаться в памяти процесса LSASS, как крошки на клавиатуре. Скомпрометировав машину пользователя, хакер извлекает хеш админа хелпдеска с помощью Mimikatz (ссылка) и использует его для авторизации на других машинах.

2. Kerberoasting (сломаешь язык)

Многие корпоративные приложения (SQL-серверы, веб-порталы) запускаются от имени доменных сервисных учетных записей (Service Accounts), у которых прописан SPN (Service Principal Name). Любой авторизованный пользователь в домене может запросить у контроллера Service Ticket (TGS) для доступа к этому сервису. Часть этого тикета зашифрована хешем пароля сервисного аккаунта.

Атакующий запрашивает тикет, скачивает его к себе на Kali Linux и спокойно перебирает пароль офлайн. И если IT-отдел задал пароль Service123! (с аргументом «иначе 1С отвалится, не трогай!») – аккаунт взломан, а сервисные аккаунты, как мы знаем, часто имеют права чуть ли не Бога.

3. LLMNR / NBT-NS Poisoning Если компьютер не может найти нужный ресурс в DNS, он начинает панически кричать на всю локальную подсеть: «Кто-нибудь знает, где сервер FILE-SHARE-01?». Злоумышленник с помощью утилиты Responder вежливо отвечает: «Это я, заходи, гостем будешь». Компьютер жертвы отправляет ему свой NetNTLMv2 хеш, который затем взламывается или пересылается (Relay) на другой сервер.

Лекарство: Микросегментация и Tier-модель

Лечить плоскую сеть тяжело, потому что это ломает исторически сложившиеся (и часто кривые) бизнес-процессы. Айтишники будут плакать, но другого пути нет.

Шаг 1. Изоляция рабочих станций

Главный вопрос, который нужно задать CIO\CTO\сетевику\Богу: «Зачем компьютеру бухгалтера Зинаиды Петровны открывать 445 порт (SMB) на компьютере маркетолога? Они даже в столовой не здороваются!».

Правильный ответ: незачем. Рабочие станции должны общаться только с серверами, но никогда – между собой.

Как запретить им общаться внутри одного VLAN? Ставить железный фаервол между каждым ПК? Нет. Для этого есть три элегантных решения:

  • Подход 1: Host-Based Firewall (Дешево и сердито) Забудьте про закупку дорогих решений. Ваш главный инструмент уже встроен в ОС – это Windows Defender Firewall, управляемый через AD GPO.
  • Базовое правило: Запретить все ВХОДЯЩИЕ соединения. Исключения: Разрешить их только от выделенных подсетей (Helpdesk, сканеры уязвимостей). В итоге зараженный компьютер пытается запустить шифровальщик по сети, а соседний ПК просто молча дропает эти пакеты на уровне своей ОС.
  • Подход 2: Изоляция на уровне сети (Private VLAN/Port Isolation) Если вы боитесь, что локальный админ выключит фаервол, используйте L2-коммутаторы доступа. Почти любой управляемый свитч умеет делать Port Isolation. Помечаете порты пользователей как Isolated, а uplink к серверам – как Promiscuous. Пакет от ПК-1 доходит до коммутатора, но тот говорит «вас тут не стояло» и отказывается пересылать его на ПК-2. Горизонтальное перемещение убито на аппаратном уровне.
  • Подход 3: Управление через EDR / XDR Если у вас развернут взрослый антивирус (Kaspersky Endpoint Security, CrowdStrike), у него почти всегда есть свой модуль Network Control. Он управляется из консоли безопасника и защищен от отключения пользователем (Tamper Protection).

Включив любую из этих трех мер, вы убиваете 80% векторов распространения малвари по офису.

Шаг 2. Tiered Administration Model (Модель уровней AD)

Microsoft давно разработала концепцию эшелонированной защиты Active Directory:

  • Tier 0: Контроллеры домена, PKI, сервера виртуализации.
  • Tier 1: Серверы приложений, баз данных.
  • Tier 2: Рабочие станции пользователей.

Золотое правило: Учетные записи администраторов Tier 0 никогда не должны логиниться на машины Tier 1 или Tier 2. Если Domain Admin зайдет по RDP на зараженный компьютер бухгалтера, чтобы «просто починить принтер», его токен останется там, и домен можно будет торжественно отпевать. Создайте отдельные учетки (Tier 2 Admins) для управления ПК пользователей.

Шаг 3. Усмирение сервисных аккаунтов

Запрет интерактивного входа для Service Accounts и длинные (от 25 символов) случайно сгенерированные пароли. В идеале – полный переход на gMSA, где AD сама генерирует 120-символьные пароли и меняет их каждые 30 дней. Прощай, Kerberoasting.

Как хранить длинные пароли для старых систем? Человек вообще не должен их помнить. Пароль генерируется и ложится в корпоративный менеджер (BitWarden/VaultWarden) или PAM-систему (CyberArk). Администратор копирует эту «кракозябру» ровно один раз при первичной настройке в services.msc, после чего с чистой совестью забывает про нее навсегда (главное – пароль от самого VaultWarden не забыть).

В итоге

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

P.S. Легкий скрипт для поиска

Запускаем в PowerShell, ищем учетные записи, уязвимые к Kerberoasting:

Import-Module ActiveDirectory
$LDAPFilter = "(&(objectClass=user)(objectCategory=person)(servicePrincipalName=*)(!(samaccountname=krbtgt))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
Write-Host "[*] Поиск учетных записей, уязвимых к Kerberoasting..." -ForegroundColor Cyan
Get-ADUser -LDAPFilter $LDAPFilter -Properties ServicePrincipalName, PasswordLastSet, PasswordNeverExpires, Description | 
  Select-Object SamAccountName, 
        @{Name="Password Age (Days)"; Expression={if($_.PasswordLastSet) {(New-TimeSpan -Start $_.PasswordLastSet -End (Get-Date)).Days} else {"N/A"}}},
         PasswordLastSet, 
         PasswordNeverExpires, 
         @{Name="SPNs"; Expression={$_.ServicePrincipalName -join "; "}} |
  Sort-Object "Password Age (Days)" -Descending |
  Out-GridView # Можно заменить на Export-Csv -Path "C:\temp\kerberoastable.csv" -NoTypeInformation