在殺毒軟件日益完備的互聯網中,那些大部分以加載系統啟動項為主要攻擊手段的的普通病毒和木馬越來越難以攻破用戶的防御屏障,但與此同時,有一些病毒卻“劍走偏鋒“,不僅繞過了殺毒軟件的檢測,還在隱藏自己的同時攻破了系統。這些病毒是如何抓住用戶心理,一步步突破了用戶系統。
接下來,通過本篇文章,美創第59號安全實驗室將為大家剖析基于輔助功能的鏡像劫持攻擊原理,向大家展現還原這種攻擊所帶來的巨大危害以及防御手段。
01
輔助功能簡介
所謂輔助功能就是在windows系統中,我們可以使用多種組合鍵打開或關閉特定的功能,例如常用的win + ctrl + o打開屏幕鍵盤,win + u打開設置中心,連按5次shift打開粘滯鍵等等。

而且微軟為了提高用戶體驗,非常‘貼心’的允許用戶在登陸系統前也可以使用這些功能,根據這個特性,某些攻擊者很可能通過遠程桌面協議,在未授權的情況下運行這些功能,雖然這些功能是‘友好的’,沒有危害性,但我們知道,這些功能之所以可以運行其實是在命令行里運行的系統指令罷了,例如
C:WINDOWSSystem32Utilman.exe 打開設置中心
C:WINDOWSSystem32sethc.exe 打開粘滯鍵
C:WINDOWSSyetem32osk.exe 打開屏幕鍵盤
問題在于,如果我們在未登陸系統的情況下使用組合鍵運行的系統命令遭到篡改,本來應該打開‘十分安全’的輔助程序卻被另一惡意程序代替執行,最終導致在用戶不知情的情況下,獲得系統權限,留下隱蔽后門。
可如何才能使用戶啟動輔助功能的系統命令變成運行自己惡意軟件的系統命令呢,這就要說到另一項技術:鏡像劫持。
02
鏡像劫持簡介
“鏡像劫持”,又叫“映像劫持”,也被稱為“IFEO”(Image File Execution Options),在Windows NT架構的系統里,IFEO的本意是為一些在默認系統環境中運行時可能引發錯誤的程序執行體提供特殊的環境設定。當一個可執行程序位于IFEO的控制中時,它的內存分配則根據該程序的參數來設定,而Windows NT架構的系統能通過這個注冊表項使用與可執行程序文件名匹配的項目作為程序載入時的控制依據,最終得以設定一個程序的堆管理機制和一些輔助機制等。大概微軟考慮到加入路徑控制會造成判斷麻煩與操作不靈活的后果,也容易導致注冊表冗余,于是IFEO使用忽略路徑的方式來匹配它所要控制的程序文件名。
簡單來說,當我想運行A.exe,結果運行的卻是B.exe,也就是說在這種情況下A程序被B程序給劫持了,而映像劫持病毒就是通過修改某些注冊表常用項的鍵值,達到在用戶無意識的情況下想運行常用程序卻讓木馬等惡意程序在后臺運行的目的。
03
鏡像劫持原理及實現
原理:
為了實現鏡像劫持,需要先找到鏡像劫持在注冊表中的路徑,“HKEY_LOCAL_macHINE SOFTWARE Microsoft WindowsNT CurrentVersion Image File ExecutionOptions”。
然而WINDOWS NT系統在試圖執行一個從命令行調用的可執行文件運行請求時,會先檢查運行程序是不是可執行文件,如果是的話,再檢查格式,然后就會檢查是否存在。由此我們發現,造成鏡像劫持的罪魁禍首就是參數“Debugger”,他是IFEO里第一個被處理的參數,若果該參數不為空,系統則會把Debugger參數里指定的程序文件名作為用戶試圖啟動的程序執行請求來處理,而僅僅把用戶試圖啟動的程序作為Debugger參數里指定的程序文件名的參數發送過去。參數“Debugger”本來是為了讓程序員能夠通過雙擊程序文件直接進入調試器里調試自己的程序。現在卻成了病毒的攻擊手段。
讓我們進行更深的思考,當更改的表項是殺毒軟件所在的表項,會造成什么后果。毫無疑問,殺毒軟件完全沒辦法工作,不僅繞過了殺毒軟件還隱秘的執行了自己的惡意程序,一般用戶根本想不到殺毒軟件的注冊表項會被篡改,這就進一步增加了攻擊后可利用的時間。危害性不言而喻。
復現:
修改注冊表的惡意代碼:
#include <IOStream>
#include <Windows.h>
using namespace std;
int test(){
Dword dwDisposition;
HKEY hKey;
const char path[] = "C:WINDOWSSystem32calc.exe";
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\chrome.exe", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
RegSetValueExA(hKey, "Debugger", 0, REG_SZ, (BYTE*)path, (1 + ::lstrlenA(path)));
return 0;}
int main(){
test();
return 0;}
惡意程序運行后,注冊表中chrome.exe新增鍵值對Debugger=“C:WINDOWSSystem32calc.exe”

注冊表項遭到修改后,雙擊運行chrome運行,本該打開網頁卻打開了計算器程序,因為系統優先執行了”C:WINDOWSSystem32calc.exe”。造成了鏡像劫持攻擊。

04
基于輔助功能實現鏡像劫持原理及實現
安全從業者不應輕視任何一種漏洞,因為當不同的漏洞結合到一起時很有可能產生1+1>2的效果。這一點在輔助功能和鏡像劫持身上很好的體現了出來。
之前我們提過輔助功能是執行系統命令,并且允許用戶在未登錄的情況下運行,那么當我們使用鏡像劫持攻擊,更改了這些指令在注冊表IFEO中的鍵值就可能造成攻擊者不需要登陸系統即可運行某些惡意軟件。
原理:
修改注冊表,在“HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Image File Execution Option”中添加Utilman.exe項,在此項中添加debugger鍵,鍵值為啟動cmd的命令C:WINDOWSSystem32cmd.exe。
當攻擊者通過遠程桌面協議連接到受害者電腦上時,只需使用組合鍵win+u,本應該打開的設置中心,最終卻打開了cmd命令行,通過命令行可以添加用戶、打開注冊表、運行惡意軟件、添加隱蔽后門等等一些列攻擊手段,嚴重性不言而喻。
復現:
在注冊表中新增Utilman.exe表項,添加鍵值對Debugger=“C:WINDOWSSystem32cmd.exe”

在登陸頁面上運行win + u,在無需登錄的情況下就打開了cmd命令框。

05
防御和清除手段
1、由于此類攻擊的惡意代碼要修改Image File Execution Options,首先要有權限才可讀寫,于是,我們可以通過限制用戶對該注冊表的讀寫權限,來阻止鏡像劫持。打開注冊表編輯器,定位到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptions,選中該項,右鍵→權限→高級,取消administrator和system用戶的寫權限即可。
2、由于鏡像劫持需要在注冊表中添加輔助功能的表項,所以檢查“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Option”注冊表路徑下的程序名稱,一些常用的輔助功能表項如:Utilman.exe,stch.exe,osk.exe等等。
3、基于零信任的理念,對于有可能有安全隱患的不必要表項可以選擇刪除,直接禁用輔助功能即可。打開注冊表編輯器,定位到HKEY_LOCAL_MACHINE SOFTWARE Microsoft WindowsNT CurrentVersion ,把“ImageFileExecutionOptions”項刪除。