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