采用獨(dú)特域名生成算法的Tofsee僵尸網(wǎng)絡(luò)
概述
瑞士政府計(jì)算機(jī)應(yīng)急響應(yīng)中心(GovCERT)近日發(fā)現(xiàn)了Tofsee僵尸網(wǎng)絡(luò)惡意軟件的新樣本,讓他們感到驚訝是,Tofsee的域名竟然是由算法隨機(jī)生成的,目前他們已經(jīng)恢復(fù)出了算法的細(xì)節(jié),并將未來(lái)12個(gè)月中可能出現(xiàn)的域名列入了黑名單。
內(nèi)容
今天,我們發(fā)現(xiàn)了一個(gè)有趣的惡意軟件樣本,我們確認(rèn)出這是Tofsee惡意軟件,它試圖在幾分鐘內(nèi)發(fā)送數(shù)百封垃圾郵件,然而,這并不是它出現(xiàn)在我們視線中的原因(我們每天分析數(shù)以千計(jì)的惡意軟件樣本,很多都有這樣的行為)。這個(gè)特定的樣本引起我們注意的原因是它所使用的域名查詢方法。它使用的域名似乎是用算法生成的,并且大約有一半域名是瑞士國(guó)家頂級(jí)域名(ccTLD)。
使用域名生成算法(DGAs)的惡意軟件是非常罕見的。
分析
我們分析的這個(gè)Tofsee樣本有一個(gè)非常新的時(shí)間戳:“2016年12月16日星期五,07:09:11”。
生成種子
下面我們來(lái)探討DGA的具體過(guò)程。首先,計(jì)算1974年1月1日0時(shí)到現(xiàn)在的秒數(shù)(下圖中 0x40A0A0),然后在 0x0040A0A8處,用這個(gè)值加再加上126230400秒(UNIX紀(jì)元到1974年1月1日的秒數(shù)),實(shí)際上,通過(guò)上面的步驟得到了當(dāng)前的UNIX時(shí)間。目前我們尚不清楚為什么要采用這種復(fù)雜的方法獲取當(dāng)前UNIX時(shí)間。這個(gè)Unix時(shí)間分別再除以四個(gè)整數(shù),分別是60,60,24和7,最后得到的是從UNIX紀(jì)元到現(xiàn)在的周數(shù)。這個(gè)值用作域名生成算法的種子。因此域名的有效期是一周,按UTC時(shí)間,從每周四開始。
在種子生成過(guò)程中還調(diào)用了一個(gè)偽隨機(jī)數(shù)發(fā)生器(PRNG),并將結(jié)果模10,得到0到9中的一個(gè)數(shù)。這個(gè)隨機(jī)數(shù)發(fā)生器采用Borland C/C++編譯器使用的標(biāo)準(zhǔn)線性同余算法。
r2的初始值是幾乎不可預(yù)測(cè)的:
DGA
每次域名生成過(guò)程,共產(chǎn)生10個(gè)域名。
(域名級(jí)別是網(wǎng)址分類的一個(gè)標(biāo)準(zhǔn),包括頂級(jí)域名、二級(jí)域名等。一個(gè)完整的域名由二個(gè)或二個(gè)以上部分組成,各部分之間用英文的句號(hào)"."來(lái)分隔,倒數(shù)第一個(gè)"."的右邊部分稱為頂級(jí)域名(TLD),頂級(jí)域名的左邊部分字符串到下個(gè)"."為止稱為二級(jí)域名(SLD),二級(jí)域名的左邊部分稱為三級(jí)域名,以此類推,每一級(jí)的域名控制它下一級(jí)域名的分配)
在0x040A0FC 位置,根據(jù)種子生成一個(gè)隨機(jī)字符串,例如周數(shù)。隨后這個(gè)隨機(jī)字符串在0x040A114又被復(fù)制了一次。例如:字符串dqg在這變成了dqgdqg,這個(gè)字符串的生成細(xì)節(jié),待會(huì)我們回過(guò)頭來(lái)再細(xì)講。
生成第一個(gè)SLD時(shí),用上面講到的不可預(yù)測(cè)的隨機(jī)數(shù)生成算法(0到9共10個(gè)數(shù)),選取“a”到“j”之間(共10個(gè)字母)的隨機(jī)字母,添加到上面的字符串后面,就生成了二級(jí)域名,如dqgdqgc.ch。然后,從選取的字母開始,DGA會(huì)依次選取a到j(luò)中的字母,比如,如果第一次選取了“c”,后面的依次就是“d”,“e”,“f”,“g”,“h”,“j”,“a”,最后是“b”,共10個(gè)域名。
前5個(gè)域名的頂級(jí)域名設(shè)為“.ch”,剩下的設(shè)置為“.biz”
下面,我們?cè)賮?lái)看一下0x040A0FC處的隨機(jī)字符串(上面的dqgdqg)是怎么生成的。
這段過(guò)程使用了最開始生成的種子r(周數(shù)),例如,根據(jù)1970年1月到現(xiàn)在的時(shí)間,換算成周數(shù),利用周數(shù)得出隨機(jī)字符串,如下:
例如:2016年12月20日,根據(jù)UNIX紀(jì)元計(jì)算出的周數(shù)是r=2450,string1 = 2450%26+‘a’=g,r=2450/26=94,因此第一個(gè)字母是g,同時(shí)r!=0,繼續(xù)循環(huán),直到r=0時(shí)結(jié)束,最后依次得到的字母是:g、q、d。隨后,隨機(jī)字符串gqd被倒序?yàn)閐qg。隨后又被復(fù)制了一次,得到dqgdqg。
程序?qū)崿F(xiàn)
下面是用python實(shí)現(xiàn)在DGA算法,根據(jù)給定的日期,能打印出所有20個(gè)可能的域名。需要注意的是,對(duì)于每一個(gè)正在運(yùn)行的Tofsee惡意軟件,只會(huì)用到其中的一個(gè)域名。
下面是在日期設(shè)置為2016年12月20日時(shí)的所有20個(gè)可能的域名:
域名列表
下表列出了未來(lái)52周的所有可能的域名,域名中括號(hào)包含了隨機(jī)擴(kuò)展,如dqgdqg{a..j}.{ch,biz}代表20個(gè)不同的域名。所有的時(shí)間都采用CET(中歐時(shí)間)時(shí)間。
采取的行動(dòng)
為了防止這種Tofsee僵尸網(wǎng)絡(luò)操作者濫用瑞士域名空間(ccTLD .ch),我們和瑞士國(guó)家頂級(jí)域名注冊(cè)機(jī)構(gòu)已經(jīng)采取了進(jìn)一步的措施,所有可能的DGA域名的組合,在注冊(cè)狀態(tài)處已經(jīng)被設(shè)置為非注冊(cè)狀態(tài)。因此在未來(lái)12個(gè)月,任何由DGA算法生成的域名,都不會(huì)被注冊(cè)。
參考鏈接