T1591.001

Determine Physical Locations

Adversaries may gather the victim's physical location(s) that can be used during targeting. Information about physical locations of a target organization may include a variety of details, including where key resources and infrastructure are housed. Physical locations may also indicate what legal jurisdiction and/or authorities the victim operates within. Adversaries may gather this information via direct elicitation through phishing for information, by searching victim-owned websites, or by leveraging publicly accessible data sets such as SEC EDGAR filings, WHOIS registration records, and social media. This reconnaissance technique is largely external to the victim environment, making direct detection extremely limited. Observable signals include automated scraping of organization-owned web properties, OSINT tool execution on managed endpoints, and email-based location elicitation attempts.

Microsoft Sentinel / Defender
kusto
// Branch 1: Detect automated scraping of location/contact pages via WAF/proxy logs (CommonSecurityLog)
let LocationPagePatterns = dynamic(["/contact", "/about", "/locations", "/offices", "/headquarters", "/find-us", "/branches", "/our-locations", "/office-locations", "/where-we-are"]);
let SuspiciousAgents = dynamic(["python-requests", "go-http-client", "curl/", "wget/", "Scrapy", "theHarvester", "recon-ng", "HTTrack", "WebCopier", "libwww-perl", "mechanize", "python-urllib"]);
let WebScrapingAlerts = CommonSecurityLog
| where TimeGenerated > ago(24h)
| where RequestURL has_any (LocationPagePatterns)
| where UserAgent has_any (SuspiciousAgents)
    or UserAgent matches regex @"(?i)(bot|spider|crawler|scraper|scanner|harvest)"
    or isempty(UserAgent)
| summarize
    RequestCount = count(),
    UniqueURLs = dcount(RequestURL),
    FirstSeen = min(TimeGenerated),
    LastSeen = max(TimeGenerated),
    SampleURLs = make_set(RequestURL, 5),
    SampleAgents = make_set(UserAgent, 3)
  by SourceIP, DeviceName
| where RequestCount > 15 or UniqueURLs > 4
| extend DetectionSource = "WAF_LocationScraping"
| extend DeviceName2 = DeviceName, AccountName2 = "", FileName2 = "", ProcessCommandLine2 = "";
// Branch 2: OSINT tools for physical location gathering on managed endpoints
let OsintToolAlerts = DeviceProcessEvents
| where Timestamp > ago(24h)
| where FileName has_any ("theHarvester", "recon-ng", "maltego", "spiderfoot", "metagoofil", "datasploit")
    or (FileName in~ ("python.exe", "python3.exe", "python")
        and ProcessCommandLine has_any ("theHarvester", "recon-ng", "harvester", "spiderfoot", "metagoofil"))
    or (FileName in~ ("cmd.exe", "powershell.exe")
        and ProcessCommandLine has_all ("whois", "-d"))
| extend
    RequestCount = int(null),
    UniqueURLs = int(null),
    FirstSeen = Timestamp,
    LastSeen = Timestamp,
    SampleURLs = dynamic([]),
    SampleAgents = dynamic([])
| extend DetectionSource = "Endpoint_OsintTool"
| extend DeviceName2 = DeviceName, AccountName2 = AccountName, FileName2 = FileName, ProcessCommandLine2 = ProcessCommandLine;
WebScrapingAlerts
| union OsintToolAlerts
| project DetectionSource, FirstSeen, LastSeen, DeviceName2, AccountName2, FileName2, ProcessCommandLine2, SourceIP, RequestCount, UniqueURLs, SampleURLs, SampleAgents
| sort by FirstSeen desc
low severity low confidence

Data Sources

Network Traffic: Network Traffic Content Application Log: Application Log Content Process: Process Creation Command: Command Execution

Required Tables

CommonSecurityLog DeviceProcessEvents

False Positives

  • Legitimate search engine crawlers (Googlebot, Bingbot, DuckDuckBot) accessing public location pages — filter by known good crawler IP ranges published by Google and Microsoft
  • Internal IT security teams or authorized penetration testers executing OSINT tools on managed endpoints during sanctioned assessments — correlate against approved change tickets
  • Marketing or business development teams using web scraping tools for competitive intelligence or market research — verify user account context and business justification
  • Website uptime monitoring and accessibility checking services (UptimeRobot, Pingdom, StatusCake) that regularly access contact/about pages to verify availability

Unlock Pro Content

Get the full detection package for T1591.001 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections