Back to Posts

一個假包裹網站,和操盤它的那六顆按鈕

「您的包裹被海關扣住,補繳一筆關稅才能放行。」這種訊息,你大概每個月都收到幾則。這篇拆解的是這套把戲的一種版本,目標是哥倫比亞人,仿冒當地國營郵政 4-72。平常真的會收到的釣魚網站多半很破,尤其仿冒政府機關的那些,一眼就看得出來。這套不是,它做得相當完整。而麻煩在你交出卡號之後:那一頭不只有自動化程式,還有個活人在等著。

8/16(日)凌晨,有人拿我的 tg.pe 短網址服務去縮一條連結(這個服務任何人都能用,不用註冊),目的地是 paquetes-colombia.blog

Note: There’s also an English version of this post.

一個新網域,長得像政府網站

先看它有多新。查公開的網域註冊資料(RDAP),它註冊於台北時間 8/16 凌晨 1 點,3 小時後被送進 tg.pe。對這麼新的網域,tg.pe 預設先當蜜罐處理:投稿的人看到「建立成功」,連結在視窗內也照常轉址過去,但它只活幾分鐘就自我銷毀,之後再點就只剩 404。這套「新網域先不信任」的邏輯,上一篇寫過,這裡不贅述。

把自己門口掃乾淨只是最低標。網域還活著,同一條連結照樣會從簡訊、Email 繼續傳,所以我照例人工點進去看一眼。這次看到的,比上次那種「一頁假登入」複雜得多。

它是一整套網站,仿的是 4-72(哥倫比亞的國營郵政):版面、字體全照抄,頁首掛著哥倫比亞政府入口 GOV.CO 的橫條,頁尾抄了 4-72 的稅籍編號。最偷懶的是網站小圖示(favicon)和那條 GOV.CO 橫條的圖,都是直接從 4-72 官網的伺服器上盜連過來的。這個偷懶有代價:仿冒站每被打開一次,就會替訪客向 4-72 的伺服器要一次那兩張圖,而請求裡的來源網址欄位寫的正是仿冒站自己。每一個冒用它的網域,此刻都躺在 4-72 自己的存取紀錄裡。被冒用的品牌手上其實有一份現成的冒用清單,只是幾乎沒人在監測。

整個站躲在流量中介 Cloudflare 後面,而且防護等級被開到會跳驗證牆,那是歹徒主動在 Cloudflare 帳號裡開的設定,效果是:靠實際抓頁面判斷的掃描器全部只拿到一頁「請證明你不是機器人」,urlscan 給這個網域的網站評分是 0 分。不過失明的只有靠抓頁面的那幾家:urlscan 自家的機器學習引擎仍判它惡意(96 分),VirusTotal 在 tg.pe 收件的當下也已經有 1 家標惡意、1 家標可疑。那些判定不可能是從網頁內容來的,牆就擋在那裡;至於它們實際看了什麼,廠商不公開。

兩百塊的算計

查件頁不管你輸入什麼單號(只要長度合理),都回同一句話:你的包裹「Retenido en aduana」(扣在海關),要補繳關稅。

假的海關頁 假的海關頁:金額 19,900 披索,搬出哥倫比亞真實存在的海關法規,再掛一句假的「DIAN(稅務暨海關總署)決議」虛張聲勢。

19,900 披索約合新台幣 200 元,小到你不會為了它特地打電話去郵局查證,剛好落在「算了付一付」的區間。再配上真實的法令編號和政府機關,滿滿權威感。不過這 200 塊只是入場費,下一頁才是它要的。

一張每 3 秒等指令的付款表單

按下「繳費」,表單跳出來:持卡人姓名、信用卡號、有效期限、CVV(卡片背面的驗證碼)。

假的付款頁 要害在這裡:一次要齊完整的信用卡資料。

到這裡都還算常見,稀奇的是它背後的動作。從你打開的那一刻起,這頁每 3 秒向自己的伺服器問一次:「接下來要我把這個人帶去哪裡?」等的是一個人給它指令。

因為在另一頭,你剛交出的卡號正即時送進一個 Telegram 群組,歹徒收到的那則訊息底下,附著一排按鈕。

歹徒手機上的那六顆按鈕

