作者: 啟明星辰ADLab
一、分析背景
2017年6月12日,安全廠商 ESET 公布一款針對電力變電站系統進行惡意攻擊的工控網絡攻擊武器 -win32/Industroyer (ESET命名), ESET 表示該攻擊武器可以直接控制斷路器,可導致變電站斷電。 Industroyer 惡意軟件目前支持四種工控協議:IEC 60870-5-101、IEC 60870-5-104、IEC 61850以及OLE for Process Control Data Access(簡稱OPC DA)。這些協議廣泛應用在電力調度、發電控制系統以及需要對電力進行控制行業,例如軌道交通、石油石化等重要基礎設施行業,尤其是 OPC 協議作為工控系統互通的通用接口更廣泛應用在各工控行業。可以看出,攻擊者對于工控系統尤其是電力系統相關的工控協議有著深厚的知識背景,并且具有目標工控環境下的各種工控設備,攻擊者需要這些設備來實現惡意代碼的編寫和測試工作。
與2015年襲擊烏克蘭電網最終導致2015年12月23日斷電的攻擊者使用的工具集(BlackEnergy、KillDisk、以及其他攻擊模塊)相比,這款惡意軟件的功能意義重大,它可以直接控制開關和斷路器,Industroyer?身后的黑客團隊無論從技術角度還是從對目標工控系統的研究深度都遠遠超過了2015年12月烏克蘭電網攻擊背后的黑客團隊。
ESET 公布該惡意軟件之前,曾經對 Dragos 公司做過相應通告,Dragos 根據通告的內容找到該惡意軟件的樣本并且通過他們對該批惡意軟件的編譯時間推測該惡意軟件曾被利用來攻擊烏克蘭的變電站導致2016年12月那次半個小時的烏克蘭停電事件。目前可以說 Industroyer 惡意軟件是繼 STUXNET、BLACKENERGY 2以及 HAVEX 之后第四款對針對工業控制系統進行攻擊的工控武器。啟明星辰ADLab根據 ESET 提供的HASH文件對這批樣本進行了分析驗證并在某些方面做了更加深入的分析。
二、Industroyer 惡意軟件簡要分析
Industroyer 惡意軟件是由一系列的攻擊模塊組成,根據目前所公開的信息及 ESET 得到的模塊就多達10多個。其中存在一個主后門模塊,它被用于連接C&C下載另外一批模塊執行,這些模塊分別為:實現 DLL Payload 模塊執行的加載器模塊、實現數據及痕跡清理的 haslo 模塊、實現IP端口掃描的 port 模塊以及實現西門子 SIPROTEC 設備 DoS 攻擊的 DoS 攻擊模塊。其中,DLL Payload 模塊包含實現 IEC 101 工控協議的 101.dll 模塊、實現 IEC 104 工控協議的 104.dll 模塊、實現 IEC 61850 協議的61850.dll/61850.exe 模塊以及實現 OPC DA 協議的 OPC.exe/OPCClientDemo.dll 模塊等。以下我們列出了可以收到的樣本及其功能。

值得注意的是,Main Backdoor 與 C&C 通信的時候是通過內網中的一臺主機作為跳板連接到 C&C 上實施命令控制的,ESET 發現該模塊是通過 Tor 網絡實現與 C&C 的交互。因此根據目前所掌握的信息我們繪制了該惡意軟件大致工作流程。

