Os logs do PowerShell Script Block vivem em Logs de Aplicativos e Serviços → Microsoft → Windows → PowerShell → Operacional, como evento 4104. Eles são completos apenas se o log de bloco de script estiver ativado. Para exportá-los:
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logspowershell.evtx
O PowerShell 7 é um produto separado com um canal separado, PowerShellCore/Operational, e sua própria política de configuração.
Se um invasor acessou uma caixa do Windows, há grandes chances de que o PowerShell tenha sido usado. A gravação de blocos de script registra o código que realmente foi executado, frequentemente após as camadas de ofuscação terem sido removidas. A Prime Core tem 663 regras de detecção para logs do PowerShell, mapeadas para 417 técnicas do MITRE ATT&CK. Elas cobrem o uso malicioso do PowerShell (T1059.001), ofuscação (T1027) e berços de download que trazem ferramentas (T1105).
Antes de começar
O log de bloco de script está ativado?
reg query "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging"
EnableScriptBlockLogging definido para 0x1 significa sim. Se a chave não existir, está desativado. Mesmo assim, o Windows PowerShell 5.1 ainda registra blocos de script que considera suspeitos, como eventos 4104 em nível de Aviso. Portanto, você pode encontrar alguns eventos. Apenas não os confunda com o quadro completo.
Ativá-lo ajuda a partir de agora, não para o que já aconteceu. Use a configuração de Política de Grupo Modelos Administrativos → Componentes do Windows → Windows PowerShell → Ativar Log de Bloco de Script do PowerShell, ou defina o valor do registro diretamente:
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
O PowerShell 7 lê sua própria chave de política sob HKLMSOFTWAREPoliciesMicrosoftPowerShellCore. Se foi instalado a partir de um zip em vez do MSI, seu canal de eventos pode não estar registrado até você executar RegisterManifest.ps1 do $PSHOME.
Espere volume. Todo script e módulo que é executado acaba no log. Aumente o tamanho máximo do canal ou você manterá apenas algumas horas.
Espere segredos. Scripts de administrador às vezes carregam senhas e chaves de API em texto plano, e o log de bloco de script os registra fielmente. Tenha isso em mente antes de esse arquivo ir para qualquer lugar e leia a seção LogTotal abaixo.
Exporte os logs
No Visualizador de Eventos, clique com o botão direito Operacional sob PowerShell e escolha Salvar Todos os Eventos Como… A partir da linha de comando:
:: apenas blocos de script
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logsps_4104.evtx /q:"*[System[(EventID=4104)]]"
:: PowerShell 7
wevtutil epl "PowerShellCore/Operational" C:logspwsh.evtx
:: o clássico log do "Windows PowerShell": eventos de início do motor com a linha de comando do host
wevtutil epl "Windows PowerShell" C:logswindows_powershell.evtx
Esse último é fácil de esquecer e vale a pena pegar. O evento 400 registra cada início do motor, incluindo a versão do motor. Uma EngineVersion de 2.0 em um sistema moderno geralmente significa que alguém deliberadamente fez downgrade para evitar o log de bloco de script.
Envie e revise no LogTotal
LogTotal lê EVTX nativamente. Uma coisa a saber antes: LogTotal ainda não sanitiza arquivos EVTX. Com logs de PowerShell, isso importa mais do que o usual, por causa dos segredos mencionados acima. Use uploads EVTX livremente para máquinas de teste. Para hosts de produção, obtenha um sim de quem possuir a manipulação de dados primeiro.
- Envie. Abra logtotal.com e solte o arquivo.
- Reveja.
Quando dá errado
| Sintoma | Causa provável | Fix |
|---|---|---|
| Nenhum evento 4104 | O log de bloco de script está desativado, e nada pareceu suspeito | Ative-o para o futuro; verifique o log do Windows PowerShell para o que você ainda pode obter |
| Apenas um punhado de eventos 4104, todos Aviso | O log está desativado; você está vendo logs automáticos de blocos suspeitos | Mesmo que acima |
| PowerShellCore/Operational não encontrado | O PowerShell 7 não está instalado, ou seu manifesto não está registrado | Execute RegisterManifest.ps1 do $PSHOME |
| Texto do 4104 é cifra ilegível | O Log de Evento Protegido está ativado | Você precisa do certificado de decodificação |
| O log cobre apenas algumas horas | Tamanho padrão, alto volume | Aumente o tamanho máximo do canal |
FAQ
O log de bloco de script captura código ofuscado?
Em grande parte, sim. Ele registra blocos de script à medida que são compilados. Quando o código ofuscado constrói e executa o próximo estágio, esse estágio é registrado como seu próprio bloco, muitas vezes em forma legível.
Qual é a diferença do transcription?
A transcripção escreve arquivos de texto da entrada e saída da sessão para uma pasta. O log de bloco de script registra o próprio código no log de eventos. Eles se complementam e ambos valem a pena ter.