Slide 1

Slide 1 text

NotSurprised @ SITCON [email protected]

Slide 2

Slide 2 text

https://speakerdeck.com/notsurprised/sitcon2019-windows-driver

Slide 3

Slide 3 text

• 鍵盤側錄 • 即時備份 • 剔除非認證USB • 自製資料夾保護 • MSDN (跟拿字典寫文章一樣難用) • Books (X瓏) • Training (據說螃蟹常要花$$送員工訓練) • Community (osr-online cmt的sln要求基本功很高、stackoverflow很少) • 監測惡意payload的cmd • 偽造I/O玩弄病毒 • Win 驅動比 Linux 缺人 • 鍛鍊耐心 • WDK Samples (code review) • Paper (Operating System)

Slide 4

Slide 4 text

> NotSurprised • UCCU hacker • ITRI engineer • 中山資管五年學碩士 Email : [email protected]

Slide 5

Slide 5 text

> • Background • Driver Compiling • IRP • Driver Dev. • Driver Debug • Driver Signing • Conclusion

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

> • Windows Driver Model,簡稱 WDM • Windows OS 的驅動程式的種類有: – 匯流排驅動程式(bus driver) – 功能驅動程式(function driver) – 篩選驅動程式(filter driver)

Slide 8

Slide 8 text

> & • Windows 7 後 Filter 的編譯生成被整合進 VS,並進行了一次架 構更新,更名為 Minifilter • Minifilter 比傳統 Filter 更容易構建編譯, 並且其可以動態安裝/卸載是傳統 Filter 所不能的

Slide 9

Slide 9 text

> • 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)

Slide 10

Slide 10 text

> Windows ~= Microkernel + LibOS ~= Monolithic Like

Slide 11

Slide 11 text

> • 在 Windows 作業系統的核心層(kernel-mode)中,是階層式的組態,這種階層 式驅動程式架構(Layered driver Architecture) 又被稱為驅動程式堆疊(Driver Stack) source : MSDN

Slide 12

Slide 12 text

> • Windows OS 的 IRP(I/O Request Packets)傳遞架構: source : MSDN

Slide 13

Slide 13 text

> • Extension Register • Kernel Dispatcher • CommunicationUK • Degree (Altitude) • Events • Handlers

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

• 在 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 > 、 、

Slide 16

Slide 16 text

>

Slide 17

Slide 17 text

> SDK 版本需匹配 WDK,但 VS、SDK 要比 WDK 先裝

Slide 18

Slide 18 text

>

Slide 19

Slide 19 text

> 、 、

Slide 20

Slide 20 text

>

Slide 21

Slide 21 text

>

Slide 22

Slide 22 text

> • 合作碼農需要統一開發環境。

Slide 23

Slide 23 text

> • [編譯不同平台]從 build setting 換到 project->driver setting

Slide 24

Slide 24 text

> https://code.msdn.microsoft.com/windowsapps/Windows-Driver-Kit-WDK-81-cf35e953#content

Slide 25

Slide 25 text

• 需要以下 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 程式。 > 、 、

Slide 26

Slide 26 text

> Kernel 沒有 printf() 的 API >.0

Slide 27

Slide 27 text

>

Slide 28

Slide 28 text

> • [編譯不同平台]從 build setting 換到 project->driver setting

Slide 29

Slide 29 text

>

Slide 30

Slide 30 text

>

Slide 31

Slide 31 text

>

Slide 32

Slide 32 text

• 終於把檔案安裝進 System32\drivers 中 >

Slide 33

Slide 33 text

> • driver.inf 安裝完成後的 driver 註冊表項

Slide 34

Slide 34 text

> • 亦可使用 WinObj 檢查安裝成果。

Slide 35

Slide 35 text

> Sample code problem.

Slide 36

Slide 36 text

> In Virtual Machine

Slide 37

Slide 37 text

> SERVICE_BOOT_START (0) SERVICE_SYSTEM_START (1) SERVICE_AUTO_START (2) SERVICE_DEMAND_START (3) SERVICE_DISABLED (4)

Slide 38

Slide 38 text

> Do not test driver on your host.

Slide 39

Slide 39 text

>

Slide 40

Slide 40 text

> • 開發環境需一致 • 提權 開啟管理員權限 • WDM編譯方式傳統 v.s. WDF全用VS自動 • 盡量不要用本機測試

Slide 41

Slide 41 text

( )

Slide 42

Slide 42 text

> • IRP (I/O Request Package) 是在 Windows 內核中的一種資料結 構,它是儲存與輸入輸出相關重要資料的資料結構。 • IRP 是一個很複雜的資料結構,首先需要了解 IRP 有兩個基本屬性, MajorFunction 和 MinorFunction,其分別記錄 IRP 的主類型和 子類型。 • 同樣的 MajorFunction 可能因為 MinorFunction 或其他參數的 不同組合出複雜多變的行為

Slide 43

Slide 43 text

> • 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 • …….

Slide 44

Slide 44 text

> • 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

Slide 45

Slide 45 text

> • IRP結構

Slide 46

Slide 46 text

> Write Buffer 以勒索軟體為例,可比較複寫資料複雜度、相似度 (Entopy、sdhash)

Slide 47

Slide 47 text

> 以勒索軟體為例,可確認被更動檔案是否是高危險類型 (檔案大小、檔案位置、檔案格式)

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

> ( y ) ……

Slide 50

Slide 50 text

> • 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

Slide 51

Slide 51 text

> C WDK unsigned long ULONG unsigned char UCHAR unsigned int UINT void VOID unsigned long * PULONG unsigned char * PUCHAR unsigned int* PUINT void * PVOID

Slide 52

Slide 52 text

> 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

Slide 53

Slide 53 text

> • 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

Slide 54

Slide 54 text

>

Slide 55

Slide 55 text

Driver Entry 建立傳輸埠 > 將資料結構 Block 送進傳輸埠 WDK SAMPLE : minispy.sys Local Procedure Call

Slide 56

Slide 56 text

> 存入資料區塊到傳輸 Buffer 中

Slide 57

Slide 57 text

> 在驅動的 PreOperationCallback 呼叫 就會將每個往 Kernel 封包存入到資料結構

Slide 58

Slide 58 text

> • User module 應用層的對接程式將資料結構從傳輸埠取出 依 Compile 時共同引用的資料結構協定切塊

Slide 59

Slide 59 text

> 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

Slide 60

Slide 60 text

> • Use Driver to change IRP content. • If need error message, deny it. Fake I/O

Slide 61

Slide 61 text

> WDK SAMPLE : ObCallback.sys 註冊監聽 Process 建立事件 取得啟動 Process 的指令

Slide 62

Slide 62 text

> WDK SAMPLE : usbview.sys 窮舉接入之 USB 裝置

Slide 63

Slide 63 text

> • csrss.exe -> NtCreateFile -> IRP_MJ_READ (Kbdclass) • WDK Sample: kbfiltr.sys

Slide 64

Slide 64 text

> • 在 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有一整串討論跟實作喔~

Slide 65

Slide 65 text

因為是載入 Driver,所以所調用的 Kernel API 時 Table 所指的記憶體位置並不確定 因此,直接用 Kernel 函數名稱取址並非其運行時 Table 所指的記憶體位置 Hook 函數時需要另外使用 MmGetSystemRoutineAddress( ) 函數確切取得運行時記憶體位置 > • In Win32 System Service Dispatcher (KiSystemService) NtCreateFile SSDT User Mode Kernel Mode ntdll.dll NewCreateFile

Slide 66

Slide 66 text

> • 根據函數名稱找到 SSDT 位址 • cli 關閉中斷(interrupt) • 關閉處理器寫入保護 (0fffefffh取代CR0保護) • 改寫函數指標(pointer) • 復原處理器寫入保護 • sti 開啟中斷

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

>

Slide 70

Slide 70 text

>

Slide 71

Slide 71 text

>

Slide 72

Slide 72 text

>

Slide 73

Slide 73 text

>

Slide 74

Slide 74 text

> • Copy .pdb and add srv*c:\MyServerSymbols*https://msdl.microsoft.com/download/symbols to WinDBG symbol path.

Slide 75

Slide 75 text

>

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

> • Hold the shift while click reboot button. SHIFT One Time Solution

Slide 78

Slide 78 text

> One Time Solution

Slide 79

Slide 79 text

> • cmd.exe (system administrator ) > bcdedit /set TESTSIGNING ON Enable by command Inndy大神: 也可以在 Kernel 找到確切驗證位址後關掉

Slide 80

Slide 80 text

> • 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.)

Slide 81

Slide 81 text

> • 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

Slide 82

Slide 82 text

> • SignTool sign /v /s TestCertStoreName /n TestCertName /t http://timestamp.verisign.com/scripts/timstamp.dll DriverFileName.sys

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

你看到藍屏了嗎? 我告訴你,那就是驅動載入成功的化身 > • 開發工具版本一致性要求高 • 開發環境常面臨企業更新政策 • 安裝 VS、SDK、WDK 動輒半天 • 安裝測試須處理許多權限問題

Slide 85

Slide 85 text

> • DbgView.exe 收取 kdprint() 常因驅動載入錯誤時靈時不靈 • .pdb 載入 symbols 解析 memory.dmp 不一定取得錯誤行數 你要對微軟有信心,你要有耐心啊 >.0 >

Slide 86

Slide 86 text

Debug Driver 這事 本來就是輕者當日,重者七日見效 > • 有時 windbg 告訴你都是 OS 的問題(但很顯然跟你的驅動有關係)

Slide 87

Slide 87 text

不要理會開源的聲音,他們都是異教徒 >

Slide 88

Slide 88 text

• Penetration Test • Anti-Virus Driver • Sandbox • Secure Compiler • Fuzzing Test • Symbolic Execution • Android Kernel • Linux Kernel • CAN Bus

Slide 89

Slide 89 text

No content