從惡意軟件的攻擊流程中我們可以推測該黑客可能的攻擊路徑:首先黑客可以通過電子郵件、辦公網系統、外來運維終端、U盤等途徑成功入侵一臺主機(如:內網的10.15.1.69),并且在該主機聯網時下載必要的模塊執行比如 Tor 網絡客戶端或者代理服務模塊等作為后續攻擊的回連跳板,黑客接下來以該主機為跳板對系統局域網絡進行探測掃描,當發現自己感興趣的目標(是否為104從站、OPC服務器或者操作站等)后對其實施攻擊,一旦攻擊成功,黑客就將這臺可以連接外網的主機 IP 配置為攻擊模塊 Main Backdoor 的代理IP,下發到該主機中,這臺主機是可以直接與 RTUs 或者 PLCs 進行通信的,并且可以做直接的控制。
三、詳細分析描述
1. Main Backdoor 模塊分析
該模塊主要用于實現與攻擊者 C&C 通信, 由于工控系統內部的控制主機可能處于無法連接外網的內部局域網絡中,所以黑客事先在進入被感染系統之前已經非常清楚該工控系統內部的網絡結構,在入侵的跳板主機上安裝了 Tor 客戶端以及代理服務(代理服務開啟3128端口接收數據進行轉發)。并且在進行內部網絡攻擊過程中,黑客將根據該跳板機的 IP 來定制化相應的 Main Backdoor 程序下發到目標機上運行。因此,可以說該模塊是在黑客攻擊過程中實時根據黑客當前所掌握的資源信息進行定制的。
該模塊的通信部分也是通過一個小時為單位的時間定制化任務來執行。也就是說,在黑客實時攻擊過程中也是有可能的通過這個定制化功能在指定的時間里與 C&C 通信,比如深夜時間。如下圖:

此外,該模塊會創建一個匿名的互斥體,并且會在路徑 %Common Documents% 的父目錄創建一個標識文件 imapi ,只有這個文件存在的情況下才會執行與 C&C 通信的任務。

Main Backdoor 模塊連接 C&C 是通過跳板機(10.15.1.69)來實現與 C&C 5.39.218.152 通信的,通信的端口為 443 端口,據 ESET 報告,與 C&C 通信的數據采用了 HTTPS 。

目前我們無法證實該情況,因為后門采用 443 端口通信但實際不為 HTTPS 的情況非常多。但是可以確定的是 Main Backdoor 與跳板機之間的通信是明文的。通信數據內容如下:

該后門收到控制命令數據后,會對數據做一定處理,最后創建一個線程來處理黑客端發來的控制請求。

其中,控制命令的前4個字節為命令 ID,接下來是單字節的控制命令,其值為 0-0xA 整形值,控制命令的控制命令參數位于第16個字節的偏移之后。控制命令分發以及處理功能代碼如下:

其中控制命令以及相應的功能說明如下表所示:

從控制功能上可以看出該后門模塊的主要任務是從C&C下載擴展模塊執行以及做遠程命令執行,并且提供了由賬戶憑證支持的權限控制。如果黑客獲取了管理員權限就可以將已安裝的后門升級到一個更高的權限版本,黑客可以選擇一個現有的、非關鍵的 Windows 服務,在注冊表中替換它的 ImagePath 鍵值為新后門的代碼路徑。
2. Launcher模塊分析
該模塊為 Main Backdoor 下載的眾多模塊之一,其實際上為黑客的進一步攻擊提供一個統一的攻擊接口,可以說是專門為運行 payload 模塊而設計的。該模塊在系統中以服務程序運行,運行時會創建一個定時器。定時器觸發時該模塊會創建新線程加載 hasio.dat 模塊并調用 hasio.dat 模塊的 Crash 函數(關于hasio.),并且執行 payload 模塊的 Crash 函數。通過啟動器模塊,惡意代碼可以在指定的時間根據命令行運行任意的 payload 。
該模塊接受3個參數,格式為:
%LAUNCHER%.exe? %WORKING_DIRECTORY% %PAYLOAD%.dll? %CONFIGURATION%.ini。
參數以及解釋如下:

當模塊啟動運行時會將 workdirectory 設置為當前目錄,然后加載 payload 模塊。需要注意的是,此時加載 Payload 模塊但是并沒有執行模塊的核心功能,這些功能實現在 Payload 模塊的導出函數 Crash() 中,所以通過該 Launcher 運行的 Payload 模塊都必須導出這么一個函數。

這個導出函數是通過定時器控制執行,定時器的觸發時間為2016年12月17日22點。

