遊戲安全之借刀殺人

遊戲安全之借刀殺人

0x0簡介

我們知道現在大多數網絡遊戲都是有遊戲保護的,由於遊戲保護的原因當我們使用第三方程序去操作(讀寫)遊戲進程內存的時候,會提示沒有讀寫權限。

這是因爲,我們在打開遊戲進程(OpenProcess)獲取句柄(Handle)的時候,遊戲的驅動保護註冊有回調過濾我們的句柄權限。

然而在Windows下是有一些系統進程必須與其他進程進行交互的,所以這些系統進程會保存有被保護遊戲進程的句柄,並且遊戲保護是不容易對其做權限過濾的。例如:lsass.exe ,csrss.exe等。

所以文章標題的“借刀殺人”,指的就是直接利用系統交互進程中的句柄來操作遊戲進程內存。這種方式是也是程序全部運行在Ring3層來讀寫的比較隱藏的方法。

0x1句柄劫持

首先查看lsass.exe進程中的句柄,發現它有打開受保護的遊戲進程crossfire.exe,且權限爲0x1478,具有查詢、讀寫進程等功能。

我們要做的就是,注入進lsass.exe進程,直接使用這個0x1688句柄,調用ReadProcessMemory(WriteProcessMemory)或者更底層的NtReadVirtualMemory(NtWriteVirtualMemory)或者下文講的自己實現讀寫函數。 

0x2句柄枚舉

上文我們是用了微軟的procexp工具看到的句柄,那麼我們自己怎麼用代碼自動獲取這個句柄呢?

使用NtQuerySystemInformation的第16位功能號枚舉系統句柄信息:

或者使用NtQueryInformationProcess的第51位功能號枚舉進程句柄信息(要求系統Windows8以上): 

0x3關於注入

在高版本的Windows系統上注入例如lsass的系統程序有可能會失敗,我們可以嘗試提升權限或者內存加載。

在lsass和csrss等進程沒辦法繪製窗口或者使用彈窗想要顯示我們的內容,因爲它們運行在“Session 0”,我們的應用程序運行在其他Session。

“從Vista 開始Session 0 中只包含系統服務,其他應用程序則通過分離的Session 運行,將服務與應用程序隔離提高系統的安全性。如下圖所示:

這樣使得Session 0 與其他Session 之間無法進行交互,不能通過服務向桌面用戶彈出信息窗口、UI 窗口等信息。”

實在要想用彈窗輸出信息的話可以用WTSSendMessageA,如下圖:

0x4進程通訊

外部進程與注入的Dll交互就用到進程間的通訊技術了。可以網上搜索一下這方面的資料,一般的命名管道,套接字,共享內存,都可以用來作爲通訊手段。

在這裏使用了命名管道和共享內存,不過命名管道可能容易被檢測。這裏給出共享內存的代碼:

我這裏在共享內存中通訊使用了內存標誌(類似於LOCK),如下: 

0x5檢測與對抗

(1)Hook ReadWrite

遊戲保護想要針對這種讀寫方式,可以Hook進程lsass.exe的讀寫函數,然後做控制驗證。

根據Joel Noguera提供的資料來看EAC中是這麼來做的。

不過在我測試的兩個遊戲中,並沒有對其處理(我電腦上只有這兩個遊戲)。所以下邊對抗部分的截圖直接引用了Joel Noguera的。 

(2)Bypass Hooks

從上邊看到EAC遊戲保護Hook了lsass.exe的讀寫函數之後,我們就不能正常調用系統讀寫函數了。但還是有騷操作的。

我們來看NtReadVirtualMemory的實現:

這個函數實現也是很簡單:傳參,把服務號放進eax中,判斷是否支持快速調用(syscall),不支持就走int 2E,進入內核。

所以我們可以自己實現一個相同的函數來繞過遊戲保護的Hook。上文中的測試圖MsgType=ZwReadVirtualMemory就是如下圖的實現方式。

(3)Downgrading the HANDLE

因爲Bypass Hooks技術的出現,使得遊戲保護再次升級,這次直接將lsass.exe的遊戲進程句柄降權,去掉了其讀寫權限。如下圖:

至此,對抗的主戰場也就轉移到了內核層。 

(4)CVE-2017-9769

因爲遊戲保護對於Ring3層獲取進程權限的嚴格限制,外掛製作者們開始使用跟保護同級別的驅動程序來繞過權限過濾等。

