Security teardown · 2026-10-19 live phishing infrastructure web.mis-ws.org

Anatomy of a WhatsApp linked-device phishing kit

web.mis-ws.org looks broken on a computer: 153 bytes of nothing. On a phone it opens a polished 「WhatsApp 安全檢測中心」support chat that walks you through a security check. The check is real — it is WhatsApp's own Link a device flow. The only lie is whose device is being linked. The victim performs the account takeover themselves, with their own thumb, and thanks the operator for helping.

Domain age
7 days reg. 2026-10-12
App bundle
1.19 MB Vue 3, obfuscated
Strings decoded
13,449
Pairing code
8 digits 120 s TTL
Public footprint
0 hits, 0 crawlers
The one-sentence version

The kit is a fake support desk wrapped around a real WhatsApp linked-device pairing session. It asks for your number, WhatsApp sends its session an 8-digit code, the chat hands you that code, and you type it into your own phone — which authorises the operator's server as a device on your account.

How the flow works

01

Get on a phone, get past the scanners

The server 404s every desktop user-agent, and the head script drops anything matching bot|spider|crawl|headlesschrome|phantomjs|selenium|puppeteer|playwright|curl/|wget. A second gate (mgate.js) then checks platform, WebGL renderer and userAgentData.mobile. The reason is not mobile UX — your WhatsApp has to be on the device you are holding.

nm = navigator.userAgent.toLowerCase(); if (/bot|spider|crawl|slurp|headlesschrome|phantomjs|selenium|puppeteer|playwright|python-requests|curl\/|wget/.test(nm)) return;mgate.js · gate 1
02

Open with a familiar problem

A 「客服安全驗證」screen, then a bot pretending to be WhatsApp's security centre. The pretext is deliberately vague — order, delivery, refund — so any visitor can project their own half-finished transaction onto it. The menu offers 查詢訂單 / 物流配送 / 退款售後 / 人工專員; every branch ends in the same place.

你好,WhatsApp 安全檢測中心,很高興為你服務! 你的帳戶有風險提示且未進行驗證。目前需要新增官方系統裝置以解除異常,請予以配合, 以免影響帳戶的正常使用。若因異常未能及時解除而導致帳戶封停、註銷所產生的責任及損失,均由用戶本人承擔!rendered chat · stage 1
03

Ask for the number, not the password

A card appears: 驗證手機號碼 — "enter your phone number, we'll send you a link request", with a country picker defaulting to +86. No password, no OTP entry field of the usual shape. The number is what opens a pairing session on the operator's side.

{'mode':'phone', 'client_session_key':…, 'timeout_seconds':300, 'metadata':{'source':'web-kf', 'domain':location.hostname, 'ua':navigator.userAgent, 'ip':…}}WebSocket /api/v1/ws1 · session.start
04

The 8-digit code — and the role reversal

WhatsApp answers with a real pairing code. In the genuine flow that code is entered on the phone; that is exactly what the kit tells you to do — and the instruction it gives is accurate. Open WhatsApp → 設定 → 關聯設備 → 使用電話號碼關聯 → type the code below. The victim authorises the operator's session while believing they are verifying their own account.

驗證碼獲取成功,請在有效期內完成操作。 安全人員校驗驗證碼 · 8 位驗證碼 · 有效期 01:58 1. 打開 WhatsApp,點擊「設定」 2. 點擊「關聯設備」 3. 點擊「使用電話號碼關聯」 4. 複製或輸入下方驗證碼,完成關聯code card · stage 3
05

Freeze the victim in place

On success the chat does not celebrate — it manufactures a review process. "AI 檢測已完成" becomes "manual review", and one line tells you the whole operation: do not remove the device you just linked. Removing it would cut the operator off, so the script reframes removal as the thing that gets you banned.

AI 檢測已完成,賬號正在轉入人工審核,請保持設備關聯狀態。 注意:請勿在手機端移除剛關聯的設備,請返回原頁面繼續完成後續操作。rendered chat · stage 4
06

Hand off to a human

「正在為您接入人工安全專員」 is not decoration: the bot script is local, but from here every message goes over /session/message and comes back from /session/poll, with typing indicators and image upload. A real operator keeps the victim talking, harvests order and refund details, and guards the linked device — while the account is already open to them.

POST /session/message {text} ← operator's reply GET /session/poll?afterId=… ← delivered as chat messages POST /session/typing · /session/media · /session/access-check {device_id, ip}support-desk API

Who does what, in the handoff

Victim's phone
  1. Reads the number to the "agent"
  2. Opens Settings → Linked devices
  3. Chooses link with phone number
  4. Types the 8-digit code the kit supplied
  5. Believes the account was verified
→ authorises the link
Kit backend
  1. Holds a live pairing session
  2. Submits the victim's number
  3. Receives the 8-digit code
  4. Renders it as a "security code"
  5. Becomes a linked device
→ full chat & contact access
WhatsApp
  1. Sees a legitimate link request
  2. Issues a valid pairing code
  3. Accepts the code from the phone
  4. Syncs history to the new device
  5. No exploit, no bug — by design
→ behaves exactly as specified

Nothing in this chain is a WhatsApp vulnerability. Every step is a supported feature, aimed at a human instead of a machine — which is why the kit spends its engineering budget on trust theatre, not on exploits.

If the code path fails: the QR fallback

2-minute links that skip every gate

The gate has one exception: /q/<6–16 chars> is allowed through unconditionally, because that page has to open on a desktop. The kit creates one per victim with a 120-second expiry — long enough to scan, too short to report or reshare.

Error codes are WhatsApp's own

The backend relays WhatsApp's real failure reasons — login_rejected, device_limit, login_timeout — then offers "scan the QR instead". Both paths end the same way: the operator holds a linked device.

The mirror

Archived copy — every file in llFco8/ is byte-for-byte as served (1.19 MB app, CSS, 13 illustrations, gate + loader chunks). One addition: guard.js, which makes the kit's own mobile gate pass so it can render here, and hard-blocks every network call. The archive cannot reach the operator's backend and cannot be used as a working kit.

The capture is the real first screen: the 「客服安全驗證」gate, the bot's risk warning, the service menu and the 開始驗證 button. Type nothing — the phone form is where stage 3 begins, and in the archive it cannot submit anywhere.

Best viewed phone-width. The archive is a historical record — the live domain rotates its entry chunk and will look different, or be gone.

Indicators

ItemValue
Hostweb.mis-ws.org · apex mis-ws.org (no A record)
Registered2026-10-12 · Gname.com · NS a.share-dns.com / b.share-dns.net
Edge→ 9dae60af.a1vk0eiqz0.xyz → cdn.a1vk0eiqz0.xyz
Addresses45.61.163.20 · 45.61.150.6 · 45.59.119.120 · 144.172.98.253 · 144.172.102.144 · 172.86.90.167
Assets/llFco8/ — rotating entry chunk, 1.19 MB app, 13 .webp illustrations
API/api/allocate · /api/pc-scan/<code> · /api/tg-cs/session/{health,access-check} · WS /api/v1/ws1
Support desk/session · /session/message · /session/poll · /session/typing · /session/media
Storage keyskf-wa-pairing-session · kf-wa-ws-path · kf-human-verification-passed
AnalyticsUmami · website-id 1e2159ad-6f45-474d-9533-3ca58be064e1
Localeszh-CN · zh-HK · zh-TW · en — auto-selected from .hk/.mo/.tw hosts

If someone already did it

Removal, not passwords. WhatsApp → Settings → Linked devices → log out every device you did not add yourself (the one labelled with a browser or an unfamiliar OS is the operator's). Then turn on two-step verification and tell your contacts. A linked device survives a reinstall and a password change; only unlinking removes it. That 8-digit code is never needed to "verify" an account — it only ever authorises a new device.