Tutoriales

Una extensión del complemento Aggressor para Cobalt Strike.

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 a pycobalt.cna
  • en CS use el View > Script Console y Cobalt Strike > Script Manager Ventana. Utilizando Script Manager carga el aggkatz.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 del lsass.dmp Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a las compartidas. lsass.dmp Archivos sobre SMB
  • chunksize : La cantidad máxima que se puede leer a la vez
  • BOF 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 salida
  • Populate 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 beta
  • Delete 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 del SYSTEM.reg Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMB
  • SAM file (optional): La ubicación del SAM.reg Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMB
  • SECURITY file (optional): La ubicación del SECURITY.reg Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMB
  • SOFTWARE file (optional): La ubicación del SOFTWARE.reg Archivo en la computadora remota. También puede utilizar rutas UNC para acceder a archivos compartidos a través de SMB
  • chunksize : La cantidad máxima que se puede leer a la vez
  • BOF 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 pypykatzEl 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 con CobaltStrike
  • 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 pycobalts desarrollo.
  1. Problemas técnicos observados:
  • En general, existen algunos problemas de codificación entre pycobalt y CobaltSrike. 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 CobaltStrikeInterfaz 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 archivo
  • seekSize : 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.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba