iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
Security

Windows Security 101系列 第 6

[Day6] Process Creation

  • 分享至 

  • xImage
  •  

以下是根據 Windows Internals 重畫的圖,Process Creation 流程上可以分成 7 個 Stage:

https://ithelp.ithome.com.tw/upload/images/20230920/20120098VmmHRDn7SS.png

Process Creation 的實作主要會是在 ntoskrnl.exe 的 NtCreateUserProcess 中實現。

以下是 NtCreateUserProcess 的 prototype:

NTSTATUS
NTAPI
NtCreateUserProcess(
    _Out_ PHANDLE ProcessHandle,
    _Out_ PHANDLE ThreadHandle,
    _In_ ACCESS_MASK ProcessDesiredAccess,
    _In_ ACCESS_MASK ThreadDesiredAccess,
    _In_opt_ POBJECT_ATTRIBUTES ProcessObjectAttributes,
    _In_opt_ POBJECT_ATTRIBUTES ThreadObjectAttributes,
    _In_ ULONG ProcessFlags,
    _In_ ULONG ThreadFlags,
    _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
    _Inout_ PPS_CREATE_INFO CreateInfo,
    _In_ PPS_ATTRIBUTE_LIST AttributeList
);

基本上就是將 process 和 thread 的參數初始化,並且完成在 kernel 中建立 process 需要的操作。

以下非常粗略的介紹各個 Stages:

Stage 1: Converting and Validating Parameters and Flags

這個部分會是在 Kernel32.dll 的 CreateProcessInternalW 中處理,之後便會調用 NtCreateUserProcess

Stage 2: Opening the Image to Be Executed

NtCreateUserProcess 在這階段會做到以下幾件事:

  • 將 PE File 載入
    • 檢查附檔名,是否在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 有可執行的 image file
    • 判斷該以何種方式載入 PE File,並替換 image file

https://ithelp.ithome.com.tw/upload/images/20230920/20120098QcOFHB0Z8K.png
(ref: https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seqNum=3)

  • 建立 section object 並映射至 memory

Stage 3: Creating the Windows Executive Process Object

NtCreateUserProcess 在這階段主要透過 PspAllocateProcess 和 PspInsertProcess 完成

PspAllocateProcess:

  • 會建立並初始化3個重要的結構 KPROCESS、EPROCESS、PEB

PspInsertProcess:

  • 如果有開啟 auditing of processes,那麼這邊會將 process creation 寫入 Security event log
  • 將 process 加入 PsActiveProcessHead 的 list 的最後
  • 建立 process handle 並回傳

Stage 4: Creating the Initial Thread and Its Stack and Context

NtCreateUserProcess 在這階段主要透過 PspAllocateThread 和 PspInsertThread 完成,然而在 ntoskrnl.exe 版本 10.0.19041.804 中執行順序其實是 PspAllocateProcess ⇒ PspAllocateThread ⇒ PspInsertProcess ⇒ PspInsertThread ,所以有可能是因為版本而產生的差異

PspAllocateThread:

  • 會建立並初始化3個重要的結構 KTHREAD、ETHREAD、TEB

PspInsertThread:

  • PspCallProcessNotifyRoutines 和 PspCallThreadNotifyRoutines 皆是在此被呼叫,這些 function 都是 kernel callbacks (這非常關鍵,也是之後幾篇攻擊的重點)
  • 將 thread 加入 process 中需要做的操作,包含建立 Thread ID、建立 thread handle 並回傳、增加 process 的 thread object count、將 thread 加入 process 的 thread list 等

https://ithelp.ithome.com.tw/upload/images/20230920/20120098J6J70KU3Sm.png

https://ithelp.ithome.com.tw/upload/images/20230920/20120098z5rl8mLUfp.png

Stage 5: Performing Windows Subsystem–Specific Post-Initialization

從 NtCreateUserProcess 返回 kernel32.dll 的 CreateProcess 後,將執行與 Windows Subsystem (csrss.exe) 相關的SxS information 操作,像是 manifest 檔案或 DLL redirection 等。

Stage 6: Starting Execution of the Initial Thread

