第3章
第3章 蜜罐------------------------------------------,“天網”基地地下一層。,也更冷。空調係統將溫度恒定在18攝氏度,是為了服務器散熱。霍林穿著林靜給的軍大衣,還是覺得指尖發涼。,裡麵裝著剛剛組裝完成的蜜罐係統。二十台服務器組成集群,通過光纖連接成一個獨立的網絡。機櫃側麵貼著標簽:“蜜罐實驗區-絕密”。。每個人眼睛都佈滿血絲,但冇人說累。“網絡拓撲確認完畢。”一個年輕技術員報告,“所有節點單向連接,物理光閘已啟用。數據隻能從入口進,不能從出口出。”“模擬支付介麵部署完成。”另一個技術員說,“用了央行提供的測試環境鏡像,和真實係統相似度99.7%。”,螢幕顯示著蜜罐的實時狀態:一切正常,等待連接。“攻擊流量引流配置好了嗎?”他問。:“防火牆規則已經修改,將來自柬埔寨IP段的偽裝流量,百分之十引流到蜜罐。比例不能太高,否則容易被察覺。”“百分之十夠了。”霍林說,“我們要的是樣本,不是全部。”。機櫃裡的服務器風扇同時加速,發出低沉的嗡鳴。螢幕上,數據流開始出現——綠色的代表正常訪問,紅色的代表攻擊流量。很快,紅色線條越來越多,像血管一樣在網絡拓撲圖上蔓延。“流量進來了。”林靜盯著螢幕,“第一個連接……是偽裝成支付寶交易的數據包。”。表麵看,它完全符合支付寶的介麵規範:正確的商戶號、合法的數字簽名、標準的JSON格式。但他在交易金額欄位發現了一個異常——金額是“0.01元”,但小數點後跟了二十個零。“這是緩衝區溢位測試。”霍林說,“攻擊者在試探係統對超長數值的處理方式。如果係統冇有做長度檢查,這個數字可能會溢位,導致內存錯誤。”,然後繼續觀察。接下來的半小時,蜜罐收到了上百種不同的攻擊試探:SQL隱碼攻擊嘗試、檔案包含漏洞探測、會話固定攻擊、甚至還有嘗試上傳Webshell的請求。
每一種試探,都精準地瞄準支付係統可能存在的弱點。
“這不是隨機掃描。”霍林對林靜說,“攻擊者對目標係統非常瞭解。他們知道用的是Oracle數據庫,知道應用服務器是Tomcat,知道API介麵的版本號。這是有內鬼,還是……”
他想起在矽穀時聽說過的一種攻擊手法:供應鏈滲透。黑客不直接攻擊目標,而是攻擊為目標提供軟件或硬體的供應商,在產品出廠前就植入後門。
“查一下支付係統的供應商清單。”霍林說,“特彆是數據庫中間件和API網關的提供商。”
林靜立刻去查。霍林繼續分析蜜罐捕獲的數據。他發現了一個規律:所有攻擊試探,都在嘗試觸發同一個函數——交易日誌記錄函數。
為什麼是日誌記錄?霍林皺眉。日誌通常隻記錄資訊,不執行敏感操作。除非……
他打開蜜罐模擬的日誌記錄模塊代碼,一行行檢查。突然,他瞳孔一縮。
找到了。
在日誌寫入檔案的那段代碼裡,有一個不起眼的字串格式化函數:sprintf。這個函數如果使用不當,會導致格式化字串漏洞——攻擊者可以控製格式化字串的內容,從而讀寫任意內存地址。
而這段代碼的寫法,恰好是危險的:sprintf(log_buffer, user_input);
用戶輸入直接被用作格式化字串。
“漏洞在這裡。”霍林指著螢幕,“但不是後門,是開發人員無意中留下的bug。攻擊者發現了它,正在嘗試利用。”
“能修複嗎?”林靜問。
“能,但需要修改源代碼,重新編譯部署。”霍林說,“支付係統的開發商是哪家?”
“金盾軟件,國企。”林靜調出資料,“他們的總部就在北京,我們可以直接聯絡。”
“不。”霍林搖頭,“先彆打草驚蛇。如果攻擊者已經知道這個漏洞,我們一修複,他們就會察覺蜜罐的存在。我們要利用這個漏洞,反過來追蹤他們。”
他有了一個大膽的想法。
“修改蜜罐的日誌記錄模塊。”霍林說,“保留漏洞,但在漏洞觸發時,不執行攻擊者期望的操作,而是執行我們預設的代碼——比如,在返回給攻擊者的數據包裡,隱藏一個追蹤信標。”
“追蹤信標?”林靜冇聽懂。
“一種隱蔽的標記。”霍林解釋,“在HTTP響應頭裡加一個特殊的Cookie,或者修改某個圖片檔案的畫素值,或者嵌入一段隻有特定設備能接收的超聲波信號。攻擊者的工具收到這些標記後,會在後續通訊中無意間攜帶它們,我們就可以反向追蹤。”
技術員們麵麵相覷。這個思路太刁鑽,也太冒險。
“如果被識破呢?”一個技術員問。
“所以我們不能用常見的追蹤手段。”霍林說,“要用他們想不到的。”
他想起在矽穀時參與的一個實驗項目:基於CPU微架構差異的設備指紋識彆。每台電腦的CPU,由於製造工藝的微小差異,在執行相同指令時,會有納秒級的時間差。這種差異就像人的指紋一樣,獨一無二。
如果能在蜜罐的響應中,嵌入一段精心設計的計算任務,讓攻擊者的電腦去執行,然後通過計算耗時反推CPU特征……
“給我兩個小時。”霍林說,“我寫一個腳本。”
他回到辦公室,關上門。窗外模擬的夜景已經切換到淩晨模式——深藍色的天空,幾顆星星,遠處有隱約的燈光。
霍林打開自己的加密筆記本電腦,連接基地的研髮網絡。他的手指在鍵盤上飛舞,代碼像流水一樣從指尖傾瀉而出。
這不是普通的編程,這是藝術。他要在幾十行代碼裡,實現一個完整的CPU特征提取演算法,還要把它偽裝成正常的網頁JavaScript,讓攻擊者的瀏覽器自動執行。
難點在於隱蔽性。代碼不能太大,否則會被安全軟件檢測;不能有明顯特征,否則會被攻擊者的人工審查發現;還要能在各種瀏覽器、各種操作係統上穩定運行。
他寫了一個小時,測試了三次,都失敗了。要麼代碼被瀏覽器攔截,要麼提取的特征不夠精確。
第四次嘗試時,他換了個思路。不直接測量CPU時間,而是測量內存訪問延遲。現代CPU都有多級緩存,訪問不同層級緩存的速度差異很大。通過設計特定的內存訪問模式,可以探測出緩存的大小和結構,這也是重要的設備特征。
這次成功了。代碼隻有5KB,看起來就像普通的頁麵統計腳本。但它在運行時,會悄悄執行一個緩存探測序列,然後將結果編碼成一個32位的雜湊值,隱藏在後續請求的Referer欄位裡。
霍林把代碼上傳到蜜罐服務器,配置好觸發條件:隻有當攻擊者嘗試利用日誌漏洞時,纔會返回這段特殊代碼。
“準備好了。”他在內部通訊裡說,“可以放開流量限製了。”
林靜將引流比例從10%提高到30%。更多的攻擊流量湧入蜜罐,螢幕上的紅色線條幾乎連成一片。
等待是煎熬的。霍林盯著蜜罐的訪問日誌,看著一條條記錄重新整理。大部分攻擊試探都失敗了——蜜罐模擬的係統雖然保留漏洞,但也做了安全限製,不會真的被攻破。
直到淩晨四點十七分。
一條特殊的請求出現了。它精準地利用了sprintf漏洞,傳入的格式化字串經過精心構造,試圖覆蓋內存中的函數指針,從而執行任意代碼。
蜜罐“中招”了——當然,是假裝中招。它返回了一個看似正常的錯誤頁麵,但頁麵裡隱藏著霍林寫的追蹤腳本。
攻擊者的工具收到了這個頁麵,解析,執行。五秒鐘後,蜜罐的日誌裡出現了一條新的記錄:來自同一個IP的後續請求,Referer欄位裡多了一串奇怪的編碼——c3ab8a137e1038d9a9a1f8c5e6b7a2d1。
“抓到了!”霍林幾乎從椅子上跳起來。
他解碼那串雜湊,得到了一組CPU緩存參數:L1緩存32KB,L2緩存256KB,L3緩存8MB。這是英特爾酷睿i7-9700K處理器的典型配置。
“攻擊者用的是一台搭載i7-9700K的電腦。”霍林說,“而且從請求間隔時間看,那台電腦在境外,延遲大約200毫秒。”
“能定位嗎?”林靜問。
“暫時不能,但有了這個指紋,隻要那台電腦再次出現,我們就能認出來。”霍林說,“而且,攻擊工具顯然有自動化功能,它會儲存會話狀態,包括我們植入的Cookie。下次它攻擊其他目標時,我們可能還能看到它。”
天快亮了。窗外模擬的天空漸漸泛白,基地裡的燈光自動調暗,切換到日間模式。
霍林靠在椅背上,長長地撥出一口氣。連續工作了十八個小時,他的大腦已經超負荷運轉,太陽穴一跳一跳地疼。但他心裡有一種久違的興奮——那是解出一道難題、打贏一場戰鬥的興奮。
辦公室門被推開,李處長端著早餐進來:豆漿、油條、茶葉蛋。
“聽說有進展?”他把早餐放在桌上。
霍林彙報了追蹤信標的成果。李處長聽完,沉默了一會兒。
“你比我想象的還要厲害。”他說,“但記住,這隻是開始。‘棱鏡’不是一般的黑客組織,他們背後有國家級的支援。你今天挫敗了他們一次試探,明天他們就會換一種方式。”
“我知道。”霍林咬了一口油條,酥脆,溫熱,“所以蜜罐要一直開著,而且要不斷升級。我們要讓他們以為漏洞還在,但實際上,每一個漏洞都是陷阱。”
“像捕獸夾。”李處長比喻。
“更像蜘蛛網。”霍林糾正,“靜靜地等,來了就粘住,然後順著線找到老巢。”
窗外,模擬的太陽完全升起來了,金色的光灑滿房間。基地裡,新一天的工作已經開始。主控大廳的螢幕上,全國網絡流量圖又開始活躍,早高峰即將到來。
霍林吃完早餐,洗了把臉,重新坐回電腦前。螢幕上,蜜罐的日誌還在實時重新整理。那條攜帶追蹤信標的IP,已經兩個小時冇有出現了。
但它一定會再來的。
就像獵人知道,受傷的野獸總會回巢。
霍林打開一個新的代碼檔案,開始編寫下一個陷阱。他的手指在鍵盤上敲擊,發出有節奏的聲響,像心跳,像鐘錶,像這個永不眠的基地裡,無數守護者共同的脈搏。
天亮了,戰鬥還在繼續。