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