Mirai 变种中的DGA
<!--kg-card-begin: markdown--><h3 id="">更新历史</h3>
<p>2016-12-09 首次发布<br>
2016-12-12 更新图0，修正了我们DGA实现中一处TLD选择的错误</p>
<h3 id="">概要</h3>
<p>两个星期前，我们发现2个新的感染载体（也即TCP端口7547和5555变种）被用来传播MIRAI恶意软件。</p>
<blockquote>
<p>&lt;<a href="__GHOST_URL__/a-few-observations-of-the-new-mirai-variant-on-port-7547/">A Few Observations of The New Mirai Variant on Port 7547</a>&gt;</p>
</blockquote>
<p>我的同事Ye Genshen快速设置了一些蜜罐，并且很快取得收获：11月28日一天就捕获了11个样本。 迄今为止，我们的蜜罐已从6个托管服务器捕获了53个独立样本。</p>
<p>在分析其中一个新样本时，我的同事Qu Wenji发现一些类似DGA的代码，并猜测变种中包含有DGA功能，这个猜测很快就从我们的沙箱数据中得到验证。详细的逆向工作显示，在通过TCP端口7547和5555分发的MIRAI样本中确实存在DGA特征。在本博客中，我将介绍我们的发现。简单来说，我们找到的DGA的属性总结如下：</p>
<ol>
<li>使用3个顶级域名：online/tech/support；</li>
<li>L2域名固定长度12字符，每个字符从“a”到“z”中随机选择；</li>
<li>域名仅由月、日和硬编码的种子字符串确定；</li>
<li>每天只生成一个域名，因此最多存在365个 DGA域名；</li>
<li>DGA域名仅在硬编码的C2域名无法解析时使用。</li>
</ol>
<p>通过逆向获取的DGA知识，我们在程序中重新实现了DGA，并用它来预测所有365个可能的域名。当进一步确认这些域名的注册信息时，我们发现其中部分域名已经被MIRAI作者注册，列表如下：</p>
<p><img src="__GHOST_URL__/content/images/2016/12/mirai_dga_registered_by_author-1.png" alt="" loading="lazy"></p>
<div align="center">图0, 已经被注册的DGA域名</div>
<p>值得一提的是，作者 dlinchkravitz@gmail.com在更早时间已经注册了其他mirai C2域名：</p>
<ul>
<li>zugzwang.me email <a href="mailto:dlinchkravitz@gmail.com">dlinchkravitz@gmail.com</a></li>
</ul>
<h3 id="">样本和分析</h3>
<p>本博客中用作说明的样本如下：<br>
<font size="3"></p>
<ul>
<li><strong>MD5</strong>: bf136fb3b350a96fd1003b8557bb758a</li>
<li><strong>SHA256</strong>: 971156ec3dca4fa5c53723863966ed165d546a184f3c8ded008b029fd59d6a5a</li>
<li><strong>File type</strong>: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped<br>
</font></li>
</ul>
<p>样品做了去符号处理但未加壳。根据以分析mirai样本经验，我们很快就确定了其主要模块。比较代码发现，resolv_cnc_addr函数的CFG（流程控制图）与先前发现的样本非常不同。 新版本的CFG如图1所示。<br>
<img src="__GHOST_URL__/content/images/2016/12/mirai_dga_resolv_cnc_addr_cfg-1.png" alt="" loading="lazy"></p>
<div align="center">图1, 新版本的resolv_cnc_addr 流程控制图</div>
<p>在函数开始处，由于在样本中硬编码了多达3个C2域名，所以生成随机数以从第一和第二个C2域名中随机选择一个，如图2所示。<br>
<img src="__GHOST_URL__/content/images/2016/12/mirai_dga_choose_1st_cnc-1.png" alt="" loading="lazy"></p>
<div align="center">图2, resolv_cnc_addr 函数第一部分</div>
<p>如果被选中的C2域名无法解析，则bot并不解析未选择的域名或第三域名，而是将根据当前日期判断是决定是否去执行DGA代码分支还是去解析第三个C2域名，如图3。<br>
<img src="__GHOST_URL__/content/images/2016/12/mirai_dga_judge_dga-1.png" alt="" loading="lazy"></p>
<div align="center">图3, 决定是否进入DGA 代码分支</div>
<p>从上述代码片段我们可以看出，如果当前日期在11月1日和12月3日之间，将去解析第3个C2域名。否则将执行DGA代码分支。这可以理解为作者不希望DGA域名在12月4日之前被启用，这也恰好被前文提及首个被注册的mirai DGA域名对应于12月4日所映证。<br>
DGA主函数名为dga_gen_domain。域名完全是基于种子数字和当前日期生成的。种子通过调用strtol（）从硬编码的十六进制格式字符串进行转换。看起来字符串“\x90\x91\x80\x90\x90\x91\x80\x90”是一个错误的配置，这会导致strtol（）总是返回0。<br>
代码中通过调用time（）和localtime（）的C库函数得到本地日期。但只有月和日被使用，如图4所示。<br>
<img src="__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part1-1-1.png" alt="" loading="lazy"></p>
<div align="center">图4, dga_gen_domain 函数片段</div>
<p>L2域名是通过反复执行图5所示的代码块来生成的。其长度由$ t5和$ t2确定，它们的值在图4中设置，从中我们可以确定L2域名长度是12。<br>
<img src="__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part2-1-1.png" alt="" loading="lazy"></p>
<div align="center">图5, 生成L2域名的循环代码片段</div>
TLD（Top Level Domain）由寄存器$S0中的残余值确定，如图6所示。 我们可以看到在这里使用了3个TLD。
<p><a href="__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part3-1.png"><img src="__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part3-1.png" class="kg-image"/></a><div align="center">图6, 确定TLD 的代码分支</div></p>
<h3 id="ioc">IOC</h3>
<p>目前，DGA相关的特性存在于如下样本，所有这些DGA样本中的种子字符串和算法都完全相同：</p>
<ul>
<li>005241cf76d31673a752a76bb0ba7118</li>
<li>05891dbabc42a36f33c30535f0931555</li>
<li>0eb51d584712485300ad8e8126773941</li>
<li>15b35cfff4129b26c0f07bd4be462ba0</li>
<li>2da64ae2f8b1e8b75063760abfc94ecf</li>
<li>41ba9f3d13ce33526da52407e2f0589d</li>
<li>4a8145ae760385c1c000113a9ea00a3a</li>
<li>551380681560849cee3de36329ba4ed3</li>
<li>72bbfc1ff6621a278e16cfc91906109f</li>
<li>73f4312cc6f5067e505bc54c3b02b569</li>
<li>7d490eedc5b46aff00ffaaec7004e2a8</li>
<li>863dcf82883c885b0686dce747dcf502</li>
<li>bf136fb3b350a96fd1003b8557bb758a</li>
<li>bf650d39eb603d92973052ca80a4fdda</li>
<li>d89b1be09de36e326611a2abbedb8751</li>
<li>dbd92b08cbff8455ff76c453ff704dc6</li>
<li>eba670256b816e2d11f107f629d08494</li>
</ul>
<p>样本中的硬编码C2域名如下：</p>
<ul>
<li>zugzwang.me</li>
<li>tr069.online</li>
<li>tr069.tech</li>
<li>tr069.support</li>
</ul>
<p>我们将密切关注DGA变种的后续变化，敬请关注后续更新。</p>
<!--kg-card-end: markdown-->
更新历史


2016-12-09 首次发布

2016-12-12 更新图0，修正了我们DGA实现中一处TLD选择的错误



概要


两个星期前，我们发现2个新的感染载体（也即TCP端口7547和5555变种）被用来传播MIRAI恶意软件。





<A Few Observations of The New Mirai Variant on Port 7547>



我的同事Ye Genshen快速设置了一些蜜罐，并且很快取得收获：11月28日一天就捕获了11个样本。 迄今为止，我们的蜜罐已从6个托管服务器捕获了53个独立样本。


在分析其中一个新样本时，我的同事Qu Wenji发现一些类似DGA的代码，并猜测变种中包含有DGA功能，这个猜测很快就从我们的沙箱数据中得到验证。详细的逆向工作显示，在通过TCP端口7547和5555分发的MIRAI样本中确实存在DGA特征。在本博客中，我将介绍我们的发现。简单来说，我们找到的DGA的属性总结如下：


 1. 使用3个顶级域名：online/tech/support；
 2. L2域名固定长度12字符，每个字符从“a”到“z”中随机选择；
 3. 域名仅由月、日和硬编码的种子字符串确定；
 4. 每天只生成一个域名，因此最多存在365个 DGA域名；
 5. DGA域名仅在硬编码的C2域名无法解析时使用。


通过逆向获取的DGA知识，我们在程序中重新实现了DGA，并用它来预测所有365个可能的域名。当进一步确认这些域名的注册信息时，我们发现其中部分域名已经被MIRAI作者注册，列表如下：





图0, 已经被注册的DGA域名


值得一提的是，作者 dlinchkravitz@gmail.com在更早时间已经注册了其他mirai C2域名：


 * zugzwang.me email dlinchkravitz@gmail.com



样本和分析


本博客中用作说明的样本如下：




 * MD5: bf136fb3b350a96fd1003b8557bb758a
 * SHA256: 971156ec3dca4fa5c53723863966ed165d546a184f3c8ded008b029fd59d6a5a
 * File type: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped
   
   


样品做了去符号处理但未加壳。根据以分析mirai样本经验，我们很快就确定了其主要模块。比较代码发现，resolv_cnc_addr函数的CFG（流程控制图）与先前发现的样本非常不同。 新版本的CFG如图1所示。




图1, 新版本的resolv_cnc_addr 流程控制图


在函数开始处，由于在样本中硬编码了多达3个C2域名，所以生成随机数以从第一和第二个C2域名中随机选择一个，如图2所示。




图2, resolv_cnc_addr 函数第一部分


如果被选中的C2域名无法解析，则bot并不解析未选择的域名或第三域名，而是将根据当前日期判断是决定是否去执行DGA代码分支还是去解析第三个C2域名，如图3。




图3, 决定是否进入DGA 代码分支


从上述代码片段我们可以看出，如果当前日期在11月1日和12月3日之间，将去解析第3个C2域名。否则将执行DGA代码分支。这可以理解为作者不希望DGA域名在12月4日之前被启用，这也恰好被前文提及首个被注册的mirai DGA域名对应于12月4日所映证。

DGA主函数名为dga_gen_domain。域名完全是基于种子数字和当前日期生成的。种子通过调用strtol（）从硬编码的十六进制格式字符串进行转换。看起来字符串“\x90\x91\x80\x90\x90\x91\x80\x90”是一个错误的配置，这会导致strtol（）总是返回0。

代码中通过调用time（）和localtime（）的C库函数得到本地日期。但只有月和日被使用，如图4所示。




图4, dga_gen_domain 函数片段


L2域名是通过反复执行图5所示的代码块来生成的。其长度由$ t5和$ t2确定，它们的值在图4中设置，从中我们可以确定L2域名长度是12。




图5, 生成L2域名的循环代码片段
TLD（Top Level Domain）由寄存器$S0中的残余值确定，如图6所示。 我们可以看到在这里使用了3个TLD。




图6, 确定TLD 的代码分支





IOC


目前，DGA相关的特性存在于如下样本，所有这些DGA样本中的种子字符串和算法都完全相同：


 * 005241cf76d31673a752a76bb0ba7118
 * 05891dbabc42a36f33c30535f0931555
 * 0eb51d584712485300ad8e8126773941
 * 15b35cfff4129b26c0f07bd4be462ba0
 * 2da64ae2f8b1e8b75063760abfc94ecf
 * 41ba9f3d13ce33526da52407e2f0589d
 * 4a8145ae760385c1c000113a9ea00a3a
 * 551380681560849cee3de36329ba4ed3
 * 72bbfc1ff6621a278e16cfc91906109f
 * 73f4312cc6f5067e505bc54c3b02b569
 * 7d490eedc5b46aff00ffaaec7004e2a8
 * 863dcf82883c885b0686dce747dcf502
 * bf136fb3b350a96fd1003b8557bb758a
 * bf650d39eb603d92973052ca80a4fdda
 * d89b1be09de36e326611a2abbedb8751
 * dbd92b08cbff8455ff76c453ff704dc6
 * eba670256b816e2d11f107f629d08494


样本中的硬编码C2域名如下：


 * zugzwang.me
 * tr069.online
 * tr069.tech
 * tr069.support


我们将密切关注DGA变种的后续变化，敬请关注后续更新。

