
Estensione di debug per Incident Response e Digital Forensics
SwishDbgExt è un'estensione di debug per Microsoft WinDbg che espande l'insieme dei comandi disponibili di Microsoft WinDbg, ma corregge e migliora anche i comandi esistenti. Questa estensione è stata sviluppata da Matt Suiche (@msuiche) – sentiti libero di contattarci a [email protected] per richiedere ulteriori funzionalità, offrire il tuo contributo e/o segnalare bug.
SwishDbgExt mira a semplificare la vita degli sviluppatori kernel, dei risolutori di problemi e degli esperti di sicurezza con una serie di comandi per debug, risposta agli incidenti e analisi forense della memoria. Poiché SwishDbgExt è un'estensione di debug per WinDbg, può essere utilizzata in sessioni di debug del kernel locali o remote, sessioni live generate da Microsoft LiveKd, ma anche su dump di crash Microsoft generati da un Blue Screen of Death o utility ibride come Comae DumpIt.
Maggiori informazioni su https://blog.comae.io/comae-2016-contest-swishdbgext-features-3c9a63c62209#.tnt1b9usx
Puoi copiare l'estensione WinDbg nella cartella WinDbg corrispondente (x86 o x64) oppure caricarla manualmente usando il comando !load come mostrato di seguito. Nota che non possono esserci spazi o virgolette nel percorso completo della DLL da caricare.
!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 desideri aggiornare il tuo template WinDbg con un template più adatto a DML, puoi importare direttamente il file windbg_template.reg allegato al pacchetto.
Mostra informazioni sui comandi dell'estensione disponibili.
Questo comando fornisce l'elenco di tutti i comandi se non viene specificato alcun argomento, oppure l'elenco dei parametri per un comando esistente se specificato come argomento.
Mostra le funzioni callback
Cerca i code cave utilizzati
Mostra la cronologia dei comandi della console
Mostra le credenziali dell'utente (basato su mimikatz di gentilwiki)
Mostra l'elenco dei driver. !ms_drivers mostra un elenco dei driver attualmente caricati. In questo esempio, ecco alcuni dei driver caricati al momento del crash in questo dump del kernel: Con questo comando possiamo anche visualizzare informazioni approfondite sugli IRP relative a un driver: Nell'immagine sopra possiamo vedere la posizione dello stack I/O specifica del driver all'interno dell'IRP di e1cexpress.sys. Qui possiamo vedere codici di funzione come IRP_MJ_CREATE che apre l'oggetto dispositivo di destinazione, indicando che è presente e disponibile per operazioni I/O.
Scarica lo spazio di memoria su disco
Mostra i worker in coda Ex.
!exqueue non funziona correttamente su Windows 8, quindi è stata implementata una versione funzionante. Proprio come il comando originale, questo mostra la coda dei thread di lavoro.
Reimposta la segmentazione in WinDbg (Ripara "16.kd>")
Mostra la GDT.
!ms_gdt mostra la Global Descriptor Table. Nota che su x64 ogni selettore è piatto (0x0000000000000000 a 0xFFFFFFFFFFFFFFFF). Questo comando può essere molto utile per verificare eventuali sospetti hook della GDT, poiché tentare di farlo su x64 provocherà un bug check. Questo perché x64 vieta l'hooking della GDT.
Mostra l'elenco degli hive del registro.
ms_hivelist mostra un elenco degli hive del registro.
Possiamo esaminare direttamente un hive (ad esempio \Registry\Machine\Software) per vedere le sue sottochiavi, valori, ecc.:

Mostra la IDT.
!ms_idt mostra la tabella dei descrittori di interrupt. Molto simile alla GDT, se la IDT viene hookata su un sistema x64, provocherà un bug check. Questo è dovuto al fatto che Microsoft ha implementato (a livello di codice) una prevenzione dell'hooking della IDT con un driver in modalità kernel che normalmente intercetterebbe le chiamate alla IDT e poi aggiungerebbe la propria elaborazione. Ecco perché nell'immagine sopra, per quanto si veda, c'è 'No'.
Analizza uno spazio di memoria e restituisce un Malware Score Index (MSI) - (basato sul lavoro di Frank Boldewin)
Scansiona il Master Boot Record (MBR)
Mostra informazioni di rete (socket, connessioni, ...)
Mostra l'elenco degli oggetti
Mostra l'elenco dei processi.
!ms_process è una versione migliorata di !process e !dml_proc.
Una delle cose interessanti, come puoi notare qui sotto, è l'uso di DML (Debugger Markup Language) con i comandi. Tutti i comandi sottolineati sono in realtà collegamenti a comandi.
Ad esempio qui sotto, puoi vedere l'output di /vads /scan, per scansionare i VAD (Virtual Address Descriptors). Puoi notare che una colonna mostra il "Malware Score Index" che può essere utile per rilevare shellcode o heap-spray.
Nello screenshot qui sotto, puoi vedere un punteggio anormalmente alto in diversi VAD – a causa dell'uso di heap spray. Basta cliccare sul punteggio per eseguire l'algoritmo di scansione.
L'algoritmo di scansione è basato sull'utility OfficeMalScanner di Frank Boldewin.
E restituisce informazioni su dove si trova lo shellcode:
L'opzione /scan può essere utilizzata anche sulle funzioni esportate per sapere se l'EAT (Export Address Table) è stata patchata o se il prologo della funzione è stato modificato.
Test simili sono disponibili per la SSDT (!ms_ssdt).
Legge un key control block
Legge un key node.
Il comando WinDbg !reg è stato a lungo fonte di frustrazione a causa di alcuni bug. Ecco perché SwishDbgExt ha proprie funzioni di esplorazione del registro per rendere l'accesso ai dati del registro il più semplice possibile.
Legge un key value
Scansiona e mostra gli hook NDIS sospetti
Mostra l'elenco dei servizi
Mostra le funzioni della System Service Descriptor Table (SDT).
!ms_ssdt mostra la System Service Dispatch Table. Questo comando è estremamente utile nell'investigazione di sospetti hook di rootkit attraverso ciò che è noto come Direct Kernel Object Manipulation (DKOM). Se vedi una routine di basso livello hookata qui (come nt!NtEnumerateKey), questo può aiutarti nell'analisi di una possibile infezione da rootkit.
Mostra informazioni relative allo Store Manager (ReadyBoost).
Il presente comando permette di elencare la cache ReadyBoost corrente (richiede USB 3.0) utilizzata dal sistema operativo, ma anche di visualizzare i log delle pagine di memoria gestite dallo store manager. Parametro: /cache
Mostra l'elenco dei KTIMER.
!ms_timers mostra la struttura KTIMER, che è una struttura opaca che rappresenta e contiene vari oggetti timer. Questo comando può essere utile per capire quali driver hanno creato quali oggetti timer, quali driver hanno chiamato quali routine, ecc.
Mostra l'elenco dei VACB in cache
Attiva/disattiva la modalità verbose
Quanto segue si basa sulla ricerca pubblicata da Alex Ionescu e disponibile qui: https://github.com/ionescu007/lxss/
Questa funzionalità è disponibile su sistemi operativi Windows 10+ come funzionalità opzionale installabile tramite il seguente comando PowerShell:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Puoi leggere ulteriori informazioni sul Sottosistema Windows per Linux ai seguenti link:
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
Scansiona la memoria di un processo con regole yara.
Scansiona la memoria di un processo.
!ms_yarascan /pid 0x228 /yarafile /yarafile C:\Rules.yar
Scansiona la memoria di tutti i processi.
!for_each_process "r? @$t0 = (nt!_EPROCESS *) @#Process; .process /r /p @$t0; !ms_yarascan /pid @@C++(@$t0->UniqueProcessId) /yarafile C:\\Rules.yar"
MsPEImageFile contiene le informazioni comuni di base utilizzate dai binari Windows (PE) ed è stato derivato in tre diverse classi: