
Async BOF para extraer o renovar automáticamente TGTs de Kerberos en un sistema objetivo.
Este repositorio contiene dos Archivos de Objetos Beacon Asíncronos (BOF). El primero, tgt-monitor, monitorea el sistema en busca de eventos de inicio de sesión Kerberos y activa el agente cada vez que se captura un nuevo TGT Kerberos. Similar al comando monitor de Rubeus, este BOF se ejecuta indefinidamente y verifica periódicamente la caché de tickets LSA del sistema. Cuando se detecta un nuevo TGT, imprime los metadatos del ticket y genera un blob kirbi codificado en base64 que puede usarse para movimiento lateral mediante ataques pass-the-ticket. El segundo, tgt-renew, renueva automáticamente los TGTs en el sistema si su tiempo de vida restante está por debajo de un umbral especificado (por ejemplo, 15 minutos).
[!Important] Los BOFs en este repositorio requieren capacidades de carga de archivos de objetos asíncronos. Esta funcionalidad es proporcionada por el framework Conquest.
Ambos BOFs requieren ejecutarse en un contexto NT AUTHORITY\SYSTEM. Los privilegios se verifican siguiendo la misma lógica.
SeImpersonatePrivilege). El BOF finaliza si esto tampoco otorga acceso de nivel SYSTEM.Los pasos siguientes se repiten en un bucle hasta que el BOF se cancela mediante el evento de parada. Un intervalo definido por el usuario establece la demora entre sondeos.
--user, solo se consideran las sesiones que coinciden con ese nombre de usuario.BeaconWakeup() para forzar al agente a registrarse y devolver la salida.
--user, solo se consideran las sesiones que coinciden con ese nombre de usuario.RenewUntil, se marca como caducado y se requiere reautenticación.BeaconWakeup().
El proceso de renovación de tickets involucra los siguientes pasos:
Este repositorio incluye un Módulo de Conquest que implementa los siguientes dos comandos.
El BOF tgt-monitor alerta cuando se capturan nuevos TGTs y los devuelve como un blob codificado en Base64. Los siguientes argumentos deben pasarse al archivo de objeto:
| Name | Type | Description |
|---|---|---|
interval | int | Tiempo de espera entre comprobaciones en segundos. |
targetUsers | string | Lista separada por comas de nombres de usuario objetivo (insensible a mayúsculas/minúsculas). Cuando este campo está establecido, solo se recuperan TGTs para los usuarios especificados. De lo contrario, se recogen TGTs para todos los usuarios. Tenga en cuenta que las cuentas de equipo deben terminar con $. |
Usage: tgt-monitor [--interval interval] [--user user]
Example: tgt-monitor --interval 5 --user DC01$
Optional arguments:
--interval interval INT Polling interval in seconds (default: 60).
--user user STRING Comma-separated list of target usernames (default: all users).

El ticket codificado se puede usar directamente con Rubeus.exe ptt /ticket:<base64> o impacket-ticketConverter para movimiento lateral adicional, como se muestra en la captura de pantalla a continuación. En Conquest, es posible usar el comando ptt para inyectar directamente el ticket en la sesión de inicio de sesión actual y suplantar al usuario objetivo.

El BOF tgt-renew renueva automáticamente los tickets que expiran pronto hasta que ya no puedan ser renovados. Los siguientes argumentos deben pasarse al archivo de objeto:
| Name | Type | Description |
|---|---|---|
interval | int | Tiempo de espera entre comprobaciones en segundos. |
threshold | int | Umbral de renovación en minutos. El ticket se renueva cuando el tiempo hasta EndTime es menor que este umbral. |
targetUsers | string | Lista separada por comas de nombres de usuario objetivo (insensible a mayúsculas/minúsculas). Cuando este campo está establecido, solo se renuevan TGTs para los usuarios especificados. De lo contrario, se renuevan TGTs para todos los usuarios. Tenga en cuenta que las cuentas de equipo deben terminar con $. |
targetLuids | string | Lista separada por comas de LUIDs objetivo (insensible a mayúsculas/minúsculas). Cuando este campo está establecido, solo se renuevan TGTs para los LUIDs especificados. |
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 Polling interval in seconds (default: 60).
--threshold minutes INT Ticket renewal threshold in minutes (default: 15).
--user user STRING Comma-separated list of target usernames (default: all users).
--luid luid STRING Comma-separated list of target LUIDs (default: all LUIDs).
Las banderas --user y --luid son mutuamente excluyentes.

git clone https://github.com/jakobfriedl/tgt-monitor-bof
cd tgt-monitor-bof
make
Desde allí, use el Administrador de Scripts de Conquest para cargar el módulo dist/tgt-monitor.py.
Esta implementación de este Archivo de Objeto Beacon se basa en los siguientes proyectos: