
Async BOF для автоматического извлечения или обновления Kerberos TGTs на целевой системе.
Этот репозиторий содержит два асинхронных файла объектных файлов Beacon (BOF). Первый, tgt-monitor, отслеживает события входа в систему Kerberos и пробуждает агента при обнаружении нового Kerberos TGT. Аналогично команде monitor из Rubeus, этот BOF работает бесконечно и периодически проверяет кэш билетов LSA в системе. При обнаружении нового TGT он выводит метаданные билета и возвращает blob в формате base64-encoded kirbi, который можно использовать для lateral movement через атаки pass-the-ticket. Второй, tgt-renew, автоматически обновляет TGT в системе, если их оставшееся время жизни ниже указанного порога (например, 15 минут).
[!Important] BOF в этом репозитории требуют возможности асинхронной загрузки объектных файлов. Такая функциональность предоставляется фреймворком Conquest.
Оба BOF требуют запуска из контекста NT AUTHORITY\SYSTEM. Привилегии проверяются по той же логике.
SeImpersonatePrivilege). BOF завершается, если это также не даёт доступа уровня SYSTEM.Следующие шаги повторяются в цикле, пока BOF не будет отменён через событие остановки. Пользовательский интервал задаёт задержку между опросами.
--user, учитываются только сеансы, соответствующие этому имени пользователя.BeaconWakeup() для принудительной проверки агента и возврата вывода.
--user, учитываются только сеансы, соответствующие этому имени пользователя.RenewUntil, он помечается как истекший, и требуется повторная аутентификация.BeaconWakeup().
Процесс обновления билета включает следующие шаги:
ExtractTicket() с использованием LUID и SPN из структуры PTICKET_ENTRY.startTime, endTime, renewUntil, ticketFlags и encryptionType в структуре PTICKET_ENTRY, вывод информации о билете и base64.В этом репозитории представлен модуль Conquest, реализующий следующие две команды.
BOF tgt-monitor оповещает при обнаружении новых TGT и возвращает их в виде Base64-encoded blob. В файл объектного файла необходимо передать следующие аргументы:
| Имя | Тип | Описание |
|---|---|---|
interval | int | Тайм-аут между проверками в секундах. |
targetUsers | string | Нечувствительный к регистру список имён целевых пользователей, разделённый запятыми. Если это поле задано, извлекаются только TGT для указанных пользователей. В противном случае TGT собираются для всех пользователей. Обратите внимание, что учётные записи компьютеров должны заканчиваться на $. |
Usage: tgt-monitor [--interval interval] [--user user]
Example: tgt-monitor --interval 5 --user DC01$
Optional arguments:
--interval interval INT Интервал опроса в секундах (по умолчанию: 60).
--user user STRING Список имён целевых пользователей, разделённый запятыми (по умолчанию: все пользователи).

Закодированный билет можно использовать напрямую с Rubeus.exe ptt /ticket:<base64> или impacket-ticketConverter для дальнейшего lateral movement, как показано на скриншоте ниже. В Conquest можно использовать команду ptt для прямой инъекции билета в текущий сеанс входа, чтобы олицетворить целевого пользователя.

BOF tgt-renew автоматически обновляет билеты, срок действия которых скоро истечёт, пока их нельзя будет обновить. В файл объектного файла необходимо передать следующие аргументы:
| Имя | Тип | Описание |
|---|---|---|
interval | int | Тайм-аут между проверками в секундах. |
threshold | int | Порог обновления в минутах. Билет обновляется, когда время до EndTime меньше этого порога. |
targetUsers | string | Нечувствительный к регистру список имён целевых пользователей, разделённый запятыми. Если это поле задано, обновляются только TGT для указанных пользователей. В противном случае TGT обновляются для всех пользователей. Обратите внимание, что учётные записи компьютеров должны заканчиваться на $. |
targetLuids | string | Нечувствительный к регистру список целевых LUID, разделённый запятыми. Если это поле задано, обновляются только TGT для указанных LUID. |
Usage: tgt-renew [--interval seconds] [--threshold minutes] [--user user] [--luid luid]
Example: tgt-renew --luid 0x3e4 --interval 300 --threshold 30
Optional arguments:
--interval seconds INT Интервал опроса в секундах (по умолчанию: 60).
--threshold minutes INT Порог обновления билета в минутах (по умолчанию: 15).
--user user STRING Список имён целевых пользователей, разделённый запятыми (по умолчанию: все пользователи).
--luid luid STRING Список целевых LUID, разделённый запятыми (по умолчанию: все LUID).
Флаги --user и --luid являются взаимоисключающими.

git clone https://github.com/jakobfriedl/tgt-monitor-bof
cd tgt-monitor-bof
make
После этого используйте Script Manager Conquest для загрузки модуля dist/tgt-monitor.py.
Реализация этого Beacon Object File основана на следующих проектах: