
Identifica las rutas de ataque en BloodHound que rompen tu segmentación de AD.
Identifica las rutas de ataque en BloodHound que rompen tu segmentación por niveles de AD
ImproHound es un ejecutable independiente de dotnet para Windows x64 con interfaz gráfica. Para usar ImproHound, debes ejecutar SharpHound para recolectar los datos necesarios del AD. Luego, subirás los datos a tu instalación de BloodHound. ImproHound se conectará a la base de datos Neo4j subyacente de BloodHound. En ImproHound, categorizarás el AD en niveles a través de la estructura de OU, e ImproHound identificará las relaciones de AD que permiten a los objetos de AD comprometer un objeto de un nivel superior (más cercano a cero) y guardará las violaciones de segmentación en un archivo csv.
Artículo del blog de ImproHound
Video de demostración de ImproHound
Presentación de ImproHound en DEF CON Adversary Village
1. Configura tu base de datos de BloodHound
Recolecta datos de BloodHound con SharpHound en tu AD
Nota: esto generará ruido en tu antivirus, SIEM, etc.
Ejemplo: Ejecuta SharpHound.exe desde cmd, recolecta todo (sí, GPOLocalGroup no está incluido en All):
SharpHound.exe --CollectionMethods All,GPOLocalGroup
Consejo 1: Usa el parámetro
Domainpara recolectar datos de otros dominios del bosque.
Consejo 2: Para obtener aún más datos, usa The Session Loop Collection Method
Sube tus datos de BloodHound en la interfaz gráfica de BloodHound
Hay un error en BloodHound que a veces hace que el archivo JSON del dominio se omita al subir un zip de datos de BloodHound. Revisa las estadísticas de la base de datos en BloodHound después de la subida de datos y asegúrate de que los objetos de dominio existan.
2. Instala el plugin APOC de Neo4j (permite las increíbles operaciones de grafo que necesitamos)
Descarga la versión de APOC que coincida con tu versión de Neo4j (apoc-x.x.x.x-all.jar).
Encuentra la versión de APOC que coincida con tu versión de Neo4j en la matriz de compatibilidad de versiones.
Intenta recordar dónde instalaste Neo4j y coloca el archivo jar de APOC en: $NEO4J_HOME/plugins/
/var/lib/neo4j/Edita neo4j.conf en tu editor de texto favorito para permitir el acceso sin restricciones a APOC reemplazando la línea:
#dbms.security.procedures.unrestricted=my.extensions.example,my.procedures.*
con
dbms.security.procedures.unrestricted=apoc.*
/etc/neo4j/neo4j.conf$NEO4J_HOME/conf/neo4j.confSi quieres ejecutar ImproHound en un equipo y BloodHound en otro, debes permitir conexiones remotas a la base de datos Neo4j en el equipo de BloodHound. Para ello, elimina el # de la línea
#dbms.default_listen_address=0.0.0.0en .
3. Descarga y ejecuta la última versión de ImproHound.exe en Windows (x64)
Confirma que puedes iniciar sesión en la base de datos de BloodHound con las mismas credenciales que usas en la interfaz gráfica de BloodHound.

Ingresa las credenciales de la base de datos y establece una conexión. Son las mismas credenciales que usas en la interfaz gráfica de BloodHound.

ImproHound crea una etiqueta 'TierX' en los nodos de la base de datos de BloodHound. Si has usado ImproHound anteriormente con esta base de datos de BloodHound, se te preguntará si deseas continuar con la segmentación por niveles que ya has creado o si deseas empezar de nuevo.

ImproHound te da la opción de establecer 'Segmentación por niveles predeterminada', que colocará a los Administradores de Dominio en el Nivel 0, a los Usuarios de Dominio en el Nivel 2, etc., o establecer todos los objetos en el Nivel 2.

