System Location Discovery
This detection identifies adversaries enumerating system locale, time zone, keyboard layout, language settings, and geographic location data to determine whether a target host falls within a desired operational geography. Attackers use this technique to implement geo-fencing logic — avoiding infection of hosts in certain regions, targeting specific populations, or evading sandbox environments. Detection covers three vectors: (1) process-based locale enumeration via PowerShell cmdlets, registry queries against NLS/TimeZoneInformation keys, and WinAPI locale functions called by suspicious parent processes; (2) outbound network connections to IP geolocation lookup services such as ipinfo.io and ip-api.com; and (3) cloud instance metadata service (IMDS) queries to 169.254.169.254 from non-cloud-management processes. Correlated alerts from multiple sub-techniques or combined with process injection and C2 beacon indicators significantly increase confidence.
let GeoIPDomains = dynamic(["ipinfo.io", "ip-api.com", "ipgeolocation.io", "freegeoip.app", "ipstack.com", "geoplugin.net", "geoip.ubuntu.com", "api.ipify.org", "ifconfig.me", "checkip.amazonaws.com", "myexternalip.com", "ipapi.co"]);
let SuspiciousParents = dynamic(["cmd.exe", "powershell.exe", "wscript.exe", "cscript.exe", "mshta.exe", "rundll32.exe", "regsvr32.exe", "wmic.exe"]);
// Vector 1: Process-based locale/timezone discovery
let LocaleProcessEvents =
DeviceProcessEvents
| where TimeGenerated > ago(1h)
| where (
// PowerShell locale cmdlets
(FileName =~ "powershell.exe" or FileName =~ "pwsh.exe")
and ProcessCommandLine has_any ("Get-WinSystemLocale", "Get-Culture", "Get-UICulture", "Get-TimeZone", "CultureInfo", "CurrentCulture", "CurrentUICulture", "[System.Globalization", "GetLocaleInfo", "GetSystemDefaultLCID", "GetSystemDefaultUILanguage")
)
or (
// Registry queries for NLS/locale/timezone
FileName =~ "reg.exe"
and ProcessCommandLine has_any ("Nls\\", "TimeZoneInformation", "Keyboard Layout", "International", "MUI", "Language")
and ProcessCommandLine has "query"
)
or (
// tzutil timezone query
FileName =~ "tzutil.exe"
and ProcessCommandLine has "/g"
)
or (
// WMIC locale queries
FileName =~ "wmic.exe"
and ProcessCommandLine has_any ("timezone", "locale", "os get locale", "win32_operatingsystem")
)
| where InitiatingProcessFileName has_any (SuspiciousParents)
or InitiatingProcessParentFileName has_any (SuspiciousParents)
| extend DetectionVector = "ProcessLocaleDiscovery"
| extend RiskScore = case(
InitiatingProcessParentFileName has_any (SuspiciousParents), 75,
InitiatingProcessFileName has_any (SuspiciousParents), 60,
50
)
| project TimeGenerated, DeviceId, DeviceName, AccountName, AccountDomain,
FileName, ProcessCommandLine, FolderPath,
InitiatingProcessFileName, InitiatingProcessCommandLine,
InitiatingProcessParentFileName, DetectionVector, RiskScore;
// Vector 2: Network-based IP geolocation lookups
let GeoIPNetworkEvents =
DeviceNetworkEvents
| where TimeGenerated > ago(1h)
| where RemoteUrl has_any (GeoIPDomains)
or (RemoteIP == "169.254.169.254" and RemotePort in (80, 443) // Cloud IMDS
and InitiatingProcessFileName !in~ ("AzureGuestAgent.exe", "aws-cfn-bootstrap", "google_guest_agent", "waagent", "WindowsAzureGuestAgent.exe"))
| extend DetectionVector = case(
RemoteIP == "169.254.169.254", "CloudIMDSQuery",
"GeoIPLookup"
)
| extend RiskScore = case(
RemoteIP == "169.254.169.254"
and InitiatingProcessFileName !in~ ("AzureGuestAgent.exe", "waagent", "google_guest_agent"), 80,
RemoteUrl has_any ("ipinfo.io", "ip-api.com", "ipgeolocation.io"), 70,
55
)
| project TimeGenerated, DeviceId, DeviceName,
InitiatingProcessAccountName, InitiatingProcessFileName,
InitiatingProcessCommandLine, InitiatingProcessParentFileName,
RemoteUrl, RemoteIP, RemotePort, Protocol, DetectionVector, RiskScore;
// Combine and surface high-risk events
union LocaleProcessEvents, GeoIPNetworkEvents
| where RiskScore >= 55
| sort by RiskScore desc, TimeGenerated desc Data Sources
Required Tables
False Positives
- IT administration scripts using Get-TimeZone or tzutil.exe for asset inventory or time synchronization audits run by sysadmin accounts
- Legitimate cloud management agents (AzureGuestAgent.exe, waagent, google_guest_agent) querying IMDS at 169.254.169.254 for instance identity and configuration metadata
- Security monitoring tools and EDR agents that enumerate system locale to normalize event timestamps or support multi-region SIEM deployments
- Software installers and update managers checking system locale to select appropriate language packs or regional configurations
- Penetration testing frameworks executing discovery modules (Metasploit post-exploitation, CobaltStrike Beacon commands) during authorized red team engagements
References (10)
- https://attack.mitre.org/techniques/T1614/
- https://www.fbi.gov/news/press-releases/fbi-issues-flash-alert-on-ragnar-locker-ransomware
- https://news.sophos.com/en-us/2016/05/03/location-based-malware/
- https://www.bleepingcomputer.com/news/security/new-rat-malware-gets-commands-via-discord-has-ransomware-feature/
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
- https://docs.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service
- https://securelist.com/transparent-tribe-part-2/98233/
- https://www.prevailion.com/darkwatchman-new-fileless-techniques/
- https://www.welivesecurity.com/2022/03/01/isaagoras-plugx-mustang-panda/
- https://www.malwarebytes.com/blog/threat-intelligence/2021/12/sidecopy-apt-connecting-lures-to-victims-locations-and-tasks
Unlock Pro Content
Get the full detection package for T1614 including response playbook, investigation guide, and atomic red team tests.