網(wǎng)站建設(shè)與管理初級(jí)教學(xué)搜索引擎優(yōu)化排名品牌
? 目錄 ?
- 🛫 問題
- 描述
- 環(huán)境
- 1?? 代碼編寫
- 開源代碼搜索
- 自己擼代碼
- procexp確定句柄對(duì)應(yīng)的文件名并過濾
- 2?? PsExec.exe提權(quán)
- 定位找不到`EABackgroundService.exe`的問題
- PsExec.exe提權(quán)
- PsExec.exe原理
- 🛬 結(jié)論
- 📖 參考資料
🛫 問題
描述
由于工作原因,需要對(duì)EA平臺(tái)進(jìn)行分析,其中一項(xiàng)就是監(jiān)控文件操作。
本篇文章主要目的是Frida實(shí)操應(yīng)用,如果有更深入的需求,推薦使用ProcMon.exe
,通過各種刪選條件進(jìn)行監(jiān)控操作。
ps: 對(duì)于有些軟件,會(huì)檢測
ProcMon.exe
等各種軟件,需要這時(shí)候可以使用frida進(jìn)行監(jiān)控。
環(huán)境
版本號(hào) | 描述 | |
---|---|---|
文章日期 | 2023-05-05 | |
操作系統(tǒng) | Win11 - 21H2 - 22000.1335 | |
Python | 3.7.1 | |
frida.exe | 15.0.18 | |
1?? 代碼編寫
開源代碼搜索
首先想到的就是找下有沒有開源的代碼,結(jié)果找到一個(gè)
https://github.com/nowsecure/frida-fs
,代碼下好,編譯好了,結(jié)果發(fā)現(xiàn),只是個(gè)文件操作的庫。
后來有找了該作者的另一個(gè)庫
https://github.com/nowsecure/fsmon
,這次看清楚了,支持Android、ios、mac,唯獨(dú)不支持windows!!!
總之,沒有找到合適的監(jiān)控文件的frida代碼。
自己擼代碼
文件讀寫相關(guān)的函數(shù)有ReadFile、WriteFile、CreateFileW(CreateFileA最終調(diào)用的也是CreateFileW)等,我們以
CreateFileW
為例,講解下frida提供的各種接口及含義。
Module.findExportByName
,根據(jù)模塊名(“kernel32.dll”)和導(dǎo)出函數(shù)名(“CreateFileW”),獲取目標(biāo)函數(shù)地址。Interceptor.attach
,執(zhí)行hook的函數(shù),傳遞一個(gè)目標(biāo)函數(shù)地址和hook后的處理方法集合。onEnter & onLeave
,處理函數(shù)集合的兩個(gè)常見方法,分別代表調(diào)用函數(shù)前和調(diào)用后的處理。
- 對(duì)于
onEnter: function (args)
,我們可以查看并修改參數(shù)相關(guān)值。- 對(duì)于
onLeave: function (retval)
,這里我們查看并修改函數(shù)返回結(jié)果。
完整代碼:
const win32 = Process.platform === 'windows';if (win32) {Interceptor.attach(Module.findExportByName("kernel32.dll", "ReadFile"), {onEnter: function (args) {const hFile = args[0];const lpBuffer = args[1];const nNumberOfBytesToRead = args[2];const lpNumberOfBytesRead = args[3];const lpOverlapped = args[4];console.log(`ReadFile called with hFile: ${hFile}, lpBuffer: ${lpBuffer}, nNumberOfBytesToRead: ${nNumberOfBytesToRead}, lpNumberOfBytesRead: ${lpNumberOfBytesRead}, lpOverlapped: ${lpOverlapped}`);},onLeave: function (retval) {console.log(`ReadFile returned: ${retval}`);}});Interceptor.attach(Module.findExportByName("kernel32.dll", "CreateFileW"), {onEnter: function(args) {var fileName = args[0].readUtf16String();console.log("Opening file: " + fileName);if (fileName.endsWith('\\IS')) {// Thread.sleep(5*1000)}},onLeave: function (retval) {console.log(`Opening returned: ${retval}`);}});Interceptor.attach(Module.findExportByName("kernel32.dll", "WriteFile"), {onEnter: function(args) {var fileHandle = args[0];// console.log("Enter Writing ", fileHandle.toInt32() === 0xbc4);if (fileHandle.toInt32() === 0xbc4) {return}console.log("Writing " + '0' + " bytes to file handle " + fileHandle);var buffer = args[1];var length = args[2];console.log("Writing " + length + " bytes to file handle " + fileHandle);},onLeave: function (retval) {// console.log(`Writing returned: ${retval}`);}});
}
procexp確定句柄對(duì)應(yīng)的文件名并過濾
上述代碼執(zhí)行后,會(huì)有大量的日志輸出,我們可以通過
fileHandle.toInt32()
過濾我們關(guān)心的句柄。
比如,我們不關(guān)心frida自己的句柄產(chǎn)生的日志,我們通過procexp
查看frida相關(guān)句柄(0xb3c),當(dāng)fileHandle.toInt32() === 0xb3c
時(shí),直接返回,不再輸出日志。
代碼如下:
Interceptor.attach(Module.findExportByName("kernel32.dll", "WriteFile"), {onEnter: function(args) {var fileHandle = args[0];// console.log("Enter Writing ", fileHandle.toInt32() === 0xbc4);if (fileHandle.toInt32() === 0xb3c) {return}
2?? PsExec.exe提權(quán)
定位找不到EABackgroundService.exe
的問題
代碼寫完后,發(fā)現(xiàn)直接執(zhí)行frida命令,會(huì)提示找不到進(jìn)程。
排查一圈后,發(fā)現(xiàn)EABackgroundService.exe
進(jìn)程是SYSTEM
權(quán)限,frida無權(quán)查看該進(jìn)程。
PsExec.exe提權(quán)
很自然的,想到了PsExec.exe,查了資料,發(fā)現(xiàn)增加
-i -d -s
這三個(gè)參數(shù)就能將frida提取為SYSTEM,這三個(gè)參數(shù)的含義如下:
- -i 運(yùn)行程序,使其與遠(yuǎn)程系統(tǒng)上指定會(huì)話的桌面進(jìn)行交互。 如果未指定會(huì)話,則進(jìn)程在控制臺(tái)會(huì)話中運(yùn)行。 嘗試使用重定向的標(biāo)準(zhǔn) IO) 以交互方式 (運(yùn)行控制臺(tái)應(yīng)用程序時(shí) ,需要 此標(biāo)志。
- -d 不要等待進(jìn)程終止 (非交互式) 。
- -s 在系統(tǒng)帳戶中運(yùn)行遠(yuǎn)程進(jìn)程。
PsExec.exe原理
PsExec.exe是Sysinternals Suite中的一個(gè)工具,它可以在本地或遠(yuǎn)程計(jì)算機(jī)上啟動(dòng)進(jìn)程。它的原理是通過在遠(yuǎn)程計(jì)算機(jī)上安裝一個(gè)服務(wù)程序(PsExecSvc.exe),該服務(wù)程序允許PsExec.exe在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行命令。
它的提權(quán)原理是利用 Windows 系統(tǒng)中的一個(gè)名為“服務(wù)控制管理器”的組件,該組件可以啟動(dòng)和停止系統(tǒng)服務(wù)。
PsExec.exe 利用這個(gè)組件啟動(dòng)一個(gè)新的服務(wù),該服務(wù)的權(quán)限可以被設(shè)置為 LocalSystem,這是 Windows 系統(tǒng)中最高的權(quán)限級(jí)別之一。一旦服務(wù)被啟動(dòng),PsExec.exe 就可以在該服務(wù)的上下文中啟動(dòng)進(jìn)程,從而獲得了更高的權(quán)限。
具體來說,PsExec.exe 的提權(quán)過程如下:
- PsExec.exe 啟動(dòng)一個(gè)新的服務(wù),該服務(wù)的權(quán)限可以被設(shè)置為 LocalSystem。
- 在該服務(wù)的上下文中,PsExec.exe 啟動(dòng)一個(gè)新的進(jìn)程。
- 新的進(jìn)程繼承了服務(wù)的權(quán)限,因此具有更高的權(quán)限。
需要注意的是,使用 PsExec.exe 進(jìn)行提權(quán)需要具有管理員權(quán)限。否則,PsExec.exe 將無法啟動(dòng)新的服務(wù)。此外,使用 PsExec.exe 進(jìn)行提權(quán)也可能會(huì)被殺毒軟件視為惡意行為,因此需要謹(jǐn)慎使用。
🛬 結(jié)論
EA平臺(tái)使用了很多技術(shù),如protobuf、rpc、各種加密等,有需要分析的,可以一起探討。
📖 參考資料
- PsExec.exe下載地址及使用說明 https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
ps: 文章中內(nèi)容僅用于技術(shù)交流,請(qǐng)勿用于違規(guī)違法行為。