
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 examina 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: recopilas un volcado de dominio con MicroBurst (el acceso de Lector es suficiente para Get-AzDomainInfo) y luego apuntas esta herramienta a la carpeta de salida. No toca Azure en sí; solo lee los archivos que ya exportaste. Los valores de secretos están redactados en todos los informes, por lo que la salida se puede adjuntar de forma segura 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 pases -OutputDirectory.
De forma predeterminada, cada valor está redactado, por lo que los informes son seguros de compartir. Los caracteres revelados se limitan a una cuarta parte de la longitud del valor (máximo 4 iniciales + 2 finales), y cualquier valor de 8 caracteres o menos se reemplaza con una máscara de ancho fijo — así 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 del contexto de todos los hallazgos en esa línea, por lo que ningún texto plano sobrevive en un informe. Al revisar falsos positivos, suele ser más rápido ver el valor completo: pasa -ShowSecrets para emitir valores sin redactar en todos los lados (consola, CSV, HTML). La consola y el HTML muestran entonces un banner de advertencia claro, y los informes deben tratarse como material de credenciales vivo:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Funciona en Windows PowerShell 5.1 y PowerShell 7+ (Windows, Linux, macOS).
Cada ejecución produce tres cosas:
| Salida | Descripción |
|---|---|
| Resumen de consola | Conteos codificados por color según severidad/categoría, más los hallazgos Critical/High principales. |
findings.csv | Una fila por hallazgo (severidad, regla, archivo, línea, valor redactado, contexto) para revisar en Excel. Los campos con contenido escaneado se escapan contra la inyección de fórmulas en hojas de cálculo. |
report.html | Informe HTML autocontenido (sin recursos externos) con tarjetas de severidad, filtro de texto en vivo y alternadores de severidad; se puede compartir con el cliente. |
El cmdlet también emite objetos de hallazgo a la canalización, por lo que puedes posprocesar:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
| Regla | Severidad | Ejemplo de origen en un volcado |
|---|---|---|
| Cadena de conexión SQL/BD con contraseña incrustada | Critical | Configuración de App Service, exportaciones de web.config |
| Cadena de conexión de cuenta de Azure Storage / clave de 88 caracteres | Critical | Configuración de aplicaciones, exportaciones de Storage |
SharedAccessKey de Service Bus / Event Hub | Critical | Configuraciones de recursos de mensajería |
| Clave de cuenta de Cosmos DB | Critical | Configuración de aplicaciones |
| Bloque de clave privada PEM | Critical | Exportaciones de Key Vault / certificados |
| Contraseña de Azure Redis Cache | High | Cadenas de conexión de caché |
Secreto de cliente de Azure AD (formato posterior a 2021 …Q~…) | High | Plantillas ARM, configuración de aplicaciones |
Token SAS / parámetro sig= | High | URL SAS de Storage |
| Token JWT / bearer | High | Tokens en caché, configuraciones |
Archivo de certificado / clave presente (.pfx, .pem, .key, …) | High | En cualquier lugar del volcado |
Asignación genérica de password / pwd | High | Variables de automatización, configuración de aplicaciones, parámetros ARM |
Asignación genérica de secret / client_secret | High | Configuración de aplicaciones, plantillas |
| Clave de acceso AWS / tokens de GitHub / Slack | High/Med | Credenciales externas almacenadas en aplicaciones de Azure |
api_key / access_key / connectionstring genéricos | Medium | Configuración de aplicaciones |
| Cadena de alta entropía (heurística) | Low | Red de seguridad para formatos de clave desconocidos — opt-in mediante -IncludeEntropy |
El conjunto de reglas completo y editable se encuentra en Private/Get-MBSignature.ps1. Cada regla es un [PSCustomObject] con estos campos:
| Campo | Requerido | Propósito |
|---|---|---|
Id, Name, Category, Severity | sí | Identidad y cómo se notifica y ordena el hallazgo. |
Pattern | sí | La expresión regular. Se compila una vez por escaneo. |
ValueGroup | sí | Qué grupo de captura contiene el secreto (0 = coincidencia completa). Impulsa la redacción. |
MultiLine | no | Evalúa contra el texto completo del archivo en lugar de línea por línea (bloques PEM). Se notifica cada coincidencia, no solo la primera. |
CaseSensitive | no | Opta por no usar la compilación IgnoreCase predeterminada. Establécelo para formatos definidos con distinción de mayúsculas y minúsculas (AKIA, ghp_, eyJ, Q~); sin ello, coinciden imitaciones con mayúsculas arbitrarias. |
Redact | no | Establece $false cuando el valor capturado es una etiqueta en lugar de un secreto (una línea de cabecera PEM, un nombre de archivo de certificado) para que aparezca textual en lugar de enmascarado hasta quedar ilegible. El valor predeterminado es redactar. |
Get-AzDomainInfo exporta las variables de cuentas de automatización y la configuración de aplicaciones como filas Name,Value[,Encrypted]. El secreto vive en la columna Value, mientras que la palabra clave que lo identifica (p. ej. ServiceAccountPwd, dbConnectionString) vive en la columna Name; por lo tanto, una expresión regular simple nunca los ve en la misma "línea" y la palabra clave queda enterrada dentro de un token compuesto sin límite de palabra.
Para archivos .csv / .tsv, el escáner además realiza un emparejamiento estructurado de columnas (Private/Get-MBCsvFinding.ps1):
Encrypted=True se omiten (el valor no es texto plano).Password o StorageKey), se notifica cada celda que no sea un marcador de posición.Los valores que ya cubre una regla de alta confianza (cadenas de conexión, claves de almacenamiento, SAS) se difieren al paso de línea sin procesar para una redacción más estricta, y los hallazgos se deduplican por categoría para que el mismo secreto nunca se notifique dos veces. Si un archivo no se puede analizar como CSV, el escáner recurre automáticamente al escaneo normal de líneas sin procesar.
-ScanValues)El emparejamiento anterior se basa en el nombre de una configuración. Para detectar también secretos almacenados bajo un nombre sin significado (p. ej. Config1 = P@ssw0rd2026!), pasa -ScanValues. Inspecciona el contenido de las celdas de valor con dos heurísticas conservadoras de severidad Low: