
Recolector de datos de Active Directory basado en TUI que ingiere objetos LDAP, realiza recolección remota RPC/SMB/HTTP y genera volcados compatibles con BloodHound CE para análisis de rutas de ataque.
Una TUI para la recolección de Active Directory.
Los principales objetivos de este proyecto son:
Flashingestor implementa 3 pasos básicos separados: Ingestión LDAP, Recolección Remota y Conversión, a diferencia de otros recolectores que ejecutan los métodos especificados en un solo paso:
Ingest (Ctrl+l) - Recoge datos de atributos de objetos sin procesar de LDAP y los almacena en output/ldap en archivos intermedios msgpack. Las consultas se pueden personalizar en config.yaml.
Remote (Ctrl+r) - Lee estos archivos intermedios en memoria, calcula la lista de computadoras a recolectar y realiza una serie de solicitudes RPC/SMB/HTTP para obtener información remota relevante para objetos Computer y EnterpriseCA, que se almacenan en output/remote.
Convert (Ctrl+s) - Lee los archivos intermedios en memoria, fusiona la información de los pasos de ingestión y recolección remota, y genera un volcado compatible con Bloodhound en output/bloodhound - este paso es completamente offline.
Para más detalles técnicos y perspectivas, consulta nuestra 📖 Wiki.
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# To build only:
$ go build ./cmd/flashingestor
# To install the executable to $GOBIN or $GOPATH/bin:
$ go install ./cmd/flashingestor
[!NOTE] También puedes usar binarios precompilados de los Lanzamientos proporcionados.
Primero autentícate con uno de los siguientes métodos:
# Anonymous
# [Requires dSHeuristics of 0000002 in the DirectoryServices object
# and can have limited visibility due to lack of Read ACEs]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# User + Password
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# User + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# User + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# User + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# User + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# User + Ticket
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
or
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
Luego ejecuta los pasos según lo desees. Para una recolección solo LDAP (DCOnly con excepción de GPOLocalGroup y CertServices), solo ejecuta Ctrl+l, verifica si la ingestión fue exitosa y luego ejecuta Ctrl+s para generar el volcado final.
Se recomienda especificar --dc y --dns para ejecutar flashingestor. Si no especificas --dc, flashingestor intentará encontrarlo con búsquedas SRV / A, lo que puede retrasar el paso inicial Ingest.
Debes especificar --dns si tu servidor DNS estándar no conoce el dominio; cuando se utiliza DNS integrado en AD, simplemente apunta --dns al DC que lo aloja. Además, independientemente de --dc, si deseas ejecutar el paso Remote Collection y tu servidor DNS no conoce las computadoras del dominio, entonces debes especificar --dns para las búsquedas.
[!TIP] En entornos con múltiples DC, también puedes usar la utilidad
dcprobepara medir la latencia de todos los DCs y encontrar un buen candidato objetivo para la ingestión:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
Si el archivo de configuración no está presente en el directorio actual como config.yaml o en la ruta proporcionada mediante --config, se asumirán las opciones predeterminadas (las mismas que en el config.yaml proporcionado); están codificadas en config/fallback.go. Para más información, lee Archivo de Configuración.
Considera usar --log para especificar un archivo de salida para los registros (en caso de que necesites revisarlos después de cerrar la TUI) y -vv para ver mensajes de registro de depuración, ya que estos pueden ayudar a solucionar posibles problemas. Para una referencia completa de los argumentos de línea de comandos, lee Argumentos de Línea de Comandos.
[!NOTE] Las consultas predeterminadas en el
config.yamlproporcionado están diseñadas teniendo en cuenta la información necesaria para la conversión de Bloodhound. Puedes optar por personalizar consultas o atributos enconfig.yaml, pero es mejor evitar eliminar atributos necesarios y evitar cambiar el significado de los filtros de búsqueda.
Si recurse_trusts está establecido en true, ingerirá cualquier dominio de confianza encontrado de forma recursiva con la credencial inicial proporcionada para la ingestión.
Si search_forest está establecido en true, ingerirá dominios que forman parte del mismo bosque que el dominio inicial desde la partición Configuration; no se emitirán consultas adicionales, ya que esto ya es parte del plan de ingestión predeterminado. Ambas opciones se pueden configurar al mismo tiempo, y flashingestor solo ingerirá cualquier dominio encontrado una vez (ya sea a través de una confianza o del bosque actual).
Si recurse_trusts está habilitado y recurse_feasible_only también está establecido en true, solo intentará ingerir un dominio de confianza si la confianza es:
Esto significa que las confianzas solo salientes no se recorrerán, y aparte del primer nivel de confianzas, las rutas de ingestión se detienen en confianzas no transitivas: si B confía en A de forma no transitiva, entonces A aún puede autenticarse en B; pero si C también confía en B de forma no transitiva, entonces A no puede autenticarse en C.
[!IMPORTANT]
recurse_trusts/search_forestsolo se autenticará en LDAP en dominios descubiertos con las credenciales especificadas del dominio de origen cuando las credenciales proporcionadas seancontraseña simpleo unhash NT; usar un TGT para emitir un ticket de referencia para este propósito es teóricamente posible pero aún no implementado en la libreríaadauth.
Las cadenas de middleware de Macmod/ldapx también se pueden usar directamente con flashingestor para ofuscar las consultas LDAP en el paso de ingestión usando las opciones -f (--ldapx-filter), -a (--ldapx-attrs) y -b (--ldapx-basedn). Con -vv, las consultas sin procesar antes y después de la ofuscación también se mostrarán en el registro.
Si tienes la intención de ejecutar el paso de recolección remota, verifica los methods habilitados; estos corresponden aproximadamente a los métodos ofrecidos por SharpHound y se pueden usar para activar o desactivar recolecciones específicas a través de RPC o HTTP.
Los argumentos --remote-* se pueden usar para especificar un conjunto separado de credenciales para la recolección remota. Si no se especifican, flashingestor intentará usar las mismas credenciales para el usuario proporcionado en los argumentos estándar de ingestión (--user, --password, etc).
Un administrador local también se puede usar para la recolección remota especificando --remote-user Administrator@., por ejemplo, pero la efectividad de este enfoque dependerá de si la cuenta es el administrador incorporado o no, y de los valores de las claves de registro FilterAdministratorToken / LocalAccountTokenFilterPolicy. Para más detalle sobre este comportamiento, consulta Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy.
Las opciones compress_output y cleanup_after_compression pueden ayudar a mantener el uso de disco pequeño. Después de cargar el volcado final en Bloodhound, puedes eliminar de forma segura los archivos en output/ldap y output/remote manualmente si no los necesitas, pero estos archivos se pueden conservar para consultar información importante sin tener que volver a ejecutar la recolección completa.
[!TIP] El propósito principal de los archivos
msgpacken las carpetasoutput/ldapyoutput/remotees servir como formato intermediario para segregar responsabilidades de todo el proceso, pero estos archivos también se pueden usar como fuente de información convirtiéndolos a JSON; de esta manera no tienes que buscar atributos de objetos sin procesar o resultados de recolección remota:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.jsonUna buena forma de inspeccionar estos archivos sería usar JQ/FX, o tu lenguaje de programación favorito 🙂
Las contribuciones son bienvenidas abriendo un issue o enviando un pull request.
Muchas gracias a SpecterOps por BloodHound, SharpHound / SharpHoundCommon y a dirkjanm por BloodHound.py, que fueron las principales referencias para esta herramienta.
Gracias a rtpt-erikgeiser y RedTeamPentesting por adauth y a p0dalirius por winacl, ambas librerías muy útiles.
Gracias a oiweiwei por go-msrpc, ya que su librería hizo posible implementar métodos de recolección remota basados en RPC.
Protected Users o cuando la autenticación NTLM está bloqueada mediante configuraciones de seguridad) o con certificados (que usa PKINIT internamente), la recolección remota no intentará autenticarse en computadoras de dominios que difieran del dominio al que pertenece el usuario. Esto también aplica al método GPOLocalGroup, que en esos casos no intentará leer archivos GPO de DCs de otros dominios, incluso si hay múltiples dominios en los datos ingeridos.SmbInfo para el tipo Computer sigue siendo una implementación básica (solo comprobaciones de registro).HttpEnrollmentEndpoints solo funciona con un nombre de usuario/contraseña proporcionado.AllowedToDelegateTo / ServicePrincipalNames sigue siendo una implementación básica.Casi todas las propiedades implementadas en SharpHound son compatibles, pero hay muchas diferencias arquitectónicas entre esta herramienta y SharpHound, por lo que no esperes que la salida coincida exactamente con la implementación oficial (a excepción de posibles errores). Pueden surgir diferencias clave especialmente en las implementaciones más complejas, como las recolecciones remotas a través de RPC y las recolecciones relacionadas con abuso de CA/certificados.
Los tiempos de espera siguen siendo en su mayoría estáticos; la implementación de SharpHound usa un tiempo de espera adaptativo (¡bastante inteligente!), pero aún no he tenido tiempo de estudiar eso. Si es necesario, personaliza los tiempos de espera con las opciones --timeout, --computer-timeout y --method-timeout (config/config.go especifica otros tiempos de espera específicos de operación).
Actualmente no hay pruebas implementadas y solo he probado manualmente un pequeño subconjunto de funcionalidades.
La Licencia MIT (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
Por la presente se concede permiso, libre de cargos, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar el Software sin restricción, incluidos, sin limitación, los derechos de uso, copia, modificación, fusión, publicación, distribución, sublicencia y/o venta de copias del Software, y para permitir a las personas a quienes se les proporcione el Software hacer lo mismo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE NINGUNA RECLAMACIÓN, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O CUALQUIER OTRO MOTIVO, QUE SURJA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRO TIPO DE ACCIONES EN EL SOFTWARE.