滲透基礎——獲得當前系統已安裝的程序列表
0x00 前言
最近遇到了一個有趣的問題:我在嘗試使用wmi獲取當前系統已安裝的程序列表時,並不能獲得完整的列表。於是做了進一步研究,找出錯誤原因,改變思路,完成目標。
本文是一篇介紹基礎知識的文章,用來解決基本的問題。
0x01 簡介
本文將要介紹以下內容:
·通過wmi獲取當前系統已安裝的程序列表
·wmi查詢結果不完整的原因
·獲取完整程序列表的實現思路
0x02 獲取當前系統已安裝的程序列表
1、使用powershell調用wmi
代碼如下:
Get-WmiObject -class Win32_Product
對輸出結果進行過濾,只顯示程序名稱,代碼如下:
Get-WmiObject -class Win32_Product |Select-Object -Property name
獲得結果如下圖
2、使用wmic調用wmi
代碼如下:
wmic /NAMESPACE:"\rootCIMV2" PATH Win32_Product
對輸出結果進行過濾,只顯示程序名稱,代碼如下:
wmic /NAMESPACE:"\rootCIMV2" PATH Win32_Product get name /FORMAT:table
獲得結果如下圖
3、使用WMI Explorer調用wmi
下載地址:
https://wmie.codeplex.com/releases/view/135794
界面化的WMI查詢工具,可用來查詢wmi支持的類,是研究wmi的好工具
首先點擊Connect連接本機
選中ROOTCIMV2 -> Query
輸入查詢命令:
SELECT * FROM Win32_Product
獲得結果如下圖
4、通過控制面板查詢已安裝的程序
控制面板 -> 程序 -> 程序和功能
發現部分程序通過wmi查詢無法獲得,例如Google Chrome,對比結果如下圖
0x03 wmi查詢結果不完整的原因
通過WMI查詢Win32_Product只能獲得特定的程序列表
這些程序有一個共同的特徵: 安裝包由Windows Installer製作,安裝過程中調用Windows Installer服務進行安裝
說明:
Microsoft Windows Installer: Windows 操作系統的一個組件,是安裝和卸載軟體的標準基礎。
Windows Installer服務: 添加、修改和刪除作為Windows Installer程序包提供的應用程序。
除了Microsoft Windows Installer,製作安裝包還可使用EasySetup、Setup2Go、Advanced Installer、Qt installer framework和WinRAR
Chrome的在安裝過程中不會調用Microsoft Windows Installer組件,所以通過WMI查詢Win32_Product無法找到Chrome
0x04 獲取完整程序列表的實現思路
我們知道,通過控制面板 -> 程序 -> 程序和功能獲取的程序列表比較完整,該列表對應註冊表鍵值:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
每個子健代表列表中的一個程序
所以,可以通過枚舉註冊表鍵值的方法獲得完整程序列表
值得注意的是64位系統下,註冊表存在重定向的問題,也會影響程序列表的顯示
32位程序列表對應註冊表鍵值HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall
64位程序列表對應註冊表鍵值HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
註:
這個問題在之前的文章《關於32位程序在64位系統下運行中需要注意的重定向問題》進行過整理
編寫powershell腳本實現枚舉註冊表,獲得完整的程序列表
關鍵代碼:
1、枚舉指定註冊表項下的子項
dir Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall -Name
如下圖
2、查詢指定註冊表項的註冊表鍵值
(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall").DisplayName
如下圖
3、加入foreach循環實現枚舉
$RegPath = "Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall"
$QueryPath = dir $RegPath -Name
foreach($Name in $QueryPath)
{
(Get-ItemProperty -Path $RegPath$Name).DisplayName
}
4、加入判斷系統位數,自動判斷註冊表重定向
完整代碼可參考如下地址:
https://github.com/3gstudent/ListInstalledPrograms
0x05 補充
通常,已安裝的程序會創建快捷方式,所以,嘗試枚舉快捷方式文件也能獲得完整的程序列表
通過wmic獲取所有快捷方式:
wmic PATH Win32_ShortcutFile get name /FORMAT:table
0x06 小結
本文介紹了通過wmi無法獲得當前系統已安裝程序完整列表的原因,編寫powershell腳本,通過枚舉註冊表項,實現獲得程序完整列表。作為一篇介紹基礎知識的文章,希望能給新人帶來啟發。
※惡意軟體Ursnif的隱蔽進程注入技術分析
※滲透測試實戰:利用列目錄漏洞重置密碼
TAG:嘶吼RoarTalk |