你在付款頁猶豫的這幾秒,另一頭有支手機震了一下:卡號跳出來,底下六顆按鈕,有人在挑下一步。就像這樣:

操作者手機上會看到的畫面(示意) 操作者這一頭的畫面:底下六顆按鈕分別是簡訊驗證碼、Email 驗證碼、3D 驗證、卡片密碼、卡號無效、完成。這張是我用自己的機器人和測試資料重建的示意圖。

這六顆按鈕不是我憑空猜的,付款頁的前端 JS 程式碼攤在明處,直接寫明了送去 Telegram 的訊息要附哪些按鈕,以下依實際擷取轉錄:

const keyboard = [
  [btn('📲 OTP SMS', 'redirect_sms'),  btn('📧 OTP Email', 'redirect_email')],
  [btn('🔒 3D Secure', 'redirect_vbv'), btn('🔢 PIN', 'redirect_pin')],
  [btn('❌ Tarjeta inválida','invalid_card'), btn('🏁 Finalizar','redirect_success')]
];

每顆按鈕都連到 cmd.php?uid=<受害者編號>&cmd=<動作>。這裡有個細節:那是 Telegram 的「打開網址」按鈕,所以歹徒一按,是歹徒自己的瀏覽器去打 cmd.php。他每下一個指令,都會在那台伺服器的存取紀錄裡留下自己的位址。這件事從外面完全看不到,只有那台伺服器的主人看得到。

操作者按哪一顆,你的瀏覽器 3 秒內就會跳到對應的畫面。

下面這張截圖不用交出卡號也拿得到:那些指令要把人帶到哪一頁,就寫在同一段 JS 程式碼裡,直接請求那些網址就看得到;只有「卡號無效」不換頁,是直接在原頁跳出錯誤訊息。

他按下「簡訊驗證碼」,你的螢幕就跳出一格欄位,等你回填手機剛收到的那組數字。

假的簡訊驗證頁 受害者看到的:一個等你填簡訊驗證碼的欄位。操作者只需要按一顆按鈕。

按「卡號無效」,畫面說卡號打錯、請你重填,更陰險的是「3D 驗證」(刷卡時銀行另外跟你確認身分的那道手續):你看到的畫面是「請到您的銀行 App 確認這筆交易」。這一步沒有偷走任何東西。它的用途是讓你在自己的銀行 App 裡,親手批准歹徒同時送出的那筆扣款,而你以為自己批准的是海關費。

這一整套只為了一件事:他拿你的卡去刷,同一時間把銀行的每一道確認從你手上騙過來。銀行的檢查沒有任何一道被破解或被拿掉,每一道都照常執行、也都通過了,因為你本人就在線上,在它問的那一秒把答案交出去。簡訊驗證碼和 3D 驗證防的是盜刷的人不在現場,這套工具做的就是把你拉到現場。

按下按鈕的是誰

那個 Telegram 機器人的憑證(bot token)就明寫在網頁原始碼裡(7362…),等於帳號密碼攤在每個訪客眼前。這不是非如此不可:這個站本來就有一支自己的 api.php 在收卡號,發 Telegram 那一步大可一起在伺服器端做掉、把憑證藏起來。它會出現在你的瀏覽器裡,純粹是因為開發者懶。

任何看得到原始碼的人,都能拿它去問這個機器人都在跟誰講話,所以我問了。整段查證只用 getMegetUpdates 這兩個只讀不寫的功能:沒有送出任何指令,沒有碰過 cmd.php(那會操控某個真實受害者的瀏覽器),也沒有在這個站送出過任何一筆資料。

機器人叫「KING DE L’ATLAS」,法文的「阿特拉斯之王」。它待在兩個 Telegram 群組裡:一個叫「4-72 #1」,收的是「有人打開網站了」這種即時通知;另一個叫「COLOMBIE」(法文的哥倫比亞),偷到的卡就貼在那裡。

但 Telegram 不會把機器人自己送出去的訊息回傳給我,我只看得到被操作者引用回覆的那幾則:6 張完整的卡,加一組當場被攔下來的簡訊驗證碼。確定至少有 6 筆,無法推斷他總共騙到多少人。

這 6 張卡都通過卡號本身的 Luhn 校驗規則,開頭幾碼落在哥倫比亞發卡行配到的號段。這些信用卡資料我加密後單獨交給 colCERT(哥倫比亞國家資安應變中心),由他們轉給發卡行。能停卡、能把款項退回來的只有發卡行,那一步從來不在我手上。

從訊息看出群裡至少有兩個帳號在對話,用的是法語,其中一個帳號的名稱是「馬格里布」方言的詞彙,機器人叫「阿特拉斯」之王,與北非的山脈同名。這些加起來指向法語圈的馬格里布,但那只是語言和命名的線索,不等於國籍或位置。這套工具的程式碼註解同樣是法文,跟群裡一致,所以就這個案子看,寫工具的和按按鈕的很可能是同一群人。

他們的帳號、對話、彼此怎麼稱呼,查的時候都看得到,我沒有寫進來。基礎設施我會點名,對應到具體的人的帳號我不點:一來看到不等於證明,萬一那是盜來的帳號就冤枉了;二來這篇要檢討的是這套機制,貼帳號只會把焦點拉到抓人。

這只是 #1

那個群組的名字「4-72 #1」帶著一個編號。很少人會把唯一的東西叫做一號。

順著查下去,paquetes-colombia.blog 不是孤例。有一個 7 月就註冊的網域 envio-colombia.blog,用的是一模一樣的工具,連查件頁那個預先填好的假單號 CO587294163 都一字不差。

而且我直接對它的頁面做了指紋比對:它把偷到的卡號用同一隻 Telegram 機器人送去同個群組。卡號送出的同時,這套工具還會拿前六碼去一個第三方服務反查發卡行和卡種,一起附在給歹徒的訊息裡,而兩個站用的是同一把金鑰。所以這兩個站不只是拿同一套工具,後端根本是同一個:前台換個名字,卡號進的是同一個群組。

envio-colombia.blog 到 8/18(二)清晨還活著,還躲在同一道驗證牆後面。它跟 paquetes 是同一批通報送出去的:註冊局和註冊商在 8/16(日)上午的追報裡就收到它(初報只列了 paquetes,一個半小時後我把整個叢集補上去),流量中介、瀏覽器封鎖清單和威脅情資平台是 8/17(一)補送的。

我做了什麼

這條連結被自動處理掉之後,我把它整理成一份完整情資,8/16(日)發出初始通報,8/17(一)補齊其餘各層,一共往三個方向送。兩天下來,回應最快的是中間層;最該動的名字那一層繞了一大圈才動,而且動它的不是我一開始敲的那扇門。

讓它被找得到。 兩個資安圈共用的威脅情資平台:盧森堡資安應變中心 CIRCL 營運的 MISP 情資社群,還有 abuse.ch 的 ThreatFox。這一步不會讓網站消失,是讓下一個撞到同一批基礎設施的人查得到。

讓它停掉。 上游每一層能動手的:流量中介 Cloudflare、賣網域的註冊商 NameSilo、管理整個 .blog 的註冊局、實際放著檔案的代管商,還有操作機器人用的 Telegram。

通知被影響的人。 被仿冒的 4-72,和哥倫比亞的國家資安應變中心 colCERT。前面那 6 張卡就是走這條路加密交出去的,由他們轉給發卡行去通知持卡人。

其中 Telegram 那一刀值得算清楚。停掉機器人不會讓這個網站停止蒐集卡號,卡號本來就同時寫進它自己伺服器上的 api.php。但會拆掉即時中繼那一半:歹徒收不到卡片送達的通知,就按不出那六顆按鈕。而因為我比對過的那兩個門面共用同一支機器人,這一刀不只砍在一個網站上。

最快的是 Cloudflare。8/16(日)上午九點我送出檢舉,中午前這個網域前面就多了一頁「Suspected Phishing」(疑似釣魚)的警告:下界是我最後一次看到它還沒處置的 11 點 06 分,上界是它回信自陳已處置的 11 點 24 分。不過那是警告不是阻擋,點頁面上的「Ignore & Proceed」照樣進得到釣魚頁。代管商那一層也是 Cloudflare 幫我找到的:我檢舉之後收到的回信,指出網站實際落腳在一家叫 VIRTUO 的業者。這一層是唯一不受那道驗證牆影響的,因為它不從外面抓頁面,檔案就在它自己的網路裡。理論上它是最有效的一刀,實際上我 8/16(日)中午就寄了,到現在沒有任何回覆。

