Back to Intelligence

Help TDS / Hotejka Tech Support Scam Campaign: Detecting Compromised Sites and 20,000+ Cloudflare Pages Lures

SA
Security Arsenal Team
October 16, 2026
10 min read

Introduction

Reporting this week links the long-running Help Traffic Distribution System (Help TDS) to a Russian-language affiliate program tracked as Hotejka, assessed to be a rebrand or successor of the ROI777 traffic-monetization operation. The operation is not new — Help TDS has been assessed active since at least 2017 — but the current observation is the scale: more than 20,000 Cloudflare Pages domains are reportedly hosting tech-support scam content, fed by traffic redirected from compromised legitimate websites.

This matters to defenders on two fronts. First, if your organization runs public web infrastructure, injected PHP templates may be quietly turning your sites into redirectors for scam infrastructure. Second, if your users browse from corporate endpoints, they may be exposed to fake Microsoft/Apple/ISP “virus detected” pages that pressure victims into calling fraud numbers, granting remote access, or installing additional malware. There is no CVE in the source reporting, no single patch to deploy, and no CISA KEV entry named in the item; the defensive problem is an active, industrialized criminal traffic chain abusing trusted cloud hosting and compromised CMS/PHP sites.

Technical Analysis

Affected platforms and products: The described mechanism targets organizations indirectly rather than exploiting one versioned product. The two exposure classes are: (1) PHP/CMS-based websites — WordPress, Joomla, Drupal, custom PHP apps, and legacy forums — where affiliate-provided PHP templates are installed into compromised sites; and (2) end users behind corporate egress, where browsers are redirected to scam pages hosted under Cloudflare’s pages.dev tenant space or attacker-controlled lookalikes. Cloudflare Pages is not “vulnerable” in the classic sense; the abuse model is low-cost hosting, fast churn, TLS by default, and a reputable CDN edge that reduces user suspicion and complicates naive blocking.

Attack chain, defender view: A likely flow is: vulnerable or weakly credentialled CMS/site is compromised → attacker uploads Help TDS PHP template or modifies existing PHP/theme files → inbound visitors are fingerprinted by referrer, geography, user agent, crawl state, and prior cookies → selected users are redirected through one or more TDS hops → final landing page is a Cloudflare Pages-hosted tech-support scam. The scam page typically imitates a browser/security warning, uses fullscreen/notification/audio pressure, and prompts a phone call or download. Monetization is affiliate-driven, which means infrastructure changes quickly but behaviors repeat: web-root tampering, conditional redirects, egress to newly created pages.dev hostnames, and social-engineering lures.

Exploitation status: This is confirmed active abuse at scale, not a theoretical proof of concept. The report cites 20,000+ Cloudflare Pages domains and a TDS operating for years. Treat public-facing PHP sites as potentially compromised until file-integrity, access-log, and egress evidence says otherwise. Do not wait for a CVE, IOC feed, or vendor patch; the highest-value controls are egress intelligence, web file integrity monitoring, CMS hardening, and user reporting workflows.

Practical scoping: Start with assets that are both internet-facing and PHP-based, especially sites with outdated plugins, abandoned subdomains, shared hosting, FTP still enabled, or admin panels exposed to the internet. On the user side, prioritize populations frequently targeted by support scams: executives’ assistants, finance, customer service, remote workers, and users with legacy browsers or relaxed SmartScreen/Defender settings.

Detection & Response

The detections below avoid naive “block all Cloudflare” logic. They focus on high-signal behaviors: web servers writing executable content, server processes spawning shells after upload, rare/new pages.dev egress combined with scam-lure terms, and PHP templates containing redirect/affiliate markers. Tune thresholds to your baseline; do not enable broad pages.dev blocking without an exception process because legitimate developers also use the platform.

YAML
---
title: Web Server Process Spawning Shell After Possible TDS Template Upload
id: 6d2f7a1b-4c59-4b0e-9c4a-1d8f0a2b7c31
status: experimental
description: Detects IIS/Apache/Nginx/PHP worker processes spawning command shells or scripting engines, consistent with post-compromise deployment of Help TDS PHP redirect templates.
references:
  - https://attack.mitre.org/techniques/T1059/
  - https://attack.mitre.org/techniques/T1505/003/
author: Security Arsenal
date: 2026/10/01
tags:
  - attack.execution
  - attack.persistence
  - attack.t1059
  - attack.t1505.003
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith:
      - '\w3wp.exe'
      - '\php-cgi.exe'
      - '\php.exe'
      - '\httpd.exe'
      - '\nginx.exe'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\rundll32.exe'
      - '\certutil.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Rare CMS deployment pipelines or application warmup scripts
  - Legitimate PHP CLI invoked by application pools under a documented admin context
level: high
---
title: Executable Web Content Created In Web Root By Server Or Upload Context
id: 9b4c1a06-7d21-4e3d-a7f9-2c0d5e8b6a44
status: experimental
description: Detects creation or modification of PHP/ASP/ASPX files in common web content directories, a frequent indicator when Help TDS partner templates are injected into compromised sites.
references:
  - https://attack.mitre.org/techniques/T1505/003/
  - https://attack.mitre.org/techniques/T1105/
author: Security Arsenal
date: 2026/10/01
tags:
  - attack.persistence
  - attack.command_and_control
  - attack.t1505.003
  - attack.t1105
logsource:
  category: file_event
  product: windows
detection:
  selection_paths:
    TargetFilename|contains:
      - '\inetpub\wwwroot\'
      - '\wwwroot\'
      - '\htdocs\'
      - '\wordpress\'
      - '\wp-content\'
      - '\uploads\'
  selection_ext:
    TargetFilename|endswith:
      - '.php'
      - '.phtml'
      - '.php5'
      - '.php7'
      - '.asp'
      - '.aspx'
      - '.ashx'
  filter_known:
    Image|endswith:
      - '\devenv.exe'
      - '\msbuild.exe'
      - '\robocopy.exe'
      - '\xcopy.exe'
  condition: selection_paths and selection_ext and not filter_known
falsepositives:
  - Scheduled CMS/plugin updates
  - Developer deployment activity
  - Backup or migration jobs writing content
level: medium
---
title: Rare Cloudflare Pages Egress With Tech Support Scam Lure Terms
id: 2e7a9c41-8b10-4d65-9b31-7f4a1c9e5d20
status: experimental
description: Detects endpoint DNS or network connections to Cloudflare Pages hostnames containing common scam-lure terms. Intended as a hunting signal correlated with rarity, process context, and user reports.
references:
  - https://attack.mitre.org/techniques/T1071/001/
  - https://attack.mitre.org/techniques/T1204/001/
author: Security Arsenal
date: 2026/10/01
tags:
  - attack.command_and_control
  - attack.execution
  - attack.t1071.001
  - attack.t1204.001
logsource:
  category: dns
  product: windows
detection:
  selection_domain:
    query|contains: '.pages.dev'
  selection_lure:
    query|contains:
      - 'support'
      - 'microsoft'
      - 'windows-security'
      - 'virus'
      - 'alert'
      - 'error'
      - 'warning'
      - 'scan'
      - 'billing'
      - 'renewal'
      - 'applecare'
      - 'geek'
      - 'helpdesk'
  condition: selection_domain and selection_lure
falsepositives:
  - Legitimate Cloudflare Pages projects using support/help naming
  - Security testing and threat-intel validation
level: low
KQL — Microsoft Sentinel / Defender
// Microsoft Sentinel / Defender hunt: rare Cloudflare Pages egress with scam-lure context
// Run over 14d to smooth CDN churn and reduce one-off developer noise.
let lookback = 14d;
let lureTerms = dynamic(['support','microsoft','windows-security','virus','alert','error','warning','scan','billing','renewal','applecare','geek','helpdesk','popup']);
let defender = DeviceNetworkEvents
| where TimeGenerated >= ago(lookback)
| where RemoteUrl has '.pages.dev' or RemoteIPType =~ 'Public'
| extend Host = tostring(parse_url(RemoteUrl).Host)
| where Host endswith '.pages.dev'
| where Host has_any (lureTerms) or RemoteUrl has_any (lureTerms)
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Hits=count(), Processes=make_set(InitiatingProcessFileName,20), Users=make_set(InitiatingProcessAccountName,20), SampleUrls=make_set(RemoteUrl,5) by DeviceName, Host
| where Hits <= 10; // rarity heuristic; tune to environment
let proxy = CommonSecurityLog
| where TimeGenerated >= ago(lookback)
| extend Url = coalesce(RequestURL, tostring(AdditionalExtensions))
| extend DestHost = coalesce(DestinationHostName, tostring(parse_url(Url).Host))
| where DestHost endswith '.pages.dev'
| where DestHost has_any (lureTerms) or Url has_any (lureTerms)
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Hits=count(), Srcs=make_set(SourceIP,20), Actions=make_set(DeviceAction,10), SampleUrls=make_set(Url,5) by DestHost, DestinationIP
| where Hits <= 25;
union defender, proxy
| project FirstSeen, LastSeen, Hits, DeviceName, Source=Srcs, Host, DestinationIP, Processes, Users, Actions, SampleUrls
| sort by LastSeen desc;
VQL — Velociraptor
-- Velociraptor hunt: find recently modified PHP files in web roots and flag TDS/scam markers
-- Deploy to web servers or file servers hosting PHP/CMS content. Review matches before quarantine.
LET roots <= SELECT FullPath FROM glob(globs=['C:/inetpub/wwwroot/**/*.php','C:/inetpub/*/wwwroot/**/*.php','/var/www/**/*.php','/srv/www/**/*.php','/usr/share/nginx/html/**/*.php','/home/*/public_html/**/*.php'])
LET recent <= SELECT FullPath, Mtime, Size FROM stat(filename=roots.FullPath) WHERE Mtime > now() - 1209600
SELECT FullPath, Mtime, Size,
       read_file(filename=FullPath, length=200000) AS Content,
       countif(array=[
         Content =~ 'base64_decode',
         Content =~ 'gzinflate|str_rot13|eval\s*\(',
         Content =~ '\$_REQUEST|\$_GET|\$_POST',
         Content =~ 'header\s*\(\s*[\'\"]Location:',
         Content =~ 'window\.location|location\.href',
         Content =~ 'hotejka|roi777|help.?tds',
         Content =~ 'pages\.dev',
         Content =~ 'google|bing|yahoo|duckduckgo'
       ]) AS MarkerHits
FROM recent
WHERE MarkerHits >= 3
ORDER BY Mtime DESC
PowerShell
# Security Arsenal - Help TDS / Cloudflare Pages scam verification & hardening snapshot (Windows/IIS)
# Run elevated on IIS/web servers. Review output before deleting anything; quarantine, do not auto-purge.
$OutDir = Join-Path $env:ProgramData 'SecurityArsenal\HelpTDS-Hunt'
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
$webRoots = @('C:\inetpub\wwwroot')
Get-IISSite | ForEach-Object { if ($_.PhysicalPath) { $webRoots += $_.PhysicalPath } }
$webRoots = $webRoots | Where-Object { Test-Path $_ } | Select-Object -Unique
$markers = 'base64_decode|gzinflate|str_rot13|eval\s*\(|header\s*\(\s*[\x27\x22]Location:|window\.location|location\.href|hotejka|roi777|help.?tds|pages\.dev|wp-load|admin-ajax|xmlrpc'
$recent = foreach ($root in $webRoots) {
  Get-ChildItem -Path $root -Recurse -Include *.php,*.phtml,*.php5,*.php7,*.asp,*.aspx,*.ashx,*.js -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-14) -or $_.CreationTime -gt (Get-Date).AddDays(-14) }
}
$hits = foreach ($f in $recent) {
  try {
    $txt = Get-Content -Path $f.FullName -Raw -ErrorAction Stop
    $m = [regex]::Matches($txt, $markers, 'IgnoreCase')
    if ($m.Count -ge 3) {
      [pscustomobject]@{ FullName=$f.FullName; Created=$f.CreationTime; Modified=$f.LastWriteTime; Size=$f.Length; MarkerHits=$m.Count; Hash=(Get-FileHash $f.FullName -Algorithm SHA256).Hash }
    }
  } catch {}
}
$hits | Sort-Object Modified -Descending | Export-Csv (Join-Path $OutDir "tds-file-hits-$stamp.csv") -NoTypeInformation
# Capture server-side outbound listener/context and suspicious child processes from web workers over the hunt window.
Get-CimInstance Win32_Process | Where-Object { $_.Name -in @('w3wp.exe','php-cgi.exe','php.exe','httpd.exe','nginx.exe') } |
  Select-Object ProcessId,Name,CommandLine,CreationDate,ParentProcessId | Export-Csv (Join-Path $OutDir "web-workers-$stamp.csv") -NoTypeInformation
