AngelBoy Windows Kernel Exploitation Note
Overview
- 在一般的 binary exploitation 中,我們通常目標是一個 services 或 processes,會跑在 ring3 還有 high level code
- 但 kernel 跑在 ring0,且其 process 是跑在 supervisor mode,所以打下 kernel 可以拿下整個 OS
- 在 linux 上會拿到 root
- windows 會拿到 NT/system
- 攻擊方向
- user mode 的目標是拿 shell
- kernel mode 要做 privilege escape 或 sandbox escape,又稱 Elevation of Privileges (EoP),在 ios 上又稱 jailbreak,Android 叫 root
- 基本上漏洞利用本質沒有區別,但打 kernel 需要再回到 userland 且沒處理好容易造成 crash (BSOD)
- 過去知名的 kernel exploit
- CVE-2016-5195 - Dirty Cow
- CVE-2019-0708 - Blue Keeper
- CVE-2020-0796 - SMBGhost
- 實際攻擊目標
- Windows driver
- *.sys, win32k.sys, srv32.sys
- Windows kernel
- C:\Windows\system32\ntoskrnl.exe
- Windows driver
- 架構圖
- User Process
- 一般跑在 windows 執行的程式,像是 cmd.exe 或 browser 等
- Subsystem DLL
- 實作 subsystem API 的動態函式庫,常用的 API 都在這邊實現,像是 kernel32.dll, kernelbase.dll, gdi.dll 等
- NTDLL
- 實作 windows native API,通常在 usermode 的最底層,會呼叫 system call 來進入 kernel 層
- Services Processes
- Service Control Manager (SCM) 所管理的 Process
- System Process
- 系統重要程式,終止可能會 BSOD
- smss.exe/lsass.exe/winlogon.exe/services.exe 等
- Subsystem Process
- 不可被終止
- helper to kernel for managing processes running under the winodws system
- 一個 session 只有一個
- csrss.exe
- Executive
- upper layer of Ntoskrnl.exe,包含許多核心管理的部分,像是 Object Manager, I/O Manager, Memory Manager 等
- Kernel
- 處理 kernel 中更底層的事務,如 Interrupt, Scheduling, Exception 等
- Device Drivers
- Kernel modules,分很多類別
- 提供 os hardware interface
- Win32k
- 核心驅動之一,主要處理 Graphics Device Interface (GDI)
- 如果用
CreateWindowEx
等 GDI 相關的,會由他來處理 - 非常複雜有獨立的 SSDT
- HAL
- HAL is an abstraction layer over the hardware closest to the CPU
- hal.dll 提供 device driver 不少 API 來操作硬體,如 DMA 等
- User Process
Debug Kernel With Windbg
題外話,因為我手邊只有 pve 沒有 pc,所以原本想試著用巢狀 vm 來盡可能跟教學環境相似,但 win11 vm 在 CPU 改 host 之後開機一直藍屏,照著文件設定後也沒用決定用 pve vm to vm
環境設定 (這裡用 host 跟 vm 代稱兩台機器)
- 首先關掉 vm 的 secure boot
- 接著我們打開 System Configuration -> Boot -> Advanced options -> Debug 打勾 -> Apply -> OK -> Exit without restart
- 設定完後可以用
bcdedit
來看最後一行是否有啟用 debug - 接著要設定 windbg attach 到 guest kernel 的方式,主要有兩種
- Net (較主流,這邊用這個)
- Serial (可以參考簡報,這邊略過)
- 然後在 vm 用管理員權限開一個 cmd
- 執行
bcdedit /DBGSETTINGS NET HOSTIP:192.168.0.0 PORT:50000 KEY:w.x.y.z
(IP 跟 PORT 記得換成自己的) - 重開機
- 然後打開 windbg -> attach to kernel -> 輸入剛才的資訊
- 成功 attach!
windbg debug kernel 會用到的指令
- Display physical memory
- !d{b|d|q|u} [Physical address]
- b/d/q/u 分別是讀取 byte/dword/qword/unicode
- !d{b|d|q|u} [Physical address]
- Write physical memory
- !e{b|d} [Physical address][Value]
- Break point
- Set hardware breakpoint
- ba Access Size [Options][Address]
- Access
- e/r/w/i - execute/read/write/io
- Options
- /p Eprocess
- 指令特定的 process 才會觸發斷點
- Set hardware breakpoint
- 更多參考資料
- Display physical memory
Basic knowledge
Process
- _EPROCESS
- The key data structures of windows process
- 在 process 創建時就會建立
- 類似 linux 中的 task structure
- 系統中的每個 process 會串成一個 double link list
- offset 會隨著版本有差異
- UniqueProcessId
- 就是 Process ID
- ActiveProcessLinks (_LIST_ENTRY)
- Linked list of EPROCESS structure
- 在 exploit 中是極為重要的結構
- Token (_Token)
- access token
- 用來表示該 process 的 securiy context 的結構
- 包含 user account, group, privilege and integrity level
- windows 決定物件是否可以被存取,是用 token 跟物件本身的 ACL 來判斷
- 決定該 Process 是否可以做某些操作,如關機
- PEB
- 指向 user space 的 PEB
- ThreadListHead (_ETHREAD)
- Process 中的每個 thread 都有個 _ETHREAD
- 該 Process 中該結構也會串成一個 double link list
- windbg 相關指令
- !process [/s Session][/m Module] 0 Flags ImageName
- 可以查看 ImageName 的詳細資訊,如 address of _EPROCESS
- 可以列出特定 image 的所有 process
- Flag 一訓的詳細程度 0 最少 3 最多
- dt _EPROCESS eprocess address
- dt _KPROCESS kprocess address
- 實作練習
- 我在 vm 中開了兩個 cmd.exe ,可以用
!process 0 0 cmd.exe
來列出目前跟這個名稱相關的 process,可以看到我開了兩個 cmd - 可以用
dt _EPROCESS [剛剛其中一個 process address]
看到詳細結構資訊
- 我在 vm 中開了兩個 cmd.exe ,可以用
- .process [/p[/r]][address of _EPROCESS]
- 用來切換 process context
- /p:Translates all transition PTEs for this proces to physical addresses before access
- Reloads user-mode symbols after the process context has been set
- !process [/s Session][/m Module] 0 Flags ImageName
Thread
- TrapFrame (_KTRAP_FRAME)
- Trap 時的 Frame 紀錄 process 進入 kernel mode 時的所有 register 狀態
- Teb
- 指向 user space 的 TEB
- Windbg 相關指令
- !thread [address]
- Address
- _ETHREAD 結構位置
- dt _ETHREAD ethread address
- dt _KTHREAD kthread address
- Address
- !thread [address]
Integrity level
- 預設程式會跑在 medium
- process 的 integrity level 繼承自 parent,如果執行檔 integrity 低於 parent 則使用較低的
- parent 可以透過 Windows API 建立低於自身的 child process,但不能建立高於自身的,除非透過 UAC
- low integrity 的 process 無法透過 windows API 取得較敏感的系統資訊
- Mandatory policy
- low integrity 無法寫入較高的 object [No-Write-Up]
- low integrity 無法讀取較高的 process memory [No-Read-up]
- low integrity 不能再叫高的 integrity level 使用 COM [No-Execute-Up]
- icacls 可以用來檢查及設置檔案的 integrity level
- 只能設置低於本身的
- icacls ImageFile /setintegritylevel Low
- Process Explorer 可以看 Process 的 integrity level
- 可以在小標題右鍵 -> Select Columns 把 integrity level 勾起來就會看到了
ACL
- DACL (Discretionary Access Control List)
- Specifies who has what access to the object
- 當 user 要 access 一個 object 時會看 DACL 是否有權限
- Specifies who has what access to the object
- SACL (System Access Control List)
- Specifies which operation by with users should be logged
- 紀錄誰該被 log
- audit info stored in system audit log
- If a SACL is null, no auditing take place
- ACE (Access Control Entry)
- ACL 中的一個元素,一個 ACL 可以有 0 或多個 ACEs,每個 ACE 監控訪問物件的權限
- SID (Security identifiers)
- SID is a unique value of variable length that is used to identify a security principal (such as a security group) in Windows operating systems. SIDs that identify generic users or generic groups is particularly well-known
- Revision number
- 當前版本號,通常是 1
- IdentifierAuthority value
- The agent that issued the SID
- NT: 5
- Subauthority value
- Identify trustees relative to the issuing authority
- Relative identifier (RID)
- 表示 domain 的 user id,default 從 1000 開始,每增加一個使用者就 +1
- 特別的 RID
- Admin: 500
- Guest: 501
- PsGetSid.exe
- 微軟官方提供的工具
- 獲得 user SID
- psgetsid.exe username
- SID -> user
- psgetsid.exe SID
- 也可以在 process explorer 的 process 點兩下然後進去 security 欄位就可以看到
Privileges
- 簡單來說就是帳號的權限,
- only use for local machine
- Example
- SeChangeNotifyPrivilege
- SeLoadDriverPrivilege
- SeCreateTokenPrivilege
- 可以用
whoami /priv
列出帳號權限 - Super Privileges
- SeDebugPrivilege
- 可以 open 任意 process (protected process 除外),直接忽略 security descriptor,可以用 CreateRemoteThread 來 inject code
- SeRestorePrivilege
- 可以覆蓋任意檔案,包含系統檔案
- SeTcbPrivilege
- Act as part of the os. This user right allows a process to impersonate any user without authentication
- SeLoadDriverPrivilege
- 可以載入 Driver 並獲得 kernel code 執行權限
- SeCreateTokenPrivilege
- 可以 create any user account’s token
- SeTakeOwnershipPrivilege
- 可以改變任意物件的 owner
- 也就是可以改 DACL
- SeDebugPrivilege
Access Token
- Windows 用 access token 來保障 process 或 thread 的安全
- 當使用者登入 windows 時,lsass 會依據 security database 來生一組 access token 代表當前登入的使用者
- Primary token
- 通常系統在一個 thread 跟受到保護的物件時只會用 primary token
- Impersonation token
- thread 可以發行跟自己 process 不一樣的安全內容,這個機制就是 impersonation
- 當 thread 在 impersonating 安全檢查會用 impersonation token 而不是原本 process 的 token
- token 內包含的資訊
- SID
- integrity level
- privileges of user and user’s groups
- whether the token is a primary or impersonation token
- token 的結構
- Privileges (_SEP_TOKEN_PRIVILEGES)
- 表示該 token 有的 privileges
- Present
- 表示該 token 具有的 Privileges
- Enabled
- 表示具有的 Privileges 啟用的狀態
- Privilege 有 Enable 才真正擁有該權限
- 可以透過 AdjustTokenPrivileges 來調整 Token 中 Privilege 的狀態
- 可以從 Present -> Enabled
- 在 Medium 的 integrity levle 並非每個都可以改,特殊權限無法直接啟用
- AuditPolicy
- 表示要針對該 token 做的 AuditPolicy
- UserAndGroups (_SID_AND_ATTRIBUTES)
- Points to an array of SID_AND_ATTRIBUTES
- array[0] 是 token’s user ID. Any additional elements are those of goups.
- SID
- Pointer to a SID structure
- Attributes
- Specifies attributes of the SID
- SIDs have attributes that indicate whether they are currently enabled, disabled, or mandatory, and how they are used
- IntegrityLevelIndex
- 表示 Integrity Level 的 SID 在 UserAndGroups 的 index
- Privileges (_SEP_TOKEN_PRIVILEGES)
- 串起來的結構圖參考
- windbg 相關指令
- !token [address of _TOKEN]
- 查看該 token 的資訊
- dt _token [address of _TOKEN]
- !token [address of _TOKEN]
Security Descriptor
- 紀錄前面那些安全資訊,紀錄誰可以對什麼物件做什麼
- 每個 object 的都有個 security descriptor 來決定誰可以存取什麼物件
- 裡面包含
- SIDs for the owner and primary group of an object
- DACL
- SACL
- 能不能存取該物件,都是由該 Object 的 Security descriptor 決定
- 藉由比對要存取的 object 的 security descriptor 及 process 本身的 access token 決定
- 存在 object header 中
Access Check
- 決定該 user 是否有權限存取該物件主要有下列兩個判段條件
- Mandatory Integrity Check (MIC)
- Integrity level
- 優先判斷
- DACL
- Determines the access that a specific user account has to an object
- Expample - Access an object
- low integrity level (If zero DACL)
- R/W to all object with integrity level of low
- R to object with integrity level of medium or high
- low integrity level (If zero DACL)
- Example - Access a process
- Low integrity level (If zero DACL)
- R/W to all process with integrity level of low
- No R/W to process with integrity level of medium or high
- [No-Read-Up]
- Low integrity level (If zero DACL)
- 當 access 物件的檢查方式
- 如果沒有 DACL 就會分配所有權限
- 看該 user 是不是 owner,是的話就會去找 DACL 中是否有該 Owner Right SID (S-1-3-4),接下來的操作就會使用該 SID
- 沒有就會給 read-control 和 write-DACL 的權限
- 接下來依序看 DACL 中的 ACE
- 如果需求的權限都 match 並且都許可,就會 allow
- 如果遇到 deny 該 user 的 ACE,會直接 deny 並不會看接下來的 ACE
- 如果找到最後,依舊都沒有 match 就會 deny
Control Register
- A control register is a processor register which changes or controls the general behavior of a CPU or other digital device. Common tasks performed by control registers include interrupt control, switching the addressing mode, paging control, and coprocessor control.
- 決定一些 CPU 的行為
- 定址模式
- 是否啟用 interrupt
- CR2
- 存放 Page fault 時的 Virtual Address
- CR3
- 在有開 paged 的情況下會啟用,用來讓 CPU 做 address transition,該 register 存放當前 process 的 page table 位置 (PML4)
- CR4
- Used in protected mode to control operations such as virtual-8086 support, enabling I/O breakpoints, page size extension and machine-check exceptions.
- CR8
- 表示當前的 IRQL
MMU
- MMU
- 在現代 os 中,當我們 access 一個記憶體時,看到的並不是真正的記憶體位置,而是 Virtual Address,當我們 access 的當下,CPU 才會透過 MMU 去將 Virtual Address 轉換成 physical address
- Pages and Address translatin
- PTE
- self-modify
- VADs
- PFN Database
- Title: AngelBoy Windows Kernel Exploitation Note
- Author: kazma
- Created at : 2024-12-24 07:17:02
- Updated at : 2024-12-25 18:53:44
- Link: https://kazma.tw/2024/12/24/AngelBoy-Windows-Kernel-Exploitation-Note/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments