
Examina dumps de domínios Azure exportados em busca de senhas em texto claro, strings de conexão, chaves de armazenamento e outros segredos; gera relatórios CSV/HTML redigidos para fluxos de trabalho de auditoria somente leitura.
Um scanner PowerShell que vasculha a saída de Get-AzDomainInfo do MicroBurst em busca de senhas em texto puro, chaves, strings de conexão e outros segredos que nunca deveriam ficar sem criptografia em um ambiente Azure.
Projetado para fluxos de trabalho de auditoria somente leitura: você coleta um dump de domínio com o MicroBurst (acesso de Leitor é suficiente para Get-AzDomainInfo) e aponta esta ferramenta para a pasta de saída. Ele não toca no próprio Azure — apenas lê os arquivos que você já exportou. Os valores de segredos são mascarados em todos os relatórios, portanto a saída é segura para anexar a achados.
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
Ou importe o módulo e use o cmdlet diretamente:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
Os relatórios são gravados em uma pasta com registro de data/hora (MBSecretScan-<timestamp>) no diretório atual, a menos que você informe -OutputDirectory.
Por padrão, todos os valores são mascarados para que os relatórios possam ser compartilhados com segurança. Os caracteres revelados são limitados a um quarto do comprimento do valor (máximo de 4 iniciais + 2 finais), e qualquer coisa com 8 caracteres ou menos é substituída por uma máscara de largura fixa — assim, uma senha típica aparece como ********, enquanto uma chave de armazenamento de 88 caracteres permanece identificável como AAAA**********AA. As strings de contexto são mascaradas antes de serem truncadas, e todo segredo encontrado em uma linha é mascarado no contexto de todos os achados daquela linha, de modo que nenhum texto puro sobrevive em um relatório. Ao triar falsos positivos, muitas vezes é mais rápido ver o valor completo — use -ShowSecrets para emitir valores sem mascaramento em todos os lugares (console, CSV, HTML). O console e o HTML passam a exibir um aviso claro, e os relatórios devem ser tratados como material de credencial vivo:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Funciona no Windows PowerShell 5.1 e no PowerShell 7+ (Windows, Linux, macOS).
Cada execução produz três coisas:
| Saída | Descrição |
|---|---|
| Resumo no console | Contagens codificadas por cores por severidade/categoria, além dos principais achados Críticos/Altos. |
findings.csv | Uma linha por achado (severidade, regra, arquivo, linha, valor mascarado, contexto) para triagem no Excel. Campos com conteúdo varrido são escapados contra injeção de fórmulas em planilhas. |
report.html | Relatório HTML autocontido (sem ativos externos) com cartões de severidade, filtro de texto dinâmico e alternância de severidade — compartilhável com o cliente. |
O cmdlet também envia objetos de achado para o pipeline, permitindo pós-processamento:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
| Regra | Severidade | Exemplo de origem em um dump |
|---|---|---|
| String de conexão SQL/BD com senha incorporada | Crítica | Configurações de App Service, exportações de web.config |
| String de conexão de conta de armazenamento do Azure / chave de 88 caracteres | Crítica | Configurações de aplicativo, exportações de Storage |
SharedAccessKey do Service Bus / Event Hub | Crítica | Configurações de recursos de mensageria |
| Chave de conta do Cosmos DB | Crítica | Configurações de aplicativo |
| Bloco de chave privada PEM | Crítica | Exportações de Key Vault / certificados |
| Senha do Azure Redis Cache | Alta | Strings de conexão do cache |
Segredo de cliente do Azure AD (formato pós-2021 …Q~…) | Alta | Modelos ARM, configurações de aplicativo |
Token SAS / parâmetro sig= | Alta | URLs SAS de armazenamento |
| JWT / token de portador | Alta | Tokens em cache, configurações |
Arquivo de certificado/chave presente (.pfx, .pem, .key, …) | Alta | Em qualquer lugar do dump |
Atribuição genérica de password / pwd | Alta | Variáveis de automação, configurações de aplicativo, parâmetros ARM |
Atribuição genérica de secret / client_secret | Alta | Configurações de aplicativo, modelos |
| Chave de acesso AWS / tokens GitHub / Slack | Alta/Média | Credenciais estrangeiras armazenadas em aplicativos Azure |
Atribuição genérica de api_key / access_key / connectionstring | Média | Configurações de aplicativo |
| String de alta entropia (heurística) | Baixa | Rede de segurança para formatos desconhecidos de chave — opt-in via -IncludeEntropy |
O conjunto de regras completo e editável está em Private/Get-MBSignature.ps1. Cada regra é um [PSCustomObject] com os seguintes campos:
| Campo | Obrigatório | Finalidade |
|---|---|---|
Id, Name, Category, Severity | sim | Identidade e como o achado é relatado e ordenado. |
Pattern | sim | A regex. Compilada uma vez por varredura. |
ValueGroup | sim | Qual grupo de captura contém o segredo (0 = correspondência inteira). Direciona o mascaramento. |
MultiLine | não | Avaliar contra o texto do arquivo inteiro em vez de linha por linha (blocos PEM). Cada correspondência é relatada, não apenas a primeira. |
CaseSensitive | não | Opte por não usar a compilação padrão IgnoreCase. Defina isso para formatos definidos com distinção de maiúsculas/minúsculas (AKIA, ghp_, eyJ, Q~) — sem isso, semelhantes em maiúsculas/minúsculas arbitrárias são correspondidos. |
Redact | não | Defina $false quando o valor capturado for um rótulo em vez de um segredo (uma linha de cabeçalho PEM, um nome de arquivo de certificado) para que apareça literalmente em vez de mascarado até ficar ilegível. O padrão é mascarar. |
Get-AzDomainInfo exporta variáveis de conta de automação e configurações de aplicativo como linhas Name,Value[,Encrypted]. O segredo está na coluna Value, enquanto a palavra-chave que o identifica (por exemplo, ServiceAccountPwd, dbConnectionString) está na coluna Name — portanto, uma regex simples nunca os vê na mesma "linha" e a palavra-chave fica enterrada dentro de um token composto sem limite de palavra.
Para arquivos .csv / .tsv, o scanner também faz emparelhamento estruturado de colunas (Private/Get-MBCsvFinding.ps1):
Encrypted=True são ignoradas (o valor não é texto puro).Password ou StorageKey), toda célula não-placeholder é relatada.Valores que uma regra de alta confiança já cobre (strings de conexão, chaves de armazenamento, SAS) são adiados para a passagem de linha bruta para um mascaramento mais rigoroso, e os achados são deduplicados por categoria para que o mesmo segredo nunca seja relatado duas vezes. Se um arquivo não puder ser analisado como CSV, o scanner volta automaticamente para a varredura normal de linha bruta.
-ScanValues)O emparelhamento acima usa como chave o nome de uma configuração. Para também capturar segredos armazenados sob um nome sem significado (por exemplo, Config1 = P@ssw0rd2026!), use -ScanValues. Ele inspeciona o conteúdo das células de valor com duas heurísticas conservadoras de severidade Baixa: