Викрадення 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 з відомо коректної бази. Продовжуйте визначати, як атакуючий отримав привілеї адміністратора, та чи було встановлено додаткову стійкість.
Потік атаки
Виконання симуляції
Попередня умова: перевірка телеметрії та базових налаштувань повинна пройти успішно.
-
Опис атаки та команди:
Зловмисник підготував шкідливу збірку (
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 "[+] Очищення завершено."