
Extensão de Depuração para Resposta a Incidentes e Forense Digital
SwishDbgExt é uma extensão de depuração da Microsoft WinDbg que expande o conjunto de comandos disponíveis pela Microsoft WinDbg, mas também corrige e melhora comandos existentes. Esta extensão foi desenvolvida por Matt Suiche (@msuiche) – sinta-se à vontade para entrar em contato pelo e-mail [email protected] para solicitar mais funcionalidades, oferecer contribuições e/ou relatar bugs.
SwishDbgExt tem como objetivo facilitar a vida de desenvolvedores de kernel, solucionadores de problemas e especialistas em segurança com uma série de comandos de depuração, resposta a incidentes e forense de memória. Por ser uma extensão de depuração do WinDbg, pode ser usada em sessões de depuração de kernel local ou remota, sessões ao vivo geradas pelo Microsoft LiveKd, mas também em dumps de falha do Microsoft gerados por uma Tela Azul da Morte ou utilitários híbridos como o Comae DumpIt.
Mais informações em https://blog.comae.io/comae-2016-contest-swishdbgext-features-3c9a63c62209#.tnt1b9usx
Você pode copiar a extensão do WinDbg para a pasta correspondente (x86 ou x64) do WinDbg ou carregá-la manualmente usando o comando !load conforme abaixo. Observe que não é permitido espaços ou aspas no caminho completo da dll a ser carregada.
!load X:\FullPath\SwishDbgExt.dll
kd> !load E:\projects\labs\SwishDbgExt\bin\x64\SwishDbgExt.dll;
SwishDbgExt v0.7.0 (Nov 2 2016) - Incident Response & Digital Forensics Debugging Extension
SwishDbgExt Copyright (C) 2016 Comae Technologies FZE - http://www.comae.io
SwishDbgExt Copyright (C) 2014-2016 Matthieu Suiche (@msuiche)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
Se desejar atualizar seu modelo do WinDbg com um modelo mais amigável para DML, você pode importar diretamente o arquivo windbg_template.reg incluído no pacote.
Exibe informações sobre os comandos de extensão disponíveis.
Este comando fornecerá a lista de todos os comandos se nenhum argumento for especificado, ou fornecerá a lista de parâmetros para um comando existente se especificado como argumento.
Exibir funções de retorno de chamada
Procurar por code cave utilizado
Exibir histórico de comandos do console
Exibir credenciais do usuário (baseado no mimikatz do gentilwiki)
Exibir lista de drivers. !ms_drivers exibirá uma lista de drivers atualmente carregados. Neste exemplo, aqui estão alguns dos drivers carregados no momento da falha neste dump de kernel: Com este comando, também podemos visualizar informações detalhadas de IRP sobre um driver: Na imagem acima, podemos ver a localização da pilha de E/S específica do driver dentro do IRP de e1cexpress.sys. Aqui podemos ver códigos de função como IRP_MJ_CREATE que abre o objeto de dispositivo alvo, indicando que ele está presente e disponível para operações de E/S.
Despejar espaço de memória no disco
Exibir fila de trabalhadores Ex.
!exqueue não funciona corretamente no Windows 8, então uma versão funcional precisou ser implementada. Assim como o comando original, este exibe a fila de threads de trabalho.
Redefinir segmentação no WinDbg (Corrigir "16.kd>")
Exibir GDT.
!ms_gdt exibe a Tabela de Descritores Globais. Observe que no x64 cada seletor é plano (0x0000000000000000 a 0xFFFFFFFFFFFFFFFF). Este comando pode ser especialmente útil para verificar possíveis hooks na GDT, pois tentar fazer isso no x64 chamará um bug check. Isso ocorre porque o x64 proíbe o hooking da GDT.
Exibir lista de hives do registro.
ms_hivelist exibe uma lista dos hives do registro.
Podemos olhar diretamente para um hive (\Registry\Machine\Software, por exemplo) para ver suas subchaves, valores, etc:

