
pyCobaltHound es una extensión de script Aggressor para Cobalt Strike que tiene como objetivo proporcionar una integración profunda entre Cobalt Strike y Bloodhound.
pyCobaltHound es una extensión de script Aggressor para Cobalt Strike que tiene como objetivo proporcionar una integración profunda entre Cobalt Strike y Bloodhound.
pyCobaltHound se esfuerza por ayudar a los operadores de equipos rojos mediante:
BloodHound para descubrir rutas de escalación abiertas por credenciales recién recolectadas.Para lograr esto, pyCobaltHound utiliza un conjunto de consultas integradas. Los operadores también pueden añadir/eliminar sus propias consultas para ajustar las capacidades de monitoreo de pyCobaltHound. Esto les da la flexibilidad de adaptar pyCobaltHound sobre la marcha durante los compromisos para tener en cuenta objetivos específicos del compromiso (usuarios, hosts, etc.).
Para instalar pyCobaltHound, clone este repositorio. ¡No olvide clonar también el submódulo incluido!
Puede usar el siguiente comando:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodulesAsegúrese de que las siguientes dependencias estén correctamente instaladas:
PyCobalt es una API de Python para Cobalt Strike. Expone muchas funciones de Aggressor para ser utilizadas directamente desde Python.
Asegúrese de tener instalado Python3+. Aunque PyCobalt puede funcionar también en macOS y Windows, solo lo hemos probado realmente en Linux.
Hay dos formas de usar la librería Python PyCobalt:
pyCobaltHound adopta este enfoque, estableciendo la ruta de búsqueda desde el programa Python usando la variable sys.path.PyCobalt. Para hacerlo, ejecute python3 setup.py install. Deberá modificar pycobalthound.py para asegurarse de que use la librería instalada en lugar de la del repositorio incluido.PyCobalt se mantenga en el futuro. De hecho, la última actualización del proyecto fue para incorporar los cambios realizados en Cobalt Strike 4.2. Dado que pyCobaltHound solo utiliza funciones básicas de Aggressor para interactuar con Cobalt Strike y su operador, esto no es un gran problema para pyCobaltHound.PyCobalt utilizado en este proyecto es un fork realizado por nosotros. Sin embargo, no controlamos el repositorio de PyCobalt.PyCobalt viene con algunos comandos de la consola de scripts para gestionar los scripts Python en ejecución. Cuando recargue su script Aggressor, debería detener explícitamente los scripts Python primero. De lo contrario, se ejecutarán para siempre sin hacer nada. Durante el desarrollo de pyCobaltHound, notamos que esto también puede provocar un comportamiento indefinido.
Recargar pyCobaltHound se puede hacer de la siguiente manera:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
Para que PyCobalt funcione correctamente, solo puede llamar a PyCobalt en un script Aggressor. Tenga esto en cuenta si desea usar pyCobaltHound junto con otros scripts Aggressor que usen PyCobalt. Nuestro enfoque es tener un script Aggressor con llamadas a python() e include() para cada herramienta basada en PyCobalt.
notify2 es – o era – un paquete para mostrar notificaciones de escritorio en Linux. Como veremos más adelante, pyCobaltHound soporta algunas formas de notificar al operador. notify2 se usa en Linux para enviar notificaciones al demonio de notificaciones a través de D-Bus.
Para habilitarlo, notify2 debe instalarse usando:
pip install notify2
Usar pyCobaltHound en Cobalt Strike es tan simple como importar el script Aggressor pycobalthound.cna en su cliente. Una vez hecho esto, debería ver un menú pyCobaltHound en la barra de menú de su Cobalt Strike.

El objetivo inicial de pyCobaltHound era monitorear el caché de credenciales de Cobalt Strike (Ver > Credenciales) en busca de nuevas entradas. Lo hace reaccionando al evento on_credentials que Cobalt Strike dispara cuando se realizan cambios en el almacén de credenciales.
Cuando se dispara este evento, pyCobaltHound:
Cobalt Strike.BloodHound.BloodHound para cada nueva entidad utilizando tanto consultas integradas como personalizadas.Dado que todo esto tiene lugar de forma asíncrona con respecto al cliente principal de Cobalt Strike, este proceso no debería bloquear su interfaz de usuario, por lo que puede seguir trabajando mientras pyCobaltHound investiga en segundo plano.
pyCobaltHound utiliza cachés separados por teamserver para evitar problemas al usar múltiples teamservers.
A veces hay situaciones en las que desearía investigar usuarios específicos (o todo el almacén de credenciales) nuevamente. Esto podría ser el caso cuando ha subido nuevos datos a la base de datos de BloodHound.
Dado que pyCobaltHound ya debería haber investigado (y por lo tanto almacenado en caché) todas las entidades en su almacén de credenciales, no las evaluará contra estos nuevos datos sin alguna intervención del operador.
Hay dos métodos disponibles para que los operadores controlen qué entidades están en caché.
En casos donde desee eliminar una entidad específica (o varias) del caché, puede hacerlo en el visor de credenciales (Ver > Credenciales). Simplemente seleccione su(s) objetivo(s) y haga clic en la opción eliminar del caché bajo la entrada del menú pyCobaltHound.
En casos donde desee eliminar todas las entidades del caché, puede hacerlo en el menú principal de pyCobaltHound (Cobalt Strike > pyCobaltHound > Limpiar caché). Esto es más útil cuando desea reevaluar todo su almacén de credenciales.

