T1589.003

Employee Names

Adversaries may gather employee names that can be used during targeting. Employee names can be used to derive email addresses as well as to help guide other reconnaissance efforts and craft more-believable lures. Adversaries may easily gather employee names since they may be readily available and exposed via online or other accessible data sets such as social media, LinkedIn, corporate websites, and press releases. Real-world threat actors including Kimsuky, Sandworm Team, and Silent Librarian have been observed collecting victim employee name information to support subsequent phishing campaigns, credential attacks, and social engineering operations. Detection is inherently challenging because this activity primarily occurs outside the victim's environment on public platforms. Effective detection pivots to monitoring organization-owned web properties for automated scraping, tracking OSINT tool execution on monitored endpoints, and identifying downstream artifacts such as systematic user enumeration via authentication systems.

Microsoft Sentinel / Defender
kusto
// Employee Name Harvesting — Corporate Web Directory Scraping Detection
// Detects high-rate automated access to employee/team listing pages via WAF and proxy telemetry
// Also surfaces OSINT harvesting tool execution on monitored endpoints
let DirectoryPaths = dynamic([
    "/team", "/about", "/about-us", "/staff", "/employees", "/directory",
    "/people", "/our-team", "/leadership", "/management", "/company/team",
    "/meet-the-team", "/who-we-are", "/bios", "/partners", "/board"
]);
let HarvestingTools = dynamic([
    "theHarvester", "theharvester", "recon-ng", "CrossLinked", "crosslinked",
    "linkedin2username", "linkedin_username", "phonebook.cz", "hunter.io",
    "osintframework", "maltego", "SpiderFoot", "spiderfoot"
]);
// Branch 1: Automated scraping of corporate employee directory pages
let WebScraping =
    CommonSecurityLog
    | where TimeGenerated > ago(1h)
    | where RequestURL has_any (DirectoryPaths)
    | where isnotempty(SourceIP)
    | summarize
        RequestCount = count(),
        UniquePages = dcount(RequestURL),
        UniqueUserAgents = dcount(RequestClientApplication),
        UserAgentSample = make_set(RequestClientApplication, 3),
        FirstSeen = min(TimeGenerated),
        LastSeen = max(TimeGenerated)
        by SourceIP, DestinationHostName
    | extend ElapsedSeconds = datetime_diff('second', LastSeen, FirstSeen)
    | extend RequestsPerMinute = iff(ElapsedSeconds > 0, toreal(RequestCount) / toreal(ElapsedSeconds) * 60.0, 0.0)
    | where RequestCount > 25 or RequestsPerMinute > 5.0
    | extend ScrapeRisk = case(
        UniqueUserAgents == 1 and RequestCount > 60, "HIGH — uniform UA, high volume",
        RequestsPerMinute > 15.0, "HIGH — rapid sequential requests",
        RequestCount > 40 and UniquePages > 8, "MEDIUM — breadth and volume",
        "LOW — review manually"
    )
    | where ScrapeRisk !startswith "LOW"
    | extend DetectionType = "Web_Directory_Scraping"
    | project TimeGenerated = FirstSeen, DetectionType, SourceIP, DestinationHostName,
              RequestCount, UniquePages, RequestsPerMinute, ScrapeRisk, UserAgentSample;
// Branch 2: OSINT harvesting tool execution on managed endpoints
let EndpointHarvesting =
    DeviceProcessEvents
    | where Timestamp > ago(1h)
    | where ProcessCommandLine has_any (HarvestingTools)
          or FileName has_any ("theHarvester", "crosslinked", "linkedin2username")
          or (FileName in~ ("python.exe", "python3", "python")
              and ProcessCommandLine has_any ("linkedin", "harvest", "employee", "osint") )
    | extend DetectionType = "Harvesting_Tool_Execution"
    | extend ScrapeRisk = "HIGH — known OSINT tool on managed endpoint"
    | project TimeGenerated = Timestamp, DetectionType, SourceIP = DeviceName,
              DestinationHostName = "", RequestCount = 1, UniquePages = 0,
              RequestsPerMinute = 0.0, ScrapeRisk,
              UserAgentSample = pack_array(ProcessCommandLine);
union WebScraping, EndpointHarvesting
| sort by TimeGenerated desc
medium severity low confidence

Data Sources

Network Traffic: Network Traffic Content Application Log: Application Log Content Process: Process Creation Microsoft Defender for Endpoint WAF / Proxy / Next-Generation Firewall (CommonSecurityLog)

Required Tables

CommonSecurityLog DeviceProcessEvents

False Positives

  • Search engine crawlers (Googlebot, Bingbot, AhrefsBot, Semrush) legitimately indexing public team and leadership pages at high rates
  • SEO audit tools (Screaming Frog, Sitebulb, DeepCrawl) run by the marketing team performing scheduled site health checks
  • Authorized penetration testers or red team operators conducting OSINT reconnaissance during an engagement — always verify active SOW coverage
  • HR and recruiting platforms (LinkedIn Talent Hub, Greenhouse, Lever) that scan competitor or partner employee directories for sourcing
  • Business intelligence and lead generation services (ZoomInfo, Lusha, Apollo.io) operating on behalf of sales teams with company-approved subscriptions

Unlock Pro Content

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

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections