聊聊鍵盤布局持久化技術(shù),你懂了嗎?
1.鍵盤布局簡介
鍵盤布局是按鍵在鍵盤上的分布模式,決定了鍵位順序。鍵盤布局在發(fā)展過程中,由于使用習(xí)慣的不同,各國間使用的鍵盤布局存在細(xì)微差別,因此在Windows系統(tǒng)上以國家為單位區(qū)分不同的鍵盤布局方案。我們最熟悉的布局模式當(dāng)屬美式鍵盤。鍵盤布局以動(dòng)態(tài)鏈接庫的形式存在System路徑下,在系統(tǒng)啟動(dòng)時(shí)加載。本文將通過探究鍵盤布局文件的加載方式得到其潛在的利用方法。
2.鍵盤布局方案加載過程
鍵盤布局文件的加載由winlogon.exe完成。Windows Logon Process(即winlogon.exe),是Windows NT 用戶登錄程序,用于管理用戶登錄和退出,且以 SYSTEM 用戶運(yùn)行。在入口WinMain中,調(diào)用了函數(shù)UpdatePerUserSystemParameters:
該函數(shù)位于user*32.dll中:
在函數(shù)UpdatePerUserSystemParameters中,首先調(diào)用GetActiveKeyboardName,通過查詢注冊(cè)表項(xiàng):
計(jì)算機(jī)\HKEY_CURRENT_USER\Keyboard Layout\Preload
獲取默認(rèn)加載的鍵盤布局文件:
在對(duì)應(yīng)注冊(cè)表下,保存著默認(rèn)加載的鍵盤布局編號(hào):
該編號(hào)指向注冊(cè)表
計(jì)算機(jī)\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000804
可以看到,當(dāng)前默認(rèn)啟用的鍵盤布局文件是中文簡體環(huán)境下的鍵盤布局,即美式鍵盤布局。在獲取到當(dāng)前啟用的鍵盤布局文件名后,以此為參數(shù)調(diào)用LoadKeyboardLayoutWorker:
在OpenKeyboardLayoutFile中,先調(diào)用GetKeyboardDllName判斷當(dāng)前語言環(huán)境,主要是為了區(qū)分出日、韓兩種特殊鍵盤布局。各語言環(huán)境下的鍵盤布局可能略有差別,但是日韓因其文字的特殊性有其特定的鍵盤標(biāo)準(zhǔn)。接著OpenKeyboardLayoutFileWorker加載對(duì)應(yīng)的DLL:
OpenKeyboardLayoutFileWorker進(jìn)一步調(diào)用LoadLibraryExW加載對(duì)應(yīng)DLL:
在加載前沒有進(jìn)行文件合法性相關(guān)的校驗(yàn),這為惡意利用留下了空間。
3.鍵盤布局文件利用
(1)鍵盤布局文件的構(gòu)建
Windows支持自定義鍵盤布局,利用微軟官方的鍵盤布局生成器Keyboard Layout Creator(MSKLC.exe)可以生成鍵盤布局文件對(duì)應(yīng)的源碼文件。首先加載已有鍵盤布局:
選擇當(dāng)前語言地區(qū)的布局:
保存源碼文件:
保存的結(jié)果是一個(gè).klc文件:
需要使用kbdutool.exe將.klc解析為鍵盤布局源碼文件:
kbdutool.exe-u -i -s out.klc
生成的源碼文件如下:
在Layout01.C末尾添加DllMain函數(shù):
利用源碼文件創(chuàng)建工程,在安裝了WDK的環(huán)境下編譯成對(duì)應(yīng)系統(tǒng)架構(gòu)的DLL,即可生成自定義布局文件。
(2)鍵盤布局文件的安裝
鍵盤布局的安裝方式有兩種:
a)由上面的分析可知,在鍵盤布局加載時(shí),會(huì)直接加載Preload注冊(cè)表項(xiàng)下保存的默認(rèn)鍵盤布局,可以通過劫持或替換默認(rèn)鍵盤布局DLL等方式實(shí)現(xiàn)安裝;
b)利用input.dll導(dǎo)出函數(shù)InstallLayoutOrTip進(jìn)行安裝。
第一種安裝方式簡單粗暴,通過修改Preload注冊(cè)表改變默認(rèn)加載的鍵盤布局文件。下面重點(diǎn)看第二種安裝方式:
根據(jù)MSDN的InstallLayoutOrTip調(diào)用示例,可以通過在鍵盤布局注冊(cè)表項(xiàng)
計(jì)算機(jī)\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
下新增一個(gè)新編號(hào),并添加相關(guān)字段信息:
創(chuàng)建后,將惡意的鍵盤布局文件部署在system目錄下,調(diào)用InstallLayoutOrTip啟用目標(biāo)鍵盤布局文件。函數(shù)第一個(gè)參數(shù)構(gòu)造如下:
語言標(biāo)識(shí)符(LangID):鍵盤布局ID(KLID)
第二個(gè)參數(shù)默認(rèn)為0,調(diào)用InstallLayoutOrTip啟用指定布局文件,利用過程如下:
安裝結(jié)果:
重啟靶機(jī)后,惡意鍵盤布局文件被成功加載,彈出管理員權(quán)限cmd:
安裝過程需要管理員權(quán)限,且需要對(duì)相關(guān)注冊(cè)表項(xiàng)進(jìn)行更改,在防護(hù)措施不足的終端上容易被利用實(shí)現(xiàn)權(quán)限維持與持久化。
4.總結(jié)
鍵盤布局作為Windows下的特殊系統(tǒng)機(jī)制,其鍵盤布局DLL的生成與安裝都有相應(yīng)的工具與API,利用成本很低,是較好的權(quán)限維持方式。但是,鍵盤布局的利用方式同樣存在其弊端,除了持久化的DLL需要放置在System目錄下以外,還需要管理員權(quán)限實(shí)現(xiàn)安裝,且行為容易被攔截。如果沒有終端防護(hù)設(shè)備,通過這種方式實(shí)現(xiàn)的持久化與維*權(quán)還是能夠達(dá)到很好的效果。
參考
自定義鍵盤布局持久化:https://github.com/NtQuerySystemInformation/CustomKeyboardLayoutPersistence
InstallLayoutOrTip調(diào)用示例:https://docs.microsoft.com/zh-cn/windows/win32/tsf/installlayoutortip