歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

從惡意軟件Nymaim看DGA

來源:本站整理 作者:佚名 時間:2019-06-13 TAG: 我要投稿

Nymaim惡意軟件首次發現是在2013年。它主要是被用作其他惡意軟件的下載器,如勒索軟件,后來它也開始為了實現點擊欺詐而進行搜索操控。
也許是因為這個惡意軟件使用了一種有效而有趣的混淆,關于Nymaim和它得DGA的文章已經有了很多。這種混淆催生了很多有創造性的幫助分析惡意軟件的工具,例如 GovCERT.CH 或者CERT Polska。
除了混淆之外,Nymaim的有趣之處還在于它試圖通過在A記錄種添加校驗和與在使用之前轉換IP地址保護自己,具體介紹可以看CERT Polska的 “Nymaim revisited”,Talos 的 “Threat Spotlight: GozNym”和Alberto Ortega的 “Nymaim Origins, Revival and Reversing Tales” 。
本月,Nymaim的新版本對上述特性進行了一些修改:
除了加殼之外,混淆被全部的拋棄。相反,惡意軟件甚至使用有用的日志消息和帶有描述性名稱的配置。
IP轉換略有變化,使用了不同的常量,但其他方面都堅持與之前的過程相同。
DGA已經被完全重寫。它現在是基于單詞列表的,比如Matsnu的DGA, Suppobox,或者Nymaim的近親Gozi。
除了使用DGA,Nymaim還有一個硬編碼域名列表,它們遵循與DGA域名相同的模式,但是在依賴于時間的DGA域名之前進行嘗試。
這篇博客文章關注的是Nymaim的DGA和IP轉換方面。例如,下面是2018年4月27日的前10個域名:
virginia-hood.top
shelter-downloadable.ps
tylerpreparation.sg
zolofteffectiveness.ch
stakeholders-looked.hn
williampassword.sc
thailandcool.re
thoughtsjazz.ec
recovery-hairy.ac
workshopsforms.hn
我分析了來自Virustotal的樣本:
MD5
30bce8f7ac249057809d3ff1894097e7
SHA-256
73f06bed13e22c2ab8b41bde5fc32b6d91680e87d0f57b3563c629ee3c479e73
SHA-1
b629c20b4ef0fd31c8d36292a48aa3a8fbfdf09c
文件大小
484 KB
編譯時間戳
2010-06-13 18:50:03 (可能是假的)
首次上傳至 Virustotal的時間
2018-04-17 21:49:18
Virustotal 鏈接
link
我將其解壓縮得以下可執行文件。所有截圖都來自加載地址0x400000的這個示例:
MD5
379ba8e55498cb7a71ec4dcd371968af
SHA-256
3eb9bbe3ed251ec3fd1ff9dbcbe4dd1a2190294a84ee359d5e87804317bac895
SHA-1
5f522dda6b003b151ff60b83fe326400b9ed7716
文件大小
368 KB
編譯時間戳
2018-03-02 23:12:20
首次上傳至 Virustotal的時間
2018-04-26 12:19:41 (我上傳的)
Virustotal 鏈接
link
 
分析
本節描述DGA的詳細信息。如果你只對Python的實現感興趣,請參閱DGA部分。
種子
Nymaim的新DGA的種子由三部分組成:
硬編碼的32位大寫的16進制字符串,推測為MD5散列值(在分析的樣本中是3138C81ED54AD5F8E905555A6623C9C9)。Nymaim將它稱為生成密鑰。
一年中從零開始的一天。例如,1月1日是第0天。這個值比ISO定義的值小1,ISO定義1月1日為一年中的第1天。從這個值減去一個計數器中的值,計數器從0開始,一直到一個天數增量DayDelta(在樣本中是10)。這意味著如果有必要,DGA將重新訪問過去10天的域名(除了在年關的時候,詳情見下面的滑動窗口)。
當年的最后兩位數字。
這三個值組合成一個字符串。然后對這個字符串進行md5散列,其結果表示為小寫的十六進制字符串。請注意,這與生成密鑰相反,生成密鑰都是大寫的。得到的字符串是隨后的偽隨機數生成器的種子和基礎。

偽隨機數生成器
偽隨機數生成器(PRNG)使用MD5哈希字符串的前8個字符,并將其作為32位整數(即隨機數)的大端十六進制表示。然后丟棄MD5散列的前7個字符,其余的字符再次用MD5散列并表示為小寫的十六進制字符串。該字符串的前8個字符表示下一個偽隨機值。關于整個過程和偽隨機數生成器,請參閱下圖:

DGA算法
DGA使用四個隨機值從四個列表中選擇字符串:
選擇第一個單詞列表中的一個單詞。
選擇一個分隔符。
選擇第二個單詞列表中的一個單詞。
選擇頂級域
然后將四個字符串連接起來形成域名。單詞的選擇是用隨機值除以列表長度的余數作為索引從列表中選擇:
CString *__thiscall dga(_DWORD *config, CString *szDomainName)
{
  dgaconfig *cfg; // [email protected]
  int v3; // [email protected]
  unsigned int nNumberOfFirstWords; // [email protected]
  randnrs objRandNrs; // [esp+Ch] [ebp-2Ch]@1
  int dgb2; // [esp+20h] [ebp-18h]@1
  int nr_random_values; // [esp+24h] [ebp-14h]@1
  char cstrDomainName; // [esp+28h] [ebp-10h]@3
  int dbg; // [esp+34h] [ebp-4h]@1
  dgb2 = 0;
  cfg = config;
  init_random_nrs(&objRandNrs);
  objRandNrs.self = &GetRuntimeClass;
  nr_random_values = 4;
  dbg = 1;
  do
  {
    v3 = rand_0(&cfg->random_hash);
    store_rand(objRandNrs.field_8, v3);
    --nr_random_values;
  }
  while ( nr_random_values );
  CString::CString(&cstrDomainName);
  nNumberOfFirstWords = cfg->nNumberOfFirstWords;
  LOBYTE(dbg) = 2;
  CString::operator+=(&cstrDomainName, cfg->rgFirstWords + 4 * (*objRandNrs.r % nNumberOfFirstWords));

[1] [2] [3] [4] [5]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视