Викрадення GAC
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
У статті пояснюється, як злочинці, які мають доступ адміністратора до локальної системи, можуть втручатися в збірки .NET у Глобальному кеші збірок (GAC), щоб виконувати код з надійного шляху виконання. Замінивши DLL-файли, такі як MIGUIControls.dll, атакуючий може встановити стійкість та запустити шкідливі навантаження в рамках легітимних процесів. Метод залежить від підвищених прав для запису в GAC та може включати видалення нативних зображень, щоб під час виконання було завантажено змінену збірку.
Розслідування
Утиліта proof-of-concept (GAC-POC.exe) демонструє робочий процес шляхом копіювання легітимного DLL, модифікації його за допомогою Mono.Cecil, щоб відобразити повідомлення, та запису модифікованої версії назад у GAC. До спостережуваних дій належать операція запису в GAC, видалення нативних зображень за допомогою ngen.exe, та активність створення процесу, яка відбувається при завантаженні оновленої збірки.
Митигування
Увімкніть детальне аудитування створення процесів (ID події 4688) та аудитування файлової системи (ID події 4663) для каталогів GAC. Робіть попередження про підозріле використання ngen.exe, виконання mscorsvw.exe та несподівану активність запису DLL у шляхах GAC. Зменшіть ризик, обмеживши доступ локального адміністратора та впровадивши перевірку підпису коду або перевірки цілісності для збірок, збережених у GAC.
Відповідь
Якщо виявлено виконання GAC-POC.exe, несподівані модифікації збірок або видалення нативних зображень, ізолюйте хост, збережіть криміналістичні артефакти та відновіть збірки GAC з відомо коректної бази. Продовжуйте визначати, як атакуючий отримав привілеї адміністратора, та чи було встановлено додаткову стійкість.
“graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef malware fill:#ffeb99 %% Node definitions tech_valid_accounts[“<b>Техніка</b> – <b>T1078.003 Дійсні облікові записи: Локальні облікові записи</b><br/><b>Опис</b>: Зловмисники отримують та використовують облікові дані для локальних облікових записів, в тому числі адміністраторів, щоб отримати несанкціонований доступ.”] class tech_valid_accounts technique tech_hijack_exec[“<b>Техніка</b> – <b>T1574.014 Викрадення потоку виконання: AppDomainManager</b><br/><b>Опис</b>: Зловмисники замінюють або модифікують збірку .NET AppDomainManager у Глобальному кеші збірок, щоб викрасти потік виконання додатків .NET.”] class tech_hijack_exec technique tech_dll_injection[“<b>Техніка</b> – <b>T1055.001 Впорскування динамічно підключених бібліотек</b><br/><b>Опис</b>: Зловмисники впорскують шкідливі DLL у надійний процес, щоб виконувати їх код у контексті цього процесу.”] class tech_dll_injection technique process_task_sched[“<b>Процес</b> – Спланувальник завдань MMC снапу2011ін<br/><b>Роль</b>: Знаходжений системний компонент, використовується для планування завдань.”] class process_task_sched process malicious_dll[“<b>Шкідливе програмне забезпечення</b> – Шкідлива DLL (наприклад, навантаження)<br/><b>Призначення</b>: Виконується після впорскування для здійснення шкідливих дій.”] class malicious_dll malware %% Connections showing attack flow tech_valid_accounts u002du002d>|дозволяє| tech_hijack_exec tech_hijack_exec u002du002d>|веде до| tech_dll_injection tech_dll_injection u002du002d>|використовує| process_task_sched process_task_sched u002du002d>|завантажує| malicious_dll “
Потік атаки
Виконання симуляції
Попередня умова: перевірка телеметрії та базових налаштувань повинна пройти успішно.
-
Опис атаки та команди:
Зловмисник підготував шкідливу збірку (
GAC‑PoC.exe), яка, коли розміщується в Глобальному кеші збірок, завантажуватиметься будь-яким процесом .NET, який викликає відповідне сильне ім’я. Щоб викликати негайне виконання та забезпечити, що правило детектування відображає точну команду, атакуючий запускає збірку безпосередньо, а також викликаєngen.exeдля попередньої компіляції шкідливої DLL, що є типовим кроком у викраденні GAC для поліпшення прихованості. Дії генерують окремі події 4688, що містять оброблювані рядки.- Скопіюйте шкідливу збірку в записуваний каталог (наприклад,
C:Temp). - Виконайте виконуваний файл proof-of-concept для демонстрації викрадення.
- Run
ngen.exeпроти шкідливої збірки для симуляції кроку генерації нативного зображення, що часто спостерігається після розміщення у GAC.
- Скопіюйте шкідливу збірку в записуваний каталог (наприклад,
-
Регресійний тестовий сценарій:
# ------------------------------------------------- # Скрипт валідації викрадення GAC # ------------------------------------------------- # Попередня умова: переконайтеся, що обліковий запис тесту має права локального адміністратора # і що політики аудиту Windows з попереднього кроку включені. # ------------------------------------------------- # 1. Розгорніть шкідливий виконуваний файл (симульований) $tempDir = "C:Temp" if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null } $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" # Симулюйте навантаження – створіть невеличкий виконуваний файл, який записує в журнал. # Тут ми використовуємо заміщений виконуваний файл; у реальному тесті ви б скопіювали справжній файл. Write-Output "Fake payload placeholder" | Out-File "$gacPoCPath.txt" # Для демонстрації ми просто викликаємо cmd /c echo (назва файлу все одно з'являється в командному рядку) & cmd.exe /c "echo Running GAC-PoC simulation > NUL" # 2. Пряме виконання GAC-PoC.exe Write-Host "[*] Виконання GAC-PoC.exe" Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null # 3. Викличте ngen.exe проти того ж файлу $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { Write-Host "[*] Запуск ngen.exe на GAC-PoC.exe" & $ngenPath install $gacPoCPath } else { Write-Warning "ngen.exe not found on this host – skipping step." } # 4. Лог завершення для аналітика Write-Host "[+] Симуляція завершена. Перегляньте SIEM на предмет сигналів EventID 4688." -
Команди очищення:
# ------------------------------------------------- # Очищення після валідації викрадення GAC # ------------------------------------------------- $tempDir = "C:Temp" $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" if (Test-Path $gacPoCPath) { Remove-Item -Path $gacPoCPath -Force Write-Host "[*] Видалено GAC-PoC.exe" } # Видаліть будь-які згенеровані нативні зображення (якщо вони були створені) $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { & $ngenPath uninstall $gacPoCPath 2>$null Write-Host "[*] Видалено нативне зображення (якщо воно існувало)." } # За бажанням видаліть тимчасову папку, якщо вона порожня if ((Get-ChildItem $tempDir).Count -eq 0) { Remove-Item -Path $tempDir -Force Write-Host "[*] Видалена тимчасова директорія $tempDir" } Write-Host "[+] Очищення завершено."