Después de eliminar sus objetivos del caché, puede solicitar manualmente que pyCobaltHound reinvestigue el contenido del almacén de credenciales. Esto sigue exactamente el mismo proceso que el anterior.
pyCobaltHound contiene funcionalidad para interactuar con sesiones de beacon existentes. Esto se puede encontrar en el menú contextual del beacon. Tenga en cuenta que estos comandos se pueden ejecutar en un solo beacon o en una selección de beacons.

Esta funcionalidad es especialmente útil cuando se trata de usuarios y equipos cuyas credenciales no han sido comprometidas (todavía), pero que efectivamente están bajo nuestro control (por ejemplo, porque tenemos un beacon ejecutándose bajo su token de sesión).
La funcionalidad Marcar como comprometido (pyCobaltHound > Marcar como comprometido) se puede usar para marcar un beacon (o un conjunto de beacons) como comprometido en la base de datos de BloodHound.

Este diálogo preguntará al operador la siguiente información:
pyCobaltHound solo marcará equipos como comprometidos si la sesión del beacon se ejecuta como administrador local, SYSTEM o una sesión de alta integridad como otro usuario.La funcionalidad Investigar (pyCobaltHound > Marcar como comprometido) se puede usar para investigar los usuarios y hosts asociados con un beacon (o un conjunto de beacons).

Este diálogo preguntará al operador la siguiente información:
pyCobaltHound solo investigará equipos si la sesión del beacon se ejecuta como administrador local, SYSTEM o una sesión de alta integridad como otro usuario.pyCobaltHound investigará todas las entidades sin verificar los niveles de integridad.pyCobaltHound contiene funcionalidad para investigar entidades libremente. Esto se puede encontrar en el menú principal (Cobalt Strike > pyCobaltHound > Investigar).
Esta funcionalidad es especialmente útil cuando se trata de usuarios y equipos cuyas credenciales no han sido comprometidas y no están bajo nuestro control.

Este diálogo preguntará al operador la siguiente información:
El menú de ajustes de pyCobaltHound se encuentra en Cobalt Strike > pyCobaltHound > Ajustes.

pyCobaltHound guardará sus ajustes en disco. Cada vez que se recarga pyCobaltHound, comprobará la existencia de un archivo de ajustes y cargará los ajustes guardados si encuentra uno.
pyCobaltHound guarda un archivo de ajustes por teamserver, por lo que es posible tener diferentes ajustes en diferentes teamservers.
Para autenticarse en la base de datos de BloodHound, pyCobaltHound necesitará la siguiente información:
Nota: si elige guardar sus ajustes de forma persistente (para conservarlos a través de reinicios del cliente/host), pyCobaltHound deserializará y almacenará estas credenciales en disco.
Como se discutió antes, pyCobaltHound utiliza caché para asegurarse de no realizar trabajo innecesario. Este caché se puede deshabilitar en los ajustes. Esto es especialmente útil al desarrollar nuevas consultas, para no tener que gestionar/limpiar constantemente el caché.
pyCobaltHound soporta algunos métodos diferentes para notificar al operador una vez que ha identificado una entidad de interés. Es posible deshabilitar estas notificaciones.
Por defecto, pyCobaltHound notificará al operador usando el cuadro de mensaje predeterminado de Aggressor. Esta opción puede interrumpir el flujo de trabajo del operador. Sin embargo, es el método predeterminado ya que es compatible en todas las plataformas donde se puede ejecutar un cliente de Cobalt Strike.

pyCobaltHound también soporta mostrar notificaciones de escritorio en Linux. Esta es nuestra opción preferida ya que no interrumpe el flujo de trabajo del operador.

Durante algunos de sus flujos de trabajo, pyCobaltHound generará un informe HTML. Esta decisión de diseño se tomó para evitar saturar al operador con notificaciones enormes en caso de que se investiguen muchas entidades. Estos informes se generarán en la carpeta reports. Es posible deshabilitar la generación de informes.

Por defecto, pyCobaltHound sincronizará las consultas entre teamservers utilizando un archivo central para todos los ajustes relacionados con consultas. Esto significa que las consultas habilitadas, añadidas o eliminadas en un teamserver también se habilitarán, añadirán o eliminarán en las consultas realizadas por otros teamservers. Esto es principalmente una opción de conveniencia y se puede deshabilitar, lo cual es útil en casos donde está ejecutando consultas específicas de un compromiso que no se aplican a todos los teamservers a los que está conectado.
Cuando la sincronización de consultas está deshabilitada, pyCobaltHound comprobará la existencia de archivos de consulta únicos. Si existen, los cargará y utilizará estas consultas durante sus flujos de trabajo. Si los archivos no existen, los creará y cargará. Esta configuración persistirá a través de recargas.
Cuando la sincronización de consultas está habilitada, pyCobaltHound comprobará la existencia de archivos de consulta únicos. Si existen, se le preguntará al operador que elija.

El operador tiene las siguientes opciones:
pyCobaltHound simplemente eliminará los archivos de consulta únicos. Todas las consultas personalizadas se perderán.pyCobaltHound intentará fusionar los archivos de consulta únicos en los archivos de consulta generales. Antes de fusionar una consulta, comprobará si no hay una consulta en el archivo general que tenga el mismo nombre o la misma declaración Cypher. Si ocurre algún conflicto de fusión, se le preguntará al operador si desea conservar las consultas no fusionadas. Se guardarán en un archivo separado. Luego, los archivos de consulta únicos se eliminarán.pyCobaltHound simplemente dejará los archivos de consulta únicos. Todas las consultas personalizadas se conservarán y los archivos se volverán a cargar si la sincronización de consultas se deshabilita nuevamente.pyCobaltHound actualmente soporta las siguientes consultas integradas:
La gestión de las diversas consultas que utiliza pyCobaltHound se puede realizar a través del menú principal (Cobalt Strike > pyCobaltHound > Consultas).

El diálogo Actualizar consultas permite a los operadores habilitar/deshabilitar consultas específicas. Al usar este diálogo, primero se le preguntará al operador qué tipo de consultas desea actualizar. Esto se hace para representar/cargar dinámicamente las consultas correctas durante este flujo de trabajo.

Después de responder al primer diálogo, se le presentará al operador una lista de todas las consultas disponibles de ese tipo. Aquí pueden elegir qué consultas desean habilitar/deshabilitar.

La opción de tipo de consulta es una solución provisional para pasar el tipo de consulta a la siguiente función en el flujo de trabajo y no es relevante para el operador.
La funcionalidad Añadir consulta permite a los operadores añadir/eliminar sus propias consultas para ajustar las capacidades de investigación de pyCobaltHound. Esto les da la flexibilidad de adaptar pyCobaltHound sobre la marcha durante los compromisos para tener en cuenta objetivos específicos del compromiso (usuarios, hosts, etc.).

Este diálogo preguntará al operador la siguiente información:
pyCobaltHound.pyCobaltHound necesita ejecutar. Los operadores son bastante libres de definir sus consultas. Los únicos requisitos son los siguientes:
pyCobaltHound genera dinámicamente la siguiente cadena Cypher basada en los nombres de entidad que está investigando:
WITH [nombres de cuentas aquí] AS samAccountNames UNWIND samAccountNames AS names.MATCH (x) WHERE x.name STARTS WITH names(x:User)) dependiendo del tipo de consulta que esté añadiendo.pyCobaltHound espera que la consulta devuelva un conjunto distinto de nombres de usuario.
RETURN DISTINCT (x.name)El diálogo Eliminar consulta permite a los operadores eliminar consultas personalizadas específicas de pyCobaltHound. Al usar este diálogo, primero se le preguntará al operador qué tipo de consulta desea eliminar. Esto se hace para representar/cargar dinámicamente las consultas correctas durante este flujo de trabajo.

Después de responder al primer diálogo, se le presentará al operador una lista de todas las consultas disponibles de ese tipo. Aquí pueden elegir qué consultas desean eliminar.

La opción de tipo de consulta es una solución provisional para pasar el tipo de consulta a la siguiente función en el flujo de trabajo y no es relevante para el operador.
pyCobaltHound utiliza/toma inspiración de lo siguiente:
pyCobaltHound utiliza para la consulta personalizada. Se utilizará en notificaciones e informes durante los flujos de trabajo de pyCobaltHound.
pyCobaltHound reemplazará con la cantidad de resultados de esta consulta.