TrojanDownloader:JS/Nemucod分析【原创+翻译】
本帖最后由 FoodieOnTheWay 于 2016-7-14 21:57 编辑背景本来,这应该是一个分析贴的,但是没想到ESET老早就有分析过,看来是撞了样本了,一脸懵逼.jpg。看到黑哥(知道创宇的hi_heige)前段时间还撞了洞,而且我也晚了ESET一个月,再加上ESET分析的比我有条理啊,我也就觉得这不算什么了。所以它现在被我改写成了翻译贴,求大神们别一言不合就拍砖。
我先贴上自己的一些分析技巧,把JS本身还原。下边就由ESET的Donny装逼了,哦不,咳咳,由Donny展示了。
JS还原其实之前已经遇到过这个Nemucod,以前的版本没有太多套路,就不好意思发论坛上,而是丢知乎上当作科普文了,现在也已经也加了ESET相关文章的翻译了。具体链接: 警惕钓鱼邮件——近期勒索软件高发 https://zhuanlan.zhihu.com/p/20927057
我这次收集到的那个样本跟ESET文章中说到的第一个非常相似。这里为了跟ESET的分析保持一致,我就直接拿ESET的样本开刀了。首先用UltraEdit或者NotePad++打开,一看这一坨代码,立马就处女癌发作,拿到xx工具站去进行格式化处理。然后这才发现,原来开头那个变量是一条执行语句啊。那就run一下,show出这个语句来吧。run一下有很多种方法,有用IE Developer Tool的,有用Chrome的,更多人用火狐的firebug。但是,这怎么能显示出我的非主流杀马特风格?妈咪妈咪哄,console.log("")大法!!!
// 在http://www.runoob.com/try/runcode.php?filename=helloworld&type=nodejs 贴上变量这句// 输入console.log(变量);// 即如下样子:var a8MTtfS4in = "…..." // 代码太长,此处省略22448字console.log(a8MTtfS4in);
点击运行,即可解出代码。以下是前后对比:
接下来就简单了,从解出来的code,我们可以看到从第333行才是真正函数开始的地方。我们要做的是保留之前的变量值,然后在之后的代码中加入无数Console.log(""),分段用/**/注释代码,然后可以就可以得到真正的代码了。比如下图,我先注释了下边的代码,去获取ahtc的结果。得到ahtc的结果后,我把这些花指令直接改成真正的结果,然后接着运行下一段。
然后发现,它在bcollisionend这句报错了,这是因为这个在线的解释器不支持WScript对象(也不可能支持)。这时我们可以把它分为两句,分别输出结果,然后组成:varbcollisionend = WScript(WScript.Shell);。当然循环体和其他包含api的语句等,也是这么干的,可不用真的去让它跑。
最终,可还原出所有JS代码。
当然,有一部分Web大牛可能还是更喜欢用浏览器的调试功能来弄,我是web菜鸟,这里就说下我菜鸟的方法了!先是找个目录创建个html文件,把如下内容拷进去,然后把我们刚才解出来的代码放进去,用IE打开。<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>DebugJS</title>
<script type="text/javascript">
function btn_click(){
/*Here is the code need to debug*/
}
</script>
</head>
<body>
<input type="button"value="ClickMe"/>
</body>
</html>
这时你会发现,这个页面上有个ClickMe。先别点,按F12打开开发人员工具,下好断点,然后点“ClickMe”就可以动态调试了。为了防止误操作,请尽量在虚拟机里执行。
功夫活儿就不再赘述,很快,你就能得到结果。
这里请注意,ESET分析的时候,把函数名也改成有意义的了,这个我之前倒没改过,对照着翻译就完了,这里也就不改了。各位想动手试试看官可以也改一改,可以改的跟ESET一样,方便理解。
翻译内容原始地址: http://www.welivesecurity.com/2016/06/16/nemucod-ups-its-game/ (ESET的官方博客)
前段时间,我们详细描述了勒索软件的工作原理. 从那之后,“Nemucod”(这是一个JS下载脚本,主要用来下载和执行恶意软件,比如Locky. 译者注:一款主要通过Nemucod传播的勒索软件)的创造者就开始努力去改进他们的代码(译者注:通俗点,就是做免杀了)。
最新的版本相比之前的版本有了一些显著的变化。在过去,流程很简单:“用户打开恶意文件→ 文件下载payload→ payload执行”。但是在最近的几个版本中,情况有点不简单了。
让我们仔细看看这些代码干啥了。原始的代码已经被严重混淆了,为了让代码更具备可读性,我们已经对这些代码解混淆了。
套路1 – 多种可供使用的连接方式(译者注:step的翻译是步骤,但好基友觉得套路更接地气)早先的一些版本只用了一种方式去连接网络,然而因为不同的基础网络配置,这有可能会失败。为了提供更好的兼容性,作者写了一个试着用多种方式联网的函数。图1 图中所示的第一种方式就是它常用的方式
套路2 –多个下载地址直到最近,Nemucod都是只附带一个地址(通常是一个被攻陷的服务器,译者注:这里原意不是特别明确,结合之前的文章这样写的)用来下载payload。这也是一个单点故障:一旦payload被移除,攻击(下载)就会失败。或许是希望能够增加成功几率吧,最近的几个版本已经包含了好几个下载地址,如下图所示。代码遍历上述地址,直到有一个下载成功。
套路3 – 第一轮解密在过去,Nemucod都是下载".exe"文件格式的payload,然后直接执行。但是,下载exe文件会被一些安全设备比如:有状态防火墙,IDS,UTM等设备拦截,或者直接拒绝下载。为了避免这种情况,最新的版本下载了一个加密的文件。首先,JS会把这个文件下载到受害者的“%temp%”文件夹中:
等Payload文件保存好,下边这个函数会把文件内容交给“deobRound1”来执行第一轮解密:正如下图展示的这样,第一轮解密是一个简单的树枝代换。文件中的所有字符被转化为16进制数值。如果数值大于127,这个字符会被替换成一个预定义的数组中的相应值;如果小于127,那么字符不会产生变化:
套路4 – 第二轮解密第一轮解密之后,文件内容会传给另外一个函数做第二轮解密。这一轮解密有三个步骤:
[*]去除文件内容中的最后四个字符;
[*]对所有的字符用 's' 执行一个异或操作;
[*]反转整个文件内容
套路5 – Payload有效性检查这一步会对Payload进行一个基本的检查。
[*]检查文件大小是不是在174080到189440之间;
[*]检查MZ头;
[*]检查PE头。
如果任何一项没通过,它就返回第二步去下载下一个下载地址中的payload。
套路6 – 最后一次解密如果所有的检查都已经通过,文件就会被写到"%temp%"路径下。
这个名叫deobRound3(译者注: 第三轮解密)的函数又把文件内容做了一次类似于套路3的解密。这些字符替换像是为了消除第二轮中解密中的“宽字符“问题。最终,所有字符都被转化为十进制,并且文件内容也成了一个有效的Windows可执行文件。
套路7 – 执行现在payload已经就绪,但是它并不会被直接执行。换了一个新把戏,写了一个bat文件,然后用这个bat来启动payload。
如果“不出意外”,用户就被感染了。
总结大家可以看得出来,Nemucod的作者一直忙于改进这个下载脚本来增强免杀能力。通过这些新特性,大家可以推测出,作者(们)在努力提高它在企业环境中的成功率(企业环境中代{过}{滤}理服务器和UTM网关可能在过去阻止了他们的payload)。
相关文件信息customers 366.wsf [JS/TrojanDownloader.Nemucod.ABI trojan]MD5: 4DEDF4085E6D2F74CB879AD2E9680AFBSHA1: EF2A9C6A61E98091A952328592D45214F6E44178cstomers 9679.js [JS/TrojanDownloader.Nemucod.ABI trojan]MD5: 42D054143A67DE14EE10F7B8C91D8A1ASHA1: D3DC6E3D066BFA8E1F4408DE471BC95B001D0D25Yhnpl47OMCLJm.exe Win32/Kryptik.EYIB trojan](译者注:这也是一个升级版的勒索软件,加壳/混淆过的,会通过注入系统进程调用vssadmin悄悄清除还原点)MD5: C1F95ADBCAF520BF182F9014970D33E5SHA1: 80B96F0207B9C5D1DAA3A6E6CF646F5AFA7BBA2C—Donny MaaslandHead of CybersecurityServices and Research(网络安全服务和研究的头儿)ESET Netherlands(荷兰ESET)
---------------------------------------------------------------------------------------------------------
分割线下是样本,密码52Pojie:// 这个中文的冒号代表下边是样本,冏
FoodieOnTheWay 发表于 2016-7-24 14:58
JS也只能这么玩儿,这个手法已经算非常猥琐了吧
非常低端,垃圾一些注释文本,然后倒序,然后在eval,就3个步骤,我觉得很简单,很容易被破解 dingk 发表于 2016-7-10 00:07
你也没睡啊,明天不是去国家会议中心么,到时候喊我一下。
这就洗洗睡了。明天7点半出发,你也早点睡吧{:1_911:} 你也没睡啊,明天不是去国家会议中心么,到时候喊我一下。 感谢分享 感谢神分享,虽然看不懂,也要支持一下 技术贴,支持大神~~ 楼主写的非常详细,谢谢!收藏先,慢慢消化 {:1_917:}楼主密码怎么是错误的,解压不开。 感谢发布原创,说实话就看懂了套路一和套路2的一半... 密码不对