
Escanea volcados de dominio de Azure exportados en busca de contraseñas en texto plano, cadenas de conexión, claves de almacenamiento y otros secretos; genera informes CSV/HTML redactados para flujos de trabajo de auditoría de solo lectura.
Un escáner de PowerShell que recorre la salida de Get-AzDomainInfo de MicroBurst en busca de contraseñas en texto plano, claves, cadenas de conexión y otros secretos que nunca deberían permanecer sin cifrar en un entorno de Azure.
Diseñado para flujos de trabajo de auditoría de solo lectura: se recopila un volcado de dominio con MicroBurst (el acceso de Reader es suficiente para Get-AzDomainInfo) y luego se apunta esta herramienta a la carpeta de salida. No interactúa con Azure en sí — solo lee los archivos que ya se han exportado. Los valores de los secretos se redactan en todos los informes, por lo que la salida es segura para adjuntar a los hallazgos.
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
O importa el módulo y usa el cmdlet directamente:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
Los informes se escriben en una carpeta con marca de tiempo (MBSecretScan-<timestamp>) en el directorio actual, a menos que se pase -OutputDirectory.
De forma predeterminada, todos los valores están redactados para que los informes sean seguros de compartir. Los caracteres revelados se limitan a un cuarto de la longitud del valor (con un máximo de 4 iniciales + 2 finales), y cualquier valor de 8 caracteres o menos se sustituye por una máscara de ancho fijo, de modo que una contraseña típica se muestra como ********, mientras que una clave de almacenamiento de 88 caracteres sigue siendo identificable como AAAA**********AA. Las cadenas de contexto se redactan antes de truncarse, y cada secreto encontrado en una línea se redacta en el contexto de cada hallazgo de esa línea, de modo que no sobrevive ningún texto plano en un informe. Al triar falsos positivos, a menudo es más rápido ver el valor completo: pase -ShowSecrets para emitir valores sin redactar en todas partes (consola, CSV, HTML, JSON, SARIF). La consola y el HTML muestran entonces un banner de advertencia claro, y los informes deben tratarse como material de credenciales activas:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Funciona en PowerShell 7+ (Windows, Linux, macOS).
Cada ejecución produce:
| Salida | Descripción |
|---|---|
| Resumen en consola | Recuentos codificados por colores según severidad/categoría, además de los principales hallazgos Críticos/Altos. |
findings.csv | Una fila por hallazgo (severidad, regla, archivo, línea, valor redactado, contexto) para su triaje en Excel. Los campos que contienen contenido escaneado se escapan contra la inyección de fórmulas en hojas de cálculo. |
report.html | Informe HTML autocontenido (sin recursos externos, restringido por una Content-Security-Policy) con tarjetas de severidad, filtro de texto en vivo y conmutadores de severidad — compartible con el cliente. |
findings.json | Metadatos del escaneo más cada hallazgo, para scripting y herramientas (-NoJson para omitirlo). |
findings.sarif | Registro SARIF 2.1.0 opcional para herramientas de escaneo de código (-Sarif). |
Cada carpeta de salida también recibe un pequeño archivo marcador .mbsecretscan-output para que un escaneo posterior cuya raíz lo contenga lo omita (véase Límites de cobertura).
El cmdlet también emite objetos de hallazgo a la canalización, para que puedas posprocesarlos:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
| Regla | Gravedad | Ejemplo de origen en un volcado |
|---|---|---|
| Cadena de conexión SQL/DB con contraseña incrustada | Crítica | Configuración de App Service, exportaciones de web.config |
| Cadena de conexión de cuenta de Azure Storage / clave de 88 caracteres | Crítica | Configuración de aplicaciones, exportaciones de Storage |
SharedAccessKey de Service Bus / Event Hub | Crítica | Configuraciones de recursos de mensajería |
| Clave de cuenta de Cosmos DB | Crítica | Configuración de aplicaciones |
| Bloque de clave privada PEM | Crítica | Exportaciones de Key Vault / certificados |
Clave de Azure Function (?code= en una URL de Function / Logic App, x-functions-key) | Alta | Definiciones de Logic App, configuración de aplicaciones |
Valor de parámetro ARM ("adminPassword": { "value": "..." }, incluso con formato embellecido en varias líneas) | Alta | Plantillas ARM / archivos de parámetros |
| Contraseña de Azure Redis Cache | Alta | Cadenas de conexión de caché |
Secreto de cliente de Azure AD (formato …Q~… posterior a 2021) | Alta | Plantillas ARM, configuración de aplicaciones |
Token SAS / parámetro sig= | Alta | URL SAS de Storage |
| Token JWT / bearer | Alta | Tokens en caché, configuraciones |
Archivo de certificado / clave presente (.pfx, .p12, .pem, .key, .jks, .ppk, …) | Alta | En cualquier parte del volcado |
Archivo de certificado presente (.cer, .crt, .der — normalmente público) | Baja | En cualquier parte del volcado |
Asignación genérica de password / pwd, incluidos nombres compuestos (administratorLoginPassword, userPWD) | Alta | Variables de Automation, configuración de aplicaciones, parámetros ARM, perfiles de publicación |
Asignación genérica de secret / client_secret, incluidos nombres compuestos (servicePrincipalSecret) | Alta | Configuración de aplicaciones, plantillas |
| Claves de acceso de AWS / tokens de GitHub / Slack | Alta/Media | Credenciales externas almacenadas en aplicaciones de Azure |
api_key / access_key / connectionstring genéricos | Media | Configuración de aplicaciones |
| Cadena de alta entropía (heurística) | Baja | Red de seguridad para formatos de clave desconocidos — opcional mediante -IncludeEntropy |
Las reglas genéricas de palabras clave coinciden con la palabra clave al final de un nombre compuesto
(sqlAdminPassword, servicePrincipalSecret, storageAccountKey), por lo que
los campos de metadatos que simplemente comienzan con una (passwordLastSet, secretName)
permanecen silenciosos. Un valor genérico se detiene antes de un espacio en blanco seguido de otro
key=/key:, por lo que password=abc apikey=xyz produce dos hallazgos limpios, mientras que una
frase de contraseña que contiene espacios se captura completa.
Un hallazgo por secreto. Cuando varias reglas coinciden con el mismo valor en la
misma línea (una cadena de conexión de Storage y la clave desnuda de 88 caracteres; una cadena de
conexión SQL y la regla genérica de contraseña), solo se conserva la coincidencia de mayor gravedad.
En caso de empate, una regla específica de formato (AZ_AAD_CLIENT_SECRET) prevalece
sobre una basada en palabras clave (GENERIC_*, ARM_PARAM_*, CSV_*).
El conjunto completo y editable de reglas se encuentra en Private/Get-MBSignature.ps1. Cada regla
es un [PSCustomObject] con estos campos: