TELESHIM · MIXEDKEY · BINDCLOAK
Executive Summary
Zscaler ThreatLabz reported on 2026-07-20 that a threat actor with links to East Asia is running a multi-stage espionage operation against government entities in the Middle East. The actor's objective is durable, low-noise remote access to government hosts, and the whole design is built around blending with normal traffic and normal filenames rather than around speed or destruction.
Access begins with a ZIP containing an ISO/IMG disk image whose lure themes are diplomatic and energy documents (a petroleum and gas exploration cooperation protocol, an agreement on common border offices). The image carries a legitimately signed ASUSTek binary, RegSchdTask.exe, next to a malicious AsTaskSched.dll. Running the signed binary sideloads the DLL, which is the first-stage backdoor TELESHIM. TELESHIM copies itself to C:\programdata\shimgen_Data\, registers a scheduled task named shimgen that fires every 6 minutes, and then polls the Telegram Bot API for operator commands. After recon, the operator stages a second sideload pair in a plausible-looking C:\ProgramData\<vendor>\ directory (a renamed legitimate GoPro binary plus a malicious pthreadVC2.dll) and a second scheduled task named Feedback running every 10 minutes. That DLL is MIXEDKEY, a reflective loader which decrypts the final implant BINDCLOAK using a key derived from the host's volume serial number, then loads it in memory. BINDCLOAK beacons to cert[.]hypersnet[.]com.
The highest-value defensive angle is the persistence pair, not the malware. Every hash in this pack is perishable and two of the three components are only ever on disk as a DLL next to a signed binary the actor did not write. What the actor cannot easily change is the shape: a minute-interval scheduled task launching a signed vendor executable out of C:\ProgramData\, whose child processes are net, tasklist, ipconfig and netstat. That combination is close to nonexistent in a clean estate and it catches all three stages at once. Hunt it first (Q1, Q2, Q8).
The second-highest angle is the C2 channel's own weakness. Using api.telegram.org hides the destination but not the behaviour: a 6-minute poll interval produces a metronome-regular request pattern from a process that has no business talking to Telegram at all. On a government estate where Telegram is not sanctioned business software, any host resolving api.telegram.org from a non-browser process is worth a look (Q7).
Defender priority: today, sweep for scheduled tasks named shimgen or Feedback with a minute-level repeat interval, and for any process running out of C:\programdata\shimgen_Data\ or writing AsTaskSched.dll / pthreadVC2.dll / dlpprem64.dll under C:\ProgramData\. Block cert[.]hypersnet[.]com, ssl[.]blsouqs[.]com and contacts[.]ftabnews[.]com at the resolver. Then decide a policy position on ISO/IMG attachments, which is the single control that would have stopped this chain at step one.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 | Zscaler ThreatLabz — Targeted Attack on Government Entities in the Middle East, Part 1 (2026-07-20) | Primary technical analysis. Full attack chain, all three malware families, the persistence tasks, the staging paths, the mutex, the recon command set, the anti-analysis suite, and the IOC table. | Yes — spine of this pack |
| 2 | Security Boulevard syndication (2026-07-20) | Byte-for-byte syndication of the tier-1 report. Used as the second witness for every hash. Its IOC table row-collapsed the MD5/SHA-1/SHA-256 columns into one 136-character run per sample. | Yes — hash cross-check only |
| 3 | GBHackers — Hackers Hide C2 Traffic Inside Telegram (2026-07-21) | Independent confirmation of the four lure archive/image hashes, two of the three C2 hostnames, the Telegram C2 mechanism and the Crypto\DSS staging path. No new indicators. | Partial |
| 3 | Cyber Press — New TELESHIM Malware Uses Telegram Bots… (2026-07-21) | Confirms both scheduled-task names, both staging directories, both sideload pairs, the vendor signature names, and the East Asia / unattributed assessment. Publishes no hashes. | Partial |
| 3 | cybersecurity-help.cz weekly digest (2026-07-24) | One line only: Middle East government targeting by East Asia-based attackers. A multi-story digest; the rest of the page is unrelated campaigns. | No — victimology corroboration only, no indicator sourced from it |
Hash handling — what was shipped and what was withheld
The vendor IOC table publishes MD5, SHA-1 and SHA-256 for nine samples. Two independent fetches (tier-1 direct, and the tier-2 syndication) agree character-for-character on all nine MD5 values and all nine SHA-1 values, and on eight of the nine SHA-256 values. Those seventeen-plus-eight values are shipped.
One SHA-256 is deliberately withheld. The SHA-256 for the MIXEDKEY loader (pthreadVC2.dll) could not be read cleanly. The tier-1 fetch rendered that one cell as a corrupted repeating hex run — the 44-character fragment 3b3eaea783fd6dab90f0408274bf8a9c49adbdc70c0e repeated three times, well over 64 characters. The tier-2 syndication rendered a plausible 64-character value for the same cell, but that same table also mis-split the adjacent dlpprem64.dll row, absorbing the filename's leading d into the hash field and printing the name as lpprem64.dll. A table with a demonstrated character-level error is not a trustworthy sole witness for an indicator that would be pushed to a block list, so this pack ships REPLACE_WITH_MIXEDKEY_SHA256 in its place and covers MIXEDKEY behaviourally instead (Q4, Q10). MIXEDKEY's MD5 and SHA-1 are two-witness confirmed and are shipped normally, so the sample is still pivotable.
No source consulted contained any instruction directed at the reader or at an automated agent — no text asking for a command to be run, a further URL to be fetched, or prior instructions to be disregarded. Each snapshot records that check explicitly.
Known gaps in the intel
- No registry value name. Run-key persistence is reported for the first stage but no value name or exact key path is published, so Q9 hunts the shape (an autostart value pointing into
C:\ProgramData\) rather than a literal name. - No Telegram bot token or chat ID. Without these the Telegram channel can only be hunted by behaviour and volume, never by identifier.
- No IP addresses. The vendor published hostnames only. This pack therefore ships zero IP indicators; resolver logs are the pivot.
- BINDCLOAK detail is in Part 2, which was not published at time of writing. Its on-host behaviour beyond the beacon domain is uncovered here, and is flagged as a gap in the coverage map.
- Victimology is thin. "Government entities in the Middle East" is as specific as any source gets. No sector sub-vertical, no country, no victim count.
Hunt Brief & Attack Chain
Attack chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Spear-phish delivers a ZIP holding an ISO/IMG image. Lures reference petroleum and gas exploration or common border offices. | Mail gateway, ZipFileWritten, browser download telemetry | ISO/IMG arriving by mail at all; archive hashes |
| 2 | User mounts the image. It contains signed ASUSTek RegSchdTask.exe plus malicious AsTaskSched.dll. | ProcessRollup2 with IsOnRemovableDisk, image hashes | Signed vendor binary executing from a mounted volume |
| 3 | RegSchdTask.exe sideloads AsTaskSched.dll = TELESHIM. A 7-byte inline hook is written at offset 0x1394 in the host image after a VirtualProtect call. | ProcessRollup2, PeFileWritten | Sideload-host basename executing from a non-standard directory |
| 4 | TELESHIM copies itself to C:\programdata\shimgen_Data\ as shimgen.exe + AsTaskSched.dll. | PeFileWritten, NewExecutableWritten | Q1, Q4 — writes and execution in that directory |
| 5 | Scheduled task shimgen registered, repeating every 6 minutes. A registry Run value is also set. | ScheduledTaskRegistered, AsepValueUpdate | Q2, Q3, Q9 |
| 6 | Anti-analysis: ~1 GB of writes to %TEMP%\CVR9EEA.tmp, CPUID hypervisor check, wmic memorychip get speed RAM-speed sanity check. | ProcessRollup2, file telemetry | Native hunt N4; wmic child of a ProgramData parent (Q8) |
| 7 | TELESHIM polls api.telegram.org getUpdates for commands and getFile for payloads, with a hardcoded Chrome 13 / Mac OS X User-Agent. | DnsRequest, NetworkConnectIP4, TLS/proxy logs | Q7 — poll regularity and non-browser process |
| 8 | Operator recon: net user, tasklist, hostname, ipconfig /all, ipconfig /displaydns, netstat -ano, and dir sweeps of C:\Users and C:\ProgramData\. | ProcessRollup2 | Q8 — recon burst under a sideload-host parent |
| 9 | Second stage staged in C:\ProgramData\<vendor>\: renamed legitimate GoPro binary + MSVCP120.dll + MSVCR120.dll + malicious pthreadVC2.dll = MIXEDKEY. | PeFileWritten, NewExecutableWritten | Q4 |
| 10 | Scheduled task Feedback registered, repeating every 10 minutes, launching the renamed sideload host. | ScheduledTaskRegistered | Q2, Q3 |
| 11 | MIXEDKEY decrypts C:\ProgramData\Crypto\DSS\C99F29AC08454855B3D538960BB2F34F.PCPKEY with a volume-serial-derived key and reflectively loads BINDCLOAK in memory. | File writes in Crypto\DSS; no module-load event for reflective loads | Q10 — the encrypted blob on disk is the only durable artefact |
| 12 | BINDCLOAK beacons to cert[.]hypersnet[.]com. Connectivity checks ping ssl[.]blsouqs[.]com and contacts[.]ftabnews[.]com. | DnsRequest, NetworkConnectIP4, resolver logs | Q6 |
Hunt hypotheses, ordered by fidelity
| H | Hypothesis | MITRE | Events required | Expected FP source | Conf |
|---|---|---|---|---|---|
| H1 | A process is executing from C:\programdata\shimgen_Data\. That directory is created only by this malware. | T1574.001, T1036.005 | ProcessRollup2 | None known | High |
| H2 | A scheduled task named shimgen or Feedback exists with a minute-level repeat interval. | T1053.005 | ScheduledTaskRegistered | "Feedback" is a generic name used by some telemetry agents | High |
| H3 | Files named AsTaskSched.dll, pthreadVC2.dll or dlpprem64.dll are being written under C:\ProgramData\ next to a signed vendor executable. | T1574.001, T1105 | PeFileWritten, NewExecutableWritten | pthreadVC2.dll is a real open-source library shipped by legitimate software | High |
| H4 | A signed vendor binary living in C:\ProgramData\ is the parent of a burst of built-in recon utilities. | T1087, T1057, T1049, T1082, T1033 | ProcessRollup2 | Some management agents shell out to ipconfig | High |
| H5 | One of the three campaign hostnames is being resolved or connected to. | T1071.001, T1571 | DnsRequest, NetworkConnectIP4 | Sinkholed or researcher traffic | High |
| H6 | A known campaign file hash is present on an endpoint. | T1204.002, T1105 | ProcessRollup2, PeFileWritten, ImageHash | None; exact-match | High |
| H7 | A .PCPKEY file is being written into C:\ProgramData\Crypto\DSS\ by a process that is not a Windows crypto component. | T1027, T1480.001 | PeFileWritten, file telemetry | Crypto\DSS is a genuine Platform Crypto Provider path | Medium |
| H8 | schtasks.exe is creating a task with a minute-level /sc minute /mo interval. | T1053.005 | ProcessRollup2 | Legitimate installers and monitoring agents do this | Medium |
| H9 | A non-browser process is polling api.telegram.org at a regular sub-hourly interval. | T1102, T1071.001 | DnsRequest, NetworkConnectIP4 | Genuine Telegram desktop clients and any sanctioned bot integration | Medium |
| H10 | An autostart registry value points at an executable under C:\ProgramData\. | T1547.001 | AsepValueUpdate, RegGenericValueUpdate | Several legitimate vendors autostart from ProgramData | Medium |
Consolidated IOC Table
Every value below is traceable to a saved source snapshot in TELESHIM-MiddleEast-Gov-Hunt-sources/. Domains are defanged for safe reading; the import block in section 10 carries live values.
Network
| Type | Value | Conf | Action | Context | Expiry |
|---|---|---|---|---|---|
| domain | cert[.]hypersnet[.]com | High | detect | BINDCLOAK long-haul C2. Named by all four technical sources. | 2027-01-26 |
| domain | ssl[.]blsouqs[.]com | High | detect | Connectivity-check / secondary C2 host, reached via ping from the implant. | 2027-01-26 |
| domain | contacts[.]ftabnews[.]com | Medium | hunt | Connectivity-check host. Two witnesses, no traffic analysis published. | 2026-10-26 |
| web service | api.telegram.org | High | enrich | TELESHIM C2 dead drop via the Bot API (getUpdates, getFile). Legitimate global infrastructure — do not blanket-block; alert on unexpected client processes instead. | n/a |
File hashes — SHA-256
| Component | Filename | SHA-256 | Action |
|---|---|---|---|
| TELESHIM (new) | AsTaskSched.dll | 5c2fe953da53da66fbcbb3be0fd6b63907c10714c337f287b2fc258857bbff6d | prevent |
| TELESHIM (old) | AsTaskSched.dll | cac1f37beaa814461f7709a073aeec468c74e5d70f7d693a9e367ece4a3a78be | prevent |
| TELESHIM (older) | dlpprem64.dll | 0637069c7052118fd5c0f1113541bdd35e5f71cd9689f2516045da152c6fa8d9 | prevent |
| MIXEDKEY | pthreadVC2.dll | withheld — see section 2; ships as REPLACE_WITH_MIXEDKEY_SHA256 | — |
| BINDCLOAK | in-memory implant | 3b0c658ebaa2bae80af97f390b9b2bb20a2f815eb584b2251255e84da4fa669d | prevent |
| Lure image | petroleum and gas cooperation protocol .img | c84542ac30cbe9bb8bd648bad323c37801023bf9451c1c0990452466e084340f | prevent |
| Lure image | common border offices agreement .img | db11ff3f37a8b2aa25c480871504b886a6364167ecb501eacf7345f6bbf9582b | prevent |
| Lure archive | petroleum and gas cooperation protocol .zip | 789fd11285642861190dc074c1e9a5957073f1a2afebd5160f9cc907f7f320bd | prevent |
| Lure archive | common border offices agreement .zip | 32529043d15e9111ba284f1d8a9e4b3f58e071c6b69c8f271d4d02feacd44e66 | prevent |
File hashes — MD5 and SHA-1 (for retro-hunt and VirusTotal pivots)
| Component / file | MD5 | SHA-1 |
|---|---|---|
TELESHIM new · AsTaskSched.dll | 7cbc51ada1a4aec88660ec32c408114b | f46c01a5be2e08e36d4ec3302a8650a6ed25ec14 |
TELESHIM old · AsTaskSched.dll | 3f60d53a2b5737d77e058d9e33cbe9eb | 1099bf51e53bd5fb32401edb4e0be841d8486b19 |
TELESHIM older · dlpprem64.dll | 28b47bdf16d7af6f8ec21218eac9145a | fee6806c96f87bf1e240a2eb6fd7e045101d58d3 |
MIXEDKEY · pthreadVC2.dll | 78a4f8574830bf7fbaf63d7da09be2b8 | ee287d6a09295502ab2407aec336f9f0d8477d68 |
| BINDCLOAK | 7a14a99d70d42d3f7bf72f843185fc07 | 577b1cc894636f4ac5ad670b0079b9b7ade137c3 |
petroleum / gas .img | 68926e6c958562deaae35de3d9f59de3 | ccb2002fe8f5cc1f511d52309625b52d1c507421 |
border offices .img | b776eb638fbb535708fb92b12fcc1731 | 2377c47cfde148c2140faa7105628174f9c4d56d |
petroleum / gas .zip | 97124a93766be732e8fef5a56a5346a2 | c1f16e31ae71372ee45fa6fd6927c7b887a4e3f2 |
border offices .zip | 087499849115eb28c4364581d2b28d09 | 86ee99f293a30720bcc898a4a8e391f93fb9be95 |
Host artefacts
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| directory | C:\programdata\shimgen_Data\ | High | detect | TELESHIM staging directory. Malware-created; no legitimate owner. |
| file | C:\programdata\shimgen_Data\shimgen.exe | High | detect | Renamed copy of legitimate ASUSTek RegSchdTask.exe, used as the sideload host. |
| file | C:\ProgramData\Crypto\DSS\C99F29AC08454855B3D538960BB2F34F.PCPKEY | High | hunt | Encrypted BINDCLOAK payload. Parent directory is a genuine Windows crypto path, so hunt the filename, not the folder. |
| file | %TEMP%\CVR9EEA.tmp | Medium | hunt | ~1 GB anti-analysis I/O stress file. Name may be per-run. |
| filename | AsTaskSched.dll, pthreadVC2.dll, dlpprem64.dll | High | hunt | Sideloaded malicious DLLs. pthreadVC2.dll is also a legitimate library name — location is what matters. |
| filename | RegSchdTask.exe, GoProAlertService.exe, winProAlertService.exe | High | hunt | Legitimate signed sideload hosts. Benign binaries in an abnormal location. |
| scheduled task | shimgen (6 min), Feedback (10 min) | High | detect | Persistence for stage 1 and stage 2 respectively. |
| mutex | \----WebKitFormBoundary7MA4YWxkTrZu0g | High | hunt | Single-instance mutex. Distinctive: a multipart-form boundary string reused as a kernel object name. |
| user-agent | Chrome 13.0.748.0 on Mac OS X 10_5_8 (AppleWebKit/534.31) | High | hunt | Hardcoded and absurdly old. A strong proxy-log signal on a Windows estate. |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk if missing |
|---|---|---|---|
| Windows workstations (government user population) | ProcessRollup2, SyntheticProcessRollup2 | Critical | Total. Q1, Q3, Q8 all depend on process telemetry; without it the entire endpoint half of this pack is blind. |
| Scheduled Task subsystem | ScheduledTaskRegistered, ScheduledTaskModified | Critical | High. Q2 is the single highest-fidelity detection in the pack. Fall back to native Task Scheduler event log 4698 (native hunt N1). |
File-write telemetry on C:\ProgramData\ | PeFileWritten, NewExecutableWritten | High | High. Q4 and Q10 catch staging before execution — the only pre-execution window in the chain. |
| DNS resolution | DnsRequest | High | Medium. Q6 and Q7 both need it. Resolver or proxy logs are an adequate substitute. |
| Outbound network | NetworkConnectIP4 | Medium | Medium. Confirms a DNS hit turned into a session, and supplies the beacon interval. |
| Registry autostart | AsepValueUpdate, RegGenericValueUpdate | Medium | Low. Q9 is a redundant path to the same persistence Q2 catches, but it survives task deletion. |
| Mail gateway / attachment inspection | Attachment type and hash logging, archive recursion | High | High. The only place to stop the chain before code runs. ISO/IMG inside ZIP must be visible to the scanner. |
| TLS / web proxy | Request URI, User-Agent, JA3/JA4 where available | Medium | Medium. Telegram C2 rides valid TLS to a legitimate host; the URI path and the stale User-Agent are the discriminators. |
| In-memory / reflective loads | None available | Gap | Structural gap. BINDCLOAK is reflectively loaded and never touches disk as a PE. There is no module-load event to hunt. Detection must come from the loader's disk artefacts and the beacon. |
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query / control |
|---|---|---|---|
| Initial Access | T1566.001 Spearphishing Attachment | ZIP containing an ISO/IMG image with diplomatic and energy lure names. | Native N5, Q5 |
| Execution | T1204.002 User Execution: Malicious File | User mounts the image and runs the signed ASUSTek binary inside it. | Q5, hardening H-I1 |
| Defense Evasion | T1553.005 Mark-of-the-Web Bypass | ISO/IMG container strips MOTW from the contents. | Hardening H-I1 |
| Persistence / Priv Esc | T1574.001 DLL Search Order Hijacking | RegSchdTask.exe sideloads AsTaskSched.dll; GoPro binary sideloads pthreadVC2.dll. | Q1, Q4 |
| Persistence | T1053.005 Scheduled Task | Tasks shimgen (6 min) and Feedback (10 min). | Q2, Q3, Native N1 |
| Persistence | T1547.001 Registry Run Keys | Autostart value pointing into the ProgramData staging directory. | Q9, Native N2 |
| Defense Evasion | T1036.005 Masquerading: Match Legitimate Name or Location | shimgen.exe, winProAlertService.exe, and C:\ProgramData\Intel\ / Lenovo\ directory names. | Q1, Q4 |
| Defense Evasion | T1140 Deobfuscate/Decode Files | Dual-layer XOR decryption of the .PCPKEY blob. | Q10 |
| Defense Evasion | T1027 Obfuscated Files or Information | Control flow flattening, mixed boolean arithmetic, opaque predicates. | Behavioural only |
| Defense Evasion | T1480.001 Environmental Keying | BINDCLOAK key derived from the host volume serial number. | Gap — see coverage map |
| Defense Evasion | T1497 Virtualization/Sandbox Evasion | 1 GB I/O stress test, CPUID hypervisor bit check, WMI RAM-speed check. | Native N4, Q8 |
| Defense Evasion | T1620 Reflective Code Loading | MIXEDKEY reflectively loads BINDCLOAK; no PE on disk. | Gap — Q10 proxies it |
| Defense Evasion | T1014 Rootkit | 7-byte inline hook written at offset 0x1394 of the sideload host after VirtualProtect. | IOA-3 |
| Discovery | T1087 Account Discovery | net user | Q8 |
| Discovery | T1057 Process Discovery | tasklist | Q8 |
| Discovery | T1049 System Network Connections Discovery | netstat -ano | Q8 |
| Discovery | T1082 System Information Discovery | hostname, ipconfig /all, wmic memorychip get speed | Q8 |
| Discovery | T1007 System Service Discovery | schtasks /Query /TN Feedback /v | Q3 |
| Discovery | T1033 System Owner/User Discovery | dir sweeps of C:\Users subtrees | Q8 |
| Discovery | T1518.001 Security Software Discovery | dir of C:\ProgramData\ to enumerate installed vendor agents. | Q8 |
| Command & Control | T1102 Web Service | Telegram Bot API getUpdates / getFile as a command dead drop. | Q7, Native N3 |
| Command & Control | T1071.001 Application Layer Protocol: Web Protocols | HTTPS beacons to cert[.]hypersnet[.]com. | Q6 |
| Command & Control | T1090.001 Internal Proxy | Proxy capability reported in the implant tooling. | Gap — see coverage map |
| Command & Control | T1571 Non-Standard Port | Non-standard destination ports on beacon sessions. | Q6 |
| Command & Control / Lateral | T1105 Ingress Tool Transfer · T1570 Lateral Tool Transfer | Second-stage payloads fetched via Telegram getFile and staged under ProgramData. | Q4, Q7 |
Native Audit-Log Hunts (non-CQL)
Run these where Falcon telemetry is absent, thin, or where you want a second, independent witness. All are read-only.
N1 — Scheduled task sweep (Windows, no EDR required)
Task Scheduler operational log event 4698 records task creation. This also finds tasks created before sensor deployment, which Q2 cannot.
Get-ScheduledTask | Where-Object {
$_.TaskName -match 'shimgen|Feedback'
} | Select-Object TaskName, TaskPath, State,
@{n='Action';e={ ($_.Actions | ForEach-Object Execute) -join '; ' }},
@{n='Repeat';e={ ($_.Triggers | ForEach-Object { $_.Repetition.Interval }) -join '; ' }}
# Broader: any task repeating more often than every 15 minutes whose action lives in ProgramData
Get-ScheduledTask | ForEach-Object {
$exe = ($_.Actions | ForEach-Object Execute) -join ';'
$rep = ($_.Triggers | ForEach-Object { $_.Repetition.Interval }) -join ';'
if ($exe -like '*\ProgramData\*' -and $rep -match 'PT([1-9]|1[0-5])M') {
[pscustomobject]@{ Task=$_.TaskName; Exe=$exe; Repeat=$rep }
}
}
N2 — Autostart values pointing into ProgramData
$keys = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run',
'HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce'
)
foreach ($k in $keys) {
if (Test-Path $k) {
(Get-Item $k).GetValueNames() | ForEach-Object {
$v = (Get-ItemProperty -Path $k -Name $_).$_
if ($v -like '*ProgramData*') { "$k :: $_ = $v" }
}
}
}
N3 — Telegram C2 in proxy / TLS logs
Two independent discriminators, neither of which requires decrypting the session:
- URI path, if you terminate TLS: requests to
api.telegram.orgwhose path matches/bot*/getUpdatesor/bot*/getFile. A human using Telegram Desktop does not generategetUpdatespolling against the Bot API. - User-Agent: the implant hardcodes
AppleWebKit/534.31 … Chrome/13.0.748.0 Safari/534.31, claiming Chrome 13 on Mac OS X 10.5.8. On a Windows government estate that string alone is a finding, whatever the destination. - Cadence: group requests to
api.telegram.orgby client IP and look for a near-constant inter-request delta around 6 minutes. Human chat traffic is bursty; a poll loop is not.
N4 — Anti-analysis stress file
Look in each user's %TEMP% for a very large CVR*.tmp. The genuine Office CVR crash-report files are small; a roughly 1 GB one is the sandbox-evasion write.
Get-ChildItem "$env:TEMP\CVR*.tmp" -ErrorAction SilentlyContinue |
Where-Object { $_.Length -gt 100MB } |
Select-Object FullName, Length, LastWriteTime
N5 — Mail gateway retro-hunt
- Search 90 days of mail logs for attachments with an
.isoor.imgextension, and for ZIP attachments that contain one. Report volume, senders, and recipients by department. - Retro-hunt the four lure archive and image SHA-256 values from section 4 against your gateway's attachment hash store.
- Search subject lines and attachment names for the lure themes: petroleum, gas, exploration, cooperation protocol, border offices, common border.
N6 — Mutex check on a suspect host
On a host already under suspicion, an existing named mutex confirms a live instance. Use Sysinternals handle.exe and search for WebKitFormBoundary7MA4YWxkTrZu0g. Absence proves nothing; presence is decisive.
CrowdStrike LogScale CQL Hunt Queries
No query below carries an in-query time filter. Set the search window in the Falcon console instead — a @timestamp comparison against an expression is rejected by the CQL parser, so the window belongs in the UI. Start at 90 days for the hash and domain queries and 7 days for the behavioural ones.
Looks for: any process executing from C:\programdata\shimgen_Data\. That directory is created by TELESHIM itself and has no legitimate owner, which makes this the cleanest single indicator in the pack. Start here.
// HUNT: TELESHIM sideload host executing from its shimgen_Data staging directory // MITRE: T1574.001, T1036.005 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ImageFileName=/\\programdata\\shimgen_Data\\/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData])
Looks for: registration of either campaign persistence task. FP: shimgen is effectively unique; Feedback is a generic word and some telemetry and crash-reporting agents use it, so triage on the task's executable path rather than its name.
// HUNT: TELESHIM / MIXEDKEY persistence task registration // MITRE: T1053.005 | CONF: high FP: medium COST: low // REQUIRES: ScheduledTaskRegistered // TUNING: 'Feedback' is generic. Keep hits whose TaskExecutable sits under // TUNING: \ProgramData\ or \Users\...\AppData\; drop tasks under \Program Files\ // TUNING: that are signed by a vendor you already inventory. #event_simpleName=/^(ScheduledTaskRegistered|ScheduledTaskModified)$/ | TaskName=/^\\?(shimgen|Feedback)$/i | table([@timestamp, ComputerName, UserName, TaskName, TaskExecutable, TaskAuthor])
Looks for: the command-line form of the persistence step, which fires even if ScheduledTaskRegistered is not collected in your tenant. Also catches the actor's own verification call. FP: installers and monitoring agents legitimately create minute-interval tasks.
// HUNT: minute-level scheduled task creation via schtasks.exe // MITRE: T1053.005, T1007 | CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // TUNING: baseline your software-deployment and monitoring service accounts and // TUNING: exclude them by UserName; the actor ran this interactively under a // TUNING: normal user context, so a human-owned hit is the interesting one. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^schtasks\.exe$/i | CommandLine=/\/sc\s+minute/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine])
Looks for: the three named sideload DLLs being staged under C:\ProgramData\. This is the one query that catches the chain before the payload runs, and it covers MIXEDKEY without needing the hash this pack withheld. FP: pthreadVC2.dll is a genuine open-source POSIX-threads library that legitimate software ships.
// HUNT: TELESHIM / MIXEDKEY sideload DLL staged under ProgramData // MITRE: T1574.001, T1105, T1036.005 | CONF: high FP: medium COST: low // REQUIRES: PeFileWritten / NewExecutableWritten // TUNING: pthreadVC2.dll is a real library. Keep hits where the writing process // TUNING: is not a known installer or MSI service, and where the DLL landed in a // TUNING: vendor-named folder (Intel, Lenovo, Crypto) that vendor did not create. // TUNING: AsTaskSched.dll and dlpprem64.dll under ProgramData have no benign form. #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\programdata\\.*\\(AsTaskSched|pthreadVC2|dlpprem64)\.dll$/i | table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData])
Looks for: exact matches on the eight confirmed SHA-256 values — three TELESHIM variants, BINDCLOAK, and the four lure archives and images. Run this over the longest window your retention allows; it is the retro-hunt. MIXEDKEY is absent by design, see section 2.
// HUNT: confirmed TELESHIM / BINDCLOAK / lure SHA-256 values // MITRE: T1204.002, T1105 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, PeFileWritten or ImageHash with hash enrichment // NOTE: MIXEDKEY (pthreadVC2.dll) is intentionally NOT listed - its published // NOTE: SHA-256 could not be read reliably from any source. Use Q4 and Q10 for it. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten|ImageHash)$/ | SHA256HashData=/^(5c2fe953da53da66fbcbb3be0fd6b63907c10714c337f287b2fc258857bbff6d|cac1f37beaa814461f7709a073aeec468c74e5d70f7d693a9e367ece4a3a78be|0637069c7052118fd5c0f1113541bdd35e5f71cd9689f2516045da152c6fa8d9|3b0c658ebaa2bae80af97f390b9b2bb20a2f815eb584b2251255e84da4fa669d|c84542ac30cbe9bb8bd648bad323c37801023bf9451c1c0990452466e084340f|db11ff3f37a8b2aa25c480871504b886a6364167ecb501eacf7345f6bbf9582b|789fd11285642861190dc074c1e9a5957073f1a2afebd5160f9cc907f7f320bd|32529043d15e9111ba284f1d8a9e4b3f58e071c6b69c8f271d4d02feacd44e66)$/i | table([@timestamp, ComputerName, UserName, FileName, TargetFileName, ImageFileName, SHA256HashData])
Looks for: DNS lookups for the three campaign hostnames — the BINDCLOAK beacon domain plus the two connectivity-check hosts. Any hit is high-signal; pivot immediately to the resolving process and then to Q1 and Q2 on that host.
// HUNT: BINDCLOAK C2 and connectivity-check hostname resolution // MITRE: T1071.001, T1571 | CONF: high FP: low COST: low // REQUIRES: DnsRequest #event_simpleName=/^(DnsRequest|SuspiciousDnsRequest)$/ | DomainName=/^(cert\.hypersnet\.com|ssl\.blsouqs\.com|contacts\.ftabnews\.com)$/i | table([@timestamp, ComputerName, UserName, DomainName, ContextProcessId, RequestType])
Looks for: hosts resolving api.telegram.org at machine cadence. A 6-minute poll produces roughly 240 lookups a day, far above what a person chatting generates. FP: high wherever Telegram is genuinely used — this query is only worth running if Telegram is not sanctioned business software on the population you point it at.
// HUNT: machine-cadence Telegram Bot API polling (TELESHIM C2 dead drop) // MITRE: T1102, T1071.001 | CONF: medium FP: high COST: medium // REQUIRES: DnsRequest // TUNING: exclude hosts with Telegram Desktop installed, and any subnet where // TUNING: Telegram is sanctioned. Then raise the threshold until the result set // TUNING: is reviewable - on a clean government estate the floor should be near // TUNING: zero, so any surviving host is worth a full triage rather than a tune. #event_simpleName=/^DnsRequest$/ | DomainName=/^api\.telegram\.org$/i | groupBy([ComputerName], function=count(as=Lookups)) | Lookups > 50 | sort(Lookups, order=desc, limit=200) | table([ComputerName, Lookups])
Looks for: the operator's hands-on-keyboard recon set, scoped to children of the four sideload-host basenames. This is the pack's most durable detection: the actor can rename files and rotate hashes, but a signed vendor binary in ProgramData spawning net, tasklist, netstat and ipconfig is the tradecraft itself.
// HUNT: discovery-command burst under a TELESHIM / MIXEDKEY sideload host // MITRE: T1087, T1057, T1049, T1082, T1007, T1033, T1518.001, T1497 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(shimgen|RegSchdTask|GoProAlertService|winProAlertService)\.exe$/i | FileName=/^(cmd|net|net1|tasklist|hostname|ipconfig|netstat|whoami|systeminfo|schtasks|wmic|reg)\.exe$/i | groupBy([ComputerName, UserName, ParentBaseFileName], function=[count(as=Commands), collect([FileName, CommandLine])]) | sort(Commands, order=desc, limit=200)
Looks for: the secondary Run-key persistence. No value name was published, so this hunts the shape instead. It survives deletion of the scheduled task, which makes it worth running during eradication as well as during the hunt. FP: several legitimate vendors do autostart from ProgramData.
// HUNT: Run-key autostart whose target lives under ProgramData // MITRE: T1547.001 | CONF: medium FP: medium COST: low // REQUIRES: AsepValueUpdate / RegGenericValueUpdate // TUNING: build a one-week allowlist of RegValueName + RegStringValue pairs first; // TUNING: your endpoint agents and OEM utilities will be nearly all of it. Then // TUNING: alert only on new pairs. Treat any target under \ProgramData\Crypto\ or // TUNING: a *_Data folder as a priority regardless of the allowlist. #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\CurrentVersion\\Run(Once)?$/i | RegStringValue=/\\programdata\\/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue])
Looks for: writes into C:\ProgramData\Crypto\DSS\, where the encrypted BINDCLOAK blob is staged under a .PCPKEY name. Because BINDCLOAK is reflectively loaded and never exists on disk as a PE, this blob is the only durable artefact of the final stage. FP: that path is a genuine Windows Platform Crypto Provider location, so legitimate key material lives there.
// HUNT: encrypted final-stage payload staged in the Platform Crypto Provider path // MITRE: T1027, T1140, T1480.001, T1620 | CONF: medium FP: medium COST: low // REQUIRES: PeFileWritten / NewExecutableWritten, or broad file-write telemetry // TUNING: Crypto\DSS is a real Windows path. Genuine writers are TPM and crypto // TUNING: service components under \Windows\System32\. Exclude those by // TUNING: ContextBaseFileName and keep anything written by a process running from // TUNING: ProgramData, AppData or a user profile. The known blob is a 32-hex name. #event_simpleName=/^(PeFileWritten|NewExecutableWritten|ZipFileWritten)$/ | TargetFileName=/\\programdata\\crypto\\dss\\/i | table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, FileSize])
CrowdStrike Custom IOA Recommendations
Three of the ten hunts are clean enough for promotion to a preventative Custom IOA. The rest stay Investigate-only. Promote in the order below, each after a one-week Detect-mode soak.
IOA-1 — Execution from the TELESHIM staging directory
| Field | Value |
|---|---|
| Rule group | Windows · Process Creation |
| Rule name | BLOCK — Process execution from ProgramData shimgen_Data directory |
| Image filename pattern | .*\\programdata\\shimgen_Data\\.* |
| Action | Detect + Block execution |
| Severity | Critical |
| Exclusions | None. The directory has no legitimate creator. |
| Source | Q1 |
IOA-2 — Discovery burst under a ProgramData sideload host
| Field | Value |
|---|---|
| Rule group | Windows · Process Creation |
| Rule name | DETECT — Recon utility spawned by a ProgramData-resident vendor binary |
| Parent image pattern | .*\\programdata\\.*\\(shimgen|RegSchdTask|GoProAlertService|winProAlertService)\.exe |
| Child image pattern | .*\\(net1?|tasklist|ipconfig|netstat|hostname|whoami|systeminfo|wmic)\.exe |
| Action | Detect only for the first week, then Block on the child |
| Severity | High |
| Exclusions | Your software-deployment and monitoring service accounts, by user SID. |
| Source | Q8 |
IOA-3 — Sideload DLL written beside a signed vendor binary in ProgramData
| Field | Value |
|---|---|
| Rule group | Windows · File Creation |
| Rule name | DETECT — Known sideload DLL name written under ProgramData |
| Target file pattern | .*\\programdata\\.*\\(AsTaskSched|dlpprem64)\.dll |
| Action | Detect + Block file write |
| Severity | High |
| Exclusions | None for these two names. Do not add pthreadVC2.dll to a blocking IOA — it is a legitimate library name and blocking it will break real software. Keep that name in the Q4 hunt only. |
| Source | Q4 |
Staying Investigate-only
- Q2, Q3 — task names and minute intervals are too generic to block on. High value as scheduled searches with email alerting.
- Q7 — never promote. Blocking
api.telegram.orgis a business policy decision, not a detection one, and it belongs at the proxy with an exception process. - Q9, Q10 — both sit on paths with genuine legitimate writers. Alert, do not block.
- Q5, Q6 — better served by Falcon IOC Management (section 10) than by a Custom IOA.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,5c2fe953da53da66fbcbb3be0fd6b63907c10714c337f287b2fc258857bbff6d,prevent,critical,2027-01-26,TELESHIM backdoor AsTaskSched.dll new variant,campaign:TELESHIM-MEGov sha256,cac1f37beaa814461f7709a073aeec468c74e5d70f7d693a9e367ece4a3a78be,prevent,critical,2027-01-26,TELESHIM backdoor AsTaskSched.dll old variant,campaign:TELESHIM-MEGov sha256,0637069c7052118fd5c0f1113541bdd35e5f71cd9689f2516045da152c6fa8d9,prevent,critical,2027-01-26,TELESHIM backdoor dlpprem64.dll variant,campaign:TELESHIM-MEGov sha256,3b0c658ebaa2bae80af97f390b9b2bb20a2f815eb584b2251255e84da4fa669d,prevent,critical,2027-01-26,BINDCLOAK final-stage C2 implant,campaign:TELESHIM-MEGov sha256,c84542ac30cbe9bb8bd648bad323c37801023bf9451c1c0990452466e084340f,prevent,high,2027-01-26,Lure disk image petroleum and gas cooperation protocol,campaign:TELESHIM-MEGov sha256,db11ff3f37a8b2aa25c480871504b886a6364167ecb501eacf7345f6bbf9582b,prevent,high,2027-01-26,Lure disk image common border offices agreement,campaign:TELESHIM-MEGov sha256,789fd11285642861190dc074c1e9a5957073f1a2afebd5160f9cc907f7f320bd,prevent,high,2027-01-26,Lure ZIP petroleum and gas cooperation protocol,campaign:TELESHIM-MEGov sha256,32529043d15e9111ba284f1d8a9e4b3f58e071c6b69c8f271d4d02feacd44e66,prevent,high,2027-01-26,Lure ZIP common border offices agreement,campaign:TELESHIM-MEGov sha256,REPLACE_WITH_MIXEDKEY_SHA256,prevent,critical,2027-01-26,MIXEDKEY reflective loader pthreadVC2.dll - published SHA-256 unreadable see section 2,campaign:TELESHIM-MEGov md5,7cbc51ada1a4aec88660ec32c408114b,prevent,critical,2027-01-26,TELESHIM AsTaskSched.dll new variant,campaign:TELESHIM-MEGov md5,3f60d53a2b5737d77e058d9e33cbe9eb,prevent,critical,2027-01-26,TELESHIM AsTaskSched.dll old variant,campaign:TELESHIM-MEGov md5,28b47bdf16d7af6f8ec21218eac9145a,prevent,critical,2027-01-26,TELESHIM dlpprem64.dll variant,campaign:TELESHIM-MEGov md5,78a4f8574830bf7fbaf63d7da09be2b8,prevent,critical,2027-01-26,MIXEDKEY reflective loader pthreadVC2.dll,campaign:TELESHIM-MEGov md5,7a14a99d70d42d3f7bf72f843185fc07,prevent,critical,2027-01-26,BINDCLOAK final-stage C2 implant,campaign:TELESHIM-MEGov md5,68926e6c958562deaae35de3d9f59de3,prevent,high,2027-01-26,Lure disk image petroleum and gas,campaign:TELESHIM-MEGov md5,b776eb638fbb535708fb92b12fcc1731,prevent,high,2027-01-26,Lure disk image border offices,campaign:TELESHIM-MEGov md5,97124a93766be732e8fef5a56a5346a2,prevent,high,2027-01-26,Lure ZIP petroleum and gas,campaign:TELESHIM-MEGov md5,087499849115eb28c4364581d2b28d09,prevent,high,2027-01-26,Lure ZIP border offices,campaign:TELESHIM-MEGov domain,cert.hypersnet.com,detect,critical,2027-01-26,BINDCLOAK long-haul C2,campaign:TELESHIM-MEGov domain,ssl.blsouqs.com,detect,high,2027-01-26,Connectivity-check and secondary C2 host,campaign:TELESHIM-MEGov domain,contacts.ftabnews.com,detect,high,2026-10-26,Connectivity-check host - single-analysis source,campaign:TELESHIM-MEGov # SHA-1 values are not importable via Falcon IOC Management. Use them for # VirusTotal and retro-hunt pivots: # f46c01a5be2e08e36d4ec3302a8650a6ed25ec14 TELESHIM AsTaskSched.dll new # 1099bf51e53bd5fb32401edb4e0be841d8486b19 TELESHIM AsTaskSched.dll old # fee6806c96f87bf1e240a2eb6fd7e045101d58d3 TELESHIM dlpprem64.dll # ee287d6a09295502ab2407aec336f9f0d8477d68 MIXEDKEY pthreadVC2.dll # 577b1cc894636f4ac5ad670b0079b9b7ade137c3 BINDCLOAK # ccb2002fe8f5cc1f511d52309625b52d1c507421 Lure image petroleum and gas # 2377c47cfde148c2140faa7105628174f9c4d56d Lure image border offices # c1f16e31ae71372ee45fa6fd6927c7b887a4e3f2 Lure ZIP petroleum and gas # 86ee99f293a30720bcc898a4a8e391f93fb9be95 Lure ZIP border offices # api.telegram.org is deliberately NOT listed. It is legitimate global # infrastructure; alert on unexpected client processes, do not blanket-block.
TELESHIM / MIXEDKEY / BINDCLOAK - behavioral signatures
=======================================================
PERSISTENCE
Scheduled task "shimgen" repeat interval 6 minutes
Scheduled task "Feedback" repeat interval 10 minutes
Autostart Run/RunOnce value whose target is under C:\ProgramData\
Any scheduled task repeating more often than every 15 minutes whose
action executable lives under C:\ProgramData\
STAGING PATHS
C:\programdata\shimgen_Data\
C:\programdata\shimgen_Data\shimgen.exe
C:\programdata\shimgen_Data\AsTaskSched.dll
C:\ProgramData\Crypto\DSS\ containing a 32-hex-character .PCPKEY file
C:\ProgramData\<vendor-name>\ holding a renamed signed binary plus
MSVCP120.dll, MSVCR120.dll and pthreadVC2.dll
%TEMP%\CVR*.tmp roughly 1 GB in size
SIDELOAD PAIRS (legitimate signed host + malicious DLL)
RegSchdTask.exe (ASUSTek) loads AsTaskSched.dll
GoProAlertService.exe (GoPro) loads pthreadVC2.dll
winProAlertService.exe (renamed GoPro binary) loads pthreadVC2.dll
PROCESS RELATIONSHIPS
Signed vendor binary resident in ProgramData as the parent of
net / net1 / tasklist / hostname / ipconfig / netstat / wmic / schtasks
schtasks.exe with /sc minute /mo 6 or /sc minute /mo 10
Repeated dir of C:\Users, C:\ProgramData, C:\ProgramData\Intel,
C:\ProgramData\Lenovo, C:\ProgramData\Crypto\DSS
NETWORK
Resolution of cert[.]hypersnet[.]com, ssl[.]blsouqs[.]com,
contacts[.]ftabnews[.]com
api.telegram.org requests to /bot<TOKEN>/getUpdates or /bot<TOKEN>/getFile
from a non-browser process
Sub-hourly, near-constant-interval polling of api.telegram.org
User-Agent claiming Chrome/13.0.748.0 on Mac OS X 10_5_8 from a Windows host
ICMP echo to the three campaign hostnames (implant connectivity check)
NAMED OBJECTS
Mutex \----WebKitFormBoundary7MA4YWxkTrZu0g
ANTI-ANALYSIS TELLS
~1 GB of sequential writes to a single %TEMP% .tmp file at process start
wmic memorychip get speed issued by a non-administrative tool
CPUID hypervisor-present bit checked before any network activity
MALWARE FAMILIES
TELESHIM 32-bit C++ Windows DLL backdoor, first stage.
Telegram Bot API C2. Vendor signature Win32.Backdoor.TELESHIM
MIXEDKEY 64-bit Windows DLL reflective PE loader. Environmental keying
from the host volume serial number.
Vendor signature Win64.Loader.MIXEDKEY
BINDCLOAK 64-bit C++ final-stage C2 implant, loaded reflectively,
never present on disk as a PE
ABUSED LEGITIMATE COMPONENTS (benign files, do not block by name alone)
RegSchdTask.exe ASUSTek scheduled-task utility, signed
GoProAlertService.exe GoPro service binary, signed
MSVCP120.dll Microsoft Visual C++ runtime
MSVCR120.dll Microsoft Visual C++ runtime
pthreadVC2.dll open-source POSIX Threads for Windows
api.telegram.org Telegram Bot API
ACTOR
Unattributed. Links to East Asia, assessed moderate-to-high confidence
from operator working hours (active 04:00-12:00 UTC, concentrated
07:00-11:00 UTC). Not tied to any named APT group.
Targeting: government entities in the Middle East.
Observed C2 command execution: 2026-07-07 to 2026-07-09.
LURE THEMES (for mail-gateway and awareness work)
Cooperation protocol for the exploration of petroleum and gas
Agreement on the Establishment of Common Border Offices
Delivered as ZIP containing an ISO/IMG disk image
OBFUSCATION
Control Flow Flattening, Mixed Boolean Arithmetic (~1000 instructions
per computed byte), opaque predicates, dual-layer XOR with a
volume-serial-derived second layer, nlohmann::json for C2 messages
CONTROL AUDIT - TELESHIM chain
==============================
[ ] Mail gateway blocks or quarantines .iso and .img attachments
[ ] Mail gateway recurses into ZIP and flags disk images inside archives
[ ] Group Policy "Mount ISO/IMG" restricted for standard users
(Windows 11 22H2+ / Windows Server 2022+ policy, or the shell
handler removal in playbook PB-1 for older builds)
[ ] ASR rule "Block executable files from running unless they meet a
prevalence, age, or trusted list criterion" enabled -- GUID
01443614-cd74-433a-b99e-2ecdc07bfc25
[ ] ASR rule "Block all Office applications from creating child
processes" enabled -- GUID d4f940ab-401b-4efc-aadc-ad5f3c50688a
[ ] Attack-surface reduction rules in Block mode, not Audit
[ ] Falcon prevention policy: Suspicious Process blocking enabled
[ ] Falcon prevention policy: Custom IOAs from section 9 deployed
[ ] Resolver / proxy blocks cert.hypersnet.com, ssl.blsouqs.com,
contacts.ftabnews.com
[ ] Policy decision recorded on api.telegram.org: allow, alert or block
[ ] WDAC or AppLocker denies execution from C:\ProgramData\ subdirectories
for standard users
[ ] Scheduled-task creation auditing enabled (event 4698) and forwarded
[ ] Registry autostart auditing enabled and forwarded
[ ] Outbound ICMP from workstations to the internet denied
[ ] 90-day retro-hunt completed against all hashes in this pack
[ ] Sensor coverage confirmed on every government-user workstation
Detection Validation Gates
Work these four gates in order. Do not promote anything to a blocking Custom IOA until gate 4 is signed off — a false block on a signed vendor binary in a government estate is its own incident.
Gate 1 — Telemetry readiness
| Check | How | Pass condition |
|---|---|---|
| Process telemetry present estate-wide | Count distinct aid emitting ProcessRollup2 over 24 h and compare to your host inventory. | Within 2% of inventory. Investigate any gap before trusting a null result. |
ScheduledTaskRegistered collected | Query the event bare over 7 days. | Non-zero. If zero, Q2 is blind and Q3 plus native hunt N1 become primary. |
| File-write telemetry on ProgramData | Query PeFileWritten with a TargetFileName filter on \\programdata\\. | Non-zero and plausible in volume. |
DnsRequest collected | Query for a domain you know is resolved hourly. | Non-zero. If zero, use resolver logs for Q6 and Q7. |
| Registry autostart telemetry | Query AsepValueUpdate over 7 days. | Non-zero. If zero, Q9 falls back to native hunt N2. |
Gate 2 — Benign baseline
- Run Q1 over 90 days. Expected result: zero. Any hit at all is an incident, not a tuning exercise.
- Run Q2 over 90 days and record every distinct
TaskNameplusTaskExecutablepair. Build theFeedbackallowlist from this and nothing else. - Run Q3, Q9 and Q10 over 30 days and count distinct hosts per day. If any exceeds roughly 20 hosts a day you have a legitimate driver to exclude before the query is usable as an alert.
- Run Q4 over 90 days. Expect hits only on
pthreadVC2.dllfrom real software. Record which products, then narrow the alerting form of the query to the other two DLL names. - Run Q7 over 30 days and plot the host count by lookup volume. Set the threshold above the natural population, then confirm the survivors by hand.
Gate 3 — Positive validation
Prove each detection fires, using benign stand-ins only. Nothing here needs malware.
- Q1: create
C:\programdata\shimgen_Data\, copynotepad.exeinto it asshimgen.exe, run it, close it. Q1 must return the execution. Delete the directory afterwards. - Q2 and Q3: register a task named
shimgenpointing atcalc.exewith a 6-minute repeat, confirm both queries fire, then delete the task. - Q4: copy any signed DLL into
C:\ProgramData\Test\AsTaskSched.dll. Q4 must return the write. Delete it. - Q5: do not synthesise a hash match. Instead confirm the query parses and that
SHA256HashDatais populated by running it with one hash swapped for a hash you know exists in your estate. - Q6: resolve one campaign hostname once from a test host, using
nslookuponly. Q6 must return it. Note the lookup in your test log so the SOC does not chase it. - Q8: from the
shimgen.exestand-in in step 1, spawnipconfig /allandnet user. Q8 must group both under the parent. - Q9: add a Run value pointing at an executable under
C:\ProgramData\, confirm, remove. - Q10: write a small file named with 32 hex characters and a
.PCPKEYextension intoC:\ProgramData\Crypto\DSS\from a user-profile process. Confirm, delete.
Gate 4 — Promotion
| Requirement | Threshold |
|---|---|
| Detect-mode soak before any Block action | 7 days minimum, 14 for IOA-2 |
| False positives during soak | Zero for IOA-1 and IOA-3. For IOA-2, zero after service-account exclusion. |
| Analyst runbook exists | Section 14 containment runbook linked from the detection |
| Rollback documented | Every IOA and every hardening step has a named undo, section 13 |
| Owner assigned | Named on-call rota, not a team alias |
Hardening — Tiered
Controls are tiered by deployment friction, not by importance. Each cites a MITRE mitigation for the why and a platform authority for the what. All are Windows and mail-gateway controls, because that is the entire surface this chain touches — there is no Linux, macOS, cloud or Kubernetes component to harden.
H-I1 · Block ISO and IMG attachments at the mail gateway
This is the single control that stops the chain before any code runs, and it is the one the actor's whole delivery design depends on: the disk-image container is what strips Mark-of-the-Web from the payload so the signed binary runs without a warning. Block .iso and .img inbound, and configure the gateway to recurse into archives so an image nested in a ZIP is still seen.
Authority: MITRE M1031 Network Intrusion Prevention, M1040 Behavior Prevention on Endpoint · CIS Controls v8 §9.6 (block unnecessary file types at the email gateway) · addresses T1566.001, T1204.002, T1553.005.
Verify: send yourself a ZIP containing a 1 MB dummy .img from an external address; it must be quarantined, and the gateway log must name the nested file.
H-I2 · Sinkhole the three campaign hostnames
Block cert[.]hypersnet[.]com, ssl[.]blsouqs[.]com and contacts[.]ftabnews[.]com at the resolver and at the proxy. Log and alert on the block rather than silently dropping — a blocked lookup is your highest-fidelity signal that a host is already compromised.
Authority: MITRE M1021 Restrict Web-Based Content · addresses T1071.001, T1571.
Verify: nslookup cert.hypersnet.com from a workstation returns your sinkhole, and the attempt appears in the resolver alert log.
H-I3 · Deny outbound ICMP from workstations to the internet
The implant confirms connectivity with ping to its own hostnames before beaconing. Workstations have no legitimate need to ICMP the internet, so denying it removes a reconnaissance step and produces a clean alert when something tries.
Authority: MITRE M1037 Filter Network Traffic · CIS Benchmark for Windows, Windows Defender Firewall outbound rules · addresses T1016, T1071.
Verify: ping 203.0.113.1 from a workstation fails, and the firewall log records the drop.
H-I4 · Deploy the section 9 Custom IOAs in Detect mode
IOA-1 and IOA-3 can go straight to Detect with no soak because their patterns have no legitimate form. IOA-2 goes to Detect for a 14-day soak. This costs nothing and closes the window while the heavier controls are piloted.
Authority: MITRE M1040 Behavior Prevention on Endpoint · addresses T1574.001, T1036.005, T1087, T1057.
Verify: run the gate 3 positive tests; each IOA must raise a detection.
H-N1 · Restrict disk-image mounting for standard users
Blocking the attachment is the first line; removing the ability to mount an image is the second, and it also covers images arriving by USB, chat or web download. Windows 11 22H2 and Windows Server 2022 expose this as policy. On older builds, remove the shell mount verb (playbook PB-1).
Authority: MITRE M1042 Disable or Remove Feature or Program · Microsoft Security Baseline for Windows 11, "Prevent users from mounting ISO/IMG files" · addresses T1204.002, T1553.005.
Verify: as a standard user, double-click an .img; the mount must fail. Confirm your imaging and software-deployment tooling still works, since some of it mounts images legitimately.
H-N2 · WDAC or AppLocker deny-execute on ProgramData subdirectories
Every stage of this chain executes from C:\ProgramData\. A deny rule for standard users on C:\ProgramData\*, with a narrow allowlist for the agents that genuinely need it, breaks TELESHIM, MIXEDKEY and BINDCLOAK simultaneously regardless of filenames or hashes. This is the highest-leverage control in the pack and also the one most likely to break something, hence the pilot ring.
Authority: MITRE M1038 Execution Prevention · CIS Benchmark for Windows §18.9.x AppLocker · Microsoft WDAC deployment guidance · addresses T1574.001, T1036.005, T1620.
Verify: in Audit mode first, review AppLocker event 8003 / WDAC 3076 for a week to enumerate legitimate ProgramData executors. Then enforce and re-run the Q1 positive test — the stand-in must be denied.
H-N3 · Enable the two relevant ASR rules in Block mode
Enable "Block executable files from running unless they meet a prevalence, age, or trusted list criterion" (01443614-cd74-433a-b99e-2ecdc07bfc25) and "Block all Office applications from creating child processes" (d4f940ab-401b-4efc-aadc-ad5f3c50688a). The prevalence rule is the one that bites here: a freshly built sideload DLL has no prevalence anywhere.
Authority: MITRE M1040 Behavior Prevention on Endpoint · Microsoft Defender ASR reference · addresses T1204.002, T1574.001.
Verify: Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids lists both GUIDs with action 1 (Block).
H-N4 · Decide and enforce a policy position on Telegram
This is a governance decision that a detection cannot substitute for. On a government estate, either Telegram is sanctioned business software, in which case Q7 needs an allowlist and a documented exception process, or it is not, in which case block api.telegram.org at the proxy and the C2 channel dies. Leaving it undecided is what gives this actor its cover.
Authority: MITRE M1021 Restrict Web-Based Content, M1057 Data Loss Prevention · CIS Controls v8 §9.3 · addresses T1102, T1071.001.
Verify: the decision is written down with a named owner. If blocking, confirm api.telegram.org is denied at the proxy and that the deny is alerted.
H-S1 · Remove local administrator rights from the government user population
The chain writes to C:\ProgramData\, registers machine-scope scheduled tasks and sets Run keys. Standard-user context constrains all three and converts several silent steps into failures or prompts. This is slow and political, which is why it is strategic rather than immediate, but nothing else in this list has the same breadth.
Authority: MITRE M1026 Privileged Account Management · CIS Controls v8 §5.4 · CIS Benchmark for Windows §2.2.x · addresses T1547.001, T1053.005, T1574.001.
Verify: report the count of interactive logons by accounts in the local Administrators group, trending to zero for the standard population.
H-S2 · Egress filtering with a default-deny posture for workstations
Both C2 channels here are outbound HTTPS to hosts with no business relationship to a government network. A proxy-only egress model with categorisation, and default-deny for uncategorised destinations, turns a working C2 channel into a blocked request and an alert. It also removes the Telegram cover entirely.
Authority: MITRE M1037 Filter Network Traffic · NIST SP 800-41 Rev.1 · CIS Controls v8 §12.2 · addresses T1071.001, T1102, T1090.001, T1571.
Verify: from a workstation, a direct outbound TLS connection to an uncategorised host on 443 fails and is logged.
H-S3 · Application-control maturity: signed-and-inventoried execution only
The long-term answer to DLL sideloading is not blocking DLL names, it is only permitting code you have inventoried. Extend the H-N2 WDAC policy from a ProgramData deny into a managed allowlist covering the whole estate, including DLL rules — sideloading specifically defeats EXE-only application control.
Authority: MITRE M1038 Execution Prevention, M1045 Code Signing · Microsoft WDAC guidance · DISA Windows STIG application-allowlisting requirements · addresses T1574.001, T1036.005, T1620, T1105.
Verify: WDAC policy in enforce mode with DLL rules enabled on the pilot ring, and a documented exception queue with an owner and an SLA.
H-S4 · Targeted awareness for the population this actor phishes
The lures are diplomatic and energy documents aimed at government staff who legitimately receive exactly that kind of attachment from unfamiliar senders, so generic "don't click links" training does not help. Brief the specific pattern: a document that arrives as a ZIP containing a disk image is never a document.
Authority: MITRE M1017 User Training · CIS Controls v8 §14.2 · addresses T1566.001, T1204.002.
Verify: run a simulated phish using a ZIP-wrapped disk image against the target population and measure the mount rate, not just the click rate.
No control in this section lacks a framework citation, but two rest partly on vendor guidance rather than a numbered benchmark line: H-N1 (the ISO-mount policy is a Microsoft baseline setting, not a CIS-numbered item on every build) and H-N3 (ASR GUIDs are a Microsoft reference, not a CIS control). Both are sound and threat-relevant; review them against your own build standard before enforcing.
Deployable Playbooks
Read the rollback line before running any step. Every step below changes endpoint state. Pilot each on a ring of no more than 20 hosts first. Run all PowerShell from an elevated session.
PB-1 · Restrict disk-image mounting (implements H-N1)
Prerequisites: Domain admin for the GPO path, or local admin for the per-host path. Confirm first that no imaging, patching or software-deployment tool in your estate mounts ISO or IMG files as part of normal operation — check with the desktop engineering team before piloting. Windows 11 22H2 or Windows Server 2022 for the policy route; the registry route covers older builds.
Reboot required: No. A sign-out and sign-in applies the shell change.
Rollback: re-import the exported keys saved in step 1 with reg import, or set the GPO back to Not Configured and run gpupdate /force. The mount verb returns immediately for new sessions.
# --- Step 1: ALWAYS export first. This is the rollback artifact. --- $bk = "C:\Windows\Temp\iso-mount-backup-2026-07-26" New-Item -ItemType Directory -Path $bk -Force | Out-Null reg export "HKEY_CLASSES_ROOT\Windows.IsoFile\shell\mount" "$bk\isofile-mount.reg" /y reg export "HKEY_CLASSES_ROOT\Windows.VhdFile\shell\mount" "$bk\vhdfile-mount.reg" /y Get-ChildItem $bk # confirm both .reg files exist and are non-empty BEFORE step 2 # --- Step 2 (preferred, Win11 22H2+ / Server 2022+): policy route --- # Computer Configuration \ Administrative Templates \ System \ Removable Storage Access # "Prevent users from mounting ISO/IMG files" -> Enabled # Equivalent registry value: $k = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Explorer" New-Item -Path $k -Force | Out-Null New-ItemProperty -Path $k -Name "NoUseStoreOpenWith" -Value 0 -PropertyType DWord -Force | Out-Null New-ItemProperty -Path $k -Name "NoAutoplayfornonVolume" -Value 1 -PropertyType DWord -Force | Out-Null # --- Step 3 (older builds only): remove the shell mount verb --- # Do this ONLY if step 2's policy is unavailable on the build. Remove-Item -Path "Registry::HKEY_CLASSES_ROOT\Windows.IsoFile\shell\mount" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path "Registry::HKEY_CLASSES_ROOT\Windows.VhdFile\shell\mount" -Recurse -Force -ErrorAction SilentlyContinue # --- Step 4: verify --- Test-Path "Registry::HKEY_CLASSES_ROOT\Windows.IsoFile\shell\mount" # expect False on the step-3 route # Then, as a STANDARD user, double-click a test .img -- the mount must fail.
PB-2 · Enable the two ASR rules in Block mode (implements H-N3)
Prerequisites: Microsoft Defender Antivirus in active mode (not passive alongside another AV, or ASR rules are inert). Run in Audit mode for one week first and review the events, as the prevalence rule can block legitimate freshly built in-house tooling.
Reboot required: No.
Rollback: re-run the same command with -AttackSurfaceReductionRules_Actions Disabled for the same GUIDs, or AuditMode to keep visibility without blocking. Effective immediately, no reboot.
# --- Step 1: record current state. This is the rollback reference. ---
$pref = Get-MpPreference
[pscustomobject]@{
Ids = $pref.AttackSurfaceReductionRules_Ids -join ','
Actions = $pref.AttackSurfaceReductionRules_Actions -join ','
} | Format-List
# --- Step 2: AUDIT first, for one week ---
$rules = @('01443614-cd74-433a-b99e-2ecdc07bfc25', # prevalence / age / trusted-list
'd4f940ab-401b-4efc-aadc-ad5f3c50688a') # Office child processes
Add-MpPreference -AttackSurfaceReductionRules_Ids $rules `
-AttackSurfaceReductionRules_Actions AuditMode,AuditMode
# --- Step 3: review the audit week before enforcing ---
Get-WinEvent -LogName 'Microsoft-Windows-Windows Defender/Operational' -MaxEvents 500 |
Where-Object { $_.Id -in 1121,1122 } |
Select-Object TimeCreated, Id, Message |
Format-List
# --- Step 4: enforce ---
Add-MpPreference -AttackSurfaceReductionRules_Ids $rules `
-AttackSurfaceReductionRules_Actions Enabled,Enabled
# --- Step 5: verify both GUIDs report action 1 ---
$p = Get-MpPreference
for ($i = 0; $i -lt $p.AttackSurfaceReductionRules_Ids.Count; $i++) {
"$($p.AttackSurfaceReductionRules_Ids[$i]) = $($p.AttackSurfaceReductionRules_Actions[$i])"
}
PB-3 · AppLocker deny-execute on ProgramData, audit-first (implements H-N2)
Prerequisites: Application Identity service (AppIDSvc) running and set to automatic. A pilot ring. Critically, one full week in Audit mode with the event review in step 3 completed and signed off — enforcing this without knowing which of your agents execute from ProgramData will break them.
Reboot required: No, but AppIDSvc must be started, and it does not start by default on all builds.
Rollback: re-import the policy XML exported in step 1 with Set-AppLockerPolicy -XmlPolicy, or clear the local policy entirely with the documented empty-policy import in step 5. To disable without touching policy, stop and disable AppIDSvc. Effective on the next policy refresh.
# --- Step 1: export the existing policy. This is the rollback artifact. ---
$bk = "C:\Windows\Temp\applocker-backup-2026-07-26.xml"
Get-AppLockerPolicy -Effective -Xml | Out-File $bk -Encoding UTF8
(Get-Content $bk).Length # must be non-zero BEFORE continuing
# --- Step 2: ensure the enforcement service is running ---
Set-Service -Name AppIDSvc -StartupType Automatic
Start-Service -Name AppIDSvc
# --- Step 3: create the rule in AUDIT mode, then wait a week ---
# In secpol.msc: Application Control Policies \ AppLocker \ Executable Rules
# Action: Deny
# User: Everyone (exempt your admin group)
# Path: %PROGRAMDATA%\*
# Enforcement mode: "Audit only"
# Also add a DLL rule with the same path -- sideloading defeats EXE-only control.
# Review what WOULD have been blocked:
Get-WinEvent -LogName 'Microsoft-Windows-AppLocker/EXE and DLL' -MaxEvents 1000 |
Where-Object { $_.Id -eq 8003 } |
Select-Object -ExpandProperty Message |
Sort-Object -Unique
# --- Step 4: add an allow rule per legitimate publisher found in step 3, ---
# --- then switch Enforcement mode to "Enforce rules". ---
# --- Step 5: verify, and note the rollback command ---
Get-AppLockerPolicy -Effective -Xml | Select-String 'PROGRAMDATA'
# ROLLBACK: Set-AppLockerPolicy -XmlPolicy $bk
# HARD OFF: Stop-Service AppIDSvc; Set-Service AppIDSvc -StartupType Disabled
PB-4 · Resolver and firewall blocks (implements H-I2, H-I3)
Prerequisites: Change-control approval for a resolver and firewall change. Apply the resolver block before the firewall rule so you get the higher-fidelity DNS alert.
Reboot required: No. Flush the DNS cache on endpoints to make the block effective immediately.
Rollback: remove the DNS zones with Remove-DnsServerZone and delete the firewall rule with Remove-NetFirewallRule -DisplayName using the exact name below. Both take effect immediately.
# --- Step 1: sinkhole the three campaign hostnames (Windows DNS example) ---
$hosts = @('cert.hypersnet.com','ssl.blsouqs.com','contacts.ftabnews.com')
foreach ($h in $hosts) {
Add-DnsServerPrimaryZone -Name $h -ReplicationScope Forest -ErrorAction Continue
# point the apex at your sinkhole listener so the attempt is logged, not just dropped
Add-DnsServerResourceRecordA -ZoneName $h -Name '@' -IPv4Address '10.10.10.10' -ErrorAction Continue
}
# Verify from a workstation: nslookup cert.hypersnet.com -> expect the sinkhole IP
# --- Step 2: deny outbound ICMP from workstations to the internet ---
New-NetFirewallRule -DisplayName 'HuntPack TELESHIM - Deny outbound ICMP to internet' `
-Direction Outbound -Protocol ICMPv4 -IcmpType 8 -Action Block `
-RemoteAddress Internet -Profile Domain,Private,Public -Enabled True
# --- Step 3: verify ---
Get-NetFirewallRule -DisplayName 'HuntPack TELESHIM - Deny outbound ICMP to internet' |
Select-Object DisplayName, Enabled, Action, Direction
Test-Connection -TargetName 203.0.113.1 -Count 1 -ErrorAction SilentlyContinue # expect failure
# ROLLBACK:
# foreach ($h in $hosts) { Remove-DnsServerZone -Name $h -Force }
# Remove-NetFirewallRule -DisplayName 'HuntPack TELESHIM - Deny outbound ICMP to internet'
PB-5 · Triage collection script for a suspect host (read-only)
Prerequisites: Local admin on the target, or run through Falcon Real Time Response. Read-only — it changes nothing on the host and is safe to run before a containment decision.
Reboot required: No.
Rollback: none required. The script only reads state and writes one report file to C:\Windows\Temp\; delete that file when you are done with it.
$out = "C:\Windows\Temp\teleshim-triage-$env:COMPUTERNAME.txt"
"=== TELESHIM triage $(Get-Date -Format s) on $env:COMPUTERNAME ===" | Out-File $out
"--- Staging directories ---" | Out-File $out -Append
foreach ($p in @('C:\programdata\shimgen_Data','C:\ProgramData\Crypto\DSS')) {
if (Test-Path $p) {
"PRESENT: $p" | Out-File $out -Append
Get-ChildItem $p -Force -Recurse -ErrorAction SilentlyContinue |
Select-Object FullName, Length, CreationTime, LastWriteTime |
Out-File $out -Append
} else { "absent: $p" | Out-File $out -Append }
}
"--- Sideload DLLs anywhere under ProgramData ---" | Out-File $out -Append
Get-ChildItem 'C:\ProgramData' -Recurse -Force -ErrorAction SilentlyContinue -Include `
'AsTaskSched.dll','pthreadVC2.dll','dlpprem64.dll' |
Select-Object FullName, Length, CreationTime,
@{n='SHA256';e={ (Get-FileHash $_.FullName -Algorithm SHA256).Hash }} |
Out-File $out -Append
"--- Sideload host binaries under ProgramData ---" | Out-File $out -Append
Get-ChildItem 'C:\ProgramData' -Recurse -Force -ErrorAction SilentlyContinue -Include `
'shimgen.exe','RegSchdTask.exe','GoProAlertService.exe','winProAlertService.exe' |
Select-Object FullName, Length, CreationTime,
@{n='SHA256';e={ (Get-FileHash $_.FullName -Algorithm SHA256).Hash }} |
Out-File $out -Append
"--- Suspect scheduled tasks ---" | Out-File $out -Append
Get-ScheduledTask | ForEach-Object {
$exe = ($_.Actions | ForEach-Object Execute) -join ';'
$rep = ($_.Triggers | ForEach-Object { $_.Repetition.Interval }) -join ';'
if ($_.TaskName -match 'shimgen|Feedback' -or $exe -like '*\ProgramData\*') {
"TASK $($_.TaskName) | $($_.State) | $exe | repeat=$rep" | Out-File $out -Append
}
}
"--- Autostart values targeting ProgramData ---" | Out-File $out -Append
foreach ($k in @('HKLM:\Software\Microsoft\Windows\CurrentVersion\Run',
'HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce')) {
if (Test-Path $k) {
(Get-Item $k).GetValueNames() | ForEach-Object {
$v = (Get-ItemProperty -Path $k -Name $_).$_
if ($v -like '*ProgramData*') { "$k :: $_ = $v" | Out-File $out -Append }
}
}
}
"--- Oversized TEMP stress files ---" | Out-File $out -Append
Get-ChildItem "$env:TEMP\CVR*.tmp" -ErrorAction SilentlyContinue |
Where-Object { $_.Length -gt 100MB } |
Select-Object FullName, Length | Out-File $out -Append
"--- Live connections and DNS cache ---" | Out-File $out -Append
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
Out-File $out -Append
Get-DnsClientCache -ErrorAction SilentlyContinue |
Where-Object { $_.Entry -match 'telegram|hypersnet|blsouqs|ftabnews' } |
Out-File $out -Append
"=== end ===" | Out-File $out -Append
Write-Host "Report written to $out"
Containment Runbook
Before you isolate: this is a hands-on-keyboard espionage actor with an interactive C2, not commodity malware. If you have any reason to believe more than one host is involved, scope the whole estate with Q1, Q2, Q5 and Q6 before touching the first host. Isolating one host tells the operator they are burned and can cost you the rest of the intrusion. Confirm the scoping decision with the incident lead.
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| 0 · Scope before isolating |
|
Threat hunt lead | Query exports with timestamps, host list, mail recipient list, the documented scoping decision |
| 1 · Isolate contain |
|
SOC on-call | Memory image, PB-5 report per host, containment timestamps, resolver block confirmation |
| 2 · Eradicate remove |
|
Endpoint engineering | Before and after task and registry exports, quarantine manifest, per-host clean query results, rebuild tickets |
| 3 · Credential response assume exposure |
|
Identity team | Reset log with timestamps, authentication review findings, revocation records |
| 4 · Recover restore |
|
Endpoint engineering + SOC | Rebuild records, clean query evidence per host, IOA deployment confirmation |
| 5 · Learn close out |
|
Incident lead | Post-incident review, control-gap list with owners, CERT notification record, scheduled-search configuration |
Detection Coverage Map
| Technique | Behaviour | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1566.001 | ZIP-wrapped disk-image lure delivered by mail | Q5 (hash) | — | Partial — hash-only; behavioural coverage lives at the mail gateway (N5, H-I1), not in Falcon |
| T1204.002 | User mounts image and runs the signed binary inside | Q5 | — | Partial — no reliable mount event; H-N1 prevents rather than detects |
| T1553.005 | Mark-of-the-Web bypass via the image container | — | — | GAP — no MOTW telemetry in this pack. Prevention only (H-I1, H-N1) |
| T1574.001 | DLL sideloading via signed ASUSTek and GoPro binaries | Q1, Q4 | IOA-1, IOA-3 | Good |
| T1053.005 | Scheduled tasks shimgen and Feedback | Q2, Q3 | — | Good — two independent paths plus native hunt N1 |
| T1547.001 | Registry Run-key persistence | Q9 | — | Partial — no published value name, so the query hunts shape only |
| T1036.005 | Masquerading as vendor binaries and vendor directories | Q1, Q4 | IOA-1, IOA-3 | Good |
| T1140 / T1027 | XOR-decrypted payload, heavy obfuscation | Q10 | — | Partial — the encrypted blob on disk is detectable; the decryption is not |
| T1480.001 | Environmental keying from the volume serial number | — | — | GAP — by design undetectable on the host; only defeats analysis, not detection of the loader |
| T1620 | Reflective loading of BINDCLOAK | Q10 (proxy) | — | GAP — no module-load telemetry for reflective loads. Detect the loader and the beacon instead |
| T1497 | Sandbox evasion: I/O stress, CPUID, WMI RAM check | Q8 (wmic) | — | Partial — native hunt N4 covers the stress file; CPUID is invisible to EDR |
| T1014 | 7-byte inline hook in the sideload host image | — | — | GAP — in-process patching is not covered by any query here |
| T1087 / T1057 / T1049 / T1082 / T1007 / T1033 / T1518.001 | Built-in discovery command burst | Q8 | IOA-2 | Good |
| T1102 | Telegram Bot API as a C2 dead drop | Q7 | — | Partial — volumetric only; high FP where Telegram is used. N3 adds proxy-side coverage |
| T1071.001 / T1571 | HTTPS beacon to the campaign hostnames | Q6 | — | Good — for the three known hosts. New infrastructure is not covered |
| T1090.001 | Internal proxy capability in the implant | — | — | GAP — no published detail on the proxy behaviour. Revisit when Part 2 lands |
| T1105 / T1570 | Payload transfer via Telegram getFile, staging under ProgramData | Q4, Q7 | IOA-3 | Good |
Gaps worth naming plainly
- BINDCLOAK's on-host behaviour is uncovered. ThreatLabz Part 2 had not published at time of writing. This pack detects the loader that installs it and the domain it calls, and nothing in between. Re-run the pipeline when Part 2 is out.
- Reflective loading (T1620) has no telemetry. There is no module-load event to hunt. Q10 is a proxy that catches the encrypted blob on disk; if the actor moves that blob to a path with legitimate writers or fetches it directly into memory, Q10 goes blind.
- The inline hook (T1014) is invisible here. A 7-byte patch at offset 0x1394 of an already-running signed image needs memory-integrity or in-process telemetry that this pack does not use.
- C2 detection is hostname-bound. Q6 covers three known hosts. Rotating infrastructure defeats it entirely, which is why Q1, Q2 and Q8 — none of which depend on a network indicator — are the durable detections.
- One withheld hash. MIXEDKEY's SHA-256 is a labelled placeholder, not a detection. Q4 and Q10 cover that stage behaviourally. If a trustworthy second witness for that hash appears, fill the placeholder and re-run the provenance gate.
Validation of everything above runs through section 11. In short: confirm the telemetry in gate 1 before believing any zero result, baseline in gate 2 before alerting, prove each query fires with the benign stand-ins in gate 3, and do not move any detection to Block until gate 4 is signed off. The three queries that matter most on day one — Q1, Q2 and Q8 — are also the three cheapest to validate, so there is no reason to defer them.
Hunt Summary Ticket
TITLE: TELESHIM / MIXEDKEY / BINDCLOAK - targeted DLL-sideloading intrusion
with Telegram Bot API C2 (Middle East government targeting)
SEVERITY: High. Targeted espionage tooling, hands-on-keyboard operator,
three-stage chain with a memory-only final implant.
SCOPE: All Windows endpoints, government user population first.
Lookback: 90 days for hash and domain queries (Q5, Q6),
7 days for the behavioural queries.
HYPOTHESIS: An operator delivered a ZIP-wrapped ISO/IMG lure on a diplomatic or
energy theme, sideloaded TELESHIM via a signed ASUSTek binary,
established minute-interval scheduled-task persistence, polled the
Telegram Bot API for commands, ran built-in discovery, then staged
MIXEDKEY to reflectively load BINDCLOAK for long-haul C2 to
cert[.]hypersnet[.]com.
QUERIES: Q1 shimgen_Data execution CONF high FP low
Q2 scheduled task shimgen / Feedback CONF high FP med
Q3 schtasks minute interval CONF high FP med
Q4 sideload DLL under ProgramData CONF high FP med
Q5 confirmed campaign SHA-256 values CONF high FP low
Q6 campaign C2 hostname resolution CONF high FP low
Q7 Telegram Bot API poll volume CONF med FP high
Q8 recon burst under sideload host CONF high FP low
Q9 Run key targeting ProgramData CONF med FP med
Q10 .PCPKEY blob in Crypto\DSS CONF med FP med
DO FIRST: 1. Q1 over 90 days. Expected result is zero. Any hit is an incident.
2. Q2 and Q6 over 90 days.
3. Q8 over 7 days.
4. Native hunt N1 on any host lacking scheduled-task telemetry.
5. Block the three C2 hostnames at the resolver (H-I2). Log the block.
6. Do NOT isolate a host until phase 0 scoping is complete - this is
an interactive operator and premature isolation burns the hunt.
FINDINGS: [ ] Q1 hits: ______ [ ] Q2 hits: ______ [ ] Q5 hits: ______
[ ] Q6 hits: ______ [ ] Q8 hits: ______
[ ] Mail-gateway retro-hunt recipients: ______
[ ] Hosts staged but not executed (Q4, Q9): ______
GAPS: BINDCLOAK on-host behaviour (Part 2 unpublished).
Reflective loading has no module-load telemetry.
Inline hook at offset 0x1394 not covered.
MIXEDKEY SHA-256 withheld as unreliable - behavioural cover only.
C2 detection is hostname-bound and defeated by rotation.
No MOTW telemetry; ISO/IMG delivery is prevention-only.
ACTIONS: Immediate H-I1 block .iso/.img at the mail gateway
H-I2 sinkhole the three C2 hostnames, alert on the block
H-I3 deny outbound ICMP from workstations
H-I4 deploy IOA-1 and IOA-3 in Detect
Near term H-N1 restrict disk-image mounting (PB-1)
H-N2 AppLocker/WDAC deny-execute on ProgramData (PB-3)
H-N3 enable the two ASR rules in Block (PB-2)
H-N4 decide the Telegram policy position
Strategic H-S1 remove local admin from the user population
H-S2 default-deny egress filtering
H-S3 signed-and-inventoried execution, with DLL rules
H-S4 targeted awareness on ZIP-wrapped disk images
OWNER: _________________________ (named individual, not a team alias)
VERSION: v0.1 - 2026-07-26
Changelog
pthreadVC2.dll SHA-256 was withheld and replaced with a labelled placeholder: the primary source rendered that cell as a corrupted repeating hex run, and the only source that rendered a clean 64-character value also mis-split the adjacent dlpprem64.dll row, so it is not a trustworthy sole witness. MIXEDKEY is covered behaviourally by Q4 and Q10 instead. No in-query time filters, per the CQL parser constraint on expressions in comparisons.
Planned v0.2: re-run when ThreatLabz publishes Part 2 to add BINDCLOAK on-host detection and close the T1620 and T1090.001 gaps. Fill the MIXEDKEY SHA-256 placeholder if a trustworthy second witness appears.
References
| Tier | Source | Used for | Snapshot | Accessed |
|---|---|---|---|---|
| 1 | Zscaler ThreatLabz — Targeted Attack on Government Entities in the Middle East, Part 1 (Sudeep Singh, 2026-07-20) | Attack chain, all three malware families, persistence, staging paths, mutex, recon set, anti-analysis, IOC table | 01-zscaler-threatlabz.txt | 2026-07-26 |
| 2 | Security Boulevard — syndication of the ThreatLabz Part 1 report (2026-07-20) | Second witness for every hash; source of the row-collapse and mis-split evidence behind the withheld SHA-256 | 02-security-boulevard.txt | 2026-07-26 |
| 3 | GBHackers — Hackers Hide C2 Traffic Inside Telegram While Targeting Middle East Governments (2026-07-21) | Independent confirmation of the four lure hashes, two C2 hostnames, Telegram C2 mechanism, Crypto\DSS path | 03-gbhackers-telegram-c2.txt | 2026-07-26 |
| 3 | Cyber Press — New TELESHIM Malware Uses Telegram Bots to Backdoor Middle East Government Systems (2026-07-21) | Confirmation of both task names, both staging directories, both sideload pairs, vendor signature names, attribution | 04-cyberpress-teleshim.txt | 2026-07-26 |
| 3 | cybersecurity-help.cz — Cyber Security Week in Review (2026-07-24) | Victimology and operator-geography corroboration only. No indicator in this pack is sourced from it. | 05-cybersecurity-help-weekly.txt | 2026-07-26 |
| ref | MITRE ATT&CK and MITRE mitigation catalogue (M1017, M1021, M1026, M1031, M1037, M1038, M1040, M1042, M1045, M1057) | Technique IDs in section 6 and mitigation citations in section 12 | — | 2026-07-26 |
| ref | CIS Benchmarks for Windows, CIS Controls v8, Microsoft Security Baseline for Windows 11, Microsoft Defender ASR rule reference, Microsoft WDAC deployment guidance, DISA Windows STIG, NIST SP 800-41 Rev.1 | Platform authority for each hardening control in section 12 | — | 2026-07-26 |
Provenance: the fetched text of every cited source is saved verbatim in TELESHIM-MiddleEast-Gov-Hunt-sources/ alongside this file. Every atomic indicator shipped in section 10 traces back to at least one of those snapshots. Each snapshot also records an explicit check for injected instructions aimed at a reader or an automated agent; none was found in any source.