Petya:将勒索软件带向底层

2016-04-08 +6 481167人围观 ,发现 9 个不明物体 终端安全

Petya和其他流行勒索软件不一样,它是通过攻击底层的磁盘架构达到无法访问整个系统的目的。恶意软件的作者不仅创建了自身的引导程序,而且还创建了一个微型的内核,长度为32节区。

Petya释放的文件向磁盘头部写入恶意代码,被感染系统的主引导记录被引导加载程序重写,并且加载一个微型恶意内核。接着,这个内核开始进行加密。Petya声称加密了所有的磁盘,但事实不是这样。相反它只加密了主文件表,因此文件系统不可读。

预防技巧:Petya在第二阶段最危险,感染主机在BSOD之后重启。为了阻止计算机在这一阶段自动重启,因此在系统故障后关闭自动重启(戳这里看具体做法

如果你是在第一阶段检测到Petya,那么你的数据还是可恢复的。具体信息看这里

分析样本

dfcced98585128312b62b42a2a250dd2 –恶意软件压缩包

af2379cc4d607a45ac44d62135fb7015 – 主程序

7899d6090efae964024e11f6586a69ce – Setup.dll

d80fc07cc293bcd36e630d45a34aca11  – Petya 的引导程序的dump+其他恶意活动中获得的内核主程序(PDF 图标)

a92f13f3a1b3b39833d3cc336301b713

感谢 Florian Roth – 分享样本, Petr Beneš –在推特上的讨论

行为分析

勒索软件的传播途径是通过邮件进行传播,邮件伪装成求职简历。木马通过链接的方式加入邮件中,链接指向dropbox上的一个压缩文件,包含两个文件:

和一张申请人的照片(该照片是未经许可使用的库存图片)

一个伪装成简历的自解压的可执行文件或者是PDF文件(该文件释放一个恶意的32位PE文件)

图片2.png 

木马需要管理员权限才能执行。然而,木马却未采用by pass UAC技术,完全依赖于社工。

当打开木马文件时,出现UAC弹窗:

图片3.png

执行完后,系统crash。重启后,将会看到下面的一幕,模仿磁盘检查过程:

图片4.png

实际上,恶意内核早就开始加密文件了。结束后,感染的主机将会看到闪烁的屏幕,由一些ASCII码组成:

图片5.png

 按任意键后,出现勒索信息,按照信息提示支付比特币才能解决问题:

图片6.png

 感染阶段

木马感染主机分为两个阶段。

第一阶段执行木马释放的文件(windows可执行文件)。它会重写磁盘头部(包括MBR),XOR加密主分区表的备份。这个阶段会导致电脑BSOD。在这个点保存数据很简单,因为只有磁盘的头部被加密了,整个文件系统没有破坏,我们仍然可以通过挂载磁盘使用它的内容。这就是为什么如果你受到勒索软件的攻击,第一件事不要重启系统。你要做的是dump磁盘文件。最后,在这一阶段,将磁盘文件挂载到其他系统中,制作文件的备份。详情:这里

图片7.png 

第二阶段是伪造磁盘检查的扫描。之后,文件系统彻底破坏,并不可读:

图片8.png 

然而,并不是所有的磁盘文件都被加密了,如果我们使用一些工具可以看到很多有效元素包括字符串:

图片9.png

提供给受害人的网址

我们注意到,受害者访问的勒索网页也是精心准备的。其中,菜单栏可以选择多种语言版本,但是到目前为止,只有英文版的能正常显示: 

图片10.png

并且还向受害人一步步展示如何恢复他们的数据:

图片11.png

步骤1:输入个人识别码

步骤2:购买比特币

步骤3:进行比特币交易

步骤4:等待确认

我们原本以为这些网络罪犯留下的信息会很少,但是,在这里,木马的作者非常自信,公布了他们的团队名:”Janus Cybercrime Solutions”,项目完成时间是在2015年12月12日。同时,还反馈更新信息,点击相关链接了解他们:

图片12.png

他们还提供网址给受害人,用于答疑:

图片13.png 

细节分析

步骤1

之前我们说过,第一阶段是Windows可执行文件过程。该可执行文件采用强健的 FUD/cryptor进行加壳加密,这就是为什么刚开始不能看到恶意代码的原因。第一层执行的是一些无意义的用来欺骗和保护真正payload的代码。真正的恶意代码payload动态解密到内存中。

下面你可以看到运行进程的内存。原始进程EXE的代码别标记为红色。解压后的恶意代码标记为蓝色:

图片14.png 

解压后的PE文件内容:

图片15.png 

然而,如果我们直接dump的话,不能够得到有效的EXE。数据的目录是损坏的。Cryptor在处理PE文件的时候,为了将PE文件加载到连续的空间,而不是被节区逐一分开。因此如果没有被Cryptor存根加载的话是不能够单独运行的。RVA的地址保存为文件地址。

我用工具重新映射文件,显示了更多的信息,例如,PE文件名是setup.dll:

图片16.png

更正:如果我们在正确的时候捕获到解压后的文件,我们可以在文件破坏之前dump下DLL文件。最后的payload:542a38bf52afa6a4a008089a6fbf22c9d68ef5d6c634dd2c0773d859a8 ae2bbf

就像它的名字说的那样,该payload的角色是为下一阶段进行配置。首先,生成一个唯一的key用于后面的加密。这个key攻击者必须知道。这就是为什么是被ECC加密的,而且受害人可以看到个人识别码,而且这个key必须通过个人页面发送给攻击者。

这个随机值是通过Windows的Crypto API函数:CryptGenRandom生成的。下面,获取128位随机Key的过程:

图片17.png 

生成洋葱服务器地址:

图片18.png

获取DeviceControl检查磁盘参数:

图片19.png

读写磁盘:

图片20.png

在重写完磁盘后,开始crash系统,使用一个没有正式文档说明的函数NtRaiseHardError

图片21.png 

在这里,第一阶段对磁盘的改变已经完成。下面你可以看到被Petya的启动程序复写后的MBR:

图片22.png

下面的一些节区包含的备份是经过”7” XOR后的数据。之后可以看到复制的Petya代码(开始0×4400-节区34)。

还可以看到勒索信息的字符串,拷贝至磁盘:

图片23.png

步骤2

步骤2是向磁盘头部写入数据的代码的内部。这段代码是16bit的结构。

程序开始于引导加载,向内存中加载一个微型内核。下面我们可以看到加载函数。内核开始于节区34并且是32节区长度(包括保存的数据):

图片24.png

内核开始处:

图片25.png 

检查数据是否已经被加密,使用一个保存在节区54开始处的字节数据标志位。如果这个标志位没有置位,程序开始伪造磁盘检查的扫描。否则,显示红色屏幕。

图片26.png

磁盘扫面并加密MFT,使用Salsa20算法。使用的32byte长度的key,从地址0x6c01处读取。之后这个key就被清除。

Salsa20在Petya的多个代码段中用于加密,解密以及Key的认证。图解如下:

图片27.png 

内部相同的函数显示了红色屏幕,这个key的检查被调用。首先,用户提供一个key。最大的输入长度为73字节,最小为16字节。

图片28.png

调试

当然,我们是不能通过典型的用户层调试器调试这一阶段的Petya。我们需要进入底层当中。最简单的方法(我的个人看法)是使用Bochs internal debugger。我们需要完整的dump磁盘。接着可以使用Bochs加载它。

我使用下述的Bochs配置(“infected,.dsk”是我的磁盘dump):bochsrc.txt

运行Bochs特征:

图片29.png

Key认证

Key认证的过程分为以下几步:

1.读取用户的输入。

接收字符集:123456789abcdefghijkmnopqrstuvwxABCDEFGHJKLMNPQRSTUVWX,如果字符包括这些则跳过

只有前16个字节才会被存储。

2.使用普通算法加密提供的Key。加密的key长度为32字节。

3.节区55(512字节)中的数据读入内存//指向认证Buffer

4.存储在物理地址0x6c21(在TOR地址前)处的值被读入内存。这是一个8字节长的长整型数据,唯一的感染特征//指向一个唯一的值

5.认证的Buffer被256bit的Salsa20加密密钥加密,值也是唯一的

6.如果认证的buffer被7完全填充,那么意味着,提供的Key是正确的。

例如:加密key VS提供的key:

图片30.png

加密提供的key的算法很简单:

bool encode(char* key, BYTE *encoded)

{

    if (!key || !encoded) {

        printf("Invalid buffer\n");

        return false;

    }

    size_t len = strlen(key);

    if (len < 16) {

        printf("Invalid key\n");

        return false;

    }

    if (len > 16) len = 16;

 

    int i, j;

    i = j = 0;

    for (i = 0, j = 0; i < len; i++, j += 2) {

        char k = key[i];

 

        encoded[j] = k + 'z';

        encoded[j+1] = k * 2;

    }

    encoded[j] = 0;

    encoded[j+1] = 0;

    return true;

}

有效的key在解密过程非常重要。如果我们提供了伪造的钥匙,并试图通过它通过修改跳跃条件使得其有效,那么Petya将恢复原来的MBR ,但其他数据将无法正确解密,操作系统将无法运行。

当这个key传入检查,Petya显示”加密节区”的信息:

图片31.png

在完成后,会需要重启电脑。下面是Petya最后显示的屏幕,受害者最后需要处理勒索软件的信息:

图片32.png

结论

在架构方面,Petya非常先进和典型。高强度的FUD,以及混淆后的PE文件 – 勒索软件的心脏 – 一个小的内核 – 表现了作者对着一整套系统高度熟练。然而,选择低级别的架构执行具有一定的局限性:代码量过小和无法使用API调用。它使得加密更加困难,这也就是为什么需要由上层生成密钥 – Windows可执行文件。这个解决方案很好,但也引入了允许恢复密钥的弱点。

大部分的勒索软件作者充分展现了对用户体验的照顾,因此,即使是非技术人员也很容易进行付款。而这款勒索软件,用户体验非常糟糕。首先 – 拒绝访问整个系统不仅危害到用户,而且影响到了木马的分布,这就使受害者支付赎金更难。第二 – 个人识别号很长,而且不能从屏幕复制,这样很容易打错字。

*参考来源:blog.malwarebytes,FB小编东二门陈冠希编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

这些评论亮了

  • kg chen 回复
    @ 54ct28  错了,你这时候反而没办法支付赎金了。。。。
    )6( 亮了
发表评论

已有 9 条评论

取消
Loading...

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php