Petya不同于其他受欢迎的人ransomware这些天。相反,通过一个加密的文件之一,它拒绝通过攻击在磁盘上的低级别结构的访问整个系统。这勒索的作者们不仅创造了自己引导加载程序但也有很小的内核,这是32个扇区长。

彼佳的滴管在盘的开头写入恶意代码。受影响的系统主引导记录被自定义引导加载程序覆盖,该加载程序加载一个微小的恶意内核。然后,该内核继续进行进一步的加密。Petya的勒索信上说加密了整个磁盘,但这不是真的。相反,它加密主文件表(MFT)使文件系统不可读。

[更新]阅读最新版本:黄金眼


预防提示:Petya在感染的第二阶段是最危险的,这一阶段开始时,受感染的系统在滴管引起的蓝屏后重新启动。为了防止您的计算机自动进入这个阶段,请关闭系统故障后自动重启看看怎么做).

如果您在阶段1中检测到Petya,您的数据仍然可以恢复。关于它的更多信息是(在这里)而在这篇文章。

更新:2016年4月8日,Petya第二阶段已被破解leo-stone.阅读更多:https://petya-pay-no-ransom.herokuapp.com/https://github.com/leo-stone/hack-petya.帮助磁盘恢复的教程是在这里


分析样品

来自另一个活动的主要可执行文件(PDF图标)

特别感谢:弗洛里安·罗斯-为了分享样本,——对建设性的讨论
Twitter。

行为分析

这种勒索软件通过以求职申请为主题的诈骗邮件发送。电子邮件附带一个Dropbox链接,恶意ZIP就在那里。这个初始ZIP包含两个元素:

  • 一个年轻男子的照片,声称是一个申请者(事实上这是一个公开的库存图片)
  • 一个可执行文件,假装是一个自解压缩文件或PDF格式的CV(实际上它是一个恶意的droppper,以32位PE文件的形式):

petya_exe“width=

为了执行它的有害特性,它需要使用Administrator权限运行。然而,它甚至没有尝试部署任何用户帐户控制(UAC)旁路技术。它完全依赖于社会工程。

当我们尝试运行它时,UAC弹出这个警告:

uac_popup“width=

部署应用程序后,系统崩溃。当它重新启动时,我们看到下面的画面,这是一个模仿CHKDSK扫描:

1“width=

实际上,恶意内核已经在加密了。当它完成时,受影响的用户会遇到这个闪烁的屏幕,上面有一个ASCII图案:

2“width=

按下一个键就会进入主屏幕,屏幕上有勒索信和所有必要的信息,这些信息可以到达网络面板并进行付款:

3.“width=

感染阶段

这ransomware两个感染阶段

第一个由dropper (Windows可执行文件)执行。它覆盖磁盘的开始部分(包括MBR),并对原始数据进行异或加密备份。这一阶段以故意执行BSOD.在这一点上保存的数据是比较容易的,因为只有被攻击的磁盘开始被覆盖。文件系统不被破坏,我们仍然可以安装该磁盘,并使用其内容。这就是为什么,如果你怀疑你有这样的勒索软件,我们推荐的第一件事情是不重新启动系统。相反,使磁盘转储。最终,你可以在这个阶段,装载该磁盘到另一个操作系统并进行文件备份。参见:彼佳关键译码器

before_reboot“width=

第二阶段是由假CHKDSK扫描中执行。在此之后,文件系统被破坏,无法读取。

destroyed_filesystem“width=

然而,这是不正确的全磁盘加密。如果我们通过取证工具查看它,我们可以看到许多有效的元素,包括字符串。

infected_disk_fragment“width=

受害者网站

我们注意到,针对受害者的网站准备充分,内容丰富。菜单提供了几种语言版本,但目前只有英语版本:

page_main“width=

它还提供了受影响用户如何恢复数据的一步一步的过程:

指南“width=

  • 步骤1:输入您的个人标识符
  • 第二步:购买比特币
  • 第三步:做一个比特币交易
  • 第四步:等待确认

我们希望网络罪犯尽可能少地泄露自己的信息。但在这种情况下,作者和/或发布者非常开放,共享团队名称——“Janus网络犯罪解决方案”——以及项目发布日期——2015年12月12日。此外,他们还提供更新的新闻feed,包括关于他们的新闻参考:

新闻“width=在问题或问题的情况下,还可以通过网络的形式与他们联系。

petya_support“width=

内部

阶段1

正如我们前面提到的,执行的第一个阶段是在Windows可执行文件。它是装在一个良好的质量FUD / cryptor这就是为什么我们看不到的恶意代码在第一。执行开始于是无害的,只对欺骗的目的和保护有效载荷使用的层。真正的恶意功能是有效负载动态解压到内存里面。

下面您可以看到正在运行的进程的内存。属于原EXE的代码被标记为红色。未打包的恶意代码被标记为蓝色:

petya_payload_mem“width=

解压缩的内容是另一个PE文件:

petya_payload_mem2“width=

然而,如果我们试图转储它,我们不会得到一个有效的可执行文件。它的数据目录被销毁。加密器对PE文件进行了处理,以便在连续的空间中加载,而不是按节划分。它失去了独立运行的能力,没有被加密的存根加载。保存为RVA的地址实际上是原始地址。

我已经使用自定义工具重新映射了它们,它显示了更多的信息,即这个PE文件的名称是Setup.dll

setup_dll“width=

更新:如果我们在正确的时刻捕捉到解包的过程,我们可以在DLL被销毁之前转储它。最终有效载荷为:7899年d6090efae964024e11f6586a69ce

顾名思义,有效负载的作用是为下一阶段设置一切。首先,它生成一个惟一的密钥,用于进一步加密。攻击者也必须知道这个密钥。这就是为什么它被ECC加密,并作为个人标识显示给受害者,必须通过个性化页面发送给攻击者。

随机值由Windows Crypto API函数检索:CryptGenRandom.下面,它得到128个随机字节:

gen_random“width=

制作洋葱地址:

generated_random“width=

使用。检索磁盘参数DeviceIoControl

device_io_control“width=

对磁盘的读写:

physical_drive_create2“width=

覆盖盘开始后,就故意崩溃的系统,使用无证功能NtRaiseHardError

raise_error“width=

此时,磁盘上的更改的第一阶段已经完成。下面你可以看到MBR被Petya的引导加载程序覆盖:

受感染的“width=

接下来的几个扇区包含原始数据的备份与异或“7”。在此之后,我们可以找到复制彼佳代码(从0x4400开始-扇区34)。

我们还可以看到,显示在赎金的字符串,复制到磁盘:

petya_string“width=

第二阶段

阶段2在写入磁盘开头的代码内部。此代码使用16位架构。

执行从一个引导加载程序开始,它将微小的恶意内核加载到内存中。下面我们可以看到加载函数的执行。内核从34扇区开始,它是32扇区长(包括保存的数据):

copy_sectors“width=

内核的开始:

jump_next“width=

使用保存在扇区54开头的一个字节标志来检查数据是否已经加密。如果该标志未设置,程序将进行假CHKDSK扫描。否则,它将显示主屏幕的红色。

to_fake_chkdsk“width=假CHKDSK加密使用MFTSalsa20算法。使用的密钥长度为32字节,从地址0x6C01读取。之后,密钥就会被删除。

Salsa20在Petya的代码中用于多个地方——用于加密、解密和密钥验证。见下图:

flow_to_salsa“width=

在显示红色屏幕的同一功能内关键检查程序被调用。首先,系统将提示用户提供密钥。最大输入长度为73个字节,最小是16个字节。

check_key“width=

调试