在使用的這些驅動中,一部分是外掛製作者們自己實現的,有些雖然功能強大,但是獲取正規簽名比較困難也很容易進入遊戲保護的黑名單中。

還有一部分是一些第三方正規廠家可受利用的驅動,如鼠標驅動,顯卡驅動等,下邊我們要講的就是使用這類的驅動程序來讓我們的程序更加隱蔽的獲取高的權限。所以這裏的“刀”就又變成了“容易被利用”的驅動。

CVE-2017-9769指的是雷蛇的一個設備驅動(Razer Synapse 2.20.15.1104),被發現可以通過控制碼直接使用內核調用ZwOpenProcess獲取高權限句柄。如下圖:

經過測試,雖然獲得了一個較高權限(0x1FFD85)的句柄(0x24),但是對於測試的這款遊戲(只怪我的計算機上只有這個遊戲),依然沒有讀寫內存的權限。

當然這只是一個測試,感興趣的安全工作者們經過授權也可以嘗試使用這種辦法測試其他遊戲。(其他遊戲也許有機會攻擊成功)

(5)CVE-2017-15303

由於上文中獲取的權限沒有達到我的要求,所以我想再來一次騷操作。

CVE-2017-15303指的是CPUIDCPU-Z1.43之前的版本中存在安全漏洞,該漏洞源於程序可以向內核模式驅動程序發送控制碼(IOCTL 0x9C402430)調用功能,利用該漏洞寫入任意內存,從而提升權限。

當然文章只是在講一種提權的思路,你也可以使用其他的驅動程序:例如 GIGABYTE Driver (CVE-2018-19321),ATSZIO Driver,Intel Driver等。這裏我用了CPUZ1.41驅動版本。

提權的思路就是,

1.通過驅動映射物理地址

2.遍歷搜索我當前進程(OpenExp.exe)的EPROCESS

3.找到他的ObjectTable

4.找到PHANDLE_TABLE_ENTRY

5.通過驅動寫物理地址,修改句柄HANDLE_TABLE_ENTRY中的訪問權限爲最高權限。

以下是主要的修改權限函數和ExpLookupHandleTableEntry函數

最終我們修改了這個句柄的權限,實現了具有任意讀寫的0x1fffc5高權限 

(6)Others

CVE-2018-19320是GIGABYTE Driver驅動級拷貝虛擬內存的漏洞,CVE-2018-19321是GIGABYTE Driver驅動級讀寫物理內存的漏洞,都是使用GIO這個設備發送控制碼,更容易配合。使用方式與上文中的操作物理內存提權類似。不再寫了。

使用提權技術也可以把被降權的如lsass.exe進程中的權限提升。不再寫了。

又或者自己實現殺傷力更強的“刀”,也不再寫了。不然檢測與對抗寫下去沒得結束了。

0x6總結

1.“外掛”與“保護”你可以把它看作是“病毒”與“殺毒”,是對抗的過程。

2.雙方的對抗現在都已經升級到了較高的技術,他們的防禦與利用也已經需要一定的門檻了。

3.大多數時候,都是“病毒”或者“外掛”使用更新的技術。

4.安全對抗的路還很長。

0x7聲明

這篇文章是自己學習的產物,只是按照一些前輩的思路走了一遍過程。我們的文章也旨在於技術研究,文中一些測試只是爲了給讀者更好的閱讀理解效果而進行的。沒有其他目的。

我們不贊同使用其中的技術製作計算機病毒或者遊戲外掛等程序。我們反對任何有違反法律的行爲。如果有人使用此方面的技術,對於其造成的任何不良後果都與我無關。

我的文章可能很多地方講的不是很清楚,想了解更多的可以看最後的《參考》。

 

參考:

《Abusing System Programs》——ContionMig

《Unveiling the underground world of Anti-Cheats》——Joel Noguera(REcon2019)

《[翻譯]Windows exploit開發系列教程第十九部分:內核利用程序之Razer rzpnk.sys中的邏輯bug 》——玉涵翻譯

《GIGABYTE Drivers Elevation of Privilege Vulnerabilities》——SECUREAUTH

《HandleMaster》——MarkHC

《CVE-2019-8372 Local Privilege Elevation in LG Kernel Driver》——Jackson

《Vulnerable Driver Megathread》——IChooseYou

《驅動注入用戶線程之跨session通知csrss之真正解決》——lanjingling888

《ProcessHacker 項目 枚舉句柄部分源碼》

 

首發看雪,博客中轉載一份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章