Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SITCON2019-Windows-Driver

 SITCON2019-Windows-Driver

NotSurprised

March 24, 2019
Tweet

More Decks by NotSurprised

Other Decks in Programming

Transcript

  1. • 鍵盤側錄 • 即時備份 • 剔除非認證USB • 自製資料夾保護 • MSDN

    (跟拿字典寫文章一樣難用) • Books (X瓏) • Training (據說螃蟹常要花$$送員工訓練) • Community (osr-online cmt的sln要求基本功很高、stackoverflow很少) • 監測惡意payload的cmd • 偽造I/O玩弄病毒 • Win 驅動比 Linux 缺人 • 鍛鍊耐心 • WDK Samples (code review) • Paper (Operating System)
  2. > • Background • Driver Compiling • IRP • Driver

    Dev. • Driver Debug • Driver Signing • Conclusion
  3. > • Windows Driver Model,簡稱 WDM • Windows OS 的驅動程式的種類有:

    – 匯流排驅動程式(bus driver) – 功能驅動程式(function driver) – 篩選驅動程式(filter driver)
  4. > & • Windows 7 後 Filter 的編譯生成被整合進 VS,並進行了一次架 構更新,更名為

    Minifilter • Minifilter 比傳統 Filter 更容易構建編譯, 並且其可以動態安裝/卸載是傳統 Filter 所不能的
  5. > • VXD (Virtual X Driver) – Windows 95、Windows 98

    • KDM (Kernel Driver Model) – Windows NT • WDM (Windows Driver Model) – Windows 2000 ~ Windows 8.1 – 使用 DDK (Driver Developer Kit) • WDF (Windows Driver Frameworks) – Windows 7 ~ Windows 10 – 使用 WDK (Windows Driver Kit)
  6. • 在 Microsoft 發布微過濾器(minifilter)框架後,先後歷經 Windows 7 到Windows 8 之間的開發轉變,Microsoft 將許多編

    譯方式整合進 Visual Studio,因此在安裝 Visual Studio 以 及相關 WDK、SDK 時必須注意版本匹配問題。 • 其中 WDK 可從官網下載,而 SDK 則建議於安裝 Visual Studio 2017 時安裝想匹配的版本 • 而 Visual Studio 2017 安裝 SDK 預設為不安裝,因此需開啟自 訂安裝並加以勾選。(Visual Studio 2015 又是另外一個故事了) • ARM/ARM64 > 、 、
  7. >

  8. >

  9. >

  10. >

  11. • 需要以下 header 檔案: fltKernel.h, mce.h, ntnls.h, crtdefs.h, ctype.h, excpt.h,

    stdio.h, string.h, swprintf.inl, vadefs.h, ntddk.h, ntifs.h, wdm.h, wsk.h, netioddk.h 這些在裝完 WDK 後會存於C:\Program Files (x86)\Windows Kits\10\Include • 以管理員權限到 Visual Studio 開起專案, 設定「解決方案配置」(ex. win 8.1 debug)與「解決方案平台」(ex. win32),然後執行。 • minispy.exe & minispy.sys 建置: > cd C:\WDK 10.0 Sample\filesys\miniFilter\minispy > msbuild /t:clean /t:build .\minispy.sln > msbuild /p:KernelBufferOverflowLib="C:\Program Files (x86)\Windows Kits\10\Lib\win8\km\x64\BufferOverflowK.lib" /p:platform=x64 /p:Configuration="Win8.1 Release" minispy.sln minispy.exe • minispy.sys 會生成在 C:\WDK 10.0 Sample\filesys\miniFilter\minispy\ • 至實驗機右鍵 minispy.inf 安裝,確認 C:\Windows\System32\drivers 下有無 minispy.sys 有則代表可以使用管理者權限開啟 cmd 並使用 net start minispy 的指令將 minispy load 進 fltmc • 使用同個具管理者權限的 cmd 視窗 cd 至 minispy.exe 所在位置,使用 minispy.exe 執行 minispy 的 User mode 對接 drive 程式。 > 、 、
  12. >

  13. >

  14. >

  15. >

  16. >

  17. ( )

  18. > • IRP (I/O Request Package) 是在 Windows 內核中的一種資料結 構,它是儲存與輸入輸出相關重要資料的資料結構。

    • IRP 是一個很複雜的資料結構,首先需要了解 IRP 有兩個基本屬性, MajorFunction 和 MinorFunction,其分別記錄 IRP 的主類型和 子類型。 • 同樣的 MajorFunction 可能因為 MinorFunction 或其他參數的 不同組合出複雜多變的行為
  19. > • IRP_MJ_DIRECTORY_CONTROL • IRP_MJ_READ • IRP_MJ_WRITE • IRP_MJ_QUERY_INFORMATION •

    IRP_MJ_SET_INFORMATION • IRP_MJ_CREATE • IRP_MJ_CLEANUP • IRP_MJ_CLOSE • IRP_MJ_DEVICE_CONTROL • IRP_MJ_LOCK_CONTROL • IRP_MJ_SET_VOLUME_INFORMATION • IRP_MJ_QUERY_SECURITY • IRP_MJ_SET_EA • …….
  20. > • IRP_MJ_DIRECTORY_CONTROL • IRP_MJ_READ • IRP_MJ_WRITE • IRP_MJ_QUERY_INFORMATION •

    IRP_MJ_SET_INFORMATION • IRP_MJ_CREATE • IRP_MJ_CLEANUP • IRP_MJ_CLOSE • IRP_MJ_DEVICE_CONTROL • IRP_MJ_LOCK_CONTROL • IRP_MJ_SET_VOLUME_INFORMATION • IRP_MJ_QUERY_SECURITY • IRP_MJ_SET_EA • ……. FILE_CREATED FILE_DOES_NOT_EXIST FILE_EXISTS FILE_OPENED FILE_OVERWRITTEN (覆寫) FILE_SUPERSEDED (替換) FILE_ALLOCATION_INFORMATION FILE_BASIC_INFORMATION (新增、修改時間、權限) FILE_DISPOSITION_INFORMATION (刪除) FILE_END_OF_FILE_INFORMATION FILE_LINK_INFORMATION FILE_POSITION_INFORMATION FILE_RENAME_INFORMATION (重命名) FILE_VALID_DATA_LENGTH_INFORMATION
  21. > • UTF16 encode : 魯 a = 9B 6F

    00 61 • ASCII encode : 9B 6F 00 61 = › o a String Type Description char *str = {"kd string"} ANSI string wchar_t *wstr = {L"kd string"} Unicode string size_t len = strlen(str) ANSI string len size_t wlen Unicode string len printf("%s %ws %d %d", str, wstr, len, wlen) print format OutputDebugString("%s", wstr) print format
  22. > C WDK unsigned long ULONG unsigned char UCHAR unsigned

    int UINT void VOID unsigned long * PULONG unsigned char * PUCHAR unsigned int* PUINT void * PVOID
  23. > HANDLE Event UNICODE_STRING ObjectName Length MaximumLength Buffer 4 byte

    2 byte 2 byte 4 byte HANDLE Event UNICODE_STRING ObjectName Length MaximumLength Padding Buffer 8 byte 2 byte 2 byte 4 byte 8 byte
  24. > • On Microsoft Windows 2000 and later versions of

    the operating system, "\??" is equivalent to "\DosDevices". • For example, the object name of the "C:\WINDOWS\example.txt" file is "\DosDevices\C:\WINDOWS\example.txt". Path Type Description \\abc\xyz MSDN C:\abc\xyz MSDN \\.\C:\abc\xyz MSDN \\?\C:\abc\xyz MSDN \\?\UNC\abc\xyz MSDN \??\UNC\abc\xyz MSDN ?\UNC\abc\xyz Actually in WindowsServer 2012 2016
  25. >

  26. > Filter Manager Read Write Rename Delete User mode Kernel

    mode I/O Manager Minispy(Kernel) File System Driver Physical Device Minispy(User) Storage Driver Stack MinispyUK.h
  27. > • Use Driver to change IRP content. • If

    need error message, deny it. Fake I/O
  28. > • 在 Win64,PatchGuard x64 一言不合就藍屏 Process/3rdAPI (wxWidgets.lib) Windows API

    System Service Dispatcher (KiSystemService) NtCreateFile SSDT User Mode Kernel Mode ntdll.dll NtClose P.S. 如何破解PatchGuard有一整串討論跟實作喔~
  29. 因為是載入 Driver,所以所調用的 Kernel API 時 Table 所指的記憶體位置並不確定 因此,直接用 Kernel 函數名稱取址並非其運行時

    Table 所指的記憶體位置 Hook 函數時需要另外使用 MmGetSystemRoutineAddress( ) 函數確切取得運行時記憶體位置 > • In Win32 System Service Dispatcher (KiSystemService) NtCreateFile SSDT User Mode Kernel Mode ntdll.dll NewCreateFile
  30. > • 根據函數名稱找到 SSDT 位址 • cli 關閉中斷(interrupt) • 關閉處理器寫入保護

    (0fffefffh取代CR0保護) • 改寫函數指標(pointer) • 復原處理器寫入保護 • sti 開啟中斷
  31. > • Encode v.s. Encrypt • 32bit v.s. 64bit •

    Char v.s. WCHAR • NT Path • Record Events / USB Protect / • KeyLogger / FakeIO / SSDT hook
  32. >

  33. >

  34. >

  35. >

  36. >

  37. >

  38. > • cmd.exe (system administrator ) > bcdedit /set TESTSIGNING

    ON Enable by command Inndy大神: 也可以在 Kernel 找到確切驗證位址後關掉
  39. > • I assume you build your own dirver already,

    if you try to use sign function within VS project, that’s another issue. • You should already have .cat, .sys & .inf (with sign function in VS, you will get your own usable .cer if you set it right.)
  40. > • MakeCert -r -pe -ss TEST -n "CN=TEST.org" test.cer

    > • CertMgr /add minispy.cer /s /r localMachine root • CertMgr /add minispy.cer /s /r localMachine trustedpublisher
  41. > • SignTool sign /v /s TestCertStoreName /n TestCertName /t

    http://timestamp.verisign.com/scripts/timstamp.dll DriverFileName.sys
  42. > • DbgView.exe 收取 kdprint() 常因驅動載入錯誤時靈時不靈 • .pdb 載入 symbols

    解析 memory.dmp 不一定取得錯誤行數 你要對微軟有信心,你要有耐心啊 >.0 >
  43. • Penetration Test • Anti-Virus Driver • Sandbox • Secure

    Compiler • Fuzzing Test • Symbolic Execution • Android Kernel • Linux Kernel • CAN Bus