# Hardening checks: write/execute separation, FTP exposure, PHP in upload paths, and CMS file integrity.
$findings = @()
foreach ($root in $webRoots) {
  $acl = Get-Acl $root
  $findings += [pscustomobject]@{ Check='WebRootACL'; Path=$root; Detail=($acl.AccessToString -replace "`r?`n",' | ') }
}
Get-WebConfiguration -Filter 'system.webServer/security/requestFiltering/fileExtensions' -ErrorAction SilentlyContinue | Out-String | Set-Content (Join-Path $OutDir "request-filtering-$stamp.txt")
Get-WindowsOptionalFeature -Online -FeatureName IIS-FTPServer,IIS-FTPSvc -ErrorAction SilentlyContinue | Export-Csv (Join-Path $OutDir "ftp-features-$stamp.csv") -NoTypeInformation
Write-Host "Review $OutDir. Next: preserve evidence, compare hashes to clean CMS source, rotate CMS/FTP/DB credentials, patch CMS/plugins, block confirmed scam domains at DNS/proxy, and enable Defender SmartScreen/PUA." -ForegroundColor Yellow

Remediation

Contain compromised web infrastructure immediately. Take affected virtual hosts or directories offline if active redirects are observed. Preserve logs before cleanup: web access logs, PHP-FPM/IIS logs, CMS admin logs, FTP/SFTP/SSH auth logs, WAF events, EDR telemetry, and full file listings with timestamps and hashes. Compare every PHP/JS/theme/plugin file against clean vendor/CMS source and known-good backups; do not rely only on AV because affiliate templates are often benign-looking conditional redirect code until runtime. Remove unknown files only after evidence capture, then rotate all credentials that could have touched the site: CMS admin, hosting panel, FTP/SFTP, SSH keys, database users, API tokens, CDN/origin tokens, and service accounts. Reset sessions and invalidate cookies where the CMS supports it.

Patch and harden the CMS/PHP stack. Update CMS core, themes, plugins, PHP runtime, and dependencies to vendor-supported current versions; remove abandoned plugins and unused admin accounts. Enforce MFA for hosting and CMS administration, disable XML-RPC if not required, restrict admin panels by IP/VPN/IdP, turn off file editing inside WordPress (DISALLOW_FILE_EDIT), and prevent PHP execution in upload/media directories. Put the origin behind a WAF with positive security for admin paths, block direct origin access except from your CDN, and disable legacy FTP in favor of SFTP/SSH keys. Add file-integrity monitoring for web roots and alert on web workers spawning shells as described above.

Protect users without breaking the internet. Do not implement a blanket deny on pages.dev unless your business can tolerate developer/platform disruption; Cloudflare Pages is legitimate infrastructure. Instead, combine: DNS/proxy blocking of confirmed scam hostnames from your investigation and threat feeds; Defender SmartScreen/Chrome Safe Browsing enforcement; blocking of remote-access tools (AnyDesk, TeamViewer, ScreenConnect, UltraViewer, etc.) for users who do not need them; browser isolation for high-risk roles; and rapid user-reporting for fake virus warnings. Report abuse to Cloudflare at https://www.cloudflare.com/abuse/, to Microsoft for impersonation scams via its reporting channels, and to https://reportfraud.ftc.gov/ where consumer fraud is involved.

Hunt and validate. Run the KQL and VQL hunts across endpoints and servers for at least 14–30 days. For confirmed hits, reconstruct the redirect chain from proxy/DNS/browser history and identify the first compromised referring site; that is often your customer, vendor, or your own web property. Add confirmed domains and redirect patterns to TI watchlists, create an internal exception workflow for legitimate pages.dev use, and measure dwell time from first pages.dev hit to user report. If a corporate site is implicated, notify the owner, preserve evidence, and consider IR escalation — the same foothold used for scam redirects can later be sold or reused for credential phishing, SEO poisoning, or malware delivery.

Related Resources

Security Arsenal Alert Triage Automation AlertMonitor Platform Book a SOC Assessment platform Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.