
aggrokatz
es una extensión de complemento agresor para CobaltStrike
esto permite pypykatz
para conectarse a las balizas de forma remota.
La versión actual de aggrokatz
permitido pypykatz
para analizar archivos de volcado de LSASS y archivos de colmena de registro para extraer credenciales y otros secretos almacenados sin descargar el archivo y sin cargar ningún código sospechoso en la baliza (Cobalt Strike ya está allí de todos modos). En el futuro, este proyecto tiene como objetivo proporcionar funciones adicionales para operaciones encubiertas como buscar y descifrar todos los secretos de DPAPI / Kerberoasting / etc.
Hemos estrenado un cortometraje blog post
para esta versión de la herramienta, que también contiene algunas capturas de pantalla.
NOTAS IMPORTANTES – POR FAVOR LEA ESTO
El volcado de LSASS / registro no es el objetivo de este proyecto, solo el análisis. Razones:
- Cobalt Strike (CS) ya está implementando varias técnicas de vertido y las pone a disposición del público en general. Recientemente cambiamos a una versión modificada de
CredBandit
que almacena los bytes sin formato en el disco duro en lugar de en base64. Genial herramienta, pruébala. - Queremos mantener en privado nuestra técnica de vertido.
No utilice «recargar» en CS-Client, ni intente descargar manualmente y luego volver a cargar el script si lo ha cambiado. DEBE descargarlo, cerrar y reiniciar el cliente, luego cargar el script modificado. De lo contrario, se ejecutarán varias versiones al mismo tiempo y se producirán muchos errores y comportamientos extraños.
Al analizar los archivos de registro / LSASS en el extremo remoto, no interactúe con la baliza específica en la que inició el script. Normalmente no habría problemas, pero no puedo dar ninguna garantía.
Instalar
- Necesitará
pycobalt
instalado y configurado. Hay un archivo Léame en su página de Github. - Necesitas instalar
pypykatz
La versión debe ser>=0.4.8
- Necesitas Cobalt Strike
Configurar
- Asegúrate de tener pycobalt
aggressor.cna
El archivo está configurado y conoce la ubicación de su intérprete de Python - Cambie el pycobalt_path a
aggrokatz.cna
apuntar apycobalt.cna
- en CS use el
View > Script Console
yCobalt Strike > Script Manager
Ventana. UtilizandoScript Manager
carga elaggkatz.cna
Texto.
usar
- Si el
aggkatz.cna
El script se cargó correctamente, tiene un nuevo elemento de menúpypykatz
cuando hace clic derecho en una baliza. - Mientras analiza, verá mensajes de depuración en
Script Console
Ventana. - Cuando se completa el análisis, los resultados aparecerán en ambos
Script Console
Ventana y la propia ventana de la baliza.
Parámetros del menú de análisis del volcado LSASS
LSASS file
: La ubicación dellsass.dmp
Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a las compartidas.lsass.dmp
Archivos sobre SMBchunksize
: La cantidad máxima que se puede leer a la vezBOF file
: El archivo BOF (Beacon Object File) que permite lecturas fragmentadas. Este archivo se carga y ejecuta (en la memoria) cada vez que se lee un nuevo fragmento.(module)
: Especifica qué módulos se analizan. Defecto:all
Output
: Indica los formatos de salidaPopulate Credential tab
: Después de un análisis exitoso, todos los datos de acceso recibidos estarán disponibles en la pestaña Datos de acceso de Cobalt Srike. Esta característica está en fase betaDelete remote file after parsing
: Después de un análisis exitoso, el archivo de volcado LSASS se elimina del destino
Parámetros del menú de análisis de volcado de registro
SYSTEM file
: La ubicación delSYSTEM.reg
Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMBSAM file (optional)
: La ubicación delSAM.reg
Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMBSECURITY file (optional)
: La ubicación delSECURITY.reg
Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMBSOFTWARE file (optional)
: La ubicación delSOFTWARE.reg
Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMBchunksize
: La cantidad máxima que se puede leer a la vezBOF file
: El archivo de objeto de baliza (BOF) que permite lecturas fragmentadas. Este archivo se carga y ejecuta (en la memoria) cada vez que se lee un nuevo fragmento.Output
: Indica los formatos de salida
restricciones
El BOF de lectura de archivos admite actualmente lecturas de archivos de hasta 4 GB. Esto se puede ampliar con algunas modificaciones, pero hasta ahora no se han observado archivos tan grandes.
Cómo funciona
TL; DR
Por lo general pypykatz
El analizador realiza una serie de lecturas de archivos en el disco duro, pero con la ayuda de aggrokatz, estas lecturas se canalizan a la baliza utilizando un BOF (Beacon Object File) especialmente diseñado que permite enviar el contenido del archivo remoto en fragmentos. leer. Esto permite pypykatz
para extraer todos los secretos de los archivos eliminados sin leer el archivo completo y tomar solo los bloques necesarios donde se encuentran los secretos.
Detallado
Para obtener una imagen completa de todo el proceso, debemos resaltar dos partes:
- Cómo
pypykatz
integrado conCobaltStrike
- Cómo
pypykatz
extrae las credenciales sin leer todo el archivo.
integración de pypykatz en CobaltStrike
CobaltStrike (Agent) está escrito en Java, pypykatz está escrito en Python. Eso es un problema. Afortunadamente para nosotros, una entidad desconocida lo ha creado. pycobalt
que proporciona una interfaz limpia entre los dos mundos, completa con API útiles que se pueden llamar directamente desde Python. A pesar de pycobalt
Dado que esta es una obra de ingeniería maravillosa, hay algunos problemas / desventajas que debemos señalar:
- Sobre la confianza
pycobalt
Proyecto:
- Intentamos contactar al autor pero no obtuvimos respuesta.
- No podemos garantizar que el
pycobalt
El proyecto continuará en el futuro. - No controlamos ningún aspecto de
pycobalt
‘s desarrollo.
- Problemas técnicos observados:
- En general, existen algunos problemas de codificación entre
pycobalt
yCobaltSrike
. Esto conduce a algunas llamadas a la API que devolverían bytes que no se pueden usar porque el codificador distorsiona algunos bytes. Al revisar el código, llegamos a la conclusión de que la mayoría de los problemas de codificación / decodificación se deben a él.pycobalt
utiliza STDOUT / STDIN para comunicarse con el proceso de Java - especialmente el
bof_pack
La llamada a la API crucial para este proyecto tuvo que implementarse como un script agresor puro y solo se llamó desde Python con estructuras de datos simples (cadena e int) y no con bytes. - Solo bloqueando las API utilizadas por. ser provisto
pycobalt
Embalaje sin ayuda para enhebrar. Al menos vimos caer el hilo accidentalmente, pero de alguna manera lo esperábamos. - Bloqueando la API + sin hilos + confiando en devoluciones de llamada = tuvimos que usar algunos trucos extraños para hacerlo bien.
Analizar credenciales en una baraja de cartas
pypykatz
y su módulo complementario minidump
tuvo que modificarse para permitir un análisis fragmentado más eficiente que lo que se implementó anteriormente, pero ese es un tema para otro día.
Después de este pypykatz
fue capaz de con CobaltStrike
sobre pycobalt
El siguiente paso fue permitir la lectura de bloques de datos. Desafortunadamente, ninguna de las soluciones C2 que hemos visto tiene esta función disponible de forma predeterminada, por lo que tuvimos que implementarla. Abordamos este problema repasando el uso de la lectura fragmentada. han implementado CobaltStrike
Interfaz de archivos de objetos de baliza, o BOF para abreviar. Los BOF son programas en C que no se ejecutan en la baliza como un archivo ejecutable separado, sino como parte de la baliza que ya se está ejecutando. Esta interfaz es extremadamente útil ya que hace que los BOF estén mucho más ocultos ya que todo el código se ejecuta en la memoria sin que se escriba nada en el disco.
Nuestra solución BOF es una función simple y toma 4 argumentos:
fileName
: Ruta de archivo completa del archivo de volcado LSASS o subárbol del registro (en el extremo remoto)buffsize
: Cantidad (en bytes) que se leerá del archivoseekSize
: La posición para iniciar la lectura del archivo (desde el principio del archivo)rplyid
: Un número de identificación que debe incluirse en la respuesta para evitar posibles colisiones.
Con estos parámetros pypykatz
(que se ejecuta en el agente) puede emitir lecturas de archivos en la baliza (computadora de destino) que se dirigen específicamente a partes específicas del archivo.
En el otro extremo (en CobaltStrike) aggrokatz
registra una devolución de llamada para monitorear cada mensaje devuelto por la baliza objetivo. Si el encabezado del mensaje coincide con el encabezado de un archivo leído, se registra como una parte de un archivo. procesada minidump
Archivo y se envía al minidump
Analizador que envía el resultado a pypykatz
. Si es necesario leer más pypykatz
será una lectura con el minidump
Lector que envía un nuevo comando de lectura a la baliza a través de la interfaz BOF. Este proceso se repite hasta que se analiza el archivo.
Resultados
Después de analizar aproximadamente 100 volcados de LSASS utilizando este método, podemos ver lo siguiente (el tamaño de fragmento utilizado fue de 20 KB):
- Dependiendo del tamaño del archivo de volcado LSASS (nuestros volcados tenían un tamaño de entre 40 MB y 300 MB), todos los secretos se podían extraer con un promedio de 3,5 MB. Tenga en cuenta que este número no depende del tamaño del volcado LSASS, sino del número de secretos y del número de paquetes que elija analizar.
- En promedio, se utilizaron 250 lecturas para un análisis exitoso.
- El tiempo para analizar solo depende de su configuración de jitter / sleep, por lo que no tiene sentido medirlo.
desventaja
- Se debe cargar un BOF en la baliza para cada proceso de lectura. (Esperamos en secreto que alguien en CobaltSrike mire este artículo y decida implementar lecturas de archivos básicas de forma predeterminada para que podamos omitir esta solución).
- La cantidad de lecturas puede ser un problema si está utilizando una baliza con una gran inestabilidad / suspensión.