{"version":"0.3.1","atoms":[],"cards":[["markdown",{"cardName":"card-markdown","markdown":"### 更新历史\n2016-12-09 首次发布\n2016-12-12 更新图0，修正了我们DGA实现中一处TLD选择的错误\n\n###概要\n\n两个星期前，我们发现2个新的感染载体（也即TCP端口7547和5555变种）被用来传播MIRAI恶意软件。\n\n> <[A Few Observations of The New Mirai Variant on Port 7547](__GHOST_URL__/a-few-observations-of-the-new-mirai-variant-on-port-7547/)>\n\n我的同事Ye Genshen快速设置了一些蜜罐，并且很快取得收获：11月28日一天就捕获了11个样本。 迄今为止，我们的蜜罐已从6个托管服务器捕获了53个独立样本。\n\n在分析其中一个新样本时，我的同事Qu Wenji发现一些类似DGA的代码，并猜测变种中包含有DGA功能，这个猜测很快就从我们的沙箱数据中得到验证。详细的逆向工作显示，在通过TCP端口7547和5555分发的MIRAI样本中确实存在DGA特征。在本博客中，我将介绍我们的发现。简单来说，我们找到的DGA的属性总结如下：\n\n1. 使用3个顶级域名：online/tech/support；\n2. L2域名固定长度12字符，每个字符从“a”到“z”中随机选择；\n3. 域名仅由月、日和硬编码的种子字符串确定；\n4. 每天只生成一个域名，因此最多存在365个 DGA域名；\n5. DGA域名仅在硬编码的C2域名无法解析时使用。\n\n通过逆向获取的DGA知识，我们在程序中重新实现了DGA，并用它来预测所有365个可能的域名。当进一步确认这些域名的注册信息时，我们发现其中部分域名已经被MIRAI作者注册，列表如下：\n\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_registered_by_author-1.png)\n\n<div align=\"center\">图0, 已经被注册的DGA域名</div>\n\n值得一提的是，作者 dlinchkravitz@gmail.com在更早时间已经注册了其他mirai C2域名：\n\n* zugzwang.me email dlinchkravitz@gmail.com\n\n###样本和分析\n\n\n本博客中用作说明的样本如下：\n<font size=\"3\">\n* **MD5**: bf136fb3b350a96fd1003b8557bb758a  \n* **SHA256**: 971156ec3dca4fa5c53723863966ed165d546a184f3c8ded008b029fd59d6a5a  \n* **File type**: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped  \n</font>\n\n样品做了去符号处理但未加壳。根据以分析mirai样本经验，我们很快就确定了其主要模块。比较代码发现，resolv_cnc_addr函数的CFG（流程控制图）与先前发现的样本非常不同。 新版本的CFG如图1所示。\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_resolv_cnc_addr_cfg-1.png)\n<div align=\"center\">图1, 新版本的resolv_cnc_addr 流程控制图</div>\n\n在函数开始处，由于在样本中硬编码了多达3个C2域名，所以生成随机数以从第一和第二个C2域名中随机选择一个，如图2所示。\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_choose_1st_cnc-1.png)\n<div align=\"center\">图2, resolv_cnc_addr 函数第一部分</div>\n\n如果被选中的C2域名无法解析，则bot并不解析未选择的域名或第三域名，而是将根据当前日期判断是决定是否去执行DGA代码分支还是去解析第三个C2域名，如图3。\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_judge_dga-1.png)\n<div align=\"center\">图3, 决定是否进入DGA 代码分支</div>\n\n从上述代码片段我们可以看出，如果当前日期在11月1日和12月3日之间，将去解析第3个C2域名。否则将执行DGA代码分支。这可以理解为作者不希望DGA域名在12月4日之前被启用，这也恰好被前文提及首个被注册的mirai DGA域名对应于12月4日所映证。\nDGA主函数名为dga_gen_domain。域名完全是基于种子数字和当前日期生成的。种子通过调用strtol（）从硬编码的十六进制格式字符串进行转换。看起来字符串“\\x90\\x91\\x80\\x90\\x90\\x91\\x80\\x90”是一个错误的配置，这会导致strtol（）总是返回0。\n代码中通过调用time（）和localtime（）的C库函数得到本地日期。但只有月和日被使用，如图4所示。\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part1-1-1.png)\n<div align=\"center\">图4, dga_gen_domain 函数片段</div>\n\nL2域名是通过反复执行图5所示的代码块来生成的。其长度由$ t5和$ t2确定，它们的值在图4中设置，从中我们可以确定L2域名长度是12。\n![](__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part2-1-1.png)\n<div align=\"center\">图5, 生成L2域名的循环代码片段</div>\nTLD（Top Level Domain）由寄存器$S0中的残余值确定，如图6所示。 我们可以看到在这里使用了3个TLD。\n\n<a href=\"__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part3-1.png\"><img src=\"__GHOST_URL__/content/images/2016/12/mirai_dga_main_func_part3-1.png\" class=\"kg-image\"/></a><div align=\"center\">图6, 确定TLD 的代码分支</div>\n\n###IOC\n目前，DGA相关的特性存在于如下样本，所有这些DGA样本中的种子字符串和算法都完全相同：\n\n* 005241cf76d31673a752a76bb0ba7118 \n* 05891dbabc42a36f33c30535f0931555  \n* 0eb51d584712485300ad8e8126773941  \n* 15b35cfff4129b26c0f07bd4be462ba0  \n* 2da64ae2f8b1e8b75063760abfc94ecf  \n* 41ba9f3d13ce33526da52407e2f0589d  \n* 4a8145ae760385c1c000113a9ea00a3a  \n* 551380681560849cee3de36329ba4ed3  \n* 72bbfc1ff6621a278e16cfc91906109f  \n* 73f4312cc6f5067e505bc54c3b02b569  \n* 7d490eedc5b46aff00ffaaec7004e2a8  \n* 863dcf82883c885b0686dce747dcf502  \n* bf136fb3b350a96fd1003b8557bb758a  \n* bf650d39eb603d92973052ca80a4fdda  \n* d89b1be09de36e326611a2abbedb8751  \n* dbd92b08cbff8455ff76c453ff704dc6  \n* eba670256b816e2d11f107f629d08494 \n\n样本中的硬编码C2域名如下：\n\n* zugzwang.me \n* tr069.online \n* tr069.tech \n* tr069.support\n\n\n我们将密切关注DGA变种的后续变化，敬请关注后续更新。\n"}]],"markups":[],"sections":[[10,0]],"ghostVersion":"3.0"}