Os logs dos blocos de script do PowerShell estão em Logs de Aplicativos e Serviços → Microsoft → Windows → PowerShell → Operacional, como evento 4104. Eles só estão completos se o registro de blocos 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 configuração de política.
Se um invasor tocou em uma máquina Windows, as chances são de que o PowerShell estava envolvido. O registro de blocos de script grava o código que realmente foi executado, muitas vezes 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 MITRE ATT&CK. Elas cobrem o uso malicioso do PowerShell (T1059.001), ofuscação (T1027) e cradles de download que puxam ferramentas (T1105).
Antes de começar
O registro de blocos de script está ativado?
reg query “HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging”
EnableScriptBlockLogging definido como 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 no nível de Aviso. Então você pode encontrar alguns eventos. Apenas não os confunda com o quadro completo.
Ligá-lo ajuda daqui para frente, não para o que já aconteceu. Use a configuração de Política de Grupo Modelos Administrativos → Componentes do Windows → Windows PowerShell → Ativar Logging 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 de $PSHOME.
Espere volume. Todo script e módulo que é executado termina no log. Aumente o tamanho máximo do canal, ou você manterá apenas algumas horas.
Espere segredos. Scripts de administração às vezes carregam senhas e chaves de API em texto simples, e o registro de blocos de script os grava fielmente. Tenha isso em mente antes que este arquivo vá para qualquer lugar, e leia a seção LogTotal abaixo.
Exporte os logs
No Visualizador de Eventos, clique com o botão direito em Operacional em PowerShell e escolha Salvar Todos os Eventos Como… Na 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 log clássico “Windows PowerShell”: eventos de início do motor com a linha de comando do host
wevtutil epl “Windows PowerShell” C:logswindows_powershell.evtx
Este último é fácil de esquecer, e vale a pena pegar. O evento 400 registra cada início de motor, incluindo a versão do motor. Uma EngineVersion de 2.0 em um sistema moderno geralmente significa que alguém fez downgrade deliberadamente para evitar o registro de blocos de script.
Faça upload e revise no LogTotal
O LogTotal lê EVTX nativamente. Uma coisa a saber primeiro: O LogTotal ainda não sanitiza arquivos EVTX. [PROOF: confirm which formats the sanitize step covers today.] With PowerShell logs, that matters more than usual, because of the secrets mentioned above. Use EVTX uploads freely for test machines. For production hosts, get a yes from whoever owns data handling first.
- Faça upload. Abra logtotal.com e solte o arquivo. [PROVA: tela de upload, limite de tamanho]
- Revise. [PROOF: what the results screen shows for PowerShell data]
Como isso parece em dados reais. Usamos [PROVA: fonte de amostra, por exemplo, uma VM de teste com registro de blocos de script ativado, após executar um cradle de download codificado e uma string de teste inofensiva de manipulação de AMSI]. O LogTotal destacou [PROVA: descobertas reais]. [PROVA: link para o arquivo de exemplo]
Quando dá errado
| Sintoma | Causa provável | Fix |
|---|---|---|
| Nenhum evento 4104 | O registro de blocos de script está desativado, e nada parecia suspeito | Ative-o para o futuro; verifique o log do Windows PowerShell para o que você ainda pode obter |
| Apenas alguns eventos 4104, todos Aviso | O registro está desativado; você está vendo registro automático de blocos suspeitos | O 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 de $PSHOME |
| Texto 4104 é uma cifra ilegível | O registro de eventos protegidos está ativado | Você precisa do certificado de decriptação |
| O log cobre apenas algumas horas | Tamanho padrão, alto volume | Aumente o tamanho máximo do canal |
FAQ
O registro de blocos de script captura código ofuscado?
Em grande parte, sim. Ele grava 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 da transcrição?
A transcrição grava arquivos de texto da entrada e saída da sessão em uma pasta. O registro de blocos de script grava o próprio código no log de eventos. Eles se complementam e ambos valem a pena ter.