在這個階段,process 已經具備可以執行的環境,除非當初 CreateProcess 有給 CREATE_SUSPENDED 的 flag,否則會直接執行第一條 thread。

Stage 7: Performing Process Initialization in the Context of the New Process

新建立的 thread 一開始會執行 KiThreadStartup,KiThreadStartup 會調用 PspUserThreadStartup,而 PspUserThreadStartup 會設置 APC routine ntdll!LdrInitializeThunk,直到返回 user mode 前才觸發 APC routine。(APC 全名為 Alertable Procedure Call,我的理解是這種非同步機制可以讓 kernel 變得更 preemptible)

最終,返回 user mode 後執行 kernel32!BaseThreadStartThunk

Appendix: The Structures Related to Process

Process Environment Block (PEB)

PEB 是 process 在 user mode 的結構,在 Windbg 下 dt nt!_PEB可以看到完整的結構,以下選了幾個重要的 elements:

  • BeingDebugged
    • 表示是否正在被 debugged
  • NtGlobalFlag
    • 透過 AND 0x70 也能表示是否被 debugged,以下是相關的 bit flag
      • FLG_HEAP_ENABLE_TAIL_CHECK (0x10)
      • FLG_HEAP_ENABLE_FREE_CHECK (0x20)
      • FLG_HEAP_VALIDATE_PARAMETERS (0x40)
  • ProcessParameters
    • 創建 process 時的參數,包含 ImagePathName 和 CommandLine
  • Ldr
    • 有三種 module list:InLoadOrderModuleList、InMemoryOrderModuleList、InInitializationOrderModuleList
    • 通常都是使用 InMemoryOrderModuleList 來列舉載入的 DLL

EPROCESS

EPROCESS 是 process 在 kernel mode 的結構,在 Windbg 下 dt nt!_EPROCESS 可以看到完整的結構,以下選了幾個重要的 elements:

  • Pcb
    • 其實 KRPOCESS 會是在 EPROCESS 的最前面,會是一整個 structure 而不是 pointer
    • 可以下 dt nt!_KPROCESS 看完整的結構
  • ActiveProcessLinks
    • 這個 circularly double linked list 會記載所有的 process
    • nt!PsActiveProcessHead 會記錄第一個 EPROCESS “System”
  • Token
    • 紀錄當前 process 的 privilege
    • 可以用在 Kernel Exploit 的提權
  • Peb
  • Vad (Virtual Address Descriptor)
    • 紀錄該 process 所佔用的記憶體區段
    • AVL Tree,節點的結構是 _MMVAD
  • ParentCid
    • parent process PID
  • Cid
    • PID

Kernel Callbacks

先前提到的 kernel callbacks,簡單來說,就是 Windows 提供了一系列的 callback API,讓 driver 開發者可以註冊這些 callback 在某些 kernel function 中被調用,以下是 kernel 有提供的 callbacks

  • PsSetCreateProcessNotifyRoutine
    • 調用時機:create/terminate processes
    • 其他 APIs:PsSetCreateProcessNotifyRoutineEx (allows to kill them before they can run)、PsSetCreateProcessNotifyRoutineEx2
  • PsSetCreateThreadNotifyRoutine
    • 調用時機:create/terminate threads
    • 其他 APIs:PsSetCreateThreadNotifyRoutineEx
  • PsSetLoadImageNotifyRoutine
    • 調用時機:DLLs/Drivers loaded by processes
  • CmRegisterCallback
    • 調用時機:registry operation
    • 其他 APIs:CmRegisterCallbackEx
  • ObRegisterCallbacks
    • 調用時機:thread, process, and desktop handle operations

本篇的內容都相當粗略,像是我完全沒講到 Windows Subsystem (csrss.exe) 的部分,只能先記錄一些大重點方便之後可以快速查找相關內容,想更深入了解內容的讀者可以閱讀 Windows Internals 同時搭配 ntoskrnl.exe 的 decompiled code,這樣會比較好理解 Process Creation。

接下來的五天,我將會每天分享一種關於 Process 的 Defense Evasion 攻擊手法

Reference


上一篇
[Day5] Shellcoding
下一篇
[Day7] Process Injection Party (Part 1): Process Hollowing
系列文
Windows Security 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言