歷史上,烏克蘭電力系統遭受了兩次惡意網絡攻擊而引起的停電事故,其中一次便是2015年12月23號由惡意代碼 BlackEnergy 攻擊而導致大規模停電事故,第二次是在2016年12月17日遭受到未知惡意攻擊而導致30分鐘的停電事故。因而該惡意軟件極有可能是第二次烏克蘭停電事故的罪魁禍首。
3. 數據清除模塊:haslo 模塊分析
該模塊為該惡意軟件的數據擦除模塊,與 KillDisk.DLL 模塊具有類似的破壞性目的,它會刪除注冊表中服務對應的模塊路徑,并對磁盤上的文件進行改寫,該模塊對應的文件名為 haslo.dat 或 haslo.exe ,其中 haslo.dat 隨啟動器模塊執行,haslo.exe 可以作為單獨工具執行。當該模塊運行時會枚舉HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下的所有鍵,并設置該鍵的 ImagePath 為空,該操作會造成系統無法正常啟動。

清理完注冊表后,該模塊會開始擦除文件,首先該模塊枚舉驅動器從C盤到Z盤中包含指定擴展名的文件,對發現的文件進行改寫。其中會避免對 Windows 目錄文件的改寫。需要注意的是,在枚舉的過程中該組件跳過了子路徑中名稱包含 Windows 的文件。該組件用從新分配內存中獲得的隨機數據來重寫文件內容。為了達到徹底擦除數據使其無法恢復的目的,該組件會嘗試重寫兩次。第一次是當文件在驅動器盤中被發現,如果第一次沒有成功,該組件會嘗試第二次。但是在此之前,該惡意軟件會終止除了包含在關鍵系統列表中的所有進程。
該模塊需要擦除的文件類型有:

此外,該擦除模塊還存在一個白名單的進程列表,為了防止意外發生,其不會對這些進程進行強制關閉的操作。擦除模塊內置的白名單進程列表如下。

4. 104.dll 模塊分析
該模塊實現了 IEC-104 規約中定義的協議,首先該模塊讀取配置文件,并根據配置文件中的指令進行指定操作。由于該模塊主要實現了 IEC-104 的協議通信,所以有必要對 IEC-104 協議的格式和規約做一些背景介紹。
IEC-104 規約是廠站與調度主站間通訊的規約,以以太網為載體,采用平衡傳輸,TCP/IP 網絡通信端口號為2404。IEC-104 規約以 0x68 為啟動字符,緊接 APDU 長度和4個8位控制域,之后是用戶數據。
名稱解釋:
- APDU:應用規約數據單元
- APCI:應用規約控制信息
- ASDU:應用服務數據單元
啟動字符 0x68 定義了數據流中的起點,APDU 的長度域定義了 APDU 體的長度,它包括 APCI 的四個控制域八位位組和 ASDU ,控制域定義了保護報文不至丟失和重復傳送的控制信息、報文傳輸啟動/停止、以及傳輸連接的監視等控制信息。
IEC-104規約幀分為三種類型:
a)可計數的信息傳輸功能的幀,簡稱I幀或者I格式幀。 b)可計數的確認功能的幀,簡稱S幀或者S格式幀。 c)啟動、停止、測試功能的幀,簡稱U幀或者U格式幀。
I格式幀常常包含 APCI 和 ASDU 兩個部分,其控制域第一個八位組的比特1=0,I幀包含特定信息,類型和內容較多。

S格式的幀只有 APCI,其控制域第一個八位組的比特 1=1 并且比特 2=0 。用于確認接收到對方的幀,但本身沒有信息發送的情況。

U格式的幀也只有 APCI,其控制域第一個八位組的比特 1=1 并且比特 2=1 ,U幀僅有三種類型:啟動幀、測試幀、停止幀。

IEC 60870-5-3 描述了遠動系統傳輸幀中的基本應用數據單元,并定義了用于配套標準中的應用服務數據單元(ASDU)結構如圖:

應用服務數據單元(ASDU)由數據單元標識符和一個或多個信息對象組成。類型標識定義了后續信息對象的結構、類型和格式。可變結構限定詞定義了信息元素的數目和信息體地址類型,長度為一個字節。公共體地址即為 RTU 地址,長度2個字節,低位在前。
主站發送的類型標識列表:

從站返回信息幀的類型標識列表:

主站發送的傳輸原因:

從站發送的傳輸原因:

對該協議有一定了解后,我們繼續對該模塊做進一步分析。當該模塊的 Crash 函數被 Launcher 加載運行時,會將配置文件讀入到內存(配置文件由參數 Crash 參數指定)讀取到內存的配置參數。

下表是配置文件中各域解釋:

該模塊首先會讀取 stop_comm_service 域并判定其是否為1,如果為1,則結束
stop_comm_service_name 域所指定的進程。

執行完以上操作后,該模塊會根據 IEC-104 規約構造數據包向配置文件中指定的目標主機IP端口發送啟動幀。構造啟動幀數據包代碼如下:

該惡意模塊(主站)連接從站(RTUs),并構造啟動幀發送給從站(RTUs)。

惡意模塊(主站)發送U幀啟動幀:

從站(RTUs)會返回一個U幀確認幀:

當成功獲取到從站(RTUs)返回的確認幀后,該模塊會根據配置文件中 operation 域提供的操作方法操作RTU。
當前 operation 域支持三種方式,分別為range、sequence、shift。
range 模式即為攻擊者指定信息對象地址范圍,主站讀取配置文件中 range 域填充攻擊者指定的信息對象地址向從站發送單點遙控選擇信息,從站(RTUs)返回單點遙控確認信息,然后惡意模塊(主站)向從站(RTUs)發送單點遙控執行請求,根據返回的信息確認信息對象地址。當得到正確的信息對象地址后,該模塊會循環向從站發送單點遙控選擇及單點遙控確認請求。

構造單點遙控選擇數據包:

惡意模塊(主站)發送的數據為:
68(啟動符)0E(長度)00 00(發送序號)00 00(接收序號)2D(類型標示)01(可變結構限定詞)06 00(傳輸原因)00 00(公共地址即RTU地址)0A 00 00(信息體地址)81(遙控性質)
當前類型標識為0x2d傳輸原因為0x06表示主站發送單點遙控,其中遙控性質為0x81表示向從站發送單點遙控選擇
從站(RTUs)返回數據,
68(啟動符)0E(長度)00 00(發送序號)02 00(接收序號)2D(類型標示)01(可變結構限定詞)07 00(傳輸原因)01 00(公共地址即RTU地址)0A 00 00(信息體地址)81(遙控性質)
當前類型標識為0x2d傳輸原因為0x07標識從站發送單點確認
惡意模塊(主站)發送單點遙控執行合閘
68(啟動符)0E(長度)02 00(發送序號)02 00(接收序號)2D(類型標示)01(可變結構限定詞)06 00(傳輸原因)00 00(公共地址即RTU地址)0A 00 00(信息體地址)01(遙控性質)
注釋
遙控性質字段解釋:
bit7 為1表示選擇,等于0標識執行
bit1 bit0 為01表示合閘,為00表示分閘
bit65432 為1表示短脈沖,為2表示長脈沖,為3表示持續。

sequence 模式為當攻擊者知道從站的信息對象地址值時,根據配置文件中的攻擊指令,向從站(RTUs)循環發送單點遙控選擇及單點遙控執行請求。
shift 模式與 range 模式類似,首先會枚舉 range 域指定的信息對象地址范圍,完成后,會通過 shift 域生成新的信息對象地址范圍進行與 range 模式相同的操作。
當配置文件中的silence域為1時會開啟命令行輸出。
啟動幀與確認幀:

單點遙控選擇與確認:

單點遙控執行請求:

四、其他模塊功能說明
該惡意軟件在攻擊過程中可以下發任何可能的攻擊模塊,根據 ESET 的報告,我們將其他的攻擊模塊以及其核心功能歸納如下(以下內容根據ESET的報告編譯總結而成):
1. 101
這個 payload DLL 名為 101.dll ,以 IEC 101(即IEC 60870-5-101) 命名,這也是一種國際標準的用于監控和控制電力系統的協議。該協議常用于工業控制系統和遠程終端單元(RTUs)之間的通信。實際通信是通過串行連接傳輸的。
101 payload 組件在一定程度上實現了 IEC 101 標準中所描述的協議,并且能夠與 RTU 或者任何支持該協議的設備進行通信。一旦被執行,101 payload 組件解析存儲在 ini 文件中的配置信息,配置信息可能包含:進程名、Windows 設備名稱(通常是 COM 端口)、信息對象地址(IOA)的范圍、以及IOA指定范圍的開始和結束值。IOA 是一個數字,用于標識設備中一個特定的數據元素。
進程的名字被指定在配置文件中,該名字屬于運行在受害者機器上的應用程序。該應用程序通過串行連接和 RTU通信。101 payload 試圖終止指定的進程,并且開始使用 CreateFile、WriteFile 和 ReadFile 這些Windows API 函數和指定的設備通信。配置文件中的第一個 COM 口用于實際通信,另外兩個端口用于防止其他進程訪問。這樣,101 組件能夠接管和維護 RTU 設備的控制。
這個組件遍歷所有被定義的 IOA 范圍內的IOA。對于每一個IOA,構造兩個“選擇和執行”包,一個單命令(C_SC_NA_1)一個雙命令(C_DC_NA_1),并且將它們發送到RTU設備。組件的主要目標是改變單命令類型IOA的開/關狀態和雙命令類型的IOA的開/關狀態。具體來說,101 payload有三個階段:在第一階段,這個組件試圖將IOA切換到它們的Off狀態;第二階段試圖將IOA轉換為On;最后階段再將IOA狀態切換回Off。
2. 61850 模塊
與 101 和 104 payload 不同的是,61850 payload 是一個獨立的惡意工具。它包含一個名字為 61850.exe 的可執行文件和一個名字為 DLL 61850.dll 的動態鏈接庫。它們以 IEC 61850 標準來命名。該標準描述了用于實現變電站自動化系統保護、自動化測量、監控和控制的設備之間的多廠商通信協議。該協議非常復雜和健壯,而61850只是使用了該協議中一小部分來產生破壞性影響。
一旦被執行,61850 payload DLL 就會嘗試讀取配置文件,該配置文件路徑由啟動器組件提供。獨立版本默認從 fromi.ini 文件讀取它的配置文件。該配置文件包含一組設備的IP地址列表,這些設備通過IEC 61850描述的協議進行通信。
如果配置文件不存在,該組件枚舉所有的網絡適配器來確定它們的 TCP/IP 子網掩碼。然后,61850 payload枚舉每一個子網掩碼下所有可能的IP地址,接著嘗試連接每一 IP 地址的 102 端口。因此,該組件有能力在網絡中自動發現相關設備。
相反,如果配置文件存在,并包含目標IP地址,該組件會連接該IP地址的102端口。并且這些IP地址也是被自動發現的。
一旦該組件連接到目標主機,它就會使用面向連接的傳輸協議發送連接請求包,如果目標設備有效回應,61850使用制造消息規范(MMS)發送初始請求包。如果收到預期的回應,則繼續發送一個MMS名稱列表請求。因此該組件在虛擬制造設備(VMD)中編譯對象名稱列表。接下來,該組件枚舉了前面步驟中發現的對象,用每一對象名發送設備特定域對象列表請求,在一個特定域中枚舉命名變量。
之后,從 61850 payload 這些請求的響應數據中搜索 包含以下字符串組合的變量:
- CSW, CF, Pos, and Model
- CSW, ST, Pos, and stVal
- CSW, CO, Pos, Oper, but not $T
- CSW, CO, Pos, SBO, but not $T
字符串“CSW”是用于控制斷路器和開關的邏輯節點的名稱。
61850 payload為一些包含“Model“或”stVal“字符串的變量發送額外的MMS讀取請求。該組件還可以發出一個可以改變其狀態的MMS寫請求。
61850 payload產生一個日志文件,它的操作包含IP地址、MMS域、命名變量和目標節點的狀態(打開或關閉)。
3. OPC DA payload 組件
OPC DA payload 組件為 OPC 數據協議實現了客戶端。訪問規范 OPC(進程控制OLE)是一種基于微軟技術的軟件標準和規范。例如 OLE、COM和DCOM 。OPC 規范中的數據訪問(DA)部分允許基于客戶端-服務器模型的分布式組件之間的實時數據交換。該組件為獨立的惡意工具,包含 OPC.exeh 和一個 DLL 。該組件同時實現了 61850 和 OPC DA payload 功能。該DLL在PE的導出表中被命名為 OPCClientDemo.dll ,表面該組件的代碼可能是基于開源項目 OPC 客戶端。
一旦被攻擊者執行,OPC DA payload不需要任何配置文件。它會用 ICatInformation 枚舉所有的 OPC 服務器。接下來該組件使用 IOPCBrowseServerAddressSpace 接口來枚舉服務器上的所有 OPC 項目。特別是尋找包含下列字符串的項。
- ctlSelOn
- ctlOperOn
- ctlSelOff
- ctlOperOff
- \Pos and stVal
這些項目的名稱表明攻擊者對屬于 ABB 解決方案的 OPC 服務器提供的 OPC 項非常感興趣。攻擊者在添加新的OPC組時使用字符串 “Abdul”,可能這個字符串被攻擊者用作俚語,指的是 ABB 解決方案。
在最后一步,OPC DA payload 嘗試使用 IOPCSyncIO 接口,寫兩次 ox01 值來改變已發現 OPC 項的狀態。
該組件寫 OPC 服務器名稱、OPC 項狀態、質量碼和值到日志文件。日志值被下面的頭所分割:
- [*ServerName: %SERVERNAME%] [State: Before]
- [*ServerName: %SERVERNAME%] [State: After ON]
- [*ServerName: %SERVERNAME%] [State: After OFF]
4. 輔助后門組件
ESET 還發現另外一個具有后門功能的惡意組件,這個惡意組件提供了另一種持久性機制,允許攻擊者重新訪問目標網絡,以防主后門被檢測到/或禁用。這個后門是一個 Windows 記事本應用的木馬版本,它擁有記事本的完整功能。但是,惡意軟件的作者已經插入了惡意代碼,每次記事本啟動,惡意代碼都有被執行。一旦攻擊者獲得管理員權限,他們就會手動替換掉合法的記事本。
插入的惡意代碼被嚴重混淆,但是,一旦代碼解密,它連接到一個遠程 C&C 服務器(這個服務器不同于主后門所連接的),下載一個 payload ,這個 payload 是一個 shellcode 形式的惡意代碼,它直接被加載到內存執行。此外,插入的代碼解密存儲在文件末尾的原始 Windows 記事本,然后再執行該記事本,這樣記事本程序就像預期那樣工作。
5. 端口掃描器
攻擊者的武器庫包含一個端口掃描器,其可以被用來在網絡中找到攻擊相關的計算機。有趣的是,攻擊者并沒有使用外部軟件,而是使用自己編寫的端口掃描工具,攻擊者可以定義用于掃描工具掃描的一系列 IP 地址和端口。
6. DoS工具
攻擊者武器庫中的另一工具是拒絕服務(DoS)工具,可以用來對付西門子 SIPROTEC 設備,該工具利用了 CVE-2015-5374 漏洞,目標是使設備無法響應。一旦漏洞被成功利用,目標機器將會停止任何命令響應,直到手動重啟。
為了利用這個漏洞,攻擊者將設備 IP 地址硬編碼到該工具中。一旦工具被執行,就會使用 UDP 協議發送特定的精心設計的數據包到目標 IP 地址的 50000 端口。該 UDP 數據包包含18字節。
2.CRASHOVERRIDE Analysis of the Threat to Electric Grid Operations DRAGOS INC version 2.2017061
3.IEC870-05-104-傳輸規約-國電
啟明星辰積極防御實驗室(ADLab)
ADLab成立于1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員。截止目前,ADLab通過CVE發布Windows、Linux、Unix等操作系統安全或軟件漏洞近300個,持續保持亞洲領先并確立了其在國際網絡安全領域的核心地位。實驗室研究方向涵蓋操作系統與應用系統安全研究、移動智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、云安全研究。研究成果應用于產品核心技術研究、國家重點科技項目攻關、專業安全服務等。

本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/328/