1. 程式人生 > 其它 >CreateRemoteThread盲注提權原理分析

CreateRemoteThread盲注提權原理分析

首先我們來看下程序程注入的核心邏輯(不考慮尋找目標程序、不考慮注入內容的執行)

/*
注入惡意Payload:
OpenProcess 可以開啟目標程序
VirtualAllocEx 在目標程序中分配一塊記憶體區域
WriteProcessMemory 在剛剛分配的記憶體區域中寫入惡意的Payload
以上3個函式可以實現Payload的注入
*/

舉一個具體的反射性DLL的例子

/*
#1 使用RWX許可權開啟目標程序(OpenProcess),併為該DLL分配足夠大的記憶體(VirtualAllocEx)。
#2 將DLL複製到分配的記憶體空間(WriteProcessMemory)。
#3 計算DLL中用於執行反射載入的匯出的記憶體偏移量(GetReflectiveLoaderOffset)。
#4 呼叫CreateRemoteThread(或類似的未公開的API函式RtlCreateUserThread)在遠端程序中開始執行,使用反射載入函式的偏移地址作為入口點。
#5 反射載入函式使用適當的CPU暫存器查詢目標程序的程序環境塊(PEB),並使用它查詢記憶體中的地址kernel32.dll以及任何其他所需的庫。
#6 解析的KERNEL32出口目錄中找到所需的API功能,如記憶體地址LoadLibraryA,GetProcAddress和VirtualAlloc。
#7 使用這些函式,然後正確載入DLL(本身)到記憶體中,並呼叫它的入口點,DllMain。
*/

總結:我們可以看到此類注入基本需要WriteProcessMemory函式的,也就是說必須有目標程序記憶體讀寫許可權,當我們沒有程序記憶體讀寫許可權的時候這個思路就行不通了,那我們該怎麼呢?

CreateRemoteThread盲注來解決以上問題

我們可以不具備目標程序的讀寫許可權,但是我們至少需要具備以下三種許可權

/*
(1) PROCESS_CREATE_THREAD
(2) PROCESS_CREATE_PROESS
(3) PROCESS_QUERY_LIMITED_INFORMATION
*/

因為經典的VirtualAllocEx、WriteProcessMemory、CreateRemoteThread的步驟不再適用(我們沒有讀寫許可權),我們就必須找到合適的新方法來執行我們的盲注的Code,最簡單的方法就是

system("path_to_script");

因此,我們得找到兩個東西,我們需要用到這兩個東西去生成一個執行緒,儘管現在有ASLR,但是還是有很大的接近100%的概率在2個不同的使用者會話程序中得到同樣的系統呼叫地址。

/*
#1 Windows中我們擁有許可權的一個指向某個位置的路徑字串
#2 我們的系統呼叫(例如,msvcrt.dll的_wsystem函式是一個好選擇)
*/

定位呼叫和字串

  • 定為呼叫
void *StartAddress = (void *)GetProcAddress(LoadLibrary("msvcrt.dll"),"_wsystem");
  • 定位字串
    通常的可用字串有下列:
/*
C:\Users\Default
%temp%
%appdata%
...
*/
strings -eb shell32.dll | grep -P "^(\\\\[a-zA-Z0-9]{3,20}){2}^"
  • 整一個bat檔案做個做_wsystem的payload即可
net user /add adminuser adminpassword
net localgroup administrators adminuser /add
博主簡介:博主國內安全行業目前最強大的網路安全公司做技術研究員,常年做技術工作。 獲得過以下全國競賽大獎: 《中國電子作品大賽一等獎》 《雲端計算技術大賽一等獎》 《AIIA人工智慧大賽優勝獎》《網路安全知識競賽一等獎》 《高新技術個人突出貢獻獎》,並參與《虛擬化技術-**保密**》一書編寫,現已出版。還擁有多項專利,多項軟體著作權! 且學習狀態上進,立志做技術牛逼的人。座右銘:在路上,永遠年輕,永遠熱淚盈眶。可郵件聯絡博主共同進步,個人郵箱:[email protected]