当然,我们不能通过典型的方式调试Petya的这个阶段用户空间调试器是分析恶意软件的临时工具。我们得去底层。在我看来,最简单的方法是使用Bochs内部调试器.我们得把被感染的磁盘全部转储出来。然后,我们可以在Bochs下装载它。

我用下面的Bochs配置(“infected.dsk”是我的磁盘转储):bochsrc.txt

这是它看起来如何在Bochs的运行:

petya_bochs“width=

主要验证

密钥验证步骤如下:

  1. 读取用户的输入。
    • 接受的字符集:123456789 abcdefghijkmnopqrstuvwxabcdefghjklmnpqrstuvwx-如果出现该字符集之外的字符,则跳过该字符集。
    • 只有第一16个字节存储
  2. 提供关键是由自定义算法编码的。编码的关键长度为32字节。
  3. 扇区55(512字节)的数据被读入内存//它将被表示为验证缓冲
  4. 存储在物理地址0x6c21(就在Tor地址之前)的值被读入内存。这是一个8字节长的数组,对于特定的感染是唯一的。//它将被表示为现时标志
  5. 验证缓冲是用256位加密的吗Salsa20编码的关键现时标志
  6. 如果,由于应用程序的结果,验证缓冲完全充满“7” - 这意味着提供关键是正确的。

例子:编码的关键提供关键

processed_pa​​ssword“width=
编码提供的密钥的算法非常简单:

保龄球编码字符* key, BYTE *encoded)
{
如果(!密钥|| !encoded) {
printf无效的缓冲\ n);
返回
}
size_tlen =strlen.(关键);
如果(len <16){
printf无效的关键\ n);
返回
}
如果(len >16) len =16
intI,J;
I = j =0.
对于(我=0.j =0.;我<兰;我+ +,+ =2){
字符k =键(我);
编码[j] = k +'Z.'
编码[J +1] = K *2
}
编码[j] =0.
编码[J +1]=0.
返回真正的
}

有效的密钥对于解密过程非常重要。如果我们提供一个伪造的密钥,并试图通过修改跳转条件将其作为有效的传递,Petya将恢复原始的MBR,但其他数据将无法正确解密,操作系统将无法运行。

当钥匙通过检查时,Petya显示了“解密扇区”的信息和进度。

decrypting_petya“width=

它完成后,它会要求重新启动计算机。下面是彼佳的最后一个画面,显示出用户终于摆脱这个勒索的:

petya_last“width=

结论

从结构上看,彼佳是非常先进和典型。良好的品质FUD,以及混淆滴管 - 和勒索的心脏 - 一个小的内核 - 描述了作者在高技能。然而,选择低级别的架构执行一定的局限性,即:代码和无法使用API​​调用大小小。它使加密困难。这就是为什么由更高层生成的密钥的 - 的Windows可执行文件。该解决方案的效果很好,但是引入了一个弱点,允许恢复密钥(如果我们设法抓住彼佳在第1阶段,关键是消除之前)。此外,作者试图用做了准备Salsa20实现,并做一些细微的改变,以采用16位架构。但是他们没有意识到,改变变量的大小会引发严重的漏洞(详细描述可以在Checkpoint的文章).

大多数勒索软件的作者都很在意用户体验,所以即使非技术人员也能很容易地付款。在这种情况下,用户体验非常糟糕。首先,拒绝进入整个系统不仅对用户是有害的,而且对勒索软件的发布者也是有害的,因为这使得受害者支付赎金更加困难。第二,个人标识符很长,不能从屏幕上复制。把它打错几乎是不可能的。

总体而言,彼佳勒索的作者写道质量好的代码,是,但是 - 错过了目标。在用户态运行勒索软件可能同样或更危险。

附录

其他供应商关于Petya:

读也:


这是由Hasherezade,独立的研究员和程序员,在资讯安全的强烈兴趣写一个客户后。她喜欢详细介绍恶意软件,并与社区分享威胁信息。看看她的推特@hasherezade.以及她的个人博客:https://hshrzd.wordpress.com