Back to Intelligence

KeyHunter Operation: leepsmarts LLM API Key Theft & Academic Fraud Campaign — OTX Detection Pack

SA
Security Arsenal Team
November 4, 2026
10 min read

Threat Summary

AlienVault OTX pulse data (TLP:WHITE, modified 2026-11-04) exposes Operation KeyHunter, a multi-vector campaign attributed to a Chinese-speaking threat actor tracked as leepsmarts. This is not a conventional malware intrusion — it is a hybrid operation fusing cloud credential harvesting, AI infrastructure abuse, financial fraud, and academic fraud into a single monetization pipeline.

The campaign's core mechanics:

  1. Mass scanning of misconfigured cloud deployments — the actor systematically enumerated exposed environment variables and config files across developer platforms including Vercel, Netlify, and Railway, harvesting 2,233 LLM API keys (OpenAI, Anthropic, and similar providers), with at least 12 confirmed valid at time of analysis.
  2. Academic fraud at scale — fraudulent student accounts were created at 20 universities, including Harvard (alumni data exposure) and Stanford (application system abuse), enabling access to institutional resources, .edu email privileges, and discounted AI tooling.
  3. Cryptocurrency draining and Telegram-based C2 — stolen assets and harvested credentials are laundered through drainer infrastructure, with Telegram bots serving as the command-and-distribution layer (see IOC juanwangccbotgithubgithub.com).
  4. Exploitation of CVE-2026-41940 — a vulnerability referenced in the pulse as part of the intrusion set, likely used to access or pivot within exposed cloud application infrastructure.

Targeting spans Education and Finance sectors across 11 countries including the United States, Germany, France, UAE, Saudi Arabia, and Pakistan. The dual-sector focus indicates the actor monetizes both raw credential resale and direct financial theft.

Threat Actor / Malware Profile — leepsmarts

Attribution: Chinese-speaking operator, identified in underground channels as leepsmarts. Operational tempo and infrastructure suggest an individual or small crew rather than a state-directed unit, though the tradecraft overlaps with known initial-access broker behavior.

Distribution / Access Method:

  • Automated scanning of public internet for exposed .env files, deployment logs, and misconfigured serverless function endpoints on Vercel, Netlify, and Railway
  • Exploitation of CVE-2026-41940 to extract environment secrets from vulnerable application frameworks
  • GitHub repository scraping for hardcoded API keys committed by developers

Payload Behavior:

  • No traditional endpoint malware family is named in the pulse — the "payload" is the harvested credential itself, weaponized immediately for LLM API abuse (resold compute, model access fraud) and financial fraud
  • Cryptocurrency drainer components deployed against victims in the finance track, typically delivered via phishing infrastructure hosted on bulletproof hosting

C2 Communication:

  • Telegram bots function as the primary C2 and exfiltration channel — harvested keys and drainer proceeds are routed through bot APIs, a technique that blends malicious traffic with legitimate TLS-encrypted Telegram sessions
  • Distributing bot infrastructure through domains mimicking GitHub (juanwangccbotgithubgithub.com) to evade casual inspection

Persistence Mechanism:

  • Persistence is achieved through fraudulent identities rather than implants: fake student accounts at 20 universities provide durable access to .edu infrastructure, library systems, and academic AI credits
  • Valid stolen API keys persist until rotated — the actor's access lives in the victim's own cloud configuration

Anti-Analysis Techniques:

  • Infrastructure distributed across multiple countries (IPs in South Korea, Chile, and Russia per the IOC set) to frustrate geofencing and takedown
  • Abuse of legitimate platforms (Telegram, GitHub lookalikes) to inherit their trust reputation
  • Rapid key validation and resale, minimizing the window between theft and monetization

IOC Analysis

The pulse contains 5 indicators across three types. SOC operationalization guidance:

TypeIndicatorRoleAction
CVECVE-2026-41940Initial access vectorAsset-inventory all internet-facing app frameworks; patch or virtual-patch immediately
IPv414.47.118.194Suspected scanning/C2 infra (South Korea)Block at perimeter; retro-hunt netflow 90 days
IPv4190.114.197.2Suspected drainer/phishing hostBlock; check proxy logs for user visits
IPv446.39.24.98Suspected C2/exfil nodeBlock; correlate with TLS SNI logs
Domainjuanwangccbotgithubgithub.comTelegram bot distribution / GitHub typosquatDNS-sinkhole; alert on any resolution

Operationalization notes:

  • Push all three IPs and the domain into your firewall, DNS resolver (RPZ), EDR custom indicators, and proxy blocklists simultaneously — partial coverage leaves exfil paths open
  • The domain's structure (mashing "ccbot" + "githubgithub") is characteristic of typosquat-served Telegram bot payloads; hunt for it in DNS query logs, not just connection logs — blocked resolutions still prove intent
  • Use VirusTotal, AbuseIPDB, and GreyNoise to enrich the IPs: GreyNoise in particular will tell you whether 14.47.118.194 is a known internet scanner targeting exposed .env endpoints
  • The CVE indicator demands vulnerability scanner integration (Tenable/Qualys/Wiz) — query your cloud asset inventory for CVE-2026-41940 exposure on Vercel/Netlify/Railway-adjacent workloads

Detection Engineering

YAML
---
title: KeyHunter LLM API Key Harvesting - Exposed Environment File Access
description: Detects web requests attempting to access exposed .env files or environment config endpoints commonly scanned by leepsmarts infrastructure during Operation KeyHunter
status: experimental
date: 2026/11/04
author: Security Arsenal Threat Intelligence
logsource:
    category: webserver
    service: access
    product: generic
detection:
    selection_uri:
        c-uri|contains:
            - '/.env'
            - '/.env.production'
            - '/.env.local'
            - '/config.env'
            - '/api/config'
            - '/_next/env'
    selection_status:
        sc-status: 200
    filter_scanner_ips:
        c-ip:
            - '14.47.118.194'
            - '190.114.197.2'
            - '46.39.24.98'
    condition: selection_uri and (selection_status or filter_scanner_ips)
falsepositives:
    - Legitimate internal health checks on misrouted endpoints
    - Developer debugging from corporate IP ranges
level: high
tags:
    - attack.t1552.001
    - attack.t1190
---
title: KeyHunter Telegram Bot C2 Communication
description: Detects outbound HTTPS connections to Telegram Bot API endpoints from non-standard processes, consistent with leepsmarts credential exfiltration via Telegram bots
status: experimental
date: 2026/11/04
author: Security Arsenal Threat Intelligence
logsource:
    category: network_connection
    product: windows
detection:
    selection_dest:
        DestinationHostname|contains:
            - 'api.telegram.org'
            - 'juanwangccbotgithubgithub.com'
    selection_process_suspicious:
        Image|endswith:
            - '\powershell.exe'
            - '\cmd.exe'
            - '\wscript.exe'
            - '\cscript.exe'
            - '\python.exe'
            - '\node.exe'
    filter_known_bots:
        User|contains: 'telegram_bot_service_account'
    condition: selection_dest and selection_process_suspicious and not filter_known_bots
falsepositives:
    - Legitimate developer automation using Telegram notifications
    - IT alerting scripts
level: medium
tags:
    - attack.t1102
    - attack.t1071.001
    - attack.t1041
---
title: KeyHunter IOC Infrastructure Contact
description: Detects network connections to known leepsmarts Operation KeyHunter infrastructure IPs identified in OTX pulse data
status: experimental
date: 2026/11/04
author: Security Arsenal Threat Intelligence
logsource:
    category: network_connection
detection:
    selection:
        DestinationIp:
            - '14.47.118.194'
            - '190.114.197.2'
            - '46.39.24.98'
    condition: selection
