摘要:震網病毒主要是通過改變離心機的轉速,來破壞離心機,并影響生產的濃縮鈾質量,
本文分享自華為云社區《【安全技術】震網(Stuxnet)病毒深度決議:首個攻擊真實世界基礎設施的病毒(1)【原創分析】》,作者:云存盤開發者支持團隊 ,
第一章 震網病毒背景【源自網路】
2006年,伊朗重啟核計劃,在納坦茲建立核工廠,安裝大量離心機生產濃縮鈾,2010年1月,聯合國負責核查伊朗核設施的國際原子能機構(IAEA)發現納坦茲核工廠出現問題,原本預期使用壽命10年的IR-1型離心機大規模故障,但是誰都說不清楚到底是什么原因導致的,
伊朗納坦茲核工廠
2010年6月,白俄羅斯一家小型反病毒公司VirusBlockAda的技術負責人舍基·烏爾森(Sergey Ulasen),在分析伊朗計劃上上的惡意檔案時,發現該惡意檔案例外復雜,不僅有效利用了"內核極"后門來躲過反病毒引擎的掃描,還利用了多個"零日漏洞"(zero-day) 來突破Windows系統,但是由于力不從心,沒有完全破譯該惡意代碼,2010年7月12日,烏爾森將該發現發布在一個英文安全論壇上,
舍基·烏爾森(SergeyUlasen)
全球安全業界開始對這個病毒進行分析和破譯,同時,微軟將該病毒命名為:震網(Stuxnet),通過分析發現,該病毒的隱蔽性、先進性和復雜性遠遠超過人們的想象,
據國外一些報道稱,該病毒是由美國和以色列的程式員共同撰寫,其中攻擊的西門子工控系統的技術規范由德國提供,西門子工控系統被廣泛應用于伊朗核設施中,在以色列的迪莫諾,構建了西門子控制器和IR-1型離心機的試驗系統,對該病毒進行了測驗,英國政府也參與了試驗,試驗完成后,荷蘭情報人員作為離心機的技術咨詢工程師,將病毒植入到核設施中,
震網病毒主要是通過改變離心機的轉速,來破壞離心機,并影響生產的濃縮鈾質量,
離心機被故障
震網病毒原本的設計是定向攻擊,作為網路武器來使用,算是APT攻擊的鼻祖,之所以被發現,是因為開發震網病毒的程式員在編程的時候,錯誤的將and和or用錯,導致病毒可以感染任何版本的Windows系統,最終在2010年6月被捕獲,
第二章 震網病毒逆向深入分析【個人原創分析,非授權請勿轉載】
震網病毒結構與運行流程
震網病毒主要包含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,讓離心機例外作業,導致離心機快速故障,
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服務器,
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)程序,
- 然后把payload .dll注入到services.exe中并且呼叫#32(感染可移動存盤設備和啟動RPC服務);
- 把payload .dll注入到Step7的行程:S7tgtopx.exe中并且呼叫#2(用于感染Step7工程檔案),為使這一步成功,Stuxnet可能需要殺掉explorer.exe和S7tgtopx.exe行程,如果他們在運行中的話,
Stuxnet的通過上述的兩種payload .dll注入和創建的服務及驅動檔案運行起來,
Stuxnet將等待一段短暫時間后才試圖連接RPC服務(#32開啟的),將呼叫0號函式檢查連接是否成功并且呼叫9號函式接收一些資料存盤到oem6c.pnf中,
至此,所有默認的傳播方式和攻擊載荷已經被激活,
Stuxnet攻擊西門子PLC流程
攻擊PLC程序:
- 惡意DLL將s7otbxdx.dll重命名為s7otbxsx.dll,用定制的DLL替代s7otbxdx.dll,該定制DLL主要重寫s7otbxsx.dll 109個中的16個涉及讀、寫和列舉代碼塊的匯出函式,其他匯出函式還是由s7otbxdx.dll提供;
- 震網根據不同目標系統的特征選擇不同的代碼來感染PLC,一個感染的序列包含注入到PLC中的代碼塊和資料塊,來改變PLC行為,主要有三種感染序列,其中兩種比較相似,功能相同,標記為序列A和B,另外一種標記為序列C;
- 如果s7otbxdx.dll是運行在ccrtsloader.exe檔案中,替換后的s7otbxdx.dll啟動兩個執行緒感染特定的PLC:
執行緒1:(每15分鐘運行一次;感染含有特定SDB特征的6ES7-315-2 PLC)
- 通過s7ag_read檢測PLC型別,必須為6ES7-315-2;
- 檢測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頻率轉換驅動器,) - 按照序列A或B進行感染:
? 拷貝DP_RECV塊到FC1869,然后用定制的塊替換DP_RECV塊;(DP_RECV是網路協處理器使用的標準代碼塊的名稱,用來接收Profibus上的網路幀,每次接收包時,定制塊會呼叫FC1869中原始的DP_RECV進行處理,然后對包資料進行一些后處理,)
? 將一些定制塊寫入到PLC(20個);
? 感染OB1,使每個周期開始先執行惡意代碼;(首先增加原始塊的大小;然后將定制代碼寫入到塊的開頭;最后將原始的OB1代碼插入到定制代碼后面,)
? 感染OB35;(和OB1相同,采用code-prepending感染技術)
執行緒2:(每5分鐘查詢一次;保證攻擊同時進行)
- 監控、查詢總線上的每個特定PLC(如S7-315)中被執行緒1成功注入的資料塊DB890;
- 當達到特定條件,啟動破壞例程時,該執行緒向所有監控的PLC中的DB890寫入資料,使同一總線上的PLC同時發起破壞攻擊,
(4) 某些條件下,會將序列C寫入PLC,針對6ES7-417,更為復雜;
(5) 破壞:(在不同時間降低或增加馬達頻率)
- 確定正常的操作頻率:807-1210Hz;
- 將頻率設定為1410Hz;
- 恢復正常操作;
- 大約27天后,先將頻率設為2Hz,然后設為1064Hz;
- 恢復正常操作;
重復上述程序,
第三章 震網病毒重現
【篇幅原因,請關注后續文章】
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/542105.html
標籤:其他
下一篇:如何做研發效能提升
