Ad-Driven Phishing and Malware Delivery
An adversary is using fraudulent social media advertisements to lure users into phishing sites or trick them into installing remote access tools, identified by browser-originating traffic from social platforms followed by rare process execution.
Based on research by ESET Research 2026-10-21 11 steps · 3 queries T1190 T1204.002 T1566.002 T1566.003
Brief
The Link Between Social Media and Endpoint Risk
Security teams often treat social media browsing as a generic acceptable-use policy issue rather than a specific attack vector. However, ESET Research recently detailed the mechanics of fraudulent social media ads in their article, Is the ad a scam? How to tell before you click (https://www.welivesecurity.com/en/social-media/is-ad-scam-how-tell-before-click/). These ads serve as the primary entry point for investment scams and remote access fraud. We have published a new hunt.md playbook to identify these transitions from social platforms to malicious outcomes.
How the Hunt Flows
The first phase focuses on triage by identifying every host that followed an external link from a social media referrer. The query looks for HTTP requests where the referrer domain belongs to a platform like l.facebook.com or t.co, but the destination is outside that platform. This provides a set of leads where users actively engaged with external content delivered through a social feed.
Because social media traffic is high-volume, the hunt uses a gated design. An analyst or agent evaluates these leads to filter for high-risk domains, such as typosquats or known investment lures. This prevents the hunt from running resource-intensive queries across the entire fleet, focusing only on the hosts that demonstrated high-risk click-through behavior.
Once a lead is confirmed, the hunt performs a parallel search for evidence of an intrusion. One branch searches for rare processes spawned directly by a web browser, specifically looking for installers or remote access tools like AnyDesk or TeamViewer that are uncommon in the environment. A second branch monitors for POST requests to sensitive paths like /login or /verify on those same external domains to identify credential harvesting.
The final phase weighs the full chain of evidence. If a host shows the referral from a social site followed immediately by a rare binary execution or a credential submission, the hunt triggers an isolation action to prevent further data loss or lateral movement.
What the Hunt Cannot See
This hunt relies on visibility into the HTTP referrer and path. Without TLS decryption at the gateway or browser-level telemetry, encrypted traffic may hide the specific URL paths or the content of form submissions, leaving only the destination domain as evidence. Additionally, this hunt is blind to telephony-based scams where an ad tricks a user into calling a phone number; such social engineering occurs entirely off-host and outside the reach of endpoint or network logs.
Steps
-
External traffic from social media referrers
Query · triageIdentify potential ad-click leads by finding HTTP requests where the referrer is a known social media domain and the target is an external site.
reads hb_http_activitysqlSELECT device_hostname, url_hostname, url_path, referrer, user_agent, time FROM hb_http_activity WHERE (instr(',' || '{{social_referrers}}' || ',', ',' || LOWER(referrer) || ',') > 0) AND (instr(',' || '{{social_referrers}}' || ',', ',' || LOWER(url_hostname) || ',') = 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. A list of hosts that followed a link from a social platform to an external domain. Silence suggests no such transitions occurred.
-
Evaluate the referral lead
Agent triageAn agent determines if the ad-click leads warrant deeper inspection of process activity and POST submissions.
-
Gate to fan-out
DecisionAvoid expensive parallel queries if the initial ad-click evaluation finds no suspicious activity.
-
Rare browser-spawned processes
Query · baselineSearch for installers or remote access tools spawned directly from browser processes, stacked by prevalence to find unique host activity.
reads hb_process_activitysqlSELECT LOWER(process_path) AS path, COUNT(DISTINCT device_hostname) AS hosts, COUNT(*) AS runs, MIN(time) AS first_seen FROM hb_process_activity WHERE (instr(',' || '{{browser_names}}' || ',', ',' || LOWER(parent_process_name) || ',') > 0) AND (instr(LOWER(process_name), 'setup') > 0 OR instr(LOWER(process_name), 'install') > 0 OR instr(LOWER(process_cmd_line), 'anydesk') > 0 OR instr(LOWER(process_cmd_line), 'teamviewer') > 0 OR instr(LOWER(process_cmd_line), 'rustdesk') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY path HAVING hosts <= 3 ORDER BY hosts, runsWhat a hit looks like. Browsers spawning binaries that are not widespread across the fleet. Rare installers suggest user-initiated execution from a scam site.
-
Suspicious web form submissions
Query · enrichmentIdentify potential credential harvesting by finding POST requests to sensitive paths on the same hosts involved in ad clicks.
reads hb_http_activitysqlSELECT device_hostname, url_hostname, url_path, http_method, request_body_len, referrer, time FROM hb_http_activity WHERE http_method = 'POST' AND (instr(',' || '{{sensitive_paths}}' || ',', ',' || LOWER(url_path) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. POST requests to login or verification paths on domains reached via social referrals. Silence means no harvesting submissions were recorded.
-
Weigh full intrusion evidence
Agent triageAn agent correlates the initial referral context with follow-on execution and harvesting to reach a final verdict.
-
Route on triage verdict
DecisionIsolate hosts with confirmed malicious execution and route others for review.
-
Isolate compromised host
Response actionPrevent further malware activity or credential misuse by severing the host's network connectivity.
-
Analyst review and reporting
Analyst taskAn analyst reviews findings to confirm the scam type and preserve evidence for bank reimbursement claims.
-
Close out
Analyst taskFinalize the hunt and record coverage results.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| Initial Access via Scam Ads T1566 · T1190 |
Yes | lead-ad-traffic, evaluate-lead |
| User Execution of Malicious Installers T1566 |
Yes | rare-browser-spawned-processes |
| Credential and Financial Information Harvesting T1566 |
Yes | suspicious-form-submissions |
Blind spots
- Needs TLS inspection at the gateway or browser-level logging. Encrypted network traffic prevents seeing the specific path or form data, leaving only the domain as evidence. It would answer whether the URL path or body for specific 'giveaway' lures was visible.
- Needs Telephony logs or external reporting. Phone-based social engineering is invisible to IT endpoint and network telemetry. It would answer whether a user called a phone number listed in a scam ad.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
browser_names | list[string] | chrome.exe, msedge.exe, firefox.exe, brave.exe, safari.exe | Common browser executable names to monitor as parent processes. |
lookback_days | number | 14 | Days of history to examine. |
scope_hosts | list[host] | — | Optional list of hosts to narrow the investigation; empty means the whole estate. |
sensitive_paths | list[path] | /login, /signin, /auth, /verify, /bank, /checkout, /submit | URL path segments often used in phishing or harvesting forms. |
social_referrers | list[domain] | l.facebook.com, t.co, linkedin.com, instagram.com, tiktok.com, fb.com | Referrer domains for social media platforms used as ad delivery vehicles. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
| Web server / proxy logs | siem | network |
Source
---
analysis: A static rule for social media traffic is too noisy. This hunt uses a gated
evaluation to contextually filter referrals and only alerts when rare binaries or
suspicious form submissions occur on the same host.
blind_spots:
- id: no-tls-decryption
question: whether the URL path or body for specific 'giveaway' lures was visible
requires: TLS inspection at the gateway or browser-level logging
risk: Encrypted network traffic prevents seeing the specific path or form data,
leaving only the domain as evidence.
stage: initial-access-fraudulent-ads
- id: telephony-blind-spot
question: whether a user called a phone number listed in a scam ad
requires: Telephony logs or external reporting
risk: Phone-based social engineering is invisible to IT endpoint and network telemetry.
stage: initial-access-fraudulent-ads
coverage:
- stage: initial-access-fraudulent-ads
status: covered
steps:
- lead-ad-traffic
- evaluate-lead
- stage: execution-fraudulent-software-install
status: covered
steps:
- rare-browser-spawned-processes
- stage: credential-access-phishing-harvesting
status: covered
steps:
- suspicious-form-submissions
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: keep-as-periodic-hunt
justification: Social media scam ads are a multi-billion dollar problem targeting
user credentials and local systems; identifying the transition from social feeds
to external execution provides a high-value signal for preventing financial and
data loss.
methodology: model-assisted
trigger: intel-report
hypothesis: An adversary is using fraudulent social media advertisements to lure users
into phishing sites or trick them into installing remote access tools, identified
by browser-originating traffic from social platforms followed by rare process execution.
labels:
- hunt
- attack.t1566.002
- attack.t1190
- attack.t1204.002
- attack.t1566.003
- credential access
- execution
- initial access
name: Ad-Driven Phishing and Malware Delivery
parameters:
browser_names:
default:
- chrome.exe
- msedge.exe
- firefox.exe
- brave.exe
- safari.exe
description: Common browser executable names to monitor as parent processes.
from:
kind: manual
observed: '2024-01-01'
ref: hunt-standard
type: list[string]
lookback_days:
default: '14'
description: Days of history to examine.
from:
kind: manual
observed: '2024-01-01'
ref: hunt-standard
type: number
scope_hosts:
default: []
description: Optional list of hosts to narrow the investigation; empty means the
whole estate.
from:
kind: manual
observed: '2024-01-01'
ref: hunt-standard
type: list[host]
sensitive_paths:
default:
- /login
- /signin
- /auth
- /verify
- /bank
- /checkout
- /submit
description: URL path segments often used in phishing or harvesting forms.
from:
kind: manual
observed: '2024-01-01'
ref: hunt-standard
type: list[path]
social_referrers:
default:
- l.facebook.com
- t.co
- linkedin.com
- instagram.com
- tiktok.com
- fb.com
description: Referrer domains for social media platforms used as ad delivery vehicles.
from:
kind: article
observed: '2026-10-20'
ref: eset-research
type: list[domain]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://www.welivesecurity.com/en/social-media/is-ad-scam-how-tell-before-click/
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: Focus on endpoints where social media sites are accessed. Corporate proxies
may mask the referrer, so prioritize hosts with local EDR agents providing unproxied
process and HTTP events.
references:
- name: "ESET Research \u2014 Is the ad a scam? How to tell before you click"
url: https://www.welivesecurity.com/en/social-media/is-ad-scam-how-tell-before-click/
related:
- hunt: browser-extension-malware-persistence
reason: Scam ads can also trick users into installing malicious browser extensions,
which requires hb_software_inventory inspection.
relation: out-of-scope-alternative
scenario:
stages:
- name: Initial Access via Scam Ads
observables:
- Ad impressions on social media platforms (Meta, Instagram, Facebook)
- Sensational news headlines or clickbait used as lures
- Deepfaked celebrity endorsements for investment scams
- Traffic to domains mimicking legitimate brands or customer support
- Browser exploitation attempts via malicious ad scripts
slug: initial-access-fraudulent-ads
tactic: initial-access
techniques:
- T1566
- T1190
- name: User Execution of Malicious Installers
observables:
- User prompted to download software to fix 'computer infection'
- Execution of unknown or suspicious installers downloaded from browser
- AppX deployment or MsiInstaller events from browser-initiated downloads
- Installation of remote access software via social engineering pressure
slug: execution-fraudulent-software-install
tactic: execution
techniques:
- T1566
- name: Credential and Financial Information Harvesting
observables:
- HTTP POST requests to fraudulent e-commerce sites or phishing pages
- User input into web forms for 'prize giveaways' or questionnaires
- Collection of card details, passwords, and personal identifiers (name, address,
phone)
- Call-back numbers on ads routing to fraudulent support centers
slug: credential-access-phishing-harvesting
tactic: credential-access
techniques:
- T1566
summary: Adversaries leverage fraudulent social media advertisements and search
results to redirect users to phishing sites or deliver malware. The campaign uses
social engineering tactics like fake security alerts and celebrity endorsements
to trick victims into downloading malicious installers or submitting sensitive
financial credentials to spoofed e-commerce domains.
severity: medium
targets:
analyst:
name: Tier-2 analyst
role: analyst
endpoint:
category: endpoint
name: Endpoint telemetry (hb_ surfaces)
telemetry:
- endpoint
hunter:
agent: true
name: Hunt agent
web:
category: siem
name: Web server / proxy logs
telemetry:
- network
tlp: clear
type: investigation
---
# Ad-Driven Phishing and Malware Delivery
This hunt targets the complete lifecycle of a scam-ad intrusion. It begins by identifying users clicking through from social media platforms to external sites. The flow uses a gated design to first evaluate these leads before performing more resource-intensive queries for rare browser-spawned processes and credential harvesting activity. This allows the hunt to distinguish between legitimate social media browsing and the specific 'click-to-execution' pattern characteristic of malvertising and deepfaked celebrity investment scams.
## lead-ad-traffic
<!-- External traffic from social media referrers -->
Identify potential ad-click leads by finding HTTP requests where the referrer is a known social media domain and the target is an external site.
```sqlite target=web role=triage params=(lookback_days=lookback_days, social_referrers=social_referrers)
~~~yaml
expected: A list of hosts that followed a link from a social platform to an external
domain. Silence suggests no such transitions occurred.
reads:
- device_hostname
- url_hostname
- url_path
- referrer
- user_agent
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-10-21'
~~~
SELECT device_hostname, url_hostname, url_path, referrer, user_agent, time FROM hb_http_activity WHERE (instr(',' || '{{social_referrers}}' || ',', ',' || LOWER(referrer) || ',') > 0) AND (instr(',' || '{{social_referrers}}' || ',', ',' || LOWER(url_hostname) || ',') = 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## evaluate-lead
<!-- Evaluate the referral lead -->
```agent target=hunter
cite: required
context:
- lead-ad-traffic
max_iterations: 3
objective: Review the external domains reached from social media. Flag those that
appear to be typosquats, investment sites, or tech support lures.
success_criteria: A per-host verdict on whether the referral looks like a scam ad
interaction.
tools:
- endpoint
- web
```
## gate-decision
<!-- Gate to fan-out -->
if~: "the evaluate-lead verdict identifies at least one suspicious host or destination" (confidence: high, judge=hunter)
then: → corroborate-activity
indeterminate: → close-out
unavailable: → close-out (blind_spot: no-tls-decryption)
else: → close-out
## corroborate-activity
<!-- Corroborate activity across endpoints and network -->
parallel:
- → rare-browser-spawned-processes
- → suspicious-form-submissions
join: → triage-full-chain
## rare-browser-spawned-processes
<!-- Rare browser-spawned processes -->
Search for installers or remote access tools spawned directly from browser processes, stacked by prevalence to find unique host activity.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, browser_names=browser_names, scope_hosts=scope_hosts)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Browsers spawning binaries that are not widespread across the fleet. Rare
installers suggest user-initiated execution from a scam site.
prevalence:
by: device_hostname
key:
- path
rare_below: 3
reads:
- device_hostname
- process_path
- process_name
- process_cmd_line
- parent_process_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-10-21'
~~~
SELECT LOWER(process_path) AS path, COUNT(DISTINCT device_hostname) AS hosts, COUNT(*) AS runs, MIN(time) AS first_seen FROM hb_process_activity WHERE (instr(',' || '{{browser_names}}' || ',', ',' || LOWER(parent_process_name) || ',') > 0) AND (instr(LOWER(process_name), 'setup') > 0 OR instr(LOWER(process_name), 'install') > 0 OR instr(LOWER(process_cmd_line), 'anydesk') > 0 OR instr(LOWER(process_cmd_line), 'teamviewer') > 0 OR instr(LOWER(process_cmd_line), 'rustdesk') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY path HAVING hosts <= 3 ORDER BY hosts, runs
```
## suspicious-form-submissions
<!-- Suspicious web form submissions -->
Identify potential credential harvesting by finding POST requests to sensitive paths on the same hosts involved in ad clicks.
```sqlite target=web role=enrichment params=(lookback_days=lookback_days, sensitive_paths=sensitive_paths, scope_hosts=scope_hosts)
~~~yaml
expected: POST requests to login or verification paths on domains reached via social
referrals. Silence means no harvesting submissions were recorded.
reads:
- device_hostname
- url_hostname
- url_path
- http_method
- request_body_len
- referrer
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-10-21'
~~~
SELECT device_hostname, url_hostname, url_path, http_method, request_body_len, referrer, time FROM hb_http_activity WHERE http_method = 'POST' AND (instr(',' || '{{sensitive_paths}}' || ',', ',' || LOWER(url_path) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## triage-full-chain
<!-- Weigh full intrusion evidence -->
```agent target=hunter
cite: required
context:
- evaluate-lead
- rare-browser-spawned-processes
- suspicious-form-submissions
max_iterations: 6
objective: Determine if any host showing suspicious ad referrals subsequently executed
a rare binary or submitted data to a sensitive web path.
success_criteria: A verdict of malicious, suspicious, or benign per host, citing the
chain of rows.
tools:
- endpoint
- web
```
## route-on-triage
<!-- Route on triage verdict -->
if~: "the triage-full-chain verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review
else: → analyst-review
## isolate-host
<!-- Isolate compromised host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host immediately. Terminate the browser and any identified installer processes.
```
→ analyst-review
## analyst-review
<!-- Analyst review and reporting -->
```manual target=analyst
Review the cited browser activity and processes. If form submissions were detected, prompt the user for password changes and bank notification. Preserve the ad URL and domain for platform reporting.
```
→ close-out
## close-out
<!-- Close out -->
```manual target=analyst
Log the findings. Update the software inventory if any new unauthorized tools were found.
```
→ end
Run it
Take this hunt into your environment.
Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.
Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.