MMD-0043-2015 - 多型型ELF惡意軟體:Linux/Xor.DDOS
0x01 背景
A share of knowledge I have,[email protected]
[email protected]於其它國產ELF DDos惡意軟體,Linux/XOR.DDoS更具威脅性,而且它仍在擴散中。最近我收到一個很好的問題(一個受到感染的研究人員問的):為什麼找到的惡意二進位制檔案跟首次執行的惡意二進位制檔案不一樣?非常好!這篇文章比較短,只包含這個問題的答案。但那些可能對緩解/檢測病毒的重要資訊和技術我會分享給NIX的小夥伴們,因此文章中還包含了我對ELF惡意軟體進行逆向,除錯和取證的三個過程。最後,請原諒我糟糕的措辭,因為我幾乎沒有時間去檢查和校驗這篇文章。
多型(Polymorphic)是指惡意軟體在自我繁殖期間不斷改變(“morphs”)其自身檔案特徵碼(大小、hash等等)的特點,衍生後的惡意軟體可能跟以前副本不一致。因此,這種能夠自我變種的惡意軟體很難使用基於簽名掃描的安全軟體進行識別和檢測。
多型型惡意軟體在Window中是一種很常見的病毒,但在Unix中這類惡意軟體可能還比較少聽說。本質上NIX的惡意軟體也是來自於網路,從感染檔案提取或透過其它惡意軟體下載。所以,我猜我們有許多預設雜湊樣本。但在這篇文章中,我們實際上是在處理一個像Windows上能夠自我複製感染的多型行為惡意軟體。所以我覺得值得寫一寫。
這篇報告是一個真實的感染事件,一個已知的gang/crook案例,我得以釋出如下的攻擊日誌:
上面的日誌是典型的Linux/ Xor.DDOS hostasa.org ssh暴力攻擊模式。不久之前我在這裡釋出過(同一個攻擊者)一個案例還有最近發生的一個案例。另外,我把這個惡意軟體上傳到了virustotal。
0x02 Polymorphic PoC
Linux/XOR.DDos執行的時候會尋找一個自我複製的地方,透過下面的系統呼叫可以看到它正在努力地寫檔案中:
open("/usr/bin/lgjgjmkkgd", O_WRONLY|O_CREAT, 0777) ; depends, in mine is -1 EACCES (Permission denied)
open("/bin/lgjgjmkkgd", O_WRONLY|O_CREAT, 0777) ; depends, in mine is -1 EACCES (Permission denied)
在一個良好的Linux系統中,如果惡意軟體不是透過root使用者執行的話你會看到上面的結果。這時,惡意軟體複製向它最喜歡的/tmp目錄當中:
open("/XOR.DDOS.SAMPLE", O_RDONLY) ; initial exec malware open itself
lseek(3, 0, SEEK_SET); ; set LSET to OFFSET to READ
open("/tmp/lgjgjmkkgd", O_WRONLY|O_CREAT, 0777); open self-copy target w/perm 777
read(3, "\177ELF\1\1\1\0\.."); ; read the malware bin
lseek(4, 0, SEEK_SET) ; set LSET to OFFSET to WRITE
14878 read(3, "\177ELF\1\1\1\0\… ; copy process read..
14878 write(4, "\177ELF\1\1\1\0\… ; copy process write
透過逆向ELF惡意軟體,以下的操作就是上述惡意軟體在尋找安裝目錄到執行整個過程(大圖點選這裡):
可以看到惡意軟體透過級聯的方式去尋找一個可以自我複製的地方,程式最開始從嘗試往/usr/bin目錄複製,然後嘗試往/bin目錄複製。在我的測試過程中,它最終選擇了/tmp/[randomname]。目標檔名是隨機的,然後透過返回的全路徑執行execve()。我們稍後再討論這個話題。
透過Linux記憶體取證工具可以比較清楚地看到複製blob資料的整個過程,使用hexdump這個老牌工具就行了:
Copy process illustration (read and write of copy process) in the end of file:
[...]
00098bd0 6d 65 00 5f 64 6c 5f 6d 61 70 5f 6f 62 6a 65 63 |me._dl_map_objec|
00098be0 74 5f 64 65 70 73 00 5f 6e 6c 5f 43 5f 4c 43 5f |t_deps._nl_C_LC_|
00098bf0 49 44 45 4e 54 49 46 49 43 41 54 49 4f 4e 00 5f |IDENTIFICATION._|
00098c00 64 6c 5f 6e 73 00 5f 6e 6c 5f 6c 6f 61 64 5f 6c |dl_ns._nl_load_l|
00098c10 6f 63 61 6c 65 5f 66 72 6f 6d 5f 61 72 63 68 69 |ocale_from_archi|
00098c20 76 65 00 77 63 74 72 61 6e 73 00 |ve.wctrans.|
00098c2b
debug的時候可以看到複製程式是優雅結束的:
read(3, "", 4096): ; EO/termination w/no space
close(3); ; end of copy (reading)
close(4); ; end of copy (writing)
上面並沒有什麼特別的操作,現在我們執行到這裡已經完成惡意軟體自我複製了,但是為什麼檔案會不同?我們繼續向下走,發現下文有一個系統呼叫在使用SEEK_END標誌:
open("/tmp/lgjgjmkkgd", O_WRONLY); ; opening the copied file
lseek(3, 0, SEEK_END) = 625707 <==size ; set LSET to the EOF for writing
; SEEK_END = *) ; note the size of original malware
它看起來是使得檔案偏移量指向了檔案結束處。下圖顯示了使用了SEEK_END標誌之後檔案偏移量的位置(*所指之處):
Illustration of the LSET set in the end of file..
00098bd0 6d 65 00 5f 64 6c 5f 6d 61 70 5f 6f 62 6a 65 63 |me._dl_map_objec|
00098be0 74 5f 64 65 70 73 00 5f 6e 6c 5f 43 5f 4c 43 5f |t_deps._nl_C_LC_|
00098bf0 49 44 45 4e 54 49 46 49 43 41 54 49 4f 4e 00 5f |IDENTIFICATION._|
00098c00 64 6c 5f 6e 73 00 5f 6e 6c 5f 6c 6f 61 64 5f 6c |dl_ns._nl_load_l|
00098c10 6f 63 61 6c 65 5f 66 72 6f 6d 5f 61 72 63 68 69 |ocale_from_archi|
00098c20 76 65 00 77 63 74 72 61 6e 73 00 *<==== |ve.wctrans.*) <==
00098c2b
繼續走,程式呼叫了timeoftheday(),然後向檔案結尾處寫入一個字串:
gettimeofday({1442479267, 397488}, NULL) ; for randomid() seed..
write(3, "wlpvpovdvi\0", 11) ; 'size is set to 11'
; write string "wlpvpovdvi\0"-
; in the LSET position (EOF)
下圖是檔案寫入前和寫入後的對比:
可以看到,檔案被多新增了11個位元組,這意味著會比自我複製之前的惡意軟體多出11個位元組。
下一步,程式呼叫close儲存並關閉檔案:
close(3) ; end of writing process..
接著,呼叫execve()函式建立一個shell command執行它:
execve("/tmp/lgjgjmkkgd", ..); ; main running process of XOR.DDOS in new PID
; with new size (& hash)
你可以在/proc看到它儲存的程式資料,相信我,這個操作不需要藉助任何Unix取證工具,因為Unix已經幫我們提供好這一切:
lgjgjmkkg 14881 MMD cwd DIR 8,6 4096 7209106 /TESTDIR
lgjgjmkkg 14881 MMD rtd DIR 8,1 4096 2 /
lgjgjmkkg 14881 MMD txt REG 8,1 "625718 <== NEW SIZE" 829 /tmp/lgjgjmkkgd
lgjgjmkkg 14881 MMD 0u CHR 1,3 0t0 1028 /dev/null
lgjgjmkkg 14881 MMD 1u CHR 1,3 0t0 1028 /dev/null
lgjgjmkkg 14881 MMD 2u CHR 1,3 0t0 1028 /dev/null
現在它擁有一個全新的PID,不是透過clone或fork/thread,而是執行在一個新的程式。另外還可以看到它比原檔案多了11個位元組:
下面是原始檔案和複製後的檔案的md5值:
$ md5sum XOR.DDOS.SAMPLE lgjgjmkkgd
"7642788b739c1ee1b6afeba9830959d3" XOR.DDOS.SAMPLE
"df50d096fb52c66b17aacf69f074c1c3" lgjgjmkkgd
$ ls -l XOR.DDOS.SAMPLE lgjgjmkkgd| awk '{print $5, $6, $7, $9}'
"625718" Sep 17 lgjgjmkkgd
"625707" Sep 17 XOR.DDOS.SAMPLE
它們有著不同的hash和大小。
ok,我們已經完成了除錯和取證,現在逆向工程來看一下這個ELF惡意軟體是如何完成上述的所有操作。
下面是我的惡意樣本一部分自我複製的過程。注意:自我複製級聯了幾種情況,我大概數了一下有至少四層級聯。惡意軟體的作者真的計算了所有可能性以確保他的程式碼能夠執行。
跳轉到0x804dfc2進行處理下個任務。
下面展示了惡意軟體在完成複製檔案之後修改檔案的過程。11個隨機字元沒有直接使用的,而是跟一個硬編碼在0x080cf120(str.Ff4VE.7)的字串做xor加密運算。
snprintf()函式結果最終被SYS_write系統呼叫所使用,在逆向靜態編譯的ELF惡意樣本的時候可以看到一些來自libc的函式,後面還可以看到很多呼叫libc的程式碼。
上面除錯中所看到的timeoftheday()正是被這裡的randomid()函式所呼叫的。
很明顯,這裡呼叫了timeoftheday()取得系統時間來作為randomid()函式的隨機種子。
這裡有一個驚訝的資訊是(我想這訊息對於社群很有幫助):Linux/XOR.DDoS ELF惡意軟體使用非常罕見的執行shell命令方法,它呼叫了LinuxExec_Argv()和LinuxExec_Argv2(),而這兩個函式都是直接使用系統呼叫(靜態編譯),這些函式一個典型的特點是:用起來非常簡單,而且容易找出哪些是負責呼叫execve()。下面展示了在解析完路徑之後使用execvp()函式進行感染。
關於execvp詳細資訊可以直接參考man(2),是的,Unix系統已經提供給我們最好的參考資料。
0x03 總結&參考
Linux/XOR.DDos在自我複製(成功感染)之後的檔案跟原檔案有不同的大小(多了11個位元組...另外,我只檢查了這一個樣本)和hash。這意味著對於那些使用hash掃描的安全軟體來說是無法掃描出變種後的Linux/XOR.DDos。
很多人認為,無所謂咯,ELF反正侵害不到我自己的電腦(Windows)。但是記住:目前IoT和路由器領域基本都是基於Linux系統,而ELF惡意軟體的感染方法越來越先進/完美(我們資料顯示有6個新的ELF惡意軟體僅半年就更新了兩個)。因此我們(MalwareMustDie)建議儘可能早點更新對這類惡意軟體的檢測質量。如果讓這些惡意軟體紮根在伺服器領域,那麼影響比感染PC機嚴重太多了。
下面是以前的Linux/XOR.DDos分析文章:
- http://blog.malwaremustdie.org/2015/07/mmd-0037-2015-bad-shellshock.html
- http://blog.malwaremustdie.org/2014/09/mmd-0028-2014-fuzzy-reversing-new-china.html
還有來自新的CNC威脅:
Will #USA be nice to clean: 192.126.126.64 & 107.160.40.9 < China crook's #malware #CNC? http://t.co/fTD0V57ySc pic.twitter.com/ZmabDO9aoP
— MalwareMustDie (@MalwareMustDie) September 15, 2015
順便說一下,CNC現在非常的活躍,下面是一些關於它們活動的截圖:
最後,希望這篇短文章能夠幫助到做安全的朋友。
相關文章
- 常見惡意軟體型別及危害2022-10-21型別
- linux ddos惡意軟體分析2020-08-19Linux
- 惡意軟體Linux/Mumblehard分析2020-08-19Linux
- 一款結合破殼(Shellshock)漏洞利用的Linux遠端控制惡意軟體Linux/XOR.DDoS 深入解析2020-08-19Linux
- 針對Linux和Windows使用者的新型多平臺惡意軟體2019-11-19LinuxWindows
- Zero Access惡意軟體分析2020-08-19
- 新型Windows惡意軟體正在針對Linux、macOS裝置2020-12-16WindowsLinuxMac
- 是防毒軟體”失職“還是惡意軟體太”狡猾“?惡意軟體可繞過Android防護系統2021-06-24防毒Android
- 惡意軟體PE檔案重建指南2020-08-19
- Adobe創意軟體和認證體系,賦能創新、創意型設計人才數字化轉型2023-02-23
- 後門惡意軟體通殺 Win、macOS、Linux 三大系統;Linux 惡意程式數量增長 35% | 思否週刊2022-01-28MacLinux
- 無法檢測到的Linux惡意軟體;惡意軟體團隊解散,10萬美元拍賣原始碼;美團疑取消支付寶支付2020-07-30Linux原始碼
- 動態惡意軟體分析工具介紹2020-11-08
- TrickBot和Emotet再奪惡意軟體之冠2020-11-21
- 【筆記】【THM】Malware Analysis(惡意軟體分析)2024-08-11筆記
- 惡意軟體開發-初級-Sektor 72024-07-03
- 惡意軟體Emotet 的新攻擊方法2022-03-01
- 惡意軟體開發——記憶體相關API2021-08-28記憶體API
- 從SharPersist思考惡意軟體持久化檢測2019-10-21持久化
- 最新 Mac 惡意軟體 OSX/CrescentCore 被發現2019-07-02Mac
- 隱藏在xml檔案中的惡意軟體2022-10-09XML
- Trickbot惡意軟體又又又升級了!2021-02-03
- D語言編譯器被多個防毒軟體誤報是惡意程式2018-11-02編譯防毒
- ANDROID勒索軟體黑產研究 ——惡意軟體一鍵生成器2018-03-24Android
- 研究人員新發現一種極為隱蔽的Linux惡意軟體2022-06-13Linux
- 多種資料庫型別管理軟體:DBeaverUltimate中文2023-11-01資料庫型別
- WAV音訊檔案中隱藏惡意軟體2019-10-17音訊
- Cuckoo惡意軟體自動化分析平臺搭建2020-08-19
- 2022年5大網路威脅惡意軟體2022-10-11
- 惡意軟體Siloscape可在Kubernetes叢集中植入後門2021-06-22
- 新惡意軟體可盜取Steam、Epic等多個遊戲平臺賬號2021-09-28遊戲
- 在 Linux 上安裝和使用惡意軟體檢測工具 LMD 及防毒引擎 ClamAV2018-10-22Linux防毒
- 多型體驗,和探索爺爺類指標的多型性2020-10-03多型指標
- 多型記憶體圖解2020-11-11多型記憶體圖解
- 微軟Azure雲服務被用於託管惡意軟體 可控制多達90臺電腦2019-06-03微軟
- 針對資訊竊取惡意軟體AZORult的分析2018-05-29
- Facebook季度安全報告:假冒ChatGPT的惡意軟體激增2023-05-04ChatGPT
- 阻止惡意軟體和網路攻擊的基本方式2023-04-23