On July 7, 2026, CyberHawk Threat Intel uncovered a live Phishing-as-a-Service operation targeting Microsoft 365 enterprises — not through a vendor advisory, but through direct threat hunting. A suspicious link surfaced during passive monitoring of threat actor Telegram channels: a Cloudflare Workers page masquerading as an Adobe Document Cloud verification portal, silently harvesting Microsoft device codes from unsuspecting corporate users. Pulling the outbound network requests from that single phishing page exposed a buried API endpoint at spx.pamconj.com — the operator control panel of what turned out to be ARToken, a fully operational PhaaS platform actively generating live Microsoft device codes for phishing campaigns.
Through systematic DNS resolution, TLS certificate analysis, WHOIS pivoting, HTTP header fingerprinting, API endpoint probing, and JavaScript bundle reverse engineering, we mapped the complete attack surface: 80+ API endpoints, a multi-operator panel with 2FA, Entra ID weaponization (user CRUD, role assignment, password reset), cross-account inbox monitoring, BEC email composition, SharePoint/OneDrive exfiltration, PRT cookie extraction, and Cloudflare Worker deployment for phishing lure distribution.
The domain was registered April 6, 2026 via Hetzner (Germany), with registrant country France. Infrastructure hosted on DigitalOcean US (New Jersey + Georgia). Cloudflare has flagged some Worker-based phishing pages as "Suspected Phishing" but the primary C2 remains untouched.
Investigation Phases
PHASE 1 — IOC INTAKE & SCOPING
COLLECTIONIt started with a single suspicious link. During passive monitoring of threat actor channels, I flagged an unusual URL circulating through underground Telegram groups — a Cloudflare Workers domain presenting itself as an Adobe Document Cloud file verification portal. The design was convincingly corporate: clean Microsoft-branded UI, a company logo strip, and an embedded device code entry field pre-loaded with a code. Except the victim hadn't generated that code — the platform had done it server-side, silently, before the page ever loaded.
Pulling the page's outbound network traffic revealed the tell: every code entered was being silently POSTed to an external API endpoint at spx.pamconj.com. That single domain was the thread that unravelled the entire operation. What I'd stumbled on wasn't a one-off phishing page — it was the operator control panel of a full-scale PhaaS platform.
GET /api/device/start, injects it into the victim-facing page, then polls /api/device/poll until the victim enters it at login.microsoft.com/device — silently authorising the TA's OAuth session without the victim ever leaving what looks like a legitimate Adobe portal.
Following the pivot to spx.pamconj.com, I identified additional subdomains and Cloudflare Worker routes through passive enumeration, DNS resolution, and certificate transparency log review. The full infrastructure footprint was staged on my Kali investigation platform for systematic DFIR analysis.
- 6 domains/subdomains identified across 2 infrastructure tiers (direct hosting + Cloudflare Workers)
- All probing conducted from isolated Kali Linux lab (10.100.110.2) — no production systems involved
- Investigation scope: DNS, TLS, HTTP, WHOIS, API surface, JS bundle extraction — passive/semi-passive only
- Evidence directory:
/home/cyberhawk/intel/artoken-eviltokens-2026-07/
PHASE 2 — DNS RECONNAISSANCE
ENUMERATIONStandard DNS resolution via system resolver on Kali. Port 53 was intermittently blocked on this network segment, so we fell back to direct HTTP probing for connectivity validation before DNS queries succeeded.
| Domain | IP Address | Status | Notes |
|---|---|---|---|
| spx.pamconj.com | 159.65.36.134 | LIVE | Primary C2 panel — DigitalOcean NJ |
| pamconj.com | 159.65.36.134 | Resolves, no HTTP | Parent domain — same IP as C2 |
| dashboard-bl.pamconj.com | 134.199.198.129 | Resolves, no HTTP | Secondary — DigitalOcean GA |
| clear90489058903-document.workers.dev | — | NXDOMAIN | CF Worker deleted/suspended |
| reynoldsjace5.workers.dev | — | NXDOMAIN | CF Worker deleted/suspended |
| 50a201fd-...reynoldsjace5.workers.dev | 104.21.89.75 | 403 — "Suspected Phishing" | Cloudflare flagged & blocked |
- Primary C2 (spx.pamconj.com) resolves and is actively serving content
- Two DigitalOcean IPs identified across two US regions (NJ + GA)
- Parent CF Worker accounts deleted — TA may have abandoned or rotated phishing infrastructure
- One sub-worker still resolves but Cloudflare blocks it with "Suspected Phishing" interstitial
PHASE 3 — TLS CERTIFICATE FORENSICS
CRYPTO ANALYSIS| Attribute | Value | Intelligence |
|---|---|---|
| Issuer | Let's Encrypt E7 | Free automated CA — common for TA infrastructure. No identity verification. |
| Issued | May 6, 2026 | Certificate is 2 months old — infrastructure recently provisioned. |
| Expires | Aug 4, 2026 | Standard 90-day LE cert — will auto-renew if certbot/ACME is configured. |
| SAN | spx.pamconj.com only | No wildcard, no additional subdomains — single-purpose cert. |
| Key Type | ECC P-256 | Modern key choice — TA is technically competent. |
| CT Logged | Yes (2 SCTs) | Certificate appears in public CT logs — discoverable via crt.sh. |
Active maintenance confirmed: The Let's Encrypt cert was issued May 6, 2026 and the domain was registered April 6, 2026 — exactly 30 days apart. The TA set up infrastructure in April, obtained TLS in May, and the server content was last modified July 6, 2026 (1 day before this investigation). This is actively maintained infrastructure.
PHASE 4 — HTTP FINGERPRINTING
SERVER ID| Component | Value | Notes |
|---|---|---|
| Reverse Proxy | Caddy v1.1 | Go-based web server with automatic HTTPS — handles LE cert renewal |
| Backend Framework | Express.js (Node.js) | x-powered-by header not stripped — OPSEC oversight |
| Frontend | React SPA (Vite build) | Bundle hash: index-BrN7SnMX.js — Vite production build |
| Protocol | HTTP/2 + HTTP/3 | alt-svc: h3 indicates QUIC support via Caddy |
| Last Modified | July 6, 2026 06:47:21 UTC | Content updated 1 day before investigation |
| Panel Title | "ARToken Panel" | Embedded in HTML <title> tag |
| Internal Port | 3001 | Extracted from JS bundle — Caddy proxies 443 → 3001 |
OPSEC failure: The Express x-powered-by header is still enabled. Combined with the Caddy via header, the entire technology stack is exposed without any request. Production security hardening was not applied. This suggests developer-operator overlap — the TA is likely a developer running their own infrastructure, not a mature crime-as-a-service operation with dedicated devops.
PHASE 5 — WHOIS & IP INTELLIGENCE
ATTRIBUTION| Attribute | Value | Intelligence |
|---|---|---|
| Registrar | Hetzner Online GmbH (Germany) | German hosting provider — popular with EU-based operators |
| Created | April 6, 2026 | Domain is ~3 months old — purpose-built for this campaign |
| Registrant Country | FR (France) | Despite WHOIS privacy, country field leaks French registration |
| NS Provider | Cloudflare | Using CF for DNS management — consistent with CF Worker phishing infrastructure |
| DNSSEC | Unsigned | No DNSSEC — vulnerable to DNS poisoning (also explains geo-variant resolution) |
| IP Address | ASN | Location | Usage |
|---|---|---|---|
| 159.65.36.134 | AS14061 DigitalOcean | Clifton, NJ, US | Primary C2 (spx.pamconj.com + pamconj.com) |
| 134.199.198.129 | AS14061 DigitalOcean | Douglasville, GA, US | Secondary (dashboard-bl.pamconj.com) |
| 104.21.89.75 | AS13335 Cloudflare | Cloudflare Anycast | CF Worker phishing pages (flagged) |
- French-registered domain, German registrar (Hetzner), US-hosted infrastructure (DigitalOcean)
- Multi-region DigitalOcean deployment suggests geographic redundancy planning
- Cloudflare used for DNS + Workers (phishing page distribution) — CF has partially taken action
- WHOIS privacy service (domain-contact.org) obscures registrant identity
PHASE 6 — API ENDPOINT PROBING
ACTIVE RECONUnauthenticated probing of discovered API endpoints to determine operational status, authentication mechanisms, and error message patterns.
- JWT Bearer token authentication —
Authorization: Bearer <token>header required - Login requires username + password (POST /api/auth/login)
- 2FA (TOTP) supported via /auth/2fa/setup, /auth/2fa/verify, /auth/2fa/disable
- Error messages are verbose — leak implementation details (Express default error handler)
LIVE PHISHING INFRASTRUCTURE CONFIRMED: The /api/device/start endpoint generates real Microsoft device codes without any authentication. This endpoint is the core phishing mechanism — it creates device codes that victims are social-engineered into entering at microsoft.com/device.
- The C2 is actively generating Microsoft device codes — real, valid codes that work at login.microsoft.com/device
- No authentication required to trigger code generation — the endpoint is publicly accessible
- 15-minute expiry (900 seconds) with 5-second polling interval — standard Microsoft device code flow parameters
- The device_code JWT is issued by Microsoft's token service — the TA has a valid Azure AD application registration
- This confirms the platform is being used for active phishing campaigns as of July 7, 2026
PHASE 7 — JS BUNDLE REVERSE ENGINEERING
ANALYSISWe captured the complete ARToken Panel frontend: 1.7MB JavaScript bundle, 96KB CSS stylesheet, and HTML index. Static analysis of the minified React bundle revealed the complete API client, route definitions, feature set, and one hardcoded Azure AD GUID.
The hardcoded GUID 62e90394-69f5-4237-9190-012177145e10 is the well-known Microsoft Entra ID Global Administrator role template ID. This confirms the panel specifically checks whether stolen tokens belong to Global Admins — the highest-value target for complete tenant takeover.
PHASE 8 — COMPLETE API SURFACE MAP
80+ ENDPOINTSExtracted every fetch() call from the minified bundle. The API client object (Lt) wraps all calls to a base URL variable B. Complete endpoint taxonomy below.
| Endpoint | Method | Purpose |
|---|---|---|
| /api/auth/login | POST | Operator login (username + password) |
| /api/auth/me | GET | Session validation (JWT) |
| /api/auth/change-password | POST | Operator password change |
| /api/auth/2fa/setup | POST | TOTP 2FA enrollment |
| /api/auth/2fa/verify | POST | TOTP verification |
| /api/auth/2fa/disable | POST | Disable 2FA |
| /api/users | GET | List all platform operators |
| /api/users/:id | GET/PUT/DELETE | Operator CRUD — multi-operator PhaaS |
| Endpoint | Method | Purpose |
|---|---|---|
| /api/tokens | GET | List all captured victim tokens |
| /api/tokens/:id | GET/DELETE | Individual token details / deletion |
| /api/tokens/:id/refresh | POST | Refresh stolen token (maintain persistence) |
| /api/tokens/:id/inbox-monitor | PUT | Toggle cross-account inbox monitoring |
| /api/tokens/:id/share-links | POST/DELETE | Share stolen tokens with other operators |
| /api/tokens/import | POST | Import tokens (file upload) |
| /api/tokens/bulk/delete | POST | Mass token deletion |
| /api/tokens/groups/* | GET/PUT/DELETE | Token grouping/tagging |
| Endpoint | Method | Purpose |
|---|---|---|
| /api/entra/:id/tenant | GET | Full tenant metadata dump |
| /api/entra/:id/users | GET/POST | List users / Create new user in victim tenant |
| /api/entra/:id/users/:uid | GET/PATCH/DELETE | Read / modify / delete victim users |
| /api/entra/:id/users/:uid/reset-password | POST | Reset victim user password |
| /api/entra/:id/users/:uid/toggle | POST | Enable/disable victim accounts |
| /api/entra/:id/roles | GET | Enumerate directory roles |
| /api/entra/:id/roles/:rid/members | POST/DELETE | Assign/remove roles — including Global Admin |
| Endpoint | Method | Purpose |
|---|---|---|
| /api/tokens/:id/prt/setup | POST | Initialize PRT extraction |
| /api/tokens/:id/prt/refresh | POST | Refresh via Primary Refresh Token |
| /api/tokens/:id/prt/renew | POST | PRT renewal (extend lifespan) |
| /api/tokens/:id/prt/reacquire | POST | Re-obtain PRT from refresh token |
| /api/tokens/:id/prt/cookie | POST | Extract OWA session cookies from PRT |
| /api/tokens/:id/prt/clean-setup | POST | Clean PRT setup artifacts |
| /api/tokens/:id/prt/status | GET | PRT operational status |
| Endpoint | Method | Purpose |
|---|---|---|
| /api/sender/:id/send | POST | Send email as victim (BEC) |
| /api/rules/:id | GET/DELETE | Inbox rule management (evidence suppression) |
| /api/box-monitor | GET/DELETE | Cross-account keyword inbox monitoring |
| /api/sharepoint/:id/* | POST | SharePoint file access, upload, sharing, permissions |
| /api/extract/:id/start | POST | Bulk data extraction from victim account |
| /api/extract-links/:id/start | POST | Link/URL extraction from emails |
| Endpoint | Method | Purpose |
|---|---|---|
| /api/settings/device-proxy | GET/PUT | Configure proxy for device code generation |
| /api/settings/telegram/test | POST | Test Telegram bot notification |
| /api/settings/cloudflare/deploy | POST | Deploy Cloudflare Workers (phishing pages) |
| /api/settings/cloudflare/workers | GET/DELETE | Manage deployed CF Worker phishing pages |
| /api/settings/origins | GET | Allowed CORS origins |
| /api/settings/artbrowser-url | GET | ARTBrowser custom download URL |
| /api/templates | GET | Phishing lure template library |
| /api/blacklist | GET/POST/DELETE | Anti-analysis IP/path blacklist |
PHASE 9 — KILL CHAIN & MITRE ATT&CK MAPPING
TTP TABLEARToken Full Attack Kill Chain — from device code phishing to BEC and data exfiltration
| MITRE ID | Technique | ARToken Implementation |
|---|---|---|
| T1566 | Phishing | Device code phishing via CF Worker lures + configurable proxy |
| T1528 | Steal Application Access Token | Token capture + FOCI refresh token exchange |
| T1550.001 | Use Alternate Auth Material: Application Access Token | PRT extraction + OWA session cookie theft |
| T1087.004 | Account Discovery: Cloud Account | Entra ID user enumeration, role listing, tenant metadata |
| T1098 | Account Manipulation | Create users, assign roles (incl. Global Admin), reset passwords, enable/disable accounts |
| T1114.001 | Email Collection: Local Email Collection | Box Monitor keyword scanning across all captured accounts |
| T1114.003 | Email Collection: Email Forwarding Rule | Inbox rule creation for evidence suppression |
| T1534 | Internal Spearphishing | BEC sender module — compose and send as victim |
| T1530 | Data from Cloud Storage Object | SharePoint/OneDrive file access, upload, sharing, permission manipulation |
| T1567 | Exfiltration Over Web Service | Bulk data extraction module with job tracking |
PHASE 10 — INDICATORS OF COMPROMISE
BLOCKLIST| Type | Indicator | Status | Context |
|---|---|---|---|
| Domain | spx.pamconj.com | ACTIVE C2 | ARToken panel — Express + Caddy on DO |
| Domain | pamconj.com | ACTIVE | Parent domain — same IP as C2 |
| Domain | dashboard-bl.pamconj.com | ACTIVE | Secondary dashboard — different DO region |
| IPv4 | 159.65.36.134 | ACTIVE C2 | DigitalOcean — Clifton, NJ (AS14061) |
| IPv4 | 134.199.198.129 | ACTIVE | DigitalOcean — Douglasville, GA (AS14061) |
| Domain | clear90489058903-document.workers.dev | Deleted (NXDOMAIN) | Former CF Worker phishing page |
| Domain | reynoldsjace5.workers.dev | Deleted (NXDOMAIN) | Former CF Worker phishing page |
| Domain | 50a201fd-dd2d-cf72-5fa6-adobe2.reynoldsjace5.workers.dev | CF Blocked | Flagged "Suspected Phishing" by Cloudflare |
PHASE 11 — DETECTION & HUNT QUERIES
HUNT LOGIC- 1Device Code Sign-Ins: Search
SigninLogsforAuthenticationProtocol == "deviceCode"in the last 30 days. Any sign-in from an IP in the 159.65.x.x or 134.199.x.x ranges warrants immediate investigation. - 2Inbox Rule Audit: Run
Get-InboxRule -Mailbox <user>across all users. Look for rules that delete, move to Junk/RSS, or mark as read — especially rules created in the last 90 days with forwarding to external addresses. - 3OAuth App Credential Audit: Review
AuditLogsforAdd service principal credentialsoperations. Cross-reference with known applications — any credential addition by a non-admin to an admin-consented app is suspicious. - 4Conditional Access Gap: Verify that Conditional Access policies enforce compliant device or MFA for device code flows. Test with
What Ifin the Entra portal for a device code scenario. - 5DNS/Proxy Log Review: Search proxy logs and DNS query logs for
pamconj.com,spx.pamconj.com, and*.workers.devdomains with phishing-style URL patterns. - 6Graph API Activity Review: Check
MicrosoftGraphActivityLogs(if enabled) for bulk user enumeration, role assignment operations, or password reset calls from unusual application IDs.
PHASE 12 — SOURCES & REFERENCES
PRIMARY SOURCESEvidence Archive
For IOC integration into your SIEM, paste the domain and IP indicators above into the CyberHawk IOC Scanner.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat intelligence, DFIR reports and hands-on SOC tooling content.
"They can't exploit you if you are the Exploit."