BARK significa Kit de investigación de ataque BloodHound. Es un script de PowerShell creado para ayudar al equipo de BloodHound Enterprise a investigar y validar continuamente las primitivas de abuso. BARK actualmente se centra en el conjunto de productos y servicios Azure de Microsoft.
BARK no requiere dependencias de terceros. Las funciones de BARK están diseñadas para ser lo más simples y fáciles de mantener posible. La mayoría de las funciones son contenedores muy simples para realizar solicitudes a varios puntos finales de API REST. Las funciones básicas de BARK ni siquiera se necesitan entre sí: puede extraer casi cualquier función BARK de BARK y funcionará perfectamente como una función independiente en sus propios scripts.
Autor principal: Andy Robbins @_wald0
Colaboradores:
Hay muchas formas de importar un script de PowerShell. Aquí hay una forma:
Primero, descargue BARK.ps1 clonando este repositorio o simplemente copiando y pegando su contenido sin formato desde GitHub.
git clone https://github.com/BloodHoundAD/BARK
Ahora, ingresa al directorio donde está la PS1:
cd BARK
Finalmente, puedes importar la PS1 de esta manera:
. .BARK.ps1
Presione Intro y su instancia de PowerShell ahora tendrá acceso a todas las funciones de BARK.
Con muy pocas excepciones, los puntos finales de la API de Azure requieren autenticación para interactuar. BARK viene con algunas funciones que lo ayudarán a adquirir los tokens necesarios para interactuar con las API REST de MS Graph y Azure. Cualquier función BARK que interactúe con una API de Azure que requiera autenticación requerirá que proporcione un token.
Supongamos que desea enumerar todos los usuarios en un inquilino de Entra ID. Primero debe obtener un token con alcance para MS Graph. Hay muchas formas de conseguir este token:
Si tiene una combinación de nombre de usuario y contraseña para un usuario de Entra en ese inquilino, primero puede adquirir un token de actualización para el usuario usando la función Get-EntraRefreshTokenWithUsernamePassword de BARK:
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
El objeto resultante que acaba de crear, $MyRefreshTokenRequest , tendrá como parte un token de actualización para su usuario. Ahora puede solicitar un token con ámbito de MS Graph utilizando este token de actualización:
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
Ahora, este nuevo objeto, $MyMSGraphToken , tendrá como uno de sus valores de propiedad un JWT con ámbito de MS Graph para su usuario. Ahora está listo para usar este token para enumerar todos los usuarios en el inquilino de Entra:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
Una vez terminado, la variable $MyEntraUsers se completará con objetos que representan a todos los usuarios de su inquilino de Entra.
Get-AzureKeyVaultTokenWithClientCredentials solicita un token de STS con Azure Vault especificado como recurso o audiencia prevista mediante un identificador de cliente y un secreto.Get-AzureKeyVaultTokenWithUsernamePassword solicita un token de STS con Azure Vault especificado como recurso o audiencia prevista mediante un nombre de usuario y una contraseña proporcionados por el usuario.Get-AzurePortalTokenWithRefreshToken solicita un token de actualización de autenticación de Azure Portal con un token de actualización proporcionado por el usuario.Get-AzureRMTokenWithClientCredentials solicita un JWT con ámbito de AzureRM con un identificador de cliente y un secreto. Útil para autenticarse como entidad de servicio de Entra.Get-AzureRMTokenWithPortalAuthRefreshToken solicita un JWT con ámbito de AzureRM con un token de actualización de autenticación de Azure Portal proporcionado por el usuario.Get-AzureRMTokenWithRefreshToken solicita un JWT con ámbito de AzureRM con un token de actualización proporcionado por el usuario.Get-AzureRMTokenWithUsernamePassword solicita un JWT con ámbito de AzureRM con un nombre de usuario y una contraseña proporcionados por el usuario.Get-EntraRefreshTokenWithUsernamePassword solicita una colección de tokens, incluido un token de actualización, de login.microsoftonline.com con un nombre de usuario y una contraseña proporcionados por el usuario. Esto fallará si el usuario tiene requisitos de autenticación multifactor o se ve afectado por una política de acceso condicional.Get-MSGraphTokenWithClientCredentials solicita un JWT con ámbito de MS Graph con un ID de cliente y un secreto. Útil para autenticarse como entidad de servicio de Entra.Get-MSGraphTokenWithPortalAuthRefreshToken solicita un JWT con ámbito de MS Graph con un token de actualización de autenticación de Azure Portal proporcionado por el usuario.Get-MSGraphTokenWithRefreshToken solicita un JWT con ámbito de MS Graph con un token de actualización proporcionado por el usuario.Get-MSGraphTokenWithUsernamePassword solicita un JWT con ámbito de MS Graph con un nombre de usuario y una contraseña proporcionados por el usuario.Parse-JWTToken tomará un JWT codificado en Base64 como entrada y lo analizará por usted. Útil para verificar la audiencia de tokens y las afirmaciones correctas.Las funciones de actualización basadas en tokens en BARK se basan en funciones en TokenTactics de Steve Borosh.
Get-AllEntraApps recopila todos los objetos de registro de la aplicación Entra.Get-AllEntraGroups recopila todos los grupos de Entra.Get-AllEntraRoles recopila todos los roles de administrador de Entra.Get-AllEntraServicePrincipals recopila todos los objetos principales del servicio Entra.Get-AllEntraUsers recopila todos los usuarios de Entra.Get-EntraAppOwner recopila propietarios de un registro de aplicación Entra.Get-EntraDeviceRegisteredUsers recopila usuarios de un dispositivo Entra.Get-EntraGroupMembers recopila miembros de un grupo Entra.Get-EntraGroupOwner recopila propietarios de un grupo Entra.Get-EntraRoleTemplates recopila plantillas de funciones de administrador de Entra.Get-EntraServicePrincipal recopila una entidad de servicio de Entra.Get-EntraServicePrincipalOwner recopila los propietarios de una entidad de servicio de Entra.Get-EntraTierZeroServicePrincipals recopila entidades principales de servicio de Entra que tienen una asignación de función de administrador de Entra de nivel cero o de función de aplicación MS Graph de nivel cero.Get-MGAppRoles recopila las funciones de la aplicación que la entidad de servicio de MS Graph pone a disposición. Get-AllAzureManagedIdentityAssignments recopila todas las asignaciones de identidades administradas.Get-AllAzureRMAKSClusters recopila todos los clústeres de servicios de Kubernetes bajo una suscripción.Get-AllAzureRMAutomationAccounts recopila todas las cuentas de automatización de una suscripción.Get-AllAzureRMAzureContainerRegistries recopila todos los registros de contenedores bajo una suscripción.Get-AllAzureRMFunctionApps recopila todas las aplicaciones de funciones bajo una suscripción.Get-AllAzureRMKeyVaults recopila todos los almacenes de claves de una suscripción.Get-AllAzureRMLogicApps recopila todas las aplicaciones lógicas bajo una suscripción.Get-AllAzureRMResourceGroups recopila todos los grupos de recursos de una suscripción.Get-AllAzureRMSubscriptions recopila todas las suscripciones de AzureRM.Get-AllAzureRMVMScaleSetsVMs recopila todas las máquinas virtuales en un conjunto de escalado de VM.Get-AllAzureRMVMScaleSets recopila todos los conjuntos de escalado de máquinas virtuales bajo una suscripción.Get-AllAzureRMVirtualMachines recopila todas las máquinas virtuales bajo una suscripción.Get-AllAzureRMWebApps recopila todas las aplicaciones web bajo una suscripción.Get-AzureAutomationAccountRunBookOutput ejecuta un runbook de cuenta de automatización y recupera su resultado.Get-AzureFunctionAppFunctionFile recopila el archivo sin formato (normalmente código fuente) de una función de aplicación de funciones.Get-AzureFunctionAppFunctions recopila todas las funciones en una aplicación de funciones.Get-AzureFunctionAppMasterKeys recopila todas las claves maestras en una aplicación de funciones.Get-AzureFunctionOutput ejecuta una función de aplicación de funciones y recupera su resultado.Get-AzureRMKeyVaultSecretValue recopila un valor secreto del almacén de claves.Get-AzureRMKeyVaultSecretVersions recopila todas las versiones de un secreto del almacén de claves.Get-AzureRMKeyVaultSecrets recopila todos los secretos en un almacén de claves.Get-AzureRMRoleAssignments recopila todas las asignaciones de roles en un objeto.Get-AzureRMRoleDefinitions recopila todas las definiciones de roles descritas en un ámbito de suscripción, incluidos los roles personalizados.Get-AzureRMWebApp recopila una aplicación web. Get-IntuneManagedDevices recopila dispositivos administrados por Intune.Get-IntuneRoleDefinitions recopila las definiciones de roles de Intune disponibles. Add-MemberToEntraGroup intentará agregar un director a un grupo Entra.Enable-EntraRole intentará habilitar (o "activar") la función Entra.New-EntraAppOwner intentará agregar un nuevo propietario a una aplicación Entra.New-EntraAppRoleAssignment intentará otorgar una función de aplicación a una entidad de servicio. Por ejemplo, puede usar esto para otorgar a una entidad de servicio el rol de aplicación RoleManagement.ReadWrite.Directory.New-EntraAppSecret intentará crear un nuevo secreto para un registro de aplicación Entra existente.New-EntraGroupOwner intentará agregar un nuevo propietario a un grupo Entra.New-EntraRoleAssignment intentará asignar una función de administrador de Entra a un director específico.New-EntraServicePrincipalOwner intentará agregar un nuevo propietario a una entidad de servicio de Entra.New-EntraServicePrincipalSecret intentará crear un nuevo secreto para una entidad de servicio de Entra existente.Reset-EntraUserPassword intentará restablecer la contraseña de otro usuario. Si tiene éxito, el resultado contendrá la nueva contraseña del usuario generada por Azure.Set-EntraUserPassword intentará establecer la contraseña de otro usuario en un nuevo valor proporcionado por el usuario. Invoke-AzureRMAKSRunCommand indicará al clúster de AKS que ejecute un comando.Invoke-AzureRMVMRunCommand intentará ejecutar un comando en una máquina virtual.Invoke-AzureRMWebAppShellCommand intentará ejecutar un comando en un contenedor de aplicación web.Invoke-AzureVMScaleSetVMRunCommand intentará ejecutar un comando en una máquina virtual de VM Scale Set.New-AzureAutomationAccountRunBook intentará agregar un runbook a una cuenta de automatización.New-AzureKeyVaultAccessPolicy intentará conceder a una entidad de seguridad permisos "Obtener" y "Lista" sobre los secretos, las claves y los certificados de un almacén de claves.New-AzureRMRoleAssignment intentará otorgar una asignación de rol de AzureRM especificada por el usuario a una entidad de seguridad determinada en un ámbito determinado.New-PowerShellFunctionAppFunction intentará crear una nueva función de PowerShell en una aplicación de funciones. ConvertTo-Markdown se utiliza para masajear la salida de las funciones Invoke-Tests para su uso en otra plataforma.Invoke-AllAzureMGAbuseTests realiza todas las pruebas de validación de abuso que se pueden ejecutar manteniendo una función de aplicación MS Graph. Devuelve un objeto que describe qué privilegios tuvieron éxito al realizar cada prueba de abuso.Invoke-AllAzureRMAbuseTests realiza todas las pruebas de validación de abuso de AzureRM y genera un objeto resultante que describe qué roles de AzureRM otorgaron la capacidad de realizar cada abuso.Invoke-AllEntraAbuseTests realiza todas las pruebas de validación de abuso que pueden ejecutar los directores a los que se les otorgan funciones de administrador de Entra. Devuelve un objeto que describe qué privilegios tuvieron éxito al realizar cada prueba de abuso.New-EntraIDAbuseTestSPs crea una nueva entidad de servicio por función de administrador de Entra activa y otorga a cada entidad de servicio la función adecuada. Devuelve las credenciales en texto sin formato creadas para cada director de servicio.New-EntraIDAbuseTestUsers crea un nuevo usuario por función de administrador activa de Entra y otorga a cada usuario la función adecuada. Devuelve las credenciales en texto sin formato creadas para cada usuario.New-IntuneAbuseTestUsers crea un nuevo usuario por función de Intune y otorga a cada usuario la función adecuada. Devuelve las credenciales en texto sin formato creadas para cada usuario.New-MSGraphAppRoleTestSPs crea una nueva entidad de servicio por función de la aplicación MS Graph y otorga a cada entidad de servicio la función adecuada. Devuelve las credenciales en texto sin formato creadas para cada director de servicio.New-TestAppReg crea un objeto de registro de aplicación con el propósito explícito de realizar pruebas de validación de abuso.New-TestSP crea una nueva entidad de servicio y la asocia con la aplicación creada por la función anterior.Remove-AbuseTestAzureRMRoles es una función de limpieza para eliminar roles de administrador de AzureRM creados durante las pruebas.Remove-AbuseTestServicePrincipals limpia las pruebas de abuso eliminando los principios de servicio que se crearon durante las pruebas.Test-AzureRMAddSelfToAzureRMRole se usa en pruebas de validación de abuso para determinar si una entidad de servicio con ciertos derechos puede otorgarse a sí misma la función de administrador de acceso de usuario a través de una suscripción.Test-AzureRMCreateFunction se usa en pruebas de validación de abuso para probar si una entidad de servicio puede agregar una nueva función a una aplicación de funciones existente.Test-AzureRMPublishAutomationAccountRunBook se usa para probar si una entidad de servicio puede publicar un nuevo runbook en una cuenta de automatización existente.Test-AzureRMVMRunCommand se usa para probar si una entidad principal puede ejecutar un comando en una máquina virtual existente.Test-MGAddMemberToNonRoleEligibleGroup se usa para probar si la entidad de servicio puede agregarse a un grupo elegible que no sea de función.Test-MGAddMemberToRoleEligibleGroup se usa para probar si la entidad de servicio puede agregarse a un grupo elegible para roles.Test-MGAddOwnerToNonRoleEligibleGroup se usa para probar si una entidad de servicio puede otorgarse a sí misma propiedad explícita de un grupo elegible que no sea de rol.Test-MGAddOwnerToRoleEligibleGroup se usa para probar si una entidad de servicio puede otorgarse a sí misma la propiedad explícita de un grupo elegible para roles.Test-MGAddRootCACert se usa para probar si una entidad de servicio puede agregar un nuevo certificado de CA raíz al inquilino.Test-MGAddSecretToApp se usa para probar si la entidad de servicio puede agregar un nuevo secreto a una aplicación existente.Test-MGAddSecretToSP se usa para probar si la entidad de servicio puede agregar un nuevo secreto a una entidad de servicio existente.Test-MGAddSelfAsOwnerOfApp se utiliza en pruebas de validación de abuso para determinar si una entidad de servicio con un privilegio particular puede otorgarse a sí misma la propiedad de una aplicación Entra existente.Test-MGAddSelfAsOwnerOfSP se utiliza en pruebas de validación de abuso para determinar si una entidad de servicio con un privilegio particular puede otorgarse la propiedad de una entidad de servicio de Entra existente.Test-MGAddSelfToEntraRole se utiliza en pruebas de validación de abuso para determinar si una entidad de servicio con un privilegio particular puede agregarse a una función de administrador de Entra (administrador global, por ejemplo).Test-MGAddSelfToMGAppRole se usa en pruebas de validación de abuso para determinar si una entidad de servicio con un privilegio particular puede otorgarse a sí misma una función particular de la aplicación MS Graph sin el consentimiento del administrador.