falsepositives:
    - Unlikely; these IPs are attributed to active campaign infrastructure
level: critical
tags:
    - attack.t1071
    - attack.t1102
KQL — Microsoft Sentinel / Defender
// KeyHunter Hunt: leepsmarts infrastructure contact + Telegram bot C2 + env-file scanning behavior
// Microsoft Sentinel / Defender XDR — run over last 30 days
let KeyHunterIPs = dynamic(["14.47.118.194", "190.114.197.2", "46.39.24.98"]);
let KeyHunterDomain = "juanwangccbotgithubgithub.com";
let NetworkHits = DeviceNetworkEvents
    | where Timestamp > ago(30d)
    | where RemoteIP in (KeyHunterIPs)
       or RemoteUrl contains KeyHunterDomain
       or (RemoteUrl contains "api.telegram.org" and InitiatingProcessFileName in~ ("powershell.exe","cmd.exe","wscript.exe","python.exe","node.exe"))
    | project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemoteUrl, RemotePort, ActionType
    | extend HitType = "NetworkIOC_or_TelegramC2";
let ProcessHits = DeviceProcessEvents
    | where Timestamp > ago(30d)
    | where ProcessCommandLine has_any (".env", "api_key", "apikey", "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "sk-", "curl", "wget")
       and FileName in~ ("powershell.exe", "cmd.exe", "curl.exe", "wget.exe", "python.exe")
    | project Timestamp, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, AccountName
    | extend HitType = "CredentialAccessBehavior";
union NetworkHits, ProcessHits
| sort by Timestamp desc
PowerShell
# KeyHunter IOC Hunt Script - leepsmarts Operation Artifacts
# Checks: network connections to known IOCs, suspicious Telegram API contact,
# exposed .env artifacts in web roots, and recent downloads of bot payload domains
# Run elevated on endpoints and web/application servers

$KeyHunterIPs   = @('14.47.118.194','190.114.197.2','46.39.24.98')
$KeyHunterDomain = 'juanwangccbotgithubgithub.com'
$Report = @()

Write-Host '[*] KeyHunter IOC Sweep - leepsmarts Campaign' -ForegroundColor Cyan

# 1. Active + historical TCP connections to campaign IPs
Write-Host '[1] Checking network connections to KeyHunter IPs...'
$conns = Get-NetTCPConnection -ErrorAction SilentlyContinue |
    Where-Object { $KeyHunterIPs -contains $_.RemoteAddress }
foreach ($c in $conns) {
    $proc = Get-Process -Id $c.OwningProcess -ErrorAction SilentlyContinue
    $Report += [PSCustomObject]@{
        Check   = 'NetworkConnection'
        Finding = "Connection to $($c.RemoteAddress):$($c.RemotePort) by $($proc.ProcessName) (PID $($c.OwningProcess))"
        Severity = 'CRITICAL'
    }
}

# 2. DNS cache check for typosquat bot domain
Write-Host '[2] Checking DNS cache for KeyHunter bot domain...'
$dns = Get-DnsClientCache -ErrorAction SilentlyContinue |
    Where-Object { $_.Entry -like "*$KeyHunterDomain*" }
if ($dns) {
    $Report += [PSCustomObject]@{
        Check = 'DNSCache'
        Finding = "DNS resolution of $KeyHunterDomain found in cache"
        Severity = 'CRITICAL'
    }
}

# 3. Web server logs for .env probing (IIS default path)
Write-Host '[3] Scanning IIS logs for .env access attempts...'
$iisLogRoot = 'C:\inetpub\logs\LogFiles'
if (Test-Path $iisLogRoot) {
    $hits = Get-ChildItem $iisLogRoot -Recurse -Filter '*.log' -ErrorAction SilentlyContinue |
        Select-String -Pattern '/\.env' -SimpleMatch -ErrorAction SilentlyContinue |
        Select-Object -First 20
    foreach ($h in $hits) {
        $Report += [PSCustomObject]@{
            Check = 'WebLog'
            Finding = ".env probe in $($h.Path): $($h.Line.Substring(0,[Math]::Min(150,$h.Line.Length)))"
            Severity = 'HIGH'
        }
    }
}

# 4. Exposed .env files in common web/deployment roots
Write-Host '[4] Checking for exposed .env files in web roots...'
$webRoots = @('C:\inetpub\wwwroot','C:\xampp\htdocs','C:\var\www')
foreach ($root in $webRoots) {
    if (Test-Path $root) {
        Get-ChildItem $root -Recurse -Filter '.env*' -ErrorAction SilentlyContinue |
            ForEach-Object {
                $Report += [PSCustomObject]@{
                    Check = 'ExposedEnvFile'
                    Finding = "Exposed env file: $($_.FullName)"
                    Severity = 'HIGH'
                }
            }
    }
}

# 5. Suspicious scheduled tasks referencing telegram/curl/node (drainer persistence)
Write-Host '[5] Checking scheduled tasks for bot persistence...'
Get-ScheduledTask -ErrorAction SilentlyContinue | ForEach-Object {
    $actions = $_.Actions | Out-String
    if ($actions -match 'telegram|juanwang|curl\.exe|node\.exe.*bot') {
        $Report += [PSCustomObject]@{
            Check = 'ScheduledTask'
            Finding = "Suspicious task '$($_.TaskName)': $($actions.Trim())"
            Severity = 'CRITICAL'
        }
    }
}

# Output
if ($Report.Count -eq 0) {
    Write-Host '[+] No KeyHunter IOCs or artifacts found on this host.' -ForegroundColor Green
} else {
    Write-Host "[!] $($Report.Count) finding(s) detected:" -ForegroundColor Red
    $Report | Sort-Object Severity | Format-Table -AutoSize
    $Report | Export-Csv -Path ".\keyhunter_hunt_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation
}

Response Priorities

Immediate (0–4 hours):

  • Block all three IPv4 IOCs (14.47.118.194, 190.114.197.2, 46.39.24.98) and sinkhole juanwangccbotgithubgithub.com across firewall, DNS RPZ, proxy, and EDR custom indicators
  • Audit every cloud deployment platform in use (Vercel, Netlify, Railway) for exposed environment variables — any LLM API key present in a publicly reachable build log or .env endpoint must be treated as compromised and rotated immediately
  • Retro-hunt 90 days of netflow and DNS logs against the IOC set to establish exposure scope
  • Inventory your attack surface for CVE-2026-41940 and apply vendor patches or compensating controls

24 Hours:

  • Because this campaign is credential-theft-centric: force rotation of all LLM provider API keys (OpenAI, Anthropic, etc.) organization-wide, and pull usage logs from those providers to detect anomalous consumption billed to your accounts
  • Verify identity integrity for any employee or student account showing .edu provisioning anomalies — coordinate with university security teams if your organization operates in the education sector
  • Alert finance/AP teams to the cryptocurrency drainer angle: flag unusual wallet-approval transactions and crypto-adjacent phishing lures in email gateways
  • Search GitHub/GitLab for accidentally committed secrets referencing your organization's key prefixes

1 Week:

  • Move all secrets out of environment files and into a managed secrets vault (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) with short TTLs and automatic rotation
  • Deploy CI/CD secret-scanning gates (trufflehog, gitleaks) so keys never reach deployment platforms in plaintext
  • Implement egress alerting on api.telegram.org from non-allowlisted processes — legitimate enterprise use of Telegram bot APIs should be rare and enumerable
  • For education-sector organizations: audit account-provisioning workflows for synthetic-identity fraud indicators (disposable email domains, VPN-origin registrations, mismatched identity documents)
  • Establish LLM API spending anomaly detection — sudden compute spikes on your keys are often the first observable indicator of resale

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

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