
Aggrokatz — это расширение-плагин агрессора для Cobalt Strike, которое позволяет pypykatz удаленно взаимодействовать с beacon-ами и дает возможность анализировать файлы дампа LSASS и файлы кустов реестра для извлечения учетных данных и других секретов, хранящихся без загрузки файла и без загрузки какого-либо подозрительного кода на beacon.

aggrokatz — это расширение плагина Aggressor для CobaltStrike, которое позволяет pypykatz взаимодействовать с биконами удалённо.
Текущая версия aggrokatz позволяет pypykatz анализировать дампы LSASS и файлы кустов реестра для извлечения учётных данных и других секретов без загрузки файла и без загрузки подозрительного кода на бикон (Cobalt Strike там уже есть).
В будущем этот проект планирует предоставить дополнительные возможности для скрытных операций, такие как поиск и расшифровка всех секретов DPAPI, кербероастинг и т.д.
Мы опубликовали короткий пост в блоге для этого релиза инструмента, в котором также есть несколько скриншотов.
Снятие дампов LSASS/реестра не является целью этого проекта, только анализ. Причины:
CredBandit, которая сбрасывает сырые байты на диск вместо base64. Отличный инструмент, зацените.В клиенте CS не используйте "reload" и не пытайтесь вручную выгрузить, а затем перезагрузить скрипт, если вы его изменили. Вы ОБЯЗАТЕЛЬНО должны выгрузить его, закрыть клиент, открыть его заново, а затем загрузить изменённый скрипт. Иначе у вас будут запущены несколько версий одновременно и возникнет множество ошибок и странного поведения!
Во время анализа файлов LSASS/реестра на удалённой стороне, пожалуйста, не взаимодействуйте с конкретным биконом, с которого вы запустили скрипт. Обычно это не вызывает проблем, но я не могу дать никаких гарантий.
pycobalt. В их репозитории на GitHub есть readme.pypykatz версии не ниже >=0.4.8aggressor.cna из pycobalt настроен и знает расположение вашего интерпретатора Pythonaggrokatz.cna, указав путь к pycobalt.cnaView > Script Console и Cobalt Strike > Script Manager. Через Script Manager загрузите скрипт aggkatz.cna.aggkatz.cna загружен успешно, при щелчке правой кнопкой мыши на биконе появится новый пункт меню pypykatz.Script Console.Script Console, так и в окне самого бикона.LSASS file: Расположение файла lsass.dmp на удалённом компьютере. Также можно использовать UNC-пути для доступа к общим файлам lsass.dmp по SMB.chunksize : Максимальный объём данных, считываемый за один разBOF file : BOF-файл (Beacon Object File), который позволяет читать по частям. Этот файл будет загружен и выполнен (в памяти) каждый раз при чтении нового фрагмента.(module) : Указывает, какие модули будут анализироваться. По умолчанию: allOutput : Задаёт формат(ы) выводаPopulate Credential tab : После успешного анализа все полученные учётные данные станут доступны на вкладке Credential в Cobalt Strike. Эта функция в бета-версииDelete remote file after parsing : После успешного анализа дамп LSASS будет удалён с целевой машиныSYSTEM file: Расположение файла SYSTEM.reg на удалённом компьютере. Также можно использовать UNC-пути для доступа к общим файлам по SMB.SAM file (optional): Расположение файла SAM.reg на удалённом компьютере. Также можно использовать UNC-пути для доступа к общим файлам по SMB.SECURITY file (optional): Расположение файла SECURITY.reg на удалённом компьютере. Также можно использовать UNC-пути для доступа к общим файлам по SMB.SOFTWARE file (optional): Расположение файла SOFTWARE.reg на удалённом компьютере. Также можно использовать UNC-пути для доступа к общим файлам по SMB.chunksize : Максимальный объём данных, считываемый за один разBOF file : BOF-файл (Beacon Object File), который позволяет читать по частям. Этот файл будет загружен и выполнен (в памяти) каждый раз при чтении нового фрагмента.Output : Задаёт формат(ы) выводаТекущий BOF для чтения файлов поддерживает чтение файлов размером до 4 ГБ. Это можно расширить с помощью некоторых модификаций, но пока такие большие файлы не наблюдались.
Обычно парсер pypykatz выполняет серию операций чтения файлов на диске, но с помощью aggrokatz эти операции чтения туннелируются к бикону с помощью специально созданного BOF (Beacon Object File), который позволяет читать содержимое удалённого файла по частям. Это позволяет pypykatz извлекать все секреты из удалённых файлов без чтения всего файла, захватывая только необходимые фрагменты, где находятся секреты.
Чтобы получить полную картину всего процесса, нужно выделить две части:
pypykatz интегрируется с CobaltStrikepypykatz выполняет извлечение учётных данных без чтения всего файлаCobaltStrike (агент) написан на Java, pypykatz — на Python. Это проблема. К счастью для нас, неизвестный автор создал pycobalt, который предоставляет удобный интерфейс между двумя мирами с полезными API, которые можно вызывать напрямую из Python. Несмотря на то, что pycobalt — замечательная инженерная работа, есть некоторые проблемы/недостатки, на которые нужно указать:
pycobalt:pycobalt будет поддерживаться в будущем.pycobalt.pycobalt и CobaltSrike. Это приводит к тому, что некоторые вызовы API возвращают байты, которые нельзя использовать, потому что часть байтов искажается кодировщиком. Анализируя код, мы приходим к выводу, что большинство проблем с кодировкой/декодировкой связаны с тем, что pycobalt использует STDOUT/STDIN для связи с процессом Java.bof_pack, который критически важен для этого проекта, пришлось реализовать как чистый скрипт aggressor и вызывать его из Python, используя только базовые структуры данных (строки и целые числа), а не байты.pycobalt, без поддержки многопоточности. По крайней мере, мы заметили, что многопоточность случайным образом ломается, но мы этого ожидали.pypykatz и его сопутствующий модуль minidump пришлось модифицировать, чтобы обеспечить более эффективный анализ по частям, чем было реализовано ранее, но это тема для другого раза.
После того как pypykatz смог взаимодействовать с CobaltStrike через pycobalt, следующим шагом стало обеспечение чтения файлов по частям. К сожалению, эта функция не доступна по умолчанию ни в одном из виденных нами C2-решений, поэтому нам пришлось её реализовать. Мы подошли к этой проблеме, реализовав чтение по частям с помощью интерфейса Beacon Object Files от CobaltStrike, сокращённо BOF. BOF — это программы на C, которые выполняются на биконе не как отдельный исполняемый файл, а как часть уже работающего бикона. Этот интерфейс чрезвычайно полезен, так как делает BOF гораздо более скрытными — весь код выполняется в памяти, ничего не записывается на диск.
Наше решение BOF — это простая функция, принимающая 4 аргумента:
fileName : Полный путь к файлу дампа LSASS или кусту реестра (на удалённой стороне)buffsize : Объём (в байтах), который нужно прочитать из файлаseekSize : Позиция, с которой должно начаться чтение файла (от начала файла)rplyid : Идентификационный номер, включаемый в ответ для предотвращения возможных коллизийС этими параметрами pypykatz (работающий на агенте) может выполнять операции чтения файлов на биконе (целевой компьютер), которые специально нацелены на определённые части файла.
На другом конце (в CobaltStrike) aggrokatz регистрирует колбэк для отслеживания каждого сообщения, возвращаемого целевым биконом. Если заголовок сообщения совпадает с заголовком операции чтения файла, оно будет обработано как фрагмент файла minidump и передано парсеру minidump, который передаст результат в pypykatz. Если требуется дополнительное чтение, pypykatz выдаст команду чтения через ридер minidump, который отправит новую команду чтения на бикон через интерфейс BOF. Этот процесс повторяется до тех пор, пока файл не будет проанализирован.
После анализа около 100 дампов LSASS с помощью этого метода можно констатировать следующее (размер чанка — 20 КБ):
dcsync — автор pycobalt
@anthemtotheego Twitter — создатель CredBandit
Nicol Jos @shinepaw — дизайн логотипа