遠程啓動服務和傳送晚間

擁有局域網內的遠程機器(NT操作系統)的系統管理員賬號密碼,不借助事先安裝客戶端,如何在該機器上執行程序?
一般來說,對遠程機器的攻擊第一步是找到漏洞,第二步是獲取權限,最後一步是在上面執行程序。實際上最後一步已經是合法操作了,本文介紹的,就是在合法情況下如何在遠程機器上運行程序。系統平臺僅限於WindowsNT/2000以上。

1 IPC連接
利用已經知道的系統管理員用戶名和密碼,和遠程機器建立IPC$管道連接。運用的API函數是:WNetAddConnection2。IPC$管道是NT默認情況下開通的進程通訊管道,通過這個管道,本地機器可以用已知的用戶名和密碼登陸到遠程機器,並擁有相應的權限。

CString strTarget = "////" + m_strComputerName + "//IPC$";
NETRESOURCE nr;
nr.dwType       = RESOURCETYPE_ANY; 
nr.lpLocalName  = NULL; 
nr.lpRemoteName = strTarget.GetBuffer(strTarget.GetLength()); 
nr.lpProvider   = NULL;
WNetAddConnection2(
 &nr,
 m_strPassword.GetBuffer(m_strPassword.GetLength()),
 m_strUserName.GetBuffer(m_strUserName.GetLength()),
 FALSE);

補充說明一點,其實,通過字典“暴力破解”出系統管理員密碼,然後建立IPC連接獲取對遠程機器的完全控制權,正是中級水平的黑客們常用的攻擊手段。

2 傳送文件
服務(NT Service)是NT系統的特色,服務程序在用戶登陸前已經啓動,驅動程序服務甚至啓動得更早。服務擁有系統的最高權限,不從屬於任何用戶,擁有對系統資源的完全控制權。
建立IPC連接後,利用IPC管道,傳送一個特製的服務文件到遠程機器。之後安裝並啓動這個服務,我們想在遠程機器上做的工作,就是通過它來執行的。如果你要在遠程機器運行程序,那麼別忘了把程序文件也一起傳過去。
傳送文件沒有什麼特別,使用的API是CopyFile。

CString strResource;
CString strTarget;
GetDefaultPathFile(strResource);
strTarget = "////" + m_strComputerName + "//admin$//system32//";
CopyFile(strResource, strTarget, TRUE);

有時候CopyFile會失敗,這時候要用GetLastError查看錯誤代碼,如果是L80,是這個文件已經在遠程機器上存在了,這種情況一般是不需要退出程序的。
你可以把CopyFile的最後一個參數設置成FALSE,這樣當文件已經存在時就會被覆蓋,當然,這種行爲不被提倡。尤其當你是在對遠程機器進行IPC入侵的時候(簡單說就是黑它!),這種破壞遠程機器上已有文件的行爲是很危險的。

3 安裝並運行服務
安裝服務相對簡單,使用CreateService,這裏不給出代碼。記得在OpenSCManager的時候第一個參數要使用遠程機器的機器名。

schSCManager = OpenSCManager(
 m_strComputerName.GetBuffer(m_strComputerName.GetLength()),
 NULL,
 SC_MANAGER_ALL_ACCESS);

啓動服務比較有講究,在本機你可以直接StartService不考慮後果,但是在控制遠程機器的情況下,不同操作系統的服務啓動等待時間是不一樣的,因此如果不進行啓動狀態查詢,就會出錯。

StartService(schService, 0, NULL);
QueryServiceStatus(schService, &ssStatus);
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
while (SERVICE_START_PENDING == ssStatus.dwCurrentState) 
{
 dwWaitTime = ssStatus.dwWaitHint / 10;
 Sleep( dwWaitTime );
 QueryServiceStatus(schService, &ssStatus)

 if (ssStatus.dwCheckPoint > dwOldCheckPoint)
 {
  dwStartTickCount = GetTickCount();
  dwOldCheckPoint = ssStatus.dwCheckPoint;
 }
 else
 {
  if(GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint)
  {
                break;
  }
 }
}
......

4 遠程執行程序
啓動服務後,接下來的事情就交給服務來做了。
怎樣寫一個服務?有一個現成的框架,VC精華區裏面有。
http://community.csdn.net/Expert/TopicView.asp?id=3022636

這裏需要注意,服務是不能直接和桌面交互的,你需要給服務指定桌面,使用SetThreadDesktop。

HDESK hdesk = OpenDesktop("default", 0, FALSE,                
 DESKTOP_CREATEMENU |
 DESKTOP_CREATEWINDOW |
 DESKTOP_ENUMERATE    |
 DESKTOP_HOOKCONTROL  |
 DESKTOP_JOURNALPLAYBACK |
 DESKTOP_JOURNALRECORD |
 DESKTOP_READOBJECTS |
 DESKTOP_SWITCHDESKTOP |);
SetThreadDesktop(hdesk);

CreateProcess(......);

至於執行什麼程序,就看你了,當然,不喜歡CreateProcess還可以用ShellExecute,只要能在遠程機器上啓動一個程序就成功了。

5 收尾
停止服務,刪除服務的可執行文件,刪除程序文件(如果有的話),關閉IPC連接,這個不需要解釋了吧?本文中的代碼你都可以看作是僞碼,運用中要記得添加出錯處理。

順便提一下,psexec.exe這個程序實現了在提供系統管理員用戶名、密碼的情況下遠程執行程序的功能,這裏介紹一下:

psexec是一個遠程執行工具,你可以像使用telnet一樣使用它。
假設我在遠程機器ip有一個賬號,賬號名是:abc   密碼是:123
比如想要在遠程系統上執行命令可以打:
psexec //遠程機器ip -u abc -p 123 cmd
如果想要遠程機器執行本地c:/srm.exe文件可以打:
psexec //遠程機器ip -u abc -p 123 -c c:/srm.exe
如果想要讓遠程機器執行本地上tftp服務端,(假設tftp服務端在本地c:/tftp32.exe),可以打:
psexec //遠程機器ip -u abc -p 123 -c c:/tftp32.exe -d

這裏給出psexec的下載地址:http://www.sysinternals.com/files/Pstools.zip
psexec屬於pstools系列,pstools是SysInternals公司的產品。

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