# 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)