Esta es la página donde categorizarás los objetos de AD en niveles. La ventana muestra la estructura de OU. Cada objeto de AD tiene un valor de nivel que se puede aumentar y disminuir con las flechas.
Establecer nivel para los hijos
Si seleccionas un dominio o un contenedor de AD, puedes hacer clic en 'Establecer nivel para los hijos' para establecer todos los hijos (de forma recursiva) al nivel del dominio/contenedor dado.
Establecer nivel para los miembros
Si seleccionas un grupo, puedes hacer clic en 'Establecer nivel para los hijos' para establecer todos los miembros (de forma recursiva) al nivel del grupo dado.
Establecer nivel para GPOs
Si haces clic en 'Establecer nivel para GPOs', cada GPO tendrá su nivel establecido al nivel de la OU con el nivel más alto (más cercano a cero) a la que está vinculada la GPO. Las GPO no vinculadas a una OU no verán cambiado su nivel.
Obtener violaciones de segmentación
Encuentra todas las relaciones en la base de datos de BloodHound donde un objeto de AD tiene control sobre un objeto de AD de un nivel superior (más cercano a cero).
Se generan dos archivos CSV como salida:
adobjects-[marca de tiempo].csv: Todos los objetos de AD y en qué nivel se encuentran.
tiering-violations-[marca de tiempo].csv: Las violaciones de segmentación.
Ejemplo de registros en el CSV de violaciones:
El primer registro es una cuenta de servicio de Nivel 1 con permiso para cambiar la contraseña de una cuenta de usuario de Nivel 0. La relación es heredada. Desafortunadamente, no siempre es posible ver de dónde se hereda la relación en los datos de BloodHound, pero puedes verificarlo manualmente inspeccionando los permisos en el objeto de AD de destino en Usuarios y Equipos. El segundo registro es un grupo con permiso para editar una GPO, que probablemente está vinculada a una OU que contiene servidores de Nivel 0, ya que es una GPO de Nivel 0.
Puedes consultar todos los tipos de relaciones y cómo se explotan aquí.
Si descubres que un objeto está en un nivel demasiado alto (más cercano a cero), debes corregirlo en ImproHound y luego buscar violaciones con este objeto como FUENTE. Si un objeto está en un nivel demasiado bajo (más cercano a infinito), debes corregirlo en ImproHound y buscar violaciones con el objeto como DESTINO.
Eliminar segmentación por niveles
Se eliminarán todas las etiquetas de nivel y los nodos creados por ImproHound en la base de datos de BloodHound.
Es importante segmentar correctamente los objetos de AD por niveles. Si estableces un DC y un usuario regular con pocos privilegios como objetos de Nivel 0, ImproHound no encontrará que el acceso de administrador del usuario al DC sea una violación de segmentación. Lo mismo ocurre si agregas a ambos al Nivel 2.
Los equipos se segmentan según lo crítico que sería si el equipo se viera comprometido.
Los usuarios se segmentan según los equipos a los que pueden iniciar sesión y según los objetos de AD sobre los que tienen control. Un ejemplo de permiso de control podría ser un usuario con derechos para editar GPO vinculadas a servidores de Nivel 1, lo que convertiría al usuario en un objeto de Nivel 1.
Un grupo pertenece al nivel más bajo (más cercano a infinito) de sus miembros, a menos que el grupo tenga miembros malos, por ejemplo, un usuario regular como miembro de Administradores de Dominio.
Ejemplos: Usuarios de Dominio es un grupo de Nivel 2 aunque tus usuarios de Nivel 0 sean miembros del grupo, porque no es la membresía de Usuarios de Dominio la que otorga privilegios a los usuarios. Por otro lado, el grupo Administradores de Dominio es un grupo de Nivel 0 porque la membresía de este grupo hace que los usuarios sean muy privilegiados. Controladores de dominio clonables no tiene ningún privilegio de AD que yo sepa, pero solo debe contener objetos de Nivel 0, es decir, DC, por lo que es un grupo de Nivel 0.
Un contenedor pertenece al nivel más alto (más cercano a cero) de sus objetos secundarios, o superior.
Ejemplo: Tienes todos los usuarios de Nivel 0, Nivel 1 y Nivel 2 en el contenedor Usuarios. Un usuario con permiso de Control Total sobre el contenedor Usuarios podría comprometer a todos los usuarios, incluidos los de Nivel 0 (excepto algunos que están protegidos, pero eso no es importante para el ejemplo), por lo que el contenedor Usuarios debe ser un objeto de Nivel 0.
El nivel de una GPO está determinado por el nivel de las OU a las que está vinculada. La GPO pertenece al nivel más alto (más cercano a cero) de las OU a las que está vinculada. Usa el botón 'Establecer nivel para GPOs' para asegurarte de que todas las GPO sigan este principio.
Ejemplo: Un usuario con permiso para editar una GPO vinculada a una OU de Nivel 1 podría controlar la membresía de Administradores en todos los servidores bajo la OU de Nivel 1 modificando la GPO.
neo4j.confReinicia Neo4j
systemctl restart neo4jnet stop neo4j && net start neo4j (PowerShell: net stop neo4j; net start neo4j)| SourceTier | SourceType | SourceName | SourceDistinguishedname | Relation | IsInherited | TargetTier | TargetType | TargetName | TargetDistinguishedname |
|---|
| Tier1 | User | [email protected] | CN=svc-monitor,CN=Users,DC=hot,DC=local | ForceChangePassword | True | Tier0 | User | [email protected] | CN=T0_JBK,CN=Users,DC=hot,DC=local |
| Tier2 | Group | [email protected] | CN=Wrk-Admins,CN=Groups,DC=hot,DC=local | GenericWrite | Tier0 | GPO | [email protected] | CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=hot,DC=local |