擁有局域網內的遠程機器(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公司的產品。
遠程啓動服務和傳送晚間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.