這次不是Mirai的變種:針對新型Botnet Torii的分析
概述
2018年是Mirai和QBot變種不斷湧現的一年。任何一個指令碼小子,都可以對Mirai原始碼稍作修改,給它起上一個新名稱,然後將其作為新的殭屍網路釋出。
在過去的一週裡,我們一直在監測一個新型的惡意軟體,我們稱之為Torii。與Mirai和其他目前已知的殭屍網路不同,它使用了一些比較高階的技術。
與絕大多數IoT殭屍網路不同,這一新型的殭屍網路在成功入侵裝置之後,會增強其隱蔽性和永續性。它不會像一般的殭屍網路那樣,攻擊網路中的其他裝置,也不會挖掘加密貨幣。相反,它具有一系列非常全面的功能,可以用於洩露敏感資訊。其具有的模組化架構,能使用多層加密通訊,獲取命令或可執行檔案並執行。
此外,Torii可以感染多種架構的裝置,並具有良好的相容性,包括MIPS、ARM、x86、x64、PowerPC、SuperH等,是目前為止我們所見過的兼容範圍最廣的惡意軟體。
由於我們在持續監測這種威脅,根據監測結果,我們發現其自2017年12月以來就開始活動,甚至活動時間可能更早。
最後,我們對 ofollow,noindex" target="_blank">@VessOnSecurity 的研究成果表示感謝,他在Twitter上發表了一篇關於該樣本的分析,他是從自己的蜜罐上獲取到的這一樣本。
根據這位安全研究人員的說法,這一殭屍網路從Tor出口節點對他的蜜罐進行了Telnet攻擊,因此我們決定將這個殭屍網路命名為Torii。
在本文中,我們重點說明迄今為止對這一殭屍網路的瞭解,分析其傳播過程、各個階段以及一些重要特徵。
目前,針對該殭屍網路的分析仍在進行中,如果有更進一步的調查結果,我們也會及時更新。
接下來,讓我們從感染向量開始。
對初始Shell指令碼的分析
在感染鏈的開始階段,首先針對目標裝置的弱口令進行Telnet攻擊,然後執行初始Shell指令碼。這一指令碼與IoT惡意軟體所經常使用的指令碼完全不同,因為它更為複雜。
指令碼首先嚐試檢測目標裝置的體系結構,然後嘗試下載相應的Payload。Torii支援的體系結構非常多,包括基於x86_64、x86、ARM、MIPS、Motorola 68k、SuperH、PPC的裝置,支援多種位寬和位元組順序。這樣一來,Torii的感染範圍就非常廣泛,能夠在眾多常見的裝置上執行。
惡意軟體使用多個命令下載二進位制Payload,其執行的命令包括:wget、ftpget、ftp、busybox wget和busybox ftpget。它還同時使用多個命令,使其傳遞Payload的可能性達到最大。
如果無法使用wget或busybox wget命令通過HTTP協議下載二進位制檔案,那麼它將會採用FTP協議。使用FTP協議時,需要經過身份驗證。在指令碼中提供了身份驗證資訊:
使用者名稱:u=”<redacted>“
密碼:p=”<redacted>“
FTP埠:po=404
FTP/HTTP伺服器IP地址:104.237.218.85(在本文撰寫時,該IP地址仍然存在)
通過連線到FTP伺服器,惡意軟體能實現大量工作:
完整檔案請點選: https://cdn2.hubspot.net/hubfs/486579/torii_directory_structure.txt?t=1538013373318
在伺服器中,有來自NGINX和FTP伺服器的日誌、Payload樣本、將被感染裝置定向到惡意軟體所在主機的Bash指令碼等。我們將在本文的最後,討論從日誌中發現的內容。首先,先讓我們來分析一下在伺服器託管的指令碼。
第一階段Payload分析(Dropper)
在指令碼確定目標裝置的架構之後,就會從伺服器下載並執行對應的二進位制檔案。所有這些二進位制檔案都是ELF格式。在分析這些Payload時,我們發現它們都非常相似,並且僅僅是第二階段Payload的Dropper。值得注意的是,它們使用了多種方法使第二階段能在目標裝置上儘可能持久化。我們來深入瞭解其中的細節。
針對本文,我們分析的是x86的樣本,其SHA256雜湊值為:
0ff70de135cee727eca5780621ba05a6ce215ad4c759b3a096dd5ece1ac3d378
字串混淆
由於樣本經過混淆,我們首先需要嘗試對其進行反混淆。因此,我們深入研究了一些文字字串,以嘗試找到該惡意軟體的工作方式。第一和第二階段中的絕大多數文字字串都是通過簡單的XOR方式進行加密的,並且在執行時需要特定字串對它們進行解密。我們使用以下IDA Python指令碼進行解密:
sea = ScreenEA() max_size = 0xFF for i in range(0x00, max_size): b = Byte(sea+i) decoded_byte = (b ^ (0xFEBCEADE >> 8 * (i % 4))) & 0xFF; PatchByte(sea+i,decoded_byte) if b == 0x00 or decoded_byte == 0x00: break e.g. F1 9A CE 91BD C5 CF 9B B2 8C 93 9B A6 8F BC 00 → ‘/proc/self/exe’
安裝第二階段ELF檔案
第一階段的核心功能是安裝另一個ELF檔案,也就是第二階段的可執行檔案,它包含在第一階段的ELF檔案中。
該檔案將會安裝在一個偽隨機的位置,這個位置是通過組合預先定義好的列表中的內容來生成的,目錄列表如下:
"/usr/bin" "/usr/lib" $HOME_PATH "/system/xbin" "/dev" $LOCATION_OF_1ST_STAGE "/var/tmp" "/tmp"
檔名列表如下:
“setenvi“ “bridged“ “swapper“ “natd“ “lftpd“ “initenv“ “unix_upstart“ “mntctrd“
通過上面的兩個列表,就能生成目標檔案的路徑。
確保第二階段持久化
然後,Dropper需要確保能夠執行第二階段Payload,並會保證其持久化。該惡意軟體的獨特之處在於它實現持久化的方式非常強大,至少採用了6種方法來確保檔案能夠保留在裝置上,並且持續執行。惡意軟體不是從6種方法中選擇一種,而是全部都會執行:
(1)通過向~.bashrc中注入程式碼,實現自動執行;
(2)通過向crontab中新增“ @reboot ”子句,實現自動執行;
(3)通過systemd自動執行“System Daemon”服務,實現自動執行;
(4)通過/etc/init和PATH實現自動執行,將自身偽裝成“System Daemon”服務;
(5)通過修改SELinux策略管理,實現自動執行;
(6)通過/etc/inittab實現自動執行。
完成後,它會投放自身內部的ELF,也就是第二階段的Payload。
第二階段Payload分析(Bot)
第二階段Payload是一個完整的Bot,能夠從其C&C伺服器執行命令。在Payload中還包含起其他功能,例如簡單的反除錯技術、資料洩露、多層通訊加密等。
此外,第二階段中發現的許多功能都與第一階段Payload相同,這樣看來很可能二者都是由同一作者建立的。
針對所有版本,第一階段Payload中的程式碼幾乎是相同的。然而我們在第二階段中發現,不同硬體架構的二進位制檔案之間存在差異。為了能夠對大多數版本中的核心功能進行分析,我們選取了x86架構版本的Payload,其SHA256雜湊值為:
5c74bd2e20ef97e39e3c027f130c62f0cfdd6f6e008250b3c5c35ff9647f2abe
反分析方法
該惡意軟體所使用的反分析方法,不如我們在Windows或移動端惡意軟體中看到的方法那麼先進,但惡意軟體作者仍在持續改進這一部分。
(1)在執行後,將會執行60秒的sleep()函式,可能會繞過簡單的沙箱;
(2)通過prctl(PR_SET_NAME)呼叫,將程序名隨機化為“[[a-z]{12,17}]”(正則表示式),以避免通過程序名稱黑名單檢測到該惡意軟體;
(3)通過從可執行檔案中刪除符號,加大分析的難度。
當我們首次從惡意伺服器104[.]237.218[.]85下載樣本時,所下載的樣本都包含符號,這樣使得分析過程更為建安。但有趣的是,在幾天之後,我們下載的版本中已經不包含符號。除此之外,這兩個版本之間沒有任何差異。這樣一來,我們能夠判斷,惡意軟體作者還在持續改進惡意軟體,以保護可執行檔案難以被分析。
C&C伺服器
如前文所述,這個元件是一個與C&C伺服器通訊的Bot。我們使用此前發現用於XOR的密碼,對C&C地址再次執行XOR操作,發現似乎每個版本的Torii都包含3個C&C地址。我們所分析的惡意軟體,會嘗試從以下C&C伺服器獲取命令:
top[.]haletteompson[.]com cloud[.]tillywirtz[.]com trade[.]andrewabendroth[.]com
它嘗試與列表中的第一個域名進行通訊,如果失敗將會轉到下一個域名。此外,如果出現失敗的情況,它還會嘗試通過Google的DNS 8.8.8.8進行域名解析。
自2018年9月15日以來,這三個域名都解析到同一個IP 66[.]85.157[.]90。此外,在同一個IP上託管的其他一些域名也非常可疑:
cloud[.]tillywirtz[.]com dushe[.]cc editor[.]akotae[.]com press[.]eonhep[.]com web[.]reeglais[.]com psoriasiafreelife[.]win q3x1u[.]psoriasiafreelife[.]win server[.]blurayburnersoftware[.]com top[.]haletteompson[.]com trade[.]andrewabendroth[.]com www[.]bubo[.]cc www[.]dushe[.]cc
在同一個IP地址,託管了這麼多看起來很奇怪的域名,這一點非常可疑。另外,在此之前,C&C域名是解析到另一個不同的IP地址(184[.]95.48[.]12)。
通過更深入的挖掘,我們還發現了另一組屬於Torii的ELF樣本,其中包括3個不同的C&C地址:
press[.]eonhep[.]com editor[.]akotae[.]com web[.]reeglais[.]com
它們在此前都解析到相同的IP地址(184[.]95.48[.]12)。並且,press[.]eonhep[.]com自2017年12月8日就開始解析到這一地址。因此,我們認為該惡意軟體至少自2017年12月就開始存在,或者可能存在的時間更長。
C&C通訊
第二階段通過TCP協議443埠,與這些C&C伺服器以及其他加密層進行通訊。有趣的是,它使用443埠來迷惑分析人員,因為443是HTTPS埠,而這一惡意軟體實際上並沒有使用TLS協議進行通訊。針對每條訊息(包括回覆的內容),都會生成一個我們稱之為“訊息信封”的結構,每個信封都經過AES-128加密,並且其中包含一個MD5校驗和,以確保其中的內容沒有被修改或損壞。此外,每個信封都包含一條訊息流,其中每條訊息都通過簡單的XOR方法進行加密,這與混淆字串的加密方式不同。它看起來沒有那麼強大,因為通訊中包含了解密的金鑰。
Torii在連線到C&C伺服器時,還會發出以下隱私資訊:
(1)主機名;
(2)程序ID;
(3)第二階段可執行檔案的路徑;
(4)在/sys/class/net/%interface_name%/address中找到的所有MAC地址及其雜湊值,這部分內容形成了被感染使用者的獨有ID,允許惡意軟體作者更容易地進行指紋識別和裝置標記,這些內容也會同時儲存在本地,其檔名諸如:
GfmVZfJKWnCheFxEVAzvAMiZZGjfFoumtiJtntFkiJTmoSsLtSIvEtufBgkgugUOogJebQojzhYNaqyVKJqRcnWDtJlNPIdeOMKP、VFgKRiHQQcLhUZfvuRUqPKCtcrjmhtKcYQorAWhqAuZuWfQqymGnWiiZAsljnyNlocePAOHaKHvGoNXMZfByomZqEMbtkOEzQkQq、XAgHrWKSKyJktzLCMcEqYqfoeUBtgodeOjLgfvArTLeOkPSyRxqrpvFWRhRYvVcLeNtMKTdgFhwrypsRoIiDeObVxTTuOVfSkzgx等;
(5)uname()呼叫後獲得的詳細資訊,包括sysname、version、release和machine;
(6)特定命令的輸出結果,目的是獲取目標裝置相關的更多資訊。
特定命令如下:
id 2>/dev/null uname -a 2>/dev/null whoami 2>/dev/null cat /proc/cpuinfo 2>/dev/null cat /proc/meminfo 2>/dev/null cat /proc/version 2>/dev/null cat /proc/partitions 2>/dev/null cat /etc/*release /etc/issue2>/dev/null
C&C命令
在分析程式碼的過程中,我們發現Bot元件正在與C&C進行通訊,並且會在無限迴圈中不斷輪詢,詢問C&C伺服器是否有任何命令需要執行。在收到命令後,它會回覆命令執行的結果。每個訊息信封中都包含一個特定值,用於指定其命令的型別,在回覆內容中也會附帶相同的值。目前,我們發現瞭如下命令型別:
(1)0xBB32:將檔案從C&C儲存到本地驅動器
接收:從C&C接收的檔案儲存到本地的位置、檔案、MD5校驗和
回覆:儲存檔案的檔案路徑、錯誤程式碼
(2)0xA16D:接收C&C輪詢的間隔時間
接收:DWORD與C&C通訊之間的暫停(Sleep)時間
回覆:程式碼為66的訊息
(3)0xAE35:在Shell直譯器中執行特定命令,並將輸出結果發回C&C
接收:在Shell中要執行的命令(sh -c “exec COMMAND”)、間隔時間(以秒為單位,最大為60)、帶有Shell直譯器路徑的字串(可選)
回覆:包含命令執行內容的輸出結果(stdoout+stderr)
(4)0xA863:將檔案從C&C儲存到特定路徑,並將其標誌更改為“rwxr-xr-x”使其可執行,然後執行
接收:從C&C接收的檔案儲存到本地的位置、檔案、MD5校驗和
回覆:儲存檔案的檔案路徑、執行該檔案後的返回程式碼
(5)0xE04B:檢查本地系統上是否存在特定檔案,並返回其大小
接收:要檢查的檔案路徑
回覆:檔案路徑、檔案大小
(6)0xF28C:從所選檔案F的偏移量O處讀取N個位元組,並將其傳送到C&C伺服器
接收:要讀取檔案(F)的檔案路徑、QWORD偏移量(O)、DWORD要讀取的位元組數(N)
回覆:檔案內容、偏移量、讀取的位元組大小、讀取內容的MD5校驗和
(7)0xDEB7:刪除指定的檔案
接收:要刪除的檔名
回覆:錯誤程式碼
(8)0xC221:從特定URL下載檔案
接收:儲存檔案的路徑、URL
回覆:儲存檔案的路徑、URL
(9)0xF76F:獲取新C&C伺服器地址,並開始與其進行通訊
接收:?、新域名、新埠號、?
回覆:?、新域名、新埠號、?
(10)0x5B77/0x73BF/0xEBF0(可能還有其他程式碼):在目標裝置上執行Ping或者獲取心跳包
接收:特定內容
回覆:重複收到的資訊
對二進位制檔案sm_packed_agent的分析
在我們對伺服器進行分析時,還發現了另一個有趣的二進位制檔案,我們設法從FTP伺服器杉獲取了名為“sm_packed_agent”的二進位制檔案。我們目前沒有在伺服器上發現這一二進位制檔案已經被使用的證據,但通過對其功能進行分析,發現它可以用於向目標裝置傳送任何遠端命令。該二進位制檔案中包含一個使用UPX加殼的GO語言應用程式,其中包含一些有趣的字串,表明它具有類似於副武器的功能:
使用的第三方庫
該二進位制檔案,使用了以下第三方庫:
https://github.com/shirou/gopsutil/host
https://github.com/shirou/gopsutil/cpu
https://github.com/shirou/gopsutil/mem
https://github.com/shirou/gopsutil/net
可能的原始碼名稱
其可能的原始碼名稱如下:
/go/src/Monitor_GO/agent/agent.go
/go/src/Monitor_GO/sm_agent.go
其中,可能有一些庫濫用了BSD許可證。顯然,Torii的作者並不關注侵權問題。
sm_agent的功能如下:
(1)在cmdline –p上使用一個帶有埠號的引數;
(2)初始化加密,載入TLS、金鑰和證書;
(3)建立伺服器,並監聽TLS連線;
(4)等待以BSON格式編碼的命令;
(5)使用命令處理程式,對命令進行處理:
1: Monitor_GO_agent__Agent_GetSystemInfo 2: Monitor_GO_agent__Agent_GetPerformanceMetrics 7: Monitor_GO_agent__Agent_ExecCmdWithTimeout
TLS加密、證書和金鑰:
(1)Agent使用ChaCha20-Poly1305流密碼進行TLS加密;
(2)同一目錄下的金鑰和證書;
(3)自簽名的授權證書ca.crt,簽名為Mayola Mednick;
(4)由ca.crt為Dorothea Gladding釋出的client.crt;
(5)由ca.crt為Graham Tudisco釋出的server.crt和server.key。
由於證書是自簽名的,所以使用的名稱也顯然是虛假的。
Start-agent.sh:
該指令碼將會首先終止任何先前啟動的sm_packed_agent例項,然後在TCP協議45709埠上執行sm_packed_agent,當出現執行失敗的情況會嘗試重新執行。
目前,還暫時不清楚Torii作者是如何使用的這項服務,但它非常通用,可以在裝置上執行幾乎任何命令。因為這應用程式是使用GO語言編寫的,所以可以非常容易地重新編譯,從而在幾乎任何架構上使用。考慮到該檔案是在惡意軟體分發的主機上執行,說明它很可能是後門,或者是用於組織多臺機器的服務。
惡意伺服器日誌分析
最後,我們分析了從Nginx伺服器和FTP伺服器(104[.]237.218[.]85)上發現的日誌。通過這些訪問日誌,我們可以推斷出Torii實際感染了多少客戶端,或者有多少客戶端試圖下載該惡意軟體。
在我們撰寫此文章時,Torii的作者已經禁用了FTP和Nginx日誌記錄,但是根據已有的日誌,我們可以生成一些簡單的統計資訊。
根據伺服器上面的日誌,在9月7日、8日、19日和20日,共有206個IP連線到伺服器。
Access-2018-09-07.log – 包含54個不同的IP地址 Access-2018-09-08.log - 包含20個不同的IP地址 Access-2018-09-19.log - 包含189個不同的IP地址 Access-2018-09-20.log - 包含10個不同的IP地址
其中,有一個IP地址38[.]124.61[.]111連線該伺服器的次數達到了1056393次。
通過檢視日誌,似乎有人使用了DirBuster-1.0-RC1,嘗試分析該伺服器的內部結構。事實上,DirBuster通常用於猜測Web伺服器的目錄和檔名,並且會生成大量請求。其實,這次掃描是完全沒有必要的,因為針對Torii這樣複雜的惡意軟體,有更加有效的方法。
通過掃描38[.]124.61[.]111的埠,我們可以發現有下面幾個埠是開啟的:
在27655埠上,有一個SSH Banner,其內容為:
SSH-2.0-OpenSSH_7.4p1 Raspbian-10+deb9u3
看上去,這個盒子正在執行Raspbian。
除此之外,我們還可以對FTP伺服器日誌進行分析。
分析發現,有幾個客戶端曾連線,並下載了一些沒有位於FTP伺服器上的檔案:
Sat Sep8 08:31:24 2018 1 128.199.109.115 6 /media/veracrypt1/nginx/md/zing.txt b _ o r md ftp 0 * c
根據我們分析的日誌內容,總共有592個不同的客戶端,在幾天時間之內從該伺服器下載檔案。需要提醒大家的是,一旦目標裝置收到Payload,就會停止連線到下載伺服器,轉為連線到C&C伺服器。因此,我們通過該日誌,就可以看到這些日誌記錄的時間段範圍內,有多少網路中的新裝置感染了這一惡意軟體。
此外,有8個客戶端同時使用了HTTP伺服器和FTP伺服器,這可能是由於HTTP方式下載失敗,或是Torii作者在測試Bash指令碼和伺服器的功能。
由於沒有證據,我們無法做出更多的推測。這臺伺服器可能只是眾多感染目標連線的伺服器之一,要揭示這個殭屍網路的真實規模,還需要進一步的調查。考慮到所分析的惡意軟體的複雜程度,我們認為它可能是為了控制大量不同型別的裝置而設計的。
結論
儘管我們的研究仍在繼續,但目前的結論已經表明,Torii是物聯網惡意軟體發展過程中的一個重要樣本,它的複雜程度已經高於我們此前看到的水平。一旦它感染了某個裝置,不僅會洩露裝置自身的一些敏感資訊,還會通過與C&C的通訊允許Torii作者執行任意程式碼或傳遞任何Payload。這樣一來,Torii就成為了一個可供今後持續使用的模組化平臺。此外,由於Payload自身不會掃描其他目標,因此它在網路上非常隱蔽。
我們還將持續進行研究,並及時披露新發現的成果。