Exibir IDT.
!ms_idt exibe a Tabela de Descritores de Interrupção. Muito parecido com a GDT, se a IDT estiver com hook em um sistema x64, isso causará um bug check. Isso se deve ao fato de a Microsoft ter implementado (programaticamente) uma prevenção de hook na IDT com um driver em modo kernel que interceptaria chamadas à IDT e adicionaria seu próprio processamento. É por isso que na imagem acima, vemos 'Não' por toda a extensão.
Analisar um espaço de memória e retornar um Índice de Pontuação de Malware (MSI) - (baseado no trabalho de Frank Boldewin)
Escaneia o Master Boot Record (MBR)
Exibir informações de rede (soquetes, conexões, ...)
Exibir lista de objetos
Exibir lista de processos.
!ms_process é uma versão melhorada de !process e !dml_proc.
Uma das coisas interessantes, como você pode notar abaixo, é o uso de DML (Debugger Markup Language) com os comandos. Todos os comandos sublinhados são, na verdade, links para comandos.
Como exemplo abaixo, você pode ver a saída de /vads /scan, para escanear VADs (Descritores de Endereço Virtual). Você pode notar que uma coluna fornece o "Índice de Pontuação de Malware", que pode ser útil para detectar shellcodes ou heap-spray.
Na captura de tela abaixo, você pode ver uma pontuação anormalmente alta em vários VADs – devido ao uso de heap spray. Basta clicar na pontuação para executar o algoritmo de varredura.
O algoritmo de varredura é baseado no utilitário OfficeMalScanner de Frank Boldewin.
E retorna informações sobre onde o shellcode está:
A opção /scan também pode ser usada em funções exportadas para saber se a Tabela de Endereços de Exportação (EAT) foi alterada ou se o prólogo da função foi modificado.
Testes semelhantes estão disponíveis para a SSDT (!ms_ssdt).
Ler bloco de controle de chave
Ler nó de chave.
O comando !reg do WinDbg tem sido uma frustração por muito tempo, devido a alguns bugs. É por isso que o SwishDbgExt possui suas próprias funções de explorador de registro para tentar tornar o acesso aos dados do registro o mais simples possível.
Ler valor da chave
Escaneia e exibe hooks suspeitos de NDIS
Exibir lista de serviços
Exibir funções da Tabela de Despacho de Serviços do Sistema (SDT).
!ms_ssdt exibe a Tabela de Despacho de Serviços do Sistema. Este comando é extremamente útil na investigação de hooks suspeitos de rootkits através do que é conhecido como Manipulação Direta de Objetos do Kernel (DKOM). Se você vir uma rotina de baixo nível aqui que está com hook (como nt!NtEnumerateKey), isso pode ajudar na análise de uma possível infecção por rootkit.
Exibir informações relacionadas ao Gerenciador de Armazenamento (ReadyBoost).
O presente comando permite listar o cache atual do ReadyBoost (requer USB 3.0) usado pelo Sistema Operacional, mas também exibir os logs das páginas de memória gerenciadas pelo gerenciador de armazenamento. Parâmetro: /cache
Exibir lista de KTIMER.
!ms_timers exibe a estrutura KTIMER, que é uma estrutura opaca que representa e contém vários objetos de temporizador. Este comando pode ser útil para descobrir quais drivers criaram quais objetos de temporizador, quais drivers chamaram quais rotinas, etc.
Exibir lista de VACBs em cache
Ativar/desativar modo verboso
O seguinte é baseado na pesquisa publicada por Alex Ionescu e disponível em: https://github.com/ionescu007/lxss/
Este recurso está disponível no Windows 10+ como um recurso opcional instalável através do seguinte comando PowerShell:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Você pode ler mais sobre o Subsistema Windows para Linux nos seguintes links:
Windows Subsystem for Linux Overview.
Instance 0xFFFFE704EEB8F010
GUID: {E29032FD-35D3-4C53-AB68-6BCEBDA7176F}
State: (1) [STARTED]
Creation Flags: 00000001
GlobalData: 0xFFFFF802ED4138A0
Root Handle: 80000834
Temp Handle: 80000838
Job Handle: 8000083c
Token: 80000818
Event Handle: 800008bc
Map Paths (0): 0xFFFFE704EF437920
VFS Context: 0xFFFFE704EEFC4710
Memory Flags: 0x2
Last PID: 35
Thread Groups: 3
Session 0xFFFFE704EDB79EC0
Instance: 0xFFFFE704EEB8F010
Console inode: 0x0
Foreground PID: -1
Process Group 0xFFFFE704EDB79AE0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EDB79EC0
Thread Group 0xFFFFE704EF4F8000
Binary Path: /init
Thread(s): 1
Owner Process Group: 0xFFFFE704EDB79AE0
Flags: 0x00000000
Main Thread: 0xFFFFE704EF5CC010
Arguments (006 bytes): 0x00007FFFC081D6E0
Process 0xFFFFE704EF2F1D70
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84EF800
NT Process Handle: 0xFFFFFFFF80000F58
VDSO Address: 0x00007FFFC0849000
Stack Address: 0x00007FFFC001E000
Session 0xFFFFE704EF5DB830
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF32D7A0
Foreground PID: 2
Process Group 0xFFFFE704EF5EF970
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF5DB830
Thread Group 0xFFFFE704EF5EE000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704EF5EF970
Flags: 0x0000000C
Main Thread: 0xFFFFE704EF5F8010
Arguments (010 bytes): 0x00007FFFDF34E418
Process 0xFFFFE704EDEF6EC0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84E6800
NT Process Handle: 0xFFFFFFFF80000D9C
VDSO Address: 0x00007FFFDF883000
Stack Address: 0x00007FFFDEB4F000
Session 0xFFFFE704EF0A8ED0
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF06B9C0
Foreground PID: 19
Process Group 0xFFFFE704F059CBC0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF0A8ED0
Thread Group 0xFFFFE704EDE51000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704F059CBC0
Flags: 0x0000000C
Main Thread: 0xFFFFE704EDC78090
Arguments (010 bytes): 0x00007FFFF78CFB78
Process 0xFFFFE704F06389B0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E618D800
NT Process Handle: 0xFFFFFFFF80001650
VDSO Address: 0x00007FFFF7C99000
Stack Address: 0x00007FFFF70D0000
Escaneia a memória de um processo com regras yara.
Escaneia a memória de um processo.
!ms_yarascan /pid 0x228 /yarafile /yarafile C:\Rules.yar
Escaneia a memória de todos os processos.
!for_each_process "r? @$t0 = (nt!_EPROCESS *) @#Process; .process /r /p @$t0; !ms_yarascan /pid @@C++(@$t0->UniqueProcessId) /yarafile C:\\Rules.yar"
MsPEImageFile contém as informações comuns básicas usadas por binários do Windows (PE) e foi derivado em três classes diferentes: