Software Discovery
Adversaries may attempt to get a listing of software and software versions that are installed on a system or in a cloud environment. Adversaries use this information during automated discovery to shape follow-on behaviors — including whether to fully infect the target, which vulnerabilities to exploit for privilege escalation, or which security tools to evade. Common techniques include querying the Windows Registry uninstall keys, WMI Win32_Product class, PowerShell Get-Package cmdlet, and command-line tools such as wmic and reg. On Linux and macOS, adversaries use package managers (dpkg, rpm, brew) and filesystem enumeration of application directories.
let SoftwareDiscoveryPatterns = dynamic([
// Registry-based enumeration
"\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
"\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
// WMI-based enumeration
"Win32_Product",
"Win32_InstalledWin32Program",
"Win32_InstalledProgramFramework",
// PowerShell cmdlets
"Get-Package",
"Get-WmiObject",
"Get-CimInstance",
// WMIC commands
"product get",
"product list"
]);
let SuspiciousParents = dynamic([
"powershell.exe", "pwsh.exe", "cmd.exe", "wscript.exe",
"cscript.exe", "mshta.exe", "rundll32.exe", "regsvr32.exe"
]);
// Branch 1: Registry queries targeting software inventory keys
let RegistryBranch = DeviceRegistryEvents
| where Timestamp > ago(24h)
| where RegistryKey has "CurrentVersion\\Uninstall"
| where ActionType in ("RegistryKeyValueQueried", "RegistryQueryKey")
| extend DetectionSource = "Registry"
| project Timestamp, DeviceName, AccountName, ActionType,
RegistryKey, RegistryValueName,
InitiatingProcessFileName, InitiatingProcessCommandLine,
InitiatingProcessParentFileName, DetectionSource;
// Branch 2: Process-based software discovery (wmic, reg, PowerShell)
let ProcessBranch = DeviceProcessEvents
| where Timestamp > ago(24h)
| where (
// wmic product enumeration
(FileName =~ "wmic.exe" and ProcessCommandLine has_any ("product get", "product list", "product where", "Win32_Product"))
// reg query against uninstall keys
or (FileName =~ "reg.exe" and ProcessCommandLine has "Uninstall")
// PowerShell software discovery cmdlets
or (FileName in~ ("powershell.exe", "pwsh.exe") and ProcessCommandLine has_any (
"Get-Package", "Win32_Product", "Win32_InstalledWin32Program",
"Get-WmiObject", "Get-CimInstance", "CurrentVersion\\Uninstall",
"InstalledProgramFramework"
))
// rpm/dpkg/brew via bash (cross-platform endpoints)
or (FileName in~ ("bash", "sh", "zsh") and ProcessCommandLine has_any (
"dpkg -l", "dpkg --list", "rpm -qa", "rpm -q",
"snap list", "flatpak list", "brew list",
"apt list", "yum list installed", "dnf list installed"
))
)
| extend DetectionSource = "Process"
// Flag suspicious parent processes indicating post-exploitation context
| extend SuspiciousParent = InitiatingProcessFileName in~ (SuspiciousParents)
// Exclude obvious system management processes
| where not (
InitiatingProcessFileName in~ ("msiexec.exe", "trustedinstaller.exe", "svchost.exe")
and AccountName in~ ("SYSTEM", "NT AUTHORITY\\SYSTEM")
)
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
InitiatingProcessFileName, InitiatingProcessCommandLine,
InitiatingProcessParentFileName, SuspiciousParent, DetectionSource;
// Union and enrich
RegistryBranch
| union ProcessBranch
| extend RiskScore = case(
DetectionSource == "Registry" and InitiatingProcessFileName in~ (SuspiciousParents), 3,
DetectionSource == "Process" and SuspiciousParent == true, 3,
DetectionSource == "Process" and FileName =~ "wmic.exe", 2,
1
)
| sort by Timestamp desc Data Sources
Required Tables
False Positives
- Software inventory agents (SCCM, Tanium, Qualys, Tenable, ServiceNow Discovery) that regularly enumerate installed software for asset management and vulnerability scanning
- System administrators running wmic product get or reg query manually during troubleshooting or software audits
- PowerShell Desired State Configuration (DSC) and automation scripts (Ansible, Chef, Puppet) querying installed packages during compliance checks
- Software installers and uninstallers that read Uninstall registry keys to check for existing versions before installation
- Endpoint Detection & Response (EDR) agents that perform software inventory as part of their telemetry collection
References (10)
- https://attack.mitre.org/techniques/T1518/
- https://learn.microsoft.com/en-us/windows/win32/wmisdk/win32-product
- https://learn.microsoft.com/en-us/powershell/module/packagemanagement/get-package
- https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-144a
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1518/T1518.md
- https://www.mandiant.com/resources/blog/unc3890-targets-israel
- https://www.welivesecurity.com/2019/10/03/casbaneiro-trojan-dangerous-banking-malware/
- https://unit42.paloaltonetworks.com/siloscape/
- https://learn.microsoft.com/en-us/defender-endpoint/advanced-hunting-deviceregistryevents-table
- https://learn.microsoft.com/en-us/defender-endpoint/advanced-hunting-deviceprocessevents-table
Unlock Pro Content
Get the full detection package for T1518 including response playbook, investigation guide, and atomic red team tests.