
Aggrokatz es una extensión de plugin agresor para Cobalt Strike que permite que pypykatz interactúe con los beacons de forma remota y permite analizar archivos de volcado de LSASS y archivos de hive del registro para extraer credenciales y otros secretos almacenados sin descargar el archivo y sin subir ningún código sospechoso al beacon.

aggrokatz es una extensión de plugin Aggressor para CobaltStrike que permite que pypykatz interactúe con los beacons de forma remota.
La versión actual de aggrokatz permite que pypykatz analice archivos de volcado LSASS y archivos de Hives del Registro para extraer credenciales y otros secretos almacenados sin descargar el archivo y sin subir ningún código sospechoso al beacon (Cobalt Strike ya está allí de todas formas).
En el futuro, este proyecto pretende proporcionar características adicionales para operaciones encubiertas, como la búsqueda y descifrado de todos los secretos de DPAPI/kerberoasting, etc.
Hemos publicado un breve blog post para el lanzamiento de esta herramienta, que también incluye algunas capturas de pantalla.
El volcado de LSASS/Registro no es el objetivo de este proyecto, solo el análisis. Razones:
CredBandit que vuelca los bytes sin procesar al disco en lugar de base64. Herramienta genial, échale un vistazo.En el cliente de CS, no use "reload" ni intente descargar y volver a cargar manualmente el script si lo ha modificado. DEBE descargarlo, cerrar el cliente y abrirlo de nuevo, luego cargar el script modificado. ¡De lo contrario, tendrá varias versiones ejecutándose simultáneamente y se producirán un montón de errores y comportamientos extraños!
Mientras analiza archivos LSASS/registro en el extremo remoto, no interactúe con el beacon específico en el que inició el script. Normalmente no causaría problemas, pero no puedo dar garantías.
pycobalt instalado y configurado. Hay un readme en su página de github.pypykatz versión >=0.4.8aggressor.cna de pycobalt esté configurado y conozca la ubicación de su intérprete de Pythonaggrokatz.cna para que apunte a pycobalt.cnaView > Script Console y Cobalt Strike > Script Manager. Usando Script Manager cargue el script aggkatz.cna.aggkatz.cna se cargó correctamente, tendrá un nuevo elemento de menú pypykatz al hacer clic derecho en un beacon.Script Console.Script Console como en la propia ventana del Beacon.LSASS file: La ubicación del archivo lsass.dmp en la computadora remota. También puede usar rutas UNC para acceder a archivos lsass.dmp compartidos a través de SMBchunksize : La cantidad máxima que se leerá de una sola vezBOF file : El archivo BOF (Beacon Object File) que permite lecturas fragmentadas. Este archivo se cargará y ejecutará (en memoria) cada vez que se lea un nuevo fragmento.(module) : Especifica qué módulos se analizarán. Por defecto: allOutput : Especifica el/los formato(s) de salidaPopulate Credential tab : Después de un análisis exitoso, todas las credenciales obtenidas estarán disponibles en la pestaña de Credenciales de Cobalt Strike. Esta característica está en betaDelete remote file after parsing : Después de un análisis exitoso, el archivo de volcado LSASS se eliminará del destinoSYSTEM file: La ubicación del archivo SYSTEM.reg en la computadora remota. También puede usar rutas UNC para acceder a archivos compartidos a través de SMBSAM file (optional): La ubicación del archivo SAM.reg en la computadora remota. También puede usar rutas UNC para acceder a archivos compartidos a través de SMBSECURITY file (optional): La ubicación del archivo SECURITY.reg en la computadora remota. También puede usar rutas UNC para acceder a archivos compartidos a través de SMBSOFTWARE file (optional): La ubicación del archivo SOFTWARE.reg en la computadora remota. También puede usar rutas UNC para acceder a archivos compartidos a través de SMBchunksize : La cantidad máxima que se leerá de una sola vezBOF file : El archivo BOF (Beacon Object File) que permite lecturas fragmentadas. Este archivo se cargará y ejecutará (en memoria) cada vez que se lea un nuevo fragmento.Output : Especifica el/los formato(s) de salidaEl BOF de lectura de archivos actualmente admite lecturas de archivos de hasta 4Gb. Esto se puede ampliar con algunas modificaciones, pero hasta ahora no se han observado archivos tan grandes.
Normalmente, el analizador de pypykatz realiza una serie de operaciones de lectura de archivos en el disco, pero con la ayuda de aggrokatz, estas operaciones de lectura se canalizan al beacon utilizando un BOF (Beacon Object File) especialmente diseñado que permite leer el contenido del archivo remoto en fragmentos. Esto permite que pypykatz extraiga todos los secretos de los archivos remotos sin leer todo el archivo, solo tomando los fragmentos necesarios donde se encuentran los secretos.
Para tener una visión completa de todo el proceso, debemos resaltar dos partes:
pypykatz con CobaltStrikepypykatz realiza la extracción de credenciales sin leer todo el archivoCobaltStrike (agente) está escrito en Java, pypykatz está escrito en Python. Esto es un problema. Por suerte para nosotros, una entidad desconocida creó pycobalt que proporciona una interfaz ordenada entre ambos mundos, completa con APIs útiles que se pueden invocar directamente desde Python. A pesar de que pycobalt es una pieza de ingeniería maravillosa, hay algunos problemas/inconvenientes que debemos señalar:
pycobalt:pycobalt se mantendrá en el futuro.pycobalt.pycobalt y CobaltStrike. Esto da como resultado que algunas llamadas a la API devuelvan bytes que no se pueden usar porque algunos bytes se alteran por el codificador. Al revisar el código, concluimos que la mayoría de los problemas de codificación/descodificación se deben a que pycobalt usa STDOUT/STDIN para comunicarse con el proceso de Java.bof_pack, que es crucial para este proyecto, tuvo que ser implementada como un script puramente Aggressor e invocada solo desde Python usando estructuras de datos básicas (string e int) y no usando bytes.pycobalt sin soporte de subprocesos (threading). Bueno, al menos observamos que los subprocesos se rompen aleatoriamente, pero algo esperábamos esto.Fue necesario modificar pypykatz y su módulo complementario minidump para permitir un análisis fragmentado más eficiente que el implementado anteriormente, pero este es un tema para otro día.
Después de que pypykatz fue capaz de interactuar con CobaltStrike a través de pycobalt, el siguiente paso fue permitir la lectura fragmentada de archivos. Lamentablemente, esta característica no está disponible de forma predeterminada en ninguna de las soluciones C2 que hemos visto, por lo que tuvimos que implementarla. La forma en que abordamos este problema fue implementando la lectura fragmentada mediante el uso de la interfaz Beacon Object Files de CobaltStrike, BOF para abreviar. Los BOF son programas en C que se ejecutan en el beacon no como un ejecutable separado, sino como parte del beacon ya en ejecución. Esta interfaz es súper útil porque hace que los BOF sean mucho más sigilosos, ya que todo el código se ejecuta en memoria sin que se escriba nada en el disco.
Nuestra solución BOF es una función simple que toma 4 argumentos:
fileName : Ruta completa del archivo de volcado LSASS o hive del registro (en el extremo remoto)buffsize : Cantidad (en bytes) a leer del archivoseekSize : La posición donde debe comenzar la operación de lectura del archivo (desde el principio del archivo)rplyid : Un número de identificación para incorporar en la respuesta para evitar posibles colisionesCon estos parámetros, pypykatz (ejecutándose en el agente) puede emitir operaciones de lectura de archivos en el beacon (computadora objetivo) que se dirigen específicamente a ciertas partes del archivo.
En el otro extremo (en CobaltStrike), aggrokatz registra un callback para monitorear cada mensaje devuelto por el beacon objetivo. Si el encabezado del mensaje coincide con el encabezado de una operación de lectura de archivo, se procesará como un fragmento de un archivo minidump y se enviará al analizador minidump, que enviará el resultado a pypykatz. En caso de que se necesite más lectura, pypykatz emitirá una lectura usando el lector minidump, que enviará un nuevo comando de lectura al beacon a través de la interfaz BOF. Este proceso se repite hasta que el archivo se analiza.
Después de analizar alrededor de 100 volcados LSASS utilizando este método, podemos afirmar lo siguiente (el tamaño de fragmento utilizado fue de 20k):
dcsync - autor de pycobalt
@anthemtotheego Twitter - Creador de CredBandit
Nicol Jos @shinepaw - diseño del logotipo