# Hunting - Abuso de PowerShell e Execução de Scripts > [!critical] Técnica Mais Abusada do ATT&CK > PowerShell ([[t1059-001-powershell|T1059.001]]) é utilizado por mais de 110 grupos de ameaça catalogados no MITRE ATT&CK, tornando-se a técnica de execução mais prevalente em incidentes reais. Este playbook cobre hipóteses de hunting para detectar abuso de PowerShell em ambientes corporativos. ## Visão Geral O [[t1059-001-powershell|PowerShell]] é simultaneamente uma das ferramentas administrativas mais poderosas do ecossistema Windows e o vetor de execução preferido por adversários. Sua capacidade de executar código diretamente na memória, baixar payloads remotos e interagir com APIs do sistema operacional o torna ideal para todas as fases de um ataque - desde o acesso inicial até a exfiltração. A detecção de abuso de PowerShell é desafiadora porque organizações legítimas dependem fortemente dele para automação. O objetivo deste playbook não é bloquear PowerShell, mas identificar padrões de uso anômalos que indicam atividade adversária: comandos codificados em Base64, download cradles, execução sem perfil (`-nop`), janela oculta (`-w hidden`), e árvores de processo incomuns. **Contexto LATAM/Brasil:** Banking trojans brasileiros como [[grandoreiro]] e [[mekotio]] utilizam PowerShell extensivamente para download de segundo estágio, bypass de segurança e persistência. Campanhas de phishing direcionadas ao setor financeiro brasileiro frequentemente começam com documentos Office que invocam PowerShell via macro VBA. > [!latam] Impacto Regional > No Brasil, PowerShell é o vetor preferido de banking trojans da família **Grandoreiro/Mekotio/Casbaneiro**. Campanhas recentes usam OneNote e PDF com links para scripts .ps1 hospedados em servidores comprometidos no Brasil. SOCs brasileiros devem priorizar monitoramento de PowerShell como indicador primário de comprometimento. --- ## Hipóteses de Hunting | # | Hipótese | Indicador | Confiança | |---|----------|-----------|-----------| | H1 | Adversários usam comandos codificados em Base64 para evadir detecção | `-EncodedCommand`, `-enc`, `-e` nos argumentos | Alta | | H2 | Download cradles baixam payloads de segundo estágio | `IEX`, `Invoke-Expression`, `Net.WebClient`, `DownloadString` | Alta | | H3 | Execução com flags de evasão indica automação maliciosa | `-nop -w hidden -ep bypass` combinados | Média-Alta | | H4 | Processos PowerShell filhos de aplicações Office indicam macro maliciosa | `winword.exe` > `powershell.exe` | Alta | | H5 | PowerShell sem interação do usuário indica automação C2 | Sessões sem console, sem perfil, duração curta | Média | --- ## Fluxo de Hunting ```mermaid graph TB H["Hipótese:<br/>Abuso de PowerShell"] --> D1["Coletar Logs<br/>Process + Script Block"] D1 --> A1["Filtrar Comandos<br/>Codificados (Base64)"] D1 --> A2["Filtrar Download<br/>Cradles (IEX/WebClient)"] A1 --> E1["Decodificar e<br/>Analisar Payload"] A2 --> E2["Verificar URLs<br/>e Reputação"] E1 --> V{"Malicioso?"} E2 --> V V -->|Sim| R["Escalar para<br/>Resposta a Incidentes"] V -->|Não| T["Documentar como<br/>Baseline Legítimo"] ``` **Legenda:** [[t1059-001-powershell|T1059.001]] - [[t1027-obfuscated-files-or-information|T1027]] - [[t1140-deobfuscatedecode-files-or-information|T1140]] --- ## Fase 1 - Detecção > [!warning] Aviso sobre as queries abaixo > As queries são exemplos e pontos de partida. Devem ser adaptadas ao schema e fontes de dados do seu ambiente. Tuning contínuo é necessário para reduzir falsos positivos. Ferramentas legítimas como SCCM, Intune e scripts de GPO podem gerar falsos positivos. ### H1 - Comandos Codificados em Base64 #### Microsoft Sentinel (KQL) ```kql // Detectar PowerShell com comandos codificados em Base64 DeviceProcessEvents | where FileName in~ ("powershell.exe", "pwsh.exe") | where ProcessCommandLine matches regex @"(?i)\s-(e|enc|encodedcommand)\s" | project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine | extend DecodedCommand = base64_decode_tostring( extract(@"(?i)-(e|enc|encodedcommand)\s+([A-Za-z0-9+/=]+)", 2, ProcessCommandLine)) | where isnotempty(DecodedCommand) | order by Timestamp desc ``` Tabela(s): `DeviceProcessEvents` (Microsoft Defender for Endpoint) #### Splunk SPL ```spl index=sysmon EventCode=1 (Image="*\\powershell.exe" OR Image="*\\pwsh.exe") (CommandLine="*-enc*" OR CommandLine="*-EncodedCommand*" OR CommandLine="*-e *") | eval decoded=base64decode(mvindex(split(CommandLine, " "), -1)) | table _time, Computer, User, CommandLine, decoded, ParentImage | sort - _time ``` Fonte de dados: Sysmon Event ID 1 (Process Creation), [[ds0009-process|DS0009 - Process]] ### H2 - Download Cradles #### Microsoft Sentinel (KQL) ```kql // Detectar download cradles via PowerShell DeviceProcessEvents | where FileName in~ ("powershell.exe", "pwsh.exe") | where ProcessCommandLine has_any ( "IEX", "Invoke-Expression", "DownloadString", "DownloadFile", "Net.WebClient", "WebRequest", "Invoke-WebRequest", "iwr", "Start-BitsTransfer", "curl", "wget") | where ProcessCommandLine !has "WindowsUpdate" // Excluir updates legítimos | project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName | order by Timestamp desc ``` #### Splunk SPL ```spl index=sysmon EventCode=1 (Image="*\\powershell.exe" OR Image="*\\pwsh.exe") (CommandLine="*IEX*" OR CommandLine="*Invoke-Expression*" OR CommandLine="*DownloadString*" OR CommandLine="*Net.WebClient*" OR CommandLine="*Invoke-WebRequest*" OR CommandLine="*DownloadFile*") | table _time, Computer, User, CommandLine, ParentImage, ParentCommandLine | sort - _time ``` ### H3 - Flags de Evasão Combinadas #### Microsoft Sentinel (KQL) ```kql // PowerShell com múltiplas flags de evasão DeviceProcessEvents | where FileName in~ ("powershell.exe", "pwsh.exe") | extend HasNoProfile = ProcessCommandLine matches regex @"(?i)-nop(rofile)?" | extend HasHidden = ProcessCommandLine matches regex @"(?i)-w(indowstyle)?\s+hidden" | extend HasBypass = ProcessCommandLine matches regex @"(?i)-ep\s+bypass|-executionpolicy\s+bypass" | extend HasNonInteractive = ProcessCommandLine has "-NonInteractive" | extend EvasionScore = toint(HasNoProfile) + toint(HasHidden) + toint(HasBypass) + toint(HasNonInteractive) | where EvasionScore >= 2 | project Timestamp, DeviceName, AccountName, ProcessCommandLine, EvasionScore, InitiatingProcessFileName | order by EvasionScore desc, Timestamp desc ``` ### H4 - PowerShell Filho de Aplicações Office #### Microsoft Sentinel (KQL) ```kql // Macro maliciosa: Office spawna PowerShell DeviceProcessEvents | where FileName in~ ("powershell.exe", "pwsh.exe") | where InitiatingProcessFileName in~ ( "winword.exe", "excel.exe", "powerpnt.exe", "outlook.exe", "mspub.exe", "onenote.exe") | project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine | order by Timestamp desc ``` #### Splunk SPL ```spl index=sysmon EventCode=1 (Image="*\\powershell.exe" OR Image="*\\pwsh.exe") (ParentImage="*\\WINWORD.EXE" OR ParentImage="*\\EXCEL.EXE" OR ParentImage="*\\OUTLOOK.EXE" OR ParentImage="*\\POWERPNT.EXE") | table _time, Computer, User, CommandLine, ParentImage | sort - _time ``` --- ## Fase 2 - Triagem e Investigação ### Perguntas-chave a responder - [ ] O comando codificado contém download de payload externo? - [ ] A URL de destino já aparece em feeds de IOC ([[urlhaus|URLhaus]], [[threatfox|ThreatFox]])? - [ ] O processo pai é legítimo para o contexto do usuário? - [ ] Há outros hosts executando comandos similares (indicando campanha)? - [ ] O usuário tem histórico de uso legítimo de PowerShell? ### Queries de investigação - Timeline do host ```kql // Timeline completa de PowerShell em um host suspeito let targetDevice = "HOSTNAME_AQUI"; DeviceProcessEvents | where DeviceName == targetDevice | where FileName in~ ("powershell.exe", "pwsh.exe") or InitiatingProcessFileName in~ ("powershell.exe", "pwsh.exe") | project Timestamp, FileName, ProcessCommandLine, InitiatingProcessFileName, AccountName | order by Timestamp asc ``` ### Script Block Logging - Decodificação ```kql // Script Block Logging captura o código decodificado DeviceEvents | where ActionType == "PowerShellCommand" | where AdditionalFields has_any ("IEX", "Invoke-Expression", "Net.WebClient") | project Timestamp, DeviceName, AdditionalFields | order by Timestamp desc ``` --- ## Fase 3 - Contenção > [!danger] Ação com Impacto Potencial > Bloquear PowerShell pode impactar ferramentas administrativas legítimas (SCCM, Intune, GPO scripts). Confirmar autorização com o gerente de incidentes antes de executar. ### Contenção imediata (primeiros 30 min) - [ ] Isolar host afetado via EDR (network containment) - [ ] Bloquear URLs/IPs de C2 identificados no proxy/firewall - [ ] Revogar credenciais do usuário comprometido - [ ] Coletar evidências forenses (memória + disco) antes de remediar ### Contenção de longo prazo - [ ] Aplicar [[m1038-execution-prevention|M1038 - Execution Prevention]] via AppLocker/WDAC - [ ] Habilitar Constrained Language Mode para PowerShell - [ ] Implementar [[m1045-code-signing|M1045 - Code Signing]] para scripts .ps1 - [ ] Garantir que Script Block Logging está habilitado em todos os endpoints --- ## Fase 4 - Erradicação - [ ] Remover scripts maliciosos identificados nos hosts - [ ] Verificar tarefas agendadas criadas por PowerShell ([[t1053-005-scheduled-task|T1053.005]]) - [ ] Verificar persistência em registry ([[t1547-001-registry-run-keys|T1547.001]]) - [ ] Resetar credenciais de todas as contas que executaram comandos suspeitos - [ ] Remover payloads baixados e artefatos temporários --- ## Fase 5 - Recuperação - [ ] Restaurar sistemas comprometidos a partir de backup limpo - [ ] Validar integridade dos sistemas antes de recolocar em produção - [ ] Monitorar intensivamente por 72h com foco em PowerShell e [[t1059-003-windows-command-shell|cmd.exe]] - [ ] Documentar todos os IOCs encontrados e compartilhar com a comunidade --- ## Automação SOAR ### Microsoft Sentinel Automation Rules Criar Analytic Rule para acionar automaticamente: 1. Detectar `-EncodedCommand` com score de evasão >= 2 2. Enriquecer IOCs (URLs, hashes) via TI feeds 3. Criar incidente com severidade baseada no score 4. Auto-isolar host se score >= 3 e processo pai é Office ### Splunk SOAR Playbook recomendado: `PowerShell Abuse Investigation` 1. Trigger: alerta de Sysmon Event ID 1 com flags de evasão 2. Ação: decodificar Base64, extrair URLs, consultar VirusTotal 3. Decisão: se malicioso, isolar endpoint via CrowdStrike API ### Palo Alto Cortex XSOAR Playbook: `Powershell Script Analysis` 1. Extrair e decodificar comando 2. Executar em sandbox (se aplicável) 3. Consultar reputação de URLs/hashes 4. Criar ticket e notificar analista --- ## Data Sources Requeridas | Data Source | Evento | Prioridade | |-------------|--------|-----------| | [[ds0009-process\|DS0009 - Process]] | Process Creation (Sysmon 1) | Crítica | | [[ds0017-command\|DS0017 - Command]] | Script Block Logging (Event ID 4104) | Crítica | | [[ds0012-script\|DS0012 - Script]] | Script Execution (Event ID 4103) | Alta | | Module Logging | PowerShell Module (Event ID 4103) | Média | | Transcription | PowerShell Transcription Logs | Média | --- ## Lições Aprendidas > [!note] Preencher após execução real > - O que funcionou conforme esperado? > - O que falhou ou precisou de adaptação? > - Quais regras de detecção geraram falsos positivos? > - O que deve ser ajustado neste playbook? --- ## Notas Relacionadas - [[t1059-001-powershell|T1059.001 - PowerShell]] - Técnica principal - [[t1027-obfuscated-files-or-information|T1027 - Obfuscated Files or Information]] - Ofuscação - [[t1140-deobfuscatedecode-files-or-information|T1140 - Deobfuscate/Decode]] - Decodificação - [[grandoreiro]] - Banking trojan brasileiro que abusa de PowerShell - [[mekotio]] - Banking trojan LATAM com PowerShell loader - [[cobalt-strike]] - Framework C2 com módulo PowerShell - [[mimikatz]] - Frequentemente executado via PowerShell - [[m1038-execution-prevention|M1038 - Execution Prevention]] - Mitigação primária - [[m1045-code-signing|M1045 - Code Signing]] - Mitigação complementar - [[ds0009-process|DS0009 - Process]] - Data source principal - [[hunting-credential-dumping]] - Playbook relacionado (pós-execução)