AngelBoy Windows Kernel Exploitation Note

kazma 成大資安社 創辦人/社長

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
  • 架構圖
    • kernel
    • 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 等

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 會用到的指令

Basic knowledge

Process

  • _EPROCESS
    • The key data structures of windows process
    • 在 process 創建時就會建立
    • 類似 linux 中的 task structure
    • 系統中的每個 process 會串成一個 double link list

pcb

  • 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 cmd
      • 可以用 dt _EPROCESS [剛剛其中一個 process address] 看到詳細結構資訊 detail
    • .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

pcb

Thread

thread
tcb

  • 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

Integrity level

integrity

  • 預設程式會跑在 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 勾起來就會看到了 process

ACL

  • DACL (Discretionary Access Control List)
    • Specifies who has what access to the object
      • 當 user 要 access 一個 object 時會看 DACL 是否有權限
  • 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
    • sid
    • 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 欄位就可以看到

DACL

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

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 的結構 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
  • 串起來的結構圖參考 summary
  • windbg 相關指令
    • !token [address of _TOKEN]
      • 查看該 token 的資訊
    • dt _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
  • 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]
  • 當 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