在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權限後所能做的事情遠遠不止我們上麵所說的這些,希望大家共同挖掘。
|