攻擊行動定在週六凌晨兩點——網路流量最低、系統管理員警覺性最差的時段。林昊選擇這個時間不僅僅是為了降低被發現的風險,更是經過了精密的計算:香港和柬埔寨有一個小時的時差,週六凌晨的香港,那些高薪聘請的安全工程師應該正在蘭桂坊喝酒或者在家裡睡覺。
林昊和阿俊在網咖後面的密室裡做最後的準備。三台顯示器上分別運行著不同的工具——Nmap端口掃描器正在對目標服務器進行最後一輪探測,Metasploit框架已經載入了預先選定的漏洞利用模組,一個自製的Python腳本則在後台持續監控著目標服務器的回應時間變化。空氣中彌漫著緊張的氣氛,兩個人誰都沒有說話,只有鍵盤敲擊的聲音和散熱風扇的嗡嗡聲。牆上的時鐘指針在緩慢移動,每一次滴答聲都像是在倒數。
「目標服務器位於香港的數據中心,」阿俊指著其中一台顯示器上的拓撲圖說,他的聲音壓得很低,像是在教堂裡說話,「實體位置在葵涌,由香港最大的託管服務商運營。它的外層防火牆是Palo Alto Networks的PA-5250,配置了最新的威脅防護簽名。中間層還有一台F5的應用層防火牆,最後才是服務器本身的iptables規則。」
「三層防禦。」林昊低聲說,眉頭微微皺起,「這不是一般企業的配置水準。這說明陳金龍在那台服務器上放的東西,比他自己的命還重要。」
「所以我才說需要你的幫助。」阿俊說,語氣中帶著一絲無奈,「我的技術能力只能到達第二層,第三層的防禦我完全沒有頭緒。我試過好幾次,每一次都在第三層被擋下來,而且差點被反追蹤到。有一次我幾乎就要突破iptables了,結果觸發了服務器上的fail2ban機制,我的跳板IP被封鎖了整整七十二小時。陳金龍的系統管理員顯然是業界頂尖的高手。」
林昊沒有回答。他的目光鎖定在螢幕上滾動的Nmap掃描結果上。目標服務器開放了五個端口:22(SSH)、80(HTTP)、443(HTTPS)、8080(HTTP代理)和一個非標準的2443端口。他注意到2443端口運行的服務指紋與標準的HTTPS有所不同——證書的加密演算法採用了不常見的Curve25519橢圓曲線,這是一個不尋常的選擇,通常只有在高度客製化的系統中才會使用這種加密演算法。更令他在意的是,這個端口的服務器名稱字段回傳的不是常見的Apache或Nginx,而是一串看似隨機的字符串——「KHRvL0NuP1RhdGU=」,Base64解碼後是「Kht/LnP1RhdGU=」,仍然是一串無意義的字符。這顯然是經過了自訂的混淆處理。
「這個2443端口,」林昊說,手指指向螢幕上那個異常的端口,「是你離開之後才開的嗎?」
阿俊湊過來看了看,推了推眼鏡,「對。我以前從來沒見過這個端口。我離開的時候,服務器只開了80、443和22三個端口。這個端口是在我離職後大約兩個月才出現的,我在監控日誌中看到過它的存在,但一直無法確定它的用途。」
林昊的嘴角浮現一絲笑意。這是一個老牌安全工程師的笑容——發現對手的破綻時的那種自信。「這就是突破口。這個端口運行著一個客製化的Web服務,使用的加密庫不是OpenSSL的標準版本。而這意味著——」他快速鍵入幾行指令,終端機上出現了一系列的掃描結果,「它可能存在開發者忽略的安全性問題。客製化往往意味著漏洞。開發者在編寫自己的加密實現時,幾乎總是會犯錯誤,因為加密是一門極其精密的學問,任何微小的偏差都可能導致整個系統的崩潰。」
他啟動了模糊測試工具,向2443端口發送了一系列畸形請求。前幾十個請求都被正常拒絕了,服務器返回標準的403錯誤。但當他發送了一個經過特殊構造的HTTP頭部時,服務器的回應時間突然增加了三秒。這三秒鐘的延遲,像是溺水者冒出的最後一個氣泡,暴露了它的位置。林昊立刻捕捉到了這個異常——這不是正常的錯誤處理行為。正常的服務器在拒絕請求時應該在毫秒級別內回應,而三秒的延遲意味著服務器在處理這個特定請求時發生了某種內部錯誤,可能是緩衝區溢出或者記憶體訪問異常。
「它在處理這個請求時崩潰了。」林昊說,手指在鍵盤上飛舞,速度之快讓阿俊幾乎看不清楚他的操作,「崩潰後自動重啟時,記憶體中的某些數據沒有被完全清除。這就是所謂的記憶體殘留漏洞。」他利用這個窗口期,成功發送了一個精心構造的Payload,讀取了一段服務器的記憶體轉儲。轉儲文件中有大量的二進制數據,密密麻麻的十六進制代碼在螢幕上快速滾動,但在這些看似混亂的數據中,他找到了一個明文的API金鑰。金鑰的格式是標準的UUID v4格式——「7c3a8f91-2b4d-4e6f-8a1c-9d0e2f3b4a5c」——這意味著這個金鑰是系統自動生成的,而不是人工設定的,說明開發者可能直接使用了框架的預設配置。
「有了這個金鑰,我們就能繞過應用層防火牆。」林昊說,他的聲音平靜但帶著一絲興奮,「準備好了嗎?」
阿俊深吸一口氣,點了點頭。他的額頭上滲出了細密的汗珠,手指在膝蓋上輕輕顫抖。
攻擊開始。
林昊的手指在鍵盤上以驚人的速度移動,一行行命令在終端機視窗中快速閃過。他利用API金鑰偽裝成合法的管理請求,穿過了F5應用層防火牆。防火牆沒有任何警報——在它看來,這只是一個正常的API調用,來自於一個經過授權的客戶端。然後利用Metasploit中的一個針對Apache Struts的漏洞,在服務器上建立了一個低權限的shell。Apache Struts的漏洞CVE-2017-5638是業界知名的OGNL注入漏洞,雖然已經被發現多年,但仍有大量系統因為沒有及時更新而暴露在風險之中。陳金龍的系統管理員雖然在防火牆上下足了功夫,卻忽略了應用層框架的安全性更新。
「進去了。」林昊低聲說,額頭上滲出了汗珠。他沒有時間慶祝——真正的挑戰才剛剛開始。他現在擁有的只是一個低權限的shell,無法訪問系統的核心目錄。他需要進行權限提升,才能讀取到那些被保護的關鍵文件。
他們需要在不受注意的情況下找到並複製那台服務器上的關鍵數據。林昊開始在服務器的檔案系統中搜索——他尋找的是資料庫備份文件、加密通訊記錄、以及任何與犯罪網絡相關的文檔。檔案系統的結構非常複雜,目錄層層嵌套,文件名全部使用隨機字符串,顯然是經過了精心的混淆。有些目錄甚至被隱藏在系統文件夾中,比如「/var/log/accounting/」下面的一個子目錄「.hidden_audit」,如果不是因為文件名前面多了一個點,他幾乎錯過了它。
時間一分一秒地過去。服務器的訪問日誌每五分鐘輪換一次——如果他們不能在這個時間窗口內完成操作,日誌就會被上傳到一個中央日誌服務器,他們的入侵行為就會暴露。林昊的螢幕上有一個倒數計時器,紅色的數字正在一秒一秒地減少,像是一個定時炸彈在不停地倒數。三百秒、兩百九十九秒、兩百九十八秒——時間在飛快地流逝。
「找到了。」林昊輕聲說。他在一個隱藏的目錄中發現了一個名為「dragon_data」的加密容器。容器的大小超過了200GB——裡面很可能是整個犯罪網絡的核心資料。但加密容器的密碼不是簡單的字符串——它需要一個硬體金鑰才能解密,而那個金鑰被存放在陳金龍辦公室的一個雙層保險箱中。容器使用的是LUKS加密格式,採用了AES-256-XTS加密算法,理論上在現有的計算能力下幾乎不可能暴力破解。
「該死。」阿俊罵了一聲,拳頭重重地砸在桌面上,鍵盤被震得跳了起來,「我們費了這麼大的功夫,卻卡在最後一關。」
但林昊並沒有表現出失望。他打開了另一個終端視窗,啟動了一個他自己編寫的工具——一個能夠利用CPU側信道漏洞提取記憶體中敏感數據的工具。這個工具利用的是Intel處理器中一個已知的Meltdown漏洞變種,雖然Linux內核已經修補了大部分已知的Meltdown攻擊向量,但在這台服務器上運行的CentOS 7系統仍然使用著未修補的舊版本內核。工具的效率不高,但在伺服器等級的硬體上,它有可能在有限的時間內提取出足夠的資訊來重建金鑰。
工具開始運行。CPU使用率飆升到了百分之九十五,散熱風扇的聲音變得急促,像是飛機引擎起飛時的轟鳴,在深夜的密室中格外刺耳。林昊看著螢幕上緩慢增加的進度條,心中默數著秒數。每過一秒,被發現的風險就增加一分。他在心中祈禱著——不是祈禱工具能成功,而是祈禱香港的系統管理員今天確實放假了。
百分之十……百分之二十……百分之三十五……進度條以蝸牛般的速度爬行。林昊能感覺到自己的心跳在加速,汗水順著他的鬢角流下。
就在進度條達到百分之四十七的時候,服務器的訪問日誌輪換計時器歸零了。
「時間到。」林昊說。他的心跳幾乎停止了。
但就在這時,他注意到了一件奇怪的事情——服務器的系統管理員似乎沒有檢查最新的日誌。日誌輪換完成了,但沒有任何警報觸發,沒有任何管理員連線進來。服務器一片寂靜。他甚至能聽到散熱風扇的聲音在空蕩蕩的機房中迴盪。
「今天是週六,」阿俊突然說,他的聲音中帶著難以置信的驚喜,「香港的系統管理員……可能放假了。」
林昊幾乎想笑出聲來。在所有複雜的技術防禦面前,最致命的弱點竟然是——人性。那些花費數百萬美元打造的防火牆和入侵檢測系統,那些經過精心配置的iptables規則和F5應用層防火牆,最終敗給了一個週末休假的系統管理員。這個世界上最高級的防禦系統,往往在最簡單的人為疏忽面前不堪一擊。
他繼續運行金鑰提取工具。在百分之七十八的時候,工具成功拼湊出了完整的硬體金鑰。金鑰的字串出現在螢幕上——一串三十二位的十六進制數字,在黑暗中閃爍著綠色的螢光。他深吸一口氣,將金鑰輸入了解密界面。加密容器被打開了,發出一聲輕微的系統提示音,像是打開了一個巨大的寶庫的門扉。裡面是數千份文件——財務報表、通訊記錄、合約文件、甚至包括了與政府官員的秘密協議。每一份文件都是一個定時炸彈,足以摧毀陳金龍的整個犯罪帝國。
林昊迅速開始複製這些文件,他的手指在鍵盤上跳動,將數據流導向多個不同的目的地。他知道,這些數據不僅僅是證據——它們是數千名受害者的希望,是正義得以伸張的基石。密室中的空氣彷彿凝固了,只有硬碟讀寫的聲音和文件傳輸的進度條在無聲地訴說著一個時代的終結。
當加密容器完全打開的那一刻,林昊看到了讓人窒息的數據量。文件按照年份和類別整齊地排列著,從2018年到2024年,每一年的資料都佔據了單獨的文件夾。他快速瀏覽了文件結構——財務記錄佔了最大部分,包括數百個Excel報表,每一行都是數十萬美元的非法交易。通訊記錄則按照聯絡人分類,從柬埔寨的地方官員到泰國的犯罪集團頭目,名單之長讓人心驚。
他注意到一個名為「特殊項目」的文件夾,密碼保護級別最高。林昊用提取到的金鑰嘗試解密,成功打開後發現裡面是一些加密的通話錄音檔。他隨機播放了一個——錄音中傳來了陳金龍和一個陌生男人的對話,兩人在討論如何處理一個「不聽話」的合作夥伴。對話的內容冷靜得可怕,彷彿他們在討論的不過是一個商業決策,而不是一個人的生死。
林昊關閉了錄音,繼續複製文件。他使用的壓縮算法和加密協議讓傳輸速度保持在最高水平,但200GB的數據仍然需要接近一個小時才能完整傳輸。他設置了一個自動中斷機制——如果在傳輸過程中檢測到任何異常的登入行為,腳本會自動中斷連線並清除所有暫時文件。
時間在寂靜中流逝。阿俊在一旁緊張地盯著監控螢幕,確保沒有警報觸發。凌晨三點四十七分,所有的文件傳輸完成。林昊檢查了每一個備份目標的完整性——新加坡的節點收到了百分之百的數據,荷蘭的節點正常,日本、德國和冰島的備份也都完整無誤。他這才關閉了與服務器的連線,清理了所有登入日誌和暫存文件。
「完成了。」林昊說,聲音因為疲憊而沙啞。
阿俊癱倒在椅子上,長長地吐了一口氣。他的表情中夾雜著解脫和不敢相信——他們真的做到了。