SOC Prime Bias: Critical

12 Jan 2026 15:59

BlueDelta (APT28) Credential Phishing via Free Hosting & Ngrok

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
BlueDelta (APT28) Credential Phishing via Free Hosting & Ngrok
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Summary

BlueDelta, a GRU‑affiliated group also known as APT28/Fancy Bear, ran multiple credential‑harvesting campaigns between February and September 2025. The campaigns used free hosting and tunneling services to host spoofed Outlook, Google and Sophos VPN login pages and exfiltrate captured credentials. Lures included legitimate PDF documents and region‑specific language to increase credibility. The operation targeted energy, nuclear research, government and academic entities in Turkey, North Macedonia and Uzbekistan.

Investigation

Recorded Future’s Insikt Group collected over a dozen phishing pages hosted on services such as Webhook.site, InfinityFree, Byet Internet Services and ngrok. JavaScript on the pages captured usernames, passwords and victim identifiers, sent beacons to attacker‑controlled webhooks, and then redirected victims to authentic portals. Multiple variants reused code and modified variable names to streamline deployment. Infrastructure was short‑lived and leveraged link‑shorteners like ShortURL.at.

Mitigation

Block known free‑hosting and tunneling domains, monitor for outbound traffic to webhook services, and enforce MFA on all external‑facing accounts. Educate users about phishing pages that mimic OWA, Google and VPN portals, especially when PDF lures are attached. Implement network filtering for known malicious URLs and apply email security controls to detect suspicious PDF links.

Response

Alert SOC analysts when HTTP POSTs to known webhook endpoints are observed and when credential‑harvesting pages are loaded. quarantine the malicious page, isolate affected user accounts, force password resets and review logs for lateral movement. Conduct a threat‑hunt for other pages using the same infrastructure and update block lists accordingly.

"graph TB %% Class Definitions classDef action fill:#99ccff classDef service fill:#ffcc99 classDef tool fill:#cccccc %% Nodes u2013 Reconnaissance recon_info["<b>Action</b> – <b>T1591 Gather Victim Org Information</b>: Collect public email addresses and organization details of target researchers."] class recon_info action recon_roles["<b>Action</b> – <b>T1591.004 Identify Roles</b>: Determine specific job functions such as energy analysts, thinku2011tank scholars and security staff."] class recon_roles action %% Nodes u2013 Resource Development resource_dev["<b>Action</b> – <b>T1583.006 Acquire Infrastructure Web Services</b>: Register disposable domains and use free hosting/tunneling services (Webhook.site, InfinityFree, Byet, ngrok, shorturl.at)."] class resource_dev service %% Nodes u2013 Phishing phishing["<b>Action</b> – <b>T1566.001 Spearphishing Attachment</b>: Send crafted email containing shortened malicious link that redirects through several URLs."] class phishing action %% Nodes u2013 Obfuscation html_smuggling["<b>Action</b> – <b>T1027.006 HTML Smuggling</b>: First redirect serves HTML that briefly embeds a legitimate PDF lure via metau2011refresh."] class html_smuggling action %% Nodes u2013 Credential Harvesting credential_forge["<b>Action</b> – <b>T1606 Forge Web Credentials / T1056.003 Web Portal Capture</b>: Spoofed login pages (OWA, Google, Sophos VPN) capture credentials with JavaScript."] class credential_forge tool %% Nodes u2013 Input Capture Beacon web_capture_beacon["<b>Action</b> – <b>T1056.003 Web Portal Capture</b>: JavaScript sends pageu2011opened beacon and entered credentials to attacker webhook."] class web_capture_beacon tool %% Nodes u2013 Exfiltration exfil_webhook["<b>Action</b> – <b>T1567.004 Exfiltration Over Webhook</b>: POST captured data as JSON to attackeru2011controlled webhook (webhook.site, ngroku2011free.app)."] class exfil_webhook service %% Nodes u2013 Command and Control c2_webprotocol["<b>Action</b> – <b>T1071.001 Application Layer Protocol Web Protocols</b>: Use standard web traffic for C2 communication."] class c2_webprotocol service c2_webservice["<b>Action</b> – <b>T1102.002 Web Service Bidirectional Communication</b>: Maintain persistent twou2011way channel via the webhook service."] class c2_webservice service %% Nodes u2013 Tunneling protocol_tunnel["<b>Action</b> – <b>T1572 Protocol Tunneling</b>: Leverage ngrok tunnels to expose local exfiltration endpoints to the internet."] class protocol_tunnel tool %% Nodes u2013 Postu2011Exfiltration Redirection post_redirect["<b>Action</b> – Postu2011exfiltration Redirection: After data capture victims are sent to the original legitimate document or VPN portal to avoid suspicion."] class post_redirect action %% Connections u2013 Flow recon_info –>|leads_to| recon_roles recon_roles –>|leads_to| resource_dev resource_dev –>|enables| phishing phishing –>|triggers| html_smuggling html_smuggling –>|delivers| credential_forge credential_forge –>|captures| web_capture_beacon web_capture_beacon –>|sends_to| exfil_webhook exfil_webhook –>|supports| c2_webprotocol c2_webprotocol –>|uses| c2_webservice c2_webservice –>|relies_on| protocol_tunnel protocol_tunnel –>|facilitates| post_redirect "

Attack Flow

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic. Abstract or unrelated examples will lead to misdiagnosis.

  • Attack Narrative & Commands:

    1. Initial phishing delivery: An attacker sends a phishing email containing a short URL that redirects to the malicious webhook.site page.
    2. Victim interaction: The victim clicks the link; the browser follows the redirect and issues an HTTP GET request to https://webhook.site/e8ae3bbd-ab02-46b7-b84c-f5f4baa5d7c7.
    3. Credential capture page: The page hosts JavaScript that steals entered credentials and POSTs them back to the same webhook URL, but the proxy only logs the initial GET request, which is sufficient to fire the rule.
    4. For the test, we emulate the victim using PowerShell’s Invoke-WebRequest to request the exact malicious URL, reproducing the same proxy log entry.
  • Regression Test Script:

    # -------------------------------------------------
    # BlueDelta Webhook Site Access Simulation (TC-20260109-9X3BZ)
    # -------------------------------------------------
    $maliciousUrls = @(
        "https://webhook.site/e8ae3bbd-ab02-46b7-b84c-f5f4baa5d7c7",
        "https://webhook.site/3791f8c0-1308-4c5b-9c82-0dc416aeb9c4"
    )
    
    foreach ($url in $maliciousUrls) {
        try {
            Write-Host "Requesting malicious URL: $url"
            Invoke-WebRequest -Uri $url -UseBasicParsing -Method GET -TimeoutSec 10 | Out-Null
            Write-Host "âś… Request sent."
        } catch {
            Write-Warning "Request to $url failed: $_"
        }
    }
  • Cleanup Commands:

    # Flush proxy cache (if applicable) to avoid residual entries
    net stop "Squid Service"
    net start "Squid Service"
    
    # Remove any temporary files created by the script (none in this case)
    Write-Host "Cleanup complete."