天天看點

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

作者:華為雲開發者聯盟

本文分享自華為雲社群《【安全技術】震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒(1)【原創分析】-雲社群-華為雲》,作者:雲存儲開發者支援團隊 。

第一章震網病毒背景【源自網絡】

2006年,伊朗重新開機核計劃,在納坦茲建立核工廠,安裝大量離心機生産濃縮鈾。2010年1月,聯合國負責核查伊朗核設施的國際原子能機構(IAEA)發現納坦茲核工廠出現問題,原本預期使用壽命10年的IR-1型離心機大規模故障,但是誰都說不清楚到底是什麼原因導緻的。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

伊朗納坦茲核工廠伊朗納坦茲核工廠

2010年6月,白俄羅斯一家小型反病毒公司VirusBlockAda的技術負責人舍基·烏爾森(Sergey Ulasen),在分析伊朗計劃上上的惡意檔案時,發現該惡意檔案異常複雜,不僅有效利用了"核心極"後門來躲過反病毒引擎的掃描,還利用了多個"零日漏洞"(zero-day) 來突破Windows系統,但是由于力不從心,沒有完全破譯該惡意代碼。2010年7月12日,烏爾森将該發現釋出在一個英文安全論壇上。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

舍基·烏爾森(SergeyUlasen)

全球安全業界開始對這個病毒進行分析和破譯。同時,微軟将該病毒命名為:震網(Stuxnet)。通過分析發現,該病毒的隐蔽性、先進性和複雜性遠遠超過人們的想象。

據國外一些報道稱,該病毒是由美國和以色列的程式員共同編寫,其中攻擊的西門子工控系統的技術規範由德國提供,西門子工控系統被廣泛應用于伊朗核設施中。在以色列的迪莫諾,建構了西門子控制器和IR-1型離心機的試驗系統,對該病毒進行了測試,英國政府也參與了試驗,試驗完成後,荷蘭情報人員作為離心機的技術咨詢工程師,将病毒植入到核設施中。

震網病毒主要是通過改變離心機的轉速,來破壞離心機,并影響生産的濃縮鈾品質。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

離心機被故障

震網病毒原本的設計是定向攻擊,作為網絡武器來使用,算是APT攻擊的鼻祖。之是以被發現,是因為開發震網病毒的程式員在程式設計的時候,錯誤的将and和or用錯,導緻病毒可以感染任何版本的Windows系統,最終在2010年6月被捕獲。

第二章震網病毒逆向深入分析【個人原創分析,非授權請勿轉載】

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

震網病毒結構與運作流程

震網病毒主要包含6個檔案,4個快捷方式圖示檔案,利用LNK漏洞從U盤自動感染計算機,兩個tmp檔案,用于初始化和安裝震網病毒。

震網病毒共利用了7個漏洞,其中4個0 Day漏洞:

  • CVE-2008-4250(MS-08-067)-Windows Server Service NetPathCanonicalize()
  • CVE-2010-2772 WinCC default password
  • CVE-2012-3015 Step 7 Insecure Library Loading
  • CVE-2010-2568(MS-10-046)-Windows Shell LNK Vulnerability (O day)
  • CVE-2010-2743(MS-10-073)-Win32K.sys Local Privilege Escalation (O day)
  • CVE-2010-3888(MS-10-092) Task Scheduler vulnerability (O day)
  • CVE-2010-2729(MS-10-061)-Windows Print Spooler Service Remote Code Execution (O day)

震網病毒隐藏在U盤中,當U盤插入到計算機上時,利用LNK漏洞會自動感染Windows系統,感染執行後,通過Ring3 Hook Ntdll實作在記憶體中加載~WTR4141.tmp檔案,Ring3 Hook Kernel32、Ntdll實作*.tmp和*.lnk檔案隐藏。進而通過記憶體LoadLibrary加載~WTR4132.tmp檔案,提取出核心的Main.dll,在記憶體中加密、脫殼、加載Main.dll,初始化安裝震網病毒,注入程序、注冊服務,釋放資源檔案,最終震網病毒以服務運作。服務運作時,會攻擊西門子WinCC工控系統軟體,通過該軟體最終攻擊PLC,讓離心機異常工作,導緻離心機快速故障。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

Call#15初始化安裝Stuxnet

當Main.dll被加載的時候,導出表#15第一個被調用。#15主要負責檢查Stuxnet是否運作在一個合适的系統中,檢測目前系統是否已被感染,把目前程序權限提升到系統權限,檢測系統中安裝的防毒軟體版本,選擇把DLL注入到哪個程序中;把DLL注入到選擇的程序中,然後調用#16。

#15的第一個任務是檢查配置資料(configuration data)是否是最新的。配置資料可以被存儲到兩個位置。Stuxnet檢查最新的配置資料并且執行。然後Stuxnet檢查是否運作在一個32位的系統中,如果運作在64位系統中則退出,同時也檢查作業系統的版本,Stuxnet隻能運作在以下版本的作業系統中:

  • Win2K
  • WinXP
  • Windows 2003
  • Vista
  • Windows Server 2008
  • Windows 7
  • Windows Server 2008 R2

接着檢查目前程序是否具有Administrator權限,如果沒有則會利用0-day漏洞提升運作權限。如果目前作業系統是Windows Vista、Windows 7、Windows Server 2008 R2,則利用Task Scheduler Escalation of Privilege來提升權限;如果作業系統是Windows XP、Win2K則利用Windows Win32k.sys Local Privilege Escalation(MS10-073)漏洞提升權限。

如果代碼運作成功,如果利用win32k.sys漏洞,主DLL檔案作為一個新程序運作,如利用Task Scheduler,主dll運作在csrss.exe程序中。

Win32k.sys漏洞利用的代碼在資源檔案#250中,當導出表#15運作檢查都通過後,#16運作。#16是Stuxnet的主安裝程式。它檢查日期和作業系統的版本,解密、建立并安裝rootkit檔案和系統資料庫項;并把自己注入到services.exe中,以便感染移動儲存設備;把自己注入到Step7的程序中感染所有的Step7工程;建立全局互斥量(mutexes)用于不同元件之間的通信;連接配接RPC伺服器。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

Call#16安裝Stuxnet

#16首先檢查配置資料是否有效,然後檢查系統資料庫HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MS-DOS Emulation中的NTVDM TRACE值是否是19790509,如果是則退出。該項應該是是否允許感染的辨別。然後讀取配置資料中的日期(配置資料偏移0x8c處)和目前系統日期對比,如果目前日期比配置資料中的時間晚,則退出;配置資料中的日期是2012-6-24。

Stuxnet的各個元件之間的通信采用全局互斥信号量,當在Windows Xp中時調用SetSecurityDescriptorDacl建立這些互斥信号量;在Windows Vista、Windows 7和WindowsServer2008中調用SetSecurityDescriptorSacl建立,用此方法可以降低系統完整性檢測,保證代碼寫操作被拒絕。

然後Stuxnet建立3個加密的檔案,這些檔案來自.stub節。然後将他們儲存到磁盤。

Ø Stuxnet主要攻擊載荷檔案儲存為Oem7a.pnf;

Ø 一個90個位元組的資料被儲存到%SystemDrive%\inf\mdmeric3.PNF中;

Ø 配置資料被拷貝到%SystemDrive%\inf\mdmcpq3.PNF中;

Ø 一個日志檔案被拷貝到%SystemDrive%\inf\oem6C.PNF中;

接着Stuxnet檢查系統時間,確定它在2012年6月24号以前。然後通過讀取存并解密儲到硬碟中的版本資訊,來檢查自己和儲存到磁盤上的加密代碼是否是最新的。此功能是通過#6實作的。

版本檢查通過後,Stuxnet從資源檔案中(#201、#242)釋放、解碼并将内容寫2個檔案中:Mrxnet.sys和Mrxcls.sys;它們是兩個驅動檔案:一個用于Stuxnet的加載點(Load point),另一個用于隐藏磁盤中惡意檔案。并且這兩個檔案的時間和系統目錄中的其他檔案時間一緻,以免引起懷疑;然後建立系統資料庫項指向這兩個驅動檔案,将它們注冊為服務項,以便開機的時候就啟動這2個服務。一旦Stuxnet建立的這個Rootkit正确安裝後,會産生一些全局信号量,表明安裝成功。

Stuxnet接着采用另外的2個導入函數(exports)繼續完成安裝和感染(infection)過程。

(1)然後把payload .dll注入到services.exe中并且調用#32(感染可移動儲存設備和啟動RPC服務);

(2)把payload .dll注入到Step7的程序:S7tgtopx.exe中并且調用#2(用于感染Step7工程檔案),為使這一步成功,Stuxnet可能需要殺掉explorer.exe和S7tgtopx.exe程序,如果他們在運作中的話。

Stuxnet的通過上述的兩種payload .dll注入和建立的服務及驅動檔案運作起來。

Stuxnet将等待一段短暫時間後才試圖連接配接RPC服務(#32開啟的),将調用0号函數檢查連接配接是否成功并且調用9号函數接收一些資料存儲到oem6c.pnf中。

至此,所有預設的傳播方式和攻擊載荷已經被激活。

震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒

Stuxnet攻擊西門子PLC流程

攻擊PLC過程:

(1) 惡意DLL将s7otbxdx.dll重命名為s7otbxsx.dll,用定制的DLL替代s7otbxdx.dll,該定制DLL主要重寫s7otbxsx.dll 109個中的16個涉及讀、寫和枚舉代碼塊的導出函數,其他導出函數還是由s7otbxdx.dll提供;

(2) 震網根據不同目标系統的特征選擇不同的代碼來感染PLC,一個感染的序列包含注入到PLC中的代碼塊和資料塊,來改變PLC行為,主要有三種感染序列,其中兩種比較相似,功能相同,标記為序列A和B,另外一種标記為序列C;

(3) 如果s7otbxdx.dll是運作在ccrtsloader.exe檔案中,替換後的s7otbxdx.dll啟動兩個線程感染特定的PLC:

線程1:(每15分鐘運作一次;感染含有特定SDB特征的6ES7-315-2 PLC)

(a) 通過s7ag_read檢測PLC類型,必須為6ES7-315-2;

(b) 檢測SDB塊來确定PLC是否被感染以及選擇寫入哪個序列(A或B);

Ø 枚舉、解析SDB(系統資料塊),尋找一個偏移50h DWORD的地方等于0100CB2Ch的SDB;(說明使用的是Profibus communications processor module CP 342-5。)

Ø 在SDB中搜尋特定的值7050h和9500h,隻有當兩個值出現在總數大于等于33時才滿足感染要求;(7050h代表KFC750V3變頻驅動器,9500h代表Vacon NX頻率轉換驅動器。)

(c) 按照序列A或B進行感染:

Ø 拷貝DP_RECV塊到FC1869,然後用定制的塊替換DP_RECV塊;(DP_RECV是網絡協處理器使用的标準代碼塊的名稱,用來接收Profibus上的網絡幀。每次接收包時,定制塊會調用FC1869中原始的DP_RECV進行處理,然後對包資料進行一些後處理。)

Ø 将一些定制塊寫入到PLC(20個);

Ø 感染OB1,使每個周期開始先執行惡意代碼;(首先增加原始塊的大小;然後将定制代碼寫入到塊的開頭;最後将原始的OB1代碼插入到定制代碼後面。)

Ø 感染OB35;(和OB1相同,采用code-prepending感染技術)

線程2:(每5分鐘查詢一次;保證攻擊同時進行)

(a) 監控、查詢總線上的每個特定PLC(如S7-315)中被線程1成功注入的資料塊DB890;

(b) 當達到特定條件,啟動破壞例程時,該線程向所有監控的PLC中的DB890寫入資料,使同一總線上的PLC同時發起破壞攻擊。

(4) 某些條件下,會将序列C寫入PLC,針對6ES7-417,更為複雜;

(5) 破壞:(在不同時間降低或增加馬達頻率)

(a) 确定正常的操作頻率:807-1210Hz;

(b) 将頻率設定為1410Hz;

(c) 恢複正常操作;

(d) 大約27天後,先将頻率設為2Hz,然後設為1064Hz;

(e) 恢複正常操作;

重複上述過程。

第三章震網病毒重制

【篇幅原因,請關注後續文章】

點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