名字那一層我同時走了三條路。.blog 註冊局回信說已經轉交適當的註冊商處理,也就是它自己不出手;註冊商 NameSilo 的 abuse 信箱回信說不收 email 通報,要我改走它的網頁表單;NetBeacon,一個專門幫通報者把案子送到能行動一方的中介,轉出來的結果是一張 Cloudflare 的案件單,沒換到任何註冊商回應。

有用的只有第三條。8/17(一)下午三點半,我把同一份證據填進那張表單。當天下午四點五十三,網域還活著、RDAP 上沒有任何處置標記;隔天清晨再查,client holdserver holdpending delete 三個狀態都上了,名稱伺服器被拔掉,網域從 DNS 上消失。NameSilo 隨後回信說它當天就把網域停用了。同一批消失的還有同日註冊的兄弟站 post-colombia.blog

同一份證據、同一個註冊商,走 email 換來一封「請改用表單」,走表單換來整域刪除。差別不在證據,在收件的那道門。而 envio-colombia.blog 到現在還在。有個對得上但我沒有證據的巧合:被刪掉的兩個都是 8/15 註冊、當時還在新註冊的寬限期內,那段期間註冊商刪掉網域可以全額退費;envio 是 7 月初註冊的,早就出了那個窗口。

真正不透明的是掃描器那一側。VirusTotal 上把這個網域標成惡意的那幾家引擎,我無從知道它們的判定跟我送出去的任何一條通路有沒有關係:CRDF 的說明文件明寫它不揭露判定的來源,其餘幾家連這種等級的說明都沒有。送了十一條通路,卻沒有一條能讓我確認那些判定是不是自己換來的。

照例誠實聲明:這是一個案例,不是統計。我能看進這個機器人這一側,純粹是因為這次的對手把金鑰寫在網頁裡;換一個把憑證藏在自己後端的對手,這篇就只剩前半段。歸因的部分只是關聯,不是證據。通報的彙總數字在 tg.pe 的透明度報告裡。

一套能即時操控受害者的釣魚機制,加上一個看得見的收贓群,聽起來很唬人,但它賺的還是那筆海關費,和你之後那張卡。攔住它最有效的一步還是老話:收到「包裹卡關、補繳小額費用」的訊息,別點連結,自己開官網或 App 查單號。

那個 3D 驗證的畫面值得多記一句。銀行 App 跳出「請確認這筆交易」的時候,先看它寫的金額和商家對不對得上你剛剛在做的事,對不上就不要按。卡號已經送出去的話,剩下的動作大家都知道:停卡,然後把最近幾筆帳看過一遍。


附錄:tg.pe 怎麼檢查每一條連結

每一條提交進來的連結,上線前後都會經過這些關卡:

  • 建立前:先比對自家的封鎖與高風險網域名單;查詢網域的註冊年齡,太新的預設先不信任;再比對 Google Safe Browsing 的威脅資料庫。
  • 建立後:背景跑 VirusTotal 掃描,多個引擎判定惡意就自動限制連結;可疑的目的地會自動留存證據(截圖與轉址鏈)。
  • 常態:abuse@tg.pe 接收外部通報,由我人工分流;確認惡意的目的地會往上通報給能處置的單位,就像這篇做的一樣。

這些機制的設計、數字與還做不到的部分,同樣都在上面那份透明度報告裡。


上一次的結局比這次乾脆:一個註冊 75 分鐘就被拿去縮網址的釣魚網域,傍晚就被 .top 註冊局從 DNS 上移除。那一天的完整紀錄在〈有人拿我的短網址釣魚,那個網域活不到 8 小時〉。


本文作者 Sean Wei,經營 tg.pe。想要本案的完整指標與各層通報時間軸,或你也在跑短網址服務、想知道這套篩選管線怎麼落地,歡迎來信 security@tg.pe。

本名韋詠祥,習慣用英文 Sean 暱稱。
自國中開始接觸程式,至今善於組合各種技巧,用來解決生活周遭的問題。
以資安競賽、網路治理、個人專案為興趣。

Read More

ICANN75 - 吉隆坡之旅

Read Previous

有人拿我的短網址釣魚,那個網域活不到 8 小時