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