
Actualizador automatizado del grafo de BloodHound para equipos azules. Enriquece las rutas de ataque de AD con datos en tiempo real de sesiones, grupos y CVE desde SIEMs, permitiendo monitoreo continuo y alertas.

A partir del lanzamiento de BloodHound CE 7.0, la base de datos predeterminada se ha cambiado a Postgres. Esta versión de FalconHound todavía depende de Neo4j como base de datos predeterminada. Si deseas seguir usando FalconHound mientras ejecutas la versión más reciente de BloodHound, agrega la siguiente línea a tu archivo bloodhound.config.json.```json "graph_driver": "neo4j",
El equipo de BloodHound mantendrá el soporte para Neo4j durante al menos un año. Dentro de este período, con suerte, habrá una gran mejora de la API o habremos implementado el soporte de PGSQL para FalconHound.
---
FalconHound es una herramienta múltiple para el equipo azul. Te permite utilizar y potenciar el poder de BloodHound de una manera más automatizada. Está diseñado para ser utilizado junto con un SIEM u otra herramienta de agregación de registros.
Uno de los aspectos desafiantes de BloodHound es que es una instantánea en el tiempo. FalconHound incluye funcionalidad que se puede utilizar para mantener un gráfico de su entorno actualizado. Esto le permite ver su entorno tal como es AHORA. Esto es especialmente útil para entornos que cambian constantemente.
Una de las relaciones más difíciles de recopilar para BloodHound son las membresías de grupos locales y la información de sesión. Como miembros del equipo azul, tenemos esta información fácilmente disponible en nuestros registros. FalconHound se puede utilizar para recopilar esta información y agregarla al gráfico, permitiendo que sea utilizada por BloodHound.
Esto es solo un ejemplo de cómo se puede usar FalconHound. Se puede usar para recopilar cualquier información que tenga en sus registros o herramientas de seguridad y agregarla al gráfico de BloodHound.
Además, el gráfico se puede usar para activar alertas o generar listas de enriquecimiento.
Por ejemplo, si se agrega un usuario a un grupo determinado, FalconHound se puede usar para consultar la base de datos del gráfico en busca de la ruta más corta a un grupo sensible o de alto privilegio. Si hay una ruta, esto se puede registrar en el SIEM o usar para activar una alerta.
Otros ejemplos donde se puede usar FalconHound:
- Agregar, eliminar o temporizar sesiones en el gráfico, basándose en eventos de inicio y cierre de sesión.
- Marcar usuarios y computadoras como comprometidos en el gráfico cuando tienen un incidente en Sentinel o MDE.
- Agregar información de CVE y si hay un exploit público disponible al gráfico.
- Todo tipo de actividades de Azure.
- Recalcular la ruta más corta a grupos sensibles cuando se agrega un usuario a un grupo o tiene un nuevo rol.
- Agregar nuevos usuarios, grupos y computadoras al gráfico.
- Generar listas de enriquecimiento para Sentinel y Splunk de, por ejemplo, usuarios Kerberoastable o usuarios con propiedad de ciertas entidades.
Las posibilidades son infinitas aquí. Por favor, agregue más ideas al rastreador de problemas o envíe un PR.
Se puede encontrar un blog que detalla más sobre por qué lo desarrollamos y algunos ejemplos de casos de uso [aquí](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)
Index:
- [Fuentes de datos y destinos compatibles](#supported-data-sources-and-targets)
- [Instalación](#installation)
- [Uso](#usage)
- [Acciones](#actions)
- [Extensiones al gráfico](#extensions-to-the-graph)
- [Gestión de credenciales](#credential-management)
- [Despliegue](#deployment)
- [Licencia](#license)
## Fuentes de datos y destinos compatibles
FalconHound está diseñado para ser usado con BloodHound. No es un reemplazo de BloodHound. Está diseñado para aprovechar el poder de BloodHound y todas las demás plataformas de datos que soporta de manera automatizada.
Actualmente, FalconHound soporta las siguientes fuentes de datos y/o destinos:
- Azure Sentinel
- Azure Sentinel Watchlists
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API (etapa temprana)
- archivos CSV
- Azure Data Explorer (ADX) - beta
- LogScale
- BloodHound CE y BHE (etapa temprana)
- archivos MarkDown
- Elastic (etapa temprana)
Se planean fuentes de datos y destinos adicionales para el futuro.
En este momento, FalconHound solo soporta la base de datos Neo4j para BloodHound. El soporte para la API de BH CE y BHE está en desarrollo activo.
---
## Instalación
Dado que FalconHound está escrito en Go, no se requiere instalación. Simplemente descargue el binario de la sección de lanzamientos y ejecútelo.
Hay binarios compilados disponibles para Windows, Linux y MacOS. Puede encontrarlos en la sección de [lanzamientos](https://github.com/FalconForceTeam/FalconHound/releases).
Antes de ejecutarlo, debe crear un archivo de configuración. Puede encontrar un archivo de configuración de ejemplo en la carpeta raíz. Las instrucciones sobre cómo crear todas las credenciales se pueden encontrar [aquí](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
La forma recomendada de ejecutar FalconHound es hacerlo como una tarea programada o un trabajo cron. Esto le permitirá ejecutarlo regularmente y mantener su gráfico, alertas y enriquecimientos actualizados.
### Requisitos
- BloodHound, o al menos la base de datos Neo4j por ahora.
- Un SIEM u otra herramienta de agregación de registros. Actualmente, se soportan Azure Sentinel y Splunk.
- Credenciales para cada endpoint con el que desee comunicarse, con los [permisos requeridos](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
### Configuración
FalconHound se configura mediante un archivo YAML. Puede encontrar un archivo de configuración de ejemplo en la carpeta raíz.
Cada sección del archivo de configuración se explica a continuación.
---
## Uso
#### Ejecución predeterminada
Para ejecutar FalconHound, simplemente ejecute el binario y agregue el parámetro `-go` para que ejecute todas las consultas en la carpeta de acciones.```bash
./falconhound -go
Para listar todas las acciones habilitadas, use el parámetro -actionlist. Esto listará todas las acciones que están habilitadas en los archivos de configuración en la carpeta de acciones. Debe usarse en combinación con el parámetro -go.```bash
./falconhound -actionlist -go
### Ejecutar con un conjunto selecto de acciones
Para ejecutar un conjunto selecto de acciones, use el parámetro `-ids`, seguido de uno o una lista de IDs de acciones separados por comas. Esto ejecutará las acciones especificadas en el parámetro, lo cual puede ser muy útil al realizar pruebas, solucionar problemas o cuando se requieren actualizaciones específicas y más frecuentes. Esto debe usarse en combinación con el parámetro `-go`.```bash
./falconhound -ids action1,action2,action3 -go
Por defecto, FalconHound buscará un archivo de configuración en el directorio actual. También puedes especificar un archivo de configuración usando la bandera -config. Esto puede permitirte ejecutar múltiples instancias de FalconHound con diferentes configuraciones, contra diferentes entornos.```bash
./falconhound -go -config /path/to/config.yml
#### Ejecutar con una carpeta de acciones diferente
Por defecto, FalconHound buscará la carpeta de acciones en el directorio actual. También puede especificar una carpeta diferente usando la bandera `-actions-dir`. Esto facilita las pruebas y la resolución de problemas, pero también permite ejecutar múltiples instancias de FalconHound con diferentes configuraciones, contra diferentes entornos o en diferentes intervalos de tiempo.```bash
./falconhound -go -actions-dir /path/to/actions
Por defecto, FalconHound usará las credenciales en config.yml (o una personalizada cargada). Al establecer la bandera -keyvault, FalconHound obtendrá el keyvault de la configuración y recuperará todos los secretos de allí. Si faltan elementos en el keyvault, recurrirá al archivo de configuración. Si se desea obtener los secretos de un keyvault de Azure usando una identidad administrada, defina la variable authtype como msi.```bash
./falconhound -go -keyvault
## Acciones
Las acciones son el núcleo de FalconHound. Son las consultas que FalconHound ejecutará. Están escritas en el lenguaje nativo de la fuente y el destino y se almacenan en la carpeta actions. Cada acción es un archivo separado y se almacena en el directorio de la fuente de la información, el destino de la consulta. El nombre del archivo se utiliza como nombre de la acción.
### Estructura de la carpeta de acciones
La carpeta de acciones está dividida en subdirectorios por fuente de consulta. Todas las carpetas se procesarán de forma recursiva y todos los archivos YAML se ejecutarán en orden alfabético.
Las acciones de Neo4j **deberían** procesarse al final, ya que su salida depende de que otras fuentes de datos hayan actualizado primero la base de datos de grafos, para obtener los resultados más actualizados.
### Archivos de acción
Todos los archivos son archivos YAML. El archivo YAML contiene la consulta, algunos metadatos y el(los) destino(s) de la información consultada.
Hay un archivo de plantilla disponible en la carpeta raíz. Puedes usarlo para crear tus propias acciones. Echa un vistazo a las acciones en la carpeta actions para más ejemplos.
Si bien la mayoría de los elementos serán bastante autoexplicativos, hay algunas cosas importantes que tener en cuenta sobre las acciones:
#### Enabled
Como su nombre indica, esto se utiliza para habilitar o deshabilitar una acción. Si se establece en false, la acción no se ejecutará.```yaml
Enabled: true
Esto se utiliza para habilitar o deshabilitar el modo de depuración para una acción. Si se establece en true, la acción se ejecutará en modo de depuración. Esto mostrará los resultados de la consulta en la consola. Es útil para pruebas y solución de problemas, pero no se recomienda su uso en producción. Ralentizará el procesamiento de la acción dependiendo del número de resultados.```yaml Debug: false
#### Consulta
El campo `Query` es la consulta que se ejecutará contra el origen. Puede ser una consulta KQL, una consulta SPL o una consulta Cypher dependiendo de tu `SourcePlatform`.
IMPORTANTE: Intenta mantener la consulta lo más exacta posible y solo devuelve los campos que necesites. Esto hará que el procesamiento de los resultados sea más rápido y eficiente.
Además, al ejecutar consultas Cypher, asegúrate de devolver un objeto JSON como resultado, de lo contrario el procesamiento fallará.
Por ejemplo, esto devolverá el Nombre, Conteo, Rol y Propietarios de las Suscripciones de Azure:```cypher
MATCH p = (n)-[r:AZOwns|AZUserAccessAdministrator]->(g:AZSubscription)
RETURN {Name:g.name , Count:COUNT(g.name), Role:type(r), Owners:COLLECT(n.name)}
Cada objetivo tiene varias opciones que se pueden configurar. Dependiendo del objetivo, algunos pueden requerir más configuración que otros.
Todos los objetivos tienen los campos Name y Enabled. El campo Name se utiliza para identificar el objetivo. El campo Enabled se utiliza para habilitar o deshabilitar el objetivo. Si se establece en falso, el objetivo será ignorado.
CSV soporta la variable {{date}}, la cual será reemplazada por la fecha actual en el formato YYYY-MM-DD. Esto se puede usar para crear informes diarios.
Esto se puede usar en un nombre de carpeta o archivo (ej. path/to/filename-{{date}}.csv) o en el nombre de la carpeta en sí.```yaml
#### Markdown
Markdown admite la variable {{date}}, que será reemplazada por la fecha actual en el formato `YYYY-MM-DD`. Esto puede usarse para crear informes diarios.
Esto puede utilizarse en un nombre de carpeta o archivo (p.ej. `path/to/filename-{{date}}.md`) o en el propio nombre de carpeta.```yaml
- Name: Markdown
Enabled: true
Path: path/to/filename.md
Ejemplo de salida:```markdown
Description: Get a list of Domain Admins. Date: 2024-02-19
| Name | ObjectID |
|---|---|
| [email protected] | S-1-5-21-1122334455-112233445-1112223334-11223344 |
#### Neo4j
El objetivo Neo4j escribirá los resultados de la consulta a una base de datos Neo4j. Esta salida es por línea y, por lo tanto, requiere configuración adicional.
Dado que podemos transferir todo tipo de datos en todas direcciones, FalconHound necesita entender qué hacer con los datos. Esto se hace mediante el uso de variables de reemplazo en la primera línea de sus consultas Cypher. Estas se pasan a Neo4j como parámetros y se pueden usar en la consulta.
Los campos `ReplacementFields` se configuran a continuación.```yaml
- Name: Neo4j
Enabled: true
Query: |
MATCH (x:Computer {name:$Computer}) MATCH (y:User {objectid:$TargetUserSid}) MERGE (x)-[r:HasSession]->(y) SET r.since=$Timestamp SET r.source='falconhound'
Parameters:
Computer: Computer
TargetUserSid: TargetUserSid
Timestamp: Timestamp
La sección de Parameters define un conjunto de parámetros que serán reemplazados por los valores de los resultados de la consulta. Se pueden referenciar como parámetros de Neo4j usando la sintaxis $parameter_name.
El objetivo Sentinel escribirá los resultados de la consulta en una tabla de Sentinel. La tabla se creará si no existe. La tabla se creará en el espacio de trabajo especificado en el archivo de configuración. Los datos de la consulta se añadirán al campo EventData. El EventID será el ID de la acción y la Description será el nombre de la acción.
Por eso también es necesario controlar la salida de la consulta, de lo contrario podrías inundar tu objetivo.```yaml
#### Sentinel Watchlists
El destino de Sentinel Watchlists escribirá los resultados de la consulta en una watchlist de Sentinel. La watchlist se creará si no existe. La watchlist se creará en el espacio de trabajo que se especifica en el archivo de configuración. Todas las columnas devueltas por la consulta se agregarán a la watchlist.```yaml
- Name: Watchlist
Enabled: true
WatchlistName: FH_MDE_Exploitable_Machines
DisplayName: MDE Exploitable Machines
SearchKey: DeviceName
Overwrite: true
El campo WatchlistName es el nombre de la lista de seguimiento. El campo DisplayName es el nombre para mostrar de la lista de seguimiento.
El campo SearchKey es la columna que se utilizará como clave de búsqueda.
El campo Overwrite se utiliza para determinar si la lista de seguimiento debe sobrescribirse o agregarse. Si se establece en false, los resultados de la consulta se agregarán a la lista de seguimiento. Si se establece en true, la lista de seguimiento se eliminará y se volverá a crear con los resultados de la consulta.
Al igual que Sentinel, Splunk escribirá los resultados de la consulta en un índice de Splunk. Será necesario crear el índice y vincularlo a un endpoint HEC. Los datos de la consulta se agregarán al campo EventData. El EventID será el ID de la acción y el Description será el nombre de la acción.```yaml
#### Azure Data Explorer
Al igual que Sentinel, Splunk escribirá los resultados de la consulta a una tabla de ADX. Los datos de la consulta se agregarán al campo EventData. El EventID será el ID de la acción y la Description será el nombre de la acción.```yaml
- Name: ADX
Enabled: true
Table: "name"
Para crear una tabla en ADX puedes usar el siguiente comando:```kql .create table FalconHound (Name: string, Description: string, EventID: string, BHQuery: string, EventData: dynamic, Timestamp: datetime)
### Extensiones al gráfico
#### Relación: HadSession
Una vez que una sesión ha finalizado, debía ser eliminada del gráfico, pero esto parecía un desperdicio de información. Así que, en lugar de eliminar la sesión,se añadirá como una relación entre el equipo y el usuario. La relación se llamará `HadSession`. La relación tendrá las siguientes propiedades:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
Esto permite descubrimientos adicionales de rutas donde podemos investigar si el usuario alguna vez inició sesión en un sistema determinado, incluso si la sesión ha terminado.
FalconHound agregará las siguientes propiedades a los nodos del gráfico:
Computadora: - 'exploitable': true/false - 'exploits': lista de CVEs - 'exposed': true/false - 'ports': lista de puertos accesibles desde Internet - 'alertids': lista de IDs de alertas
Las formas actualmente compatibles de proporcionar credenciales a FalconHound son:
El archivo de configuración contiene todos los detalles requeridos por cada plataforma. Todos los elementos en el archivo de configuración son sensibles a mayúsculas y minúsculas. La mejor práctica es separar las aplicaciones por nivel de servicio, pero puede usar 1 AppID/AppSecret para todas las acciones basadas en Azure.
Los permisos requeridos para su AppID/AppSecret se enumeran aquí.
Una forma más segura de almacenar las credenciales sería usar un Azure KeyVault. Tenga en cuenta que hay un pequeño aspecto de costo al usar Keyvaults. El acceso a los KeyVaults actualmente admite autenticación basada en una identidad administrada del sistema o AppID/AppSecret que deben configurarse en el archivo config.yml.
La forma recomendada de configurar esto es asignar una identidad administrada del sistema a la VM donde se ejecuta FalconHound y asignarle el rol Key Vault Secrets User a este Keyvault. Esto permitirá que FalconHound se autentique en el Keyvault sin necesidad de configuración adicional.
Alternativamente, puede usar un ServicePrincipal que solo tenga el rol Key Vault Secrets User para este Keyvault. Este rol solo permite el acceso a los secretos, ni siquiera listarlos. NO reutilice el ServicePrincipal que tiene acceso a Sentinel y/o MDE, ya que esto casi anula por completo el uso de un Keyvault.
Los elementos a configurar en el Keyvault se enumeran a continuación. Tenga en cuenta que los secretos de Keyvault no distinguen entre mayúsculas y minúsculas.``` SentinelAppSecret SentinelAppID SentinelTenantID SentinelTargetTable SentinelResourceGroup SentinelSharedKey SentinelSubscriptionID SentinelWorkspaceID SentinelWorkspaceName MDETenantID MDEAppID MDEAppSecret Neo4jUri Neo4jUsername Neo4jPassword GraphTenantID GraphAppID GraphAppSecret AdxTenantID AdxAppID AdxAppSecret AdxClusterURL AdxDatabase SplunkUrl SplunkApiToken SplunkIndex SplunkApiPort SplunkHecToken SplunkHecPort BHUrl BHTokenID BHTokenKey LogScaleUrl LogScaleToken LogScaleRepository LimaCharlieAPIUrl LimaCharlieOrgId LimaCharlieIngestKey ElasticCloudID ElasticApiKey
Una vez configurado, puede agregar el parámetro `-keyvault` al iniciar FalconHound.
#### Modo mixto / fallback
Cuando el parámetro `-keyvault` se establece en la línea de comandos, esta será la fuente principal para todos los secretos requeridos. Si FalconHound no logra recuperar elementos, recurrirá al elemento equivalente en `config.yml`.
Si ambos fallan y hay acciones habilitadas para ese origen o destino, se lanzará una advertencia y se omitirá(n) la(s) acción(es).
## Implementación
FalconHound está diseñado para ejecutarse como una tarea programada o trabajo cron. Esto le permitirá ejecutarlo de forma regular y mantener su gráfico, alertas y enriquecimientos actualizados.
Dependiendo de la cantidad de acciones que tenga habilitadas, la cantidad de datos que esté procesando y la cantidad de datos que esté escribiendo en el gráfico, esto puede tomar un tiempo.
Todas las consultas basadas en registros están diseñadas para ejecutarse cada 15 minutos. Si el procesamiento toma demasiado tiempo, es posible que necesite ajustar un poco esto.
Si ese es el caso, se recomienda deshabilitar ciertas acciones.
También puede haber cierta superposición, por ejemplo, con las acciones de sesión. Si tiene muchas sesiones, es posible que desee deshabilitar las acciones de sesión de Sentinel y confiar en la de MDE. Esto asume que tiene MDE y Sentinel conectados y que la mayoría de las máquinas están integradas en MDE.
### Sharphound / Azurehound
Si bien FalconHound está diseñado para usarse con BloodHound, no es un reemplazo de Sharphound y Azurehound. Está diseñado para complementar la recopilación y eliminar el problema del momento puntual de la recopilación periódica. Tanto Sharphound como Azurehound aún son necesarios para recopilar los datos, ya que no todos los datos similares están disponibles en los registros.
Se recomienda ejecutar Sharphound y Azurehound de forma regular, por ejemplo, una vez al día/semana o mes, y FalconHound cada 15 minutos.
## Licencia
Este proyecto está licenciado bajo la Licencia BSD3 - consulte el archivo [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE) para más detalles.
Esto significa que puede usar este software de forma gratuita, incluso en productos comerciales, siempre que nos dé crédito.
No puede responsabilizarnos por ningún daño causado por este software.