Від коду до покриття (Частина 2): Кошмар з білими пробілами
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Стаття пояснює, як фільтри LDAP, створені за допомогою інструментів Impacket, нормалізуються службою Active Directory таким чином, що в їх форматуванні з’являються непослідовні пробіли в Ідентифікатор події 1644 журналах. Ці зміни у форматуванні можуть порушити виявлення, які залежать від точного зіставлення строк, навіть коли логіка базових фільтрів ідентична. Автор показує, чому базова логіка “містить” є ненадійною, і розповідає про розробку стійких виявлень Sigma за допомогою регулярних виразів, які допускають відмінності в пробілах, зміни в регістрі та варіації операторів.
Розслідування
Щоб перевірити проблему, автор переглянув реальні записи подій 1644 з виробничих середовищ і задокументував численні варіації пробілів одного й того ж побітового фільтра LDAP (наприклад, варіанти userAccountControl&524288 з різними пробілами, розміщенням дужок і форматуванням). Було випробувано кілька підходів до виявлення — починаючи з перевірки статичних строк і закінчуючи все гнучкішими шаблонами регулярних виразів — поки правило надійно не співпадало з усіма спостережуваними представленнями без помилкових спрацьовувань.
Пом’якшення
Прийміть виявлення на основі регулярних виразів, які дозволяють опційні пробіли, підтримують нечутливе до регістру зіставлення та враховують обидва AND/OR стилі операторів. Щоб зберегти продуктивність на розумному рівні, попередньо фільтруйте по імені цільового атрибута перед застосуванням більш витратної логіки регулярних виразів. Нарешті, регулярно перевіряйте виявлення на заданому «стінах ганьби» корпусі, який фіксує всі побачені варіанти пробілів і форматування в полі.
Відповідь
Коли спрацьовує підозрілих фільтр LDAP, повідомте SOC, щоб оцінити можливе виявлення привілеїв або ескалацію-оглядову діяльність. Корелюйте подію з джерелом хост/IP, користувачем-запитувачем та іншими атрибутами LDAP, щоб визначити наміри та межі. Якщо виникають помилкові позитиви, налаштуйте пороги та умови правил, зберігаючи покриття для вже відомих варіантів форматування.
Потік атаки
Ми все ще оновлюємо цю частину. Зареєструйтесь, щоб отримати повідомлення
Повідомити менеВиявлення
Можливе делегування виявлення через userAccountControl (через служби каталогу)
Перегляд
Можливе вимивання через виключення заблокованого облікового запису (через службу каталогу)
Перегляд
Виявлення бітових операцій на рівні сервісного шару LDAP з варіаціями пробілів [Microsoft Windows Security Event Log]
Перегляд
Виконання гравітаційного сценарію
Передумова: Повинен бути пройдений перевірка телеметрії і базового рівня Pre-flight Check.
Обґрунтування: У цьому розділі детально описано точне виконання техніки супротивника (TTP), призначеної для запуску правила виявлення. Команди та наратив ПОВИННІ точно відображати виявлені TTP та прагнути генерувати саме ту телеметрію, якої очікує логіка виявлення.
-
Опис атаки та команди:
Супротивник із обліковими даними домену з низьким привілеєм хоче знайти облікові записи з привілеями для бічного переміщення. Вони створюють фільтр LDAP, який виконує побітовий AND наuserAccountControlщоб ізолювати облікові записи задміністративнимпрапором (значення 524288). Щоб уникнути простого зіставлення строк, вони додають додаткові пробіли та дужки точно так, як очікує правило Sigma.- Побудуйте рядок фільтра LDAP із варіаціями пробілів.
- Виконайте пошук LDAP за допомогою
ldapsearch(через PowerShell) проти контролера домену. - Переконайтеся, що журнал безпеки реєструє подію 1644 з створеним фільтром.
-
Скрипт регресійного тестування:
# -------------------------------------------------------------- # Симулюйте побітовий фільтр LDAP, який повинен спрацювати правило Sigma # -------------------------------------------------------------- # Параметри $DomainController = "dc01.example.com" $BaseDN = "DC=example,DC=com" $Filter = "( userAccountControl & 524288 )" $Attributes = "distinguishedName,samAccountName,userAccountControl" # Виконати запит LDAP try { $result = [ADSI]"LDAP://$DomainController/$BaseDN" $searcher = New-Object System.DirectoryServices.DirectorySearcher($result) $searcher.Filter = $Filter $searcher.PropertiesToLoad.AddRange($Attributes.Split(',')) $searcher.PageSize = 1000 $entries = $searcher.FindAll() foreach ($entry in $entries) { $dn = $entry.Properties["distinguishedname"][0] $sam = $entry.Properties["samaccountname"][0] $uac = $entry.Properties["useraccountcontrol"][0] Write-Output "Знайдено: $sam ($dn) - UAC=$uac" } } catch { Write-Error "Запит LDAP не вдався: $_" } -
Команди очищення:
# Жодних постійних змін не було внесено; просто закрийте з'єднання ADSI. Write-Output "Очищення завершено."