转载

勒索软件PadCrypty域名生成算法分析

PadCrypt是一款勒索软件的名字,首次在 推特@abuse_ch 提及到。 BleepinComputer.com 写了 两篇 关于PadCrypt的 文章 MalwareHunterTeam 也 在推特上提到了PadCrypt version 2.2.86.1的域名生成算法(DGA):  

勒索软件PadCrypty域名生成算法分析

BleepinComputer.com 推送的版本是 2.2.97.0

勒索软件PadCrypty域名生成算法分析

下面是版本 2.2.86.1 2016 3 6 号生成的 24 个域名:

勒索软件PadCrypty域名生成算法分析

下面是版本 2.2.97.0 2016 3 6 号生成的 72 个域名:

勒索软件PadCrypty域名生成算法分析

为了重现 DGA ,我使用的样本是 PadCrypt 2.2.86.1 来源 Hybrid-Analysis

201510()

link

下面的这个样本是 PadCrypt 2.2.97.0, 来源 Lawrence Abrams 这里 ,可以从 virusshare 上下载。这个样本在 DGA 上做了很小的修改(具体可以看上面的推特)。

201619

link

0×01 DGA  设计

PadCrypt 2.2.86.1 DGA 一天生成 24 个域名, PadCrypt 2.2.97.0 是它的三倍( 72 )。 DGA 均使用 SHA256 哈希值作为生成方案。其他恶意软件家族的哈希包括 Bamital , Murofet , ,Pushdo(MD5) Dyre(SHA-256)

PadCrypt  的数字没有进行复杂的变化,只有域名数字( 0 23 )的当前时间采用 hash 值。在  2.2.86.1 和  2.2.97.0 唯一的不同就是时间和域名数字分开了。在旧的版本中被 (eg,6-3-2016:17) 分开;在新的版本中 (eg:6-3-2017|17)

Hash 值的最后四位决定了是否为顶级域名。他 4 位值用作顶级域名的硬编码列表的索引。列表中只拥有 11 个域名,第一个顶级域名用来代替更大的指数级。这就使得第一域名 .com 比其他域名更普通了。 3-18 位决定了 16 个第二级别的特性。第二级别的特性映射到一个硬编码的列表中 0000-1001:

勒索软件PadCrypty域名生成算法分析

剩下的值 1010-1111 映射到相关的十六进制表示, a f 。由于字母 a,b,c,d f 同样在硬编码的映射中,和字母 enolmk 一样出现两次。

0×02 重现

使用 python 重现 DGA 。使用 -d 或者 –date 参数设置日期。如果不提供日期,那么当天的域名就已经生成了。你可以通过 -V 或者 –version 选择 DGA 的版本。你也可以在我的 Github 上找到日后改进的 DGA 重现过程。

The DGA of PadCrypt 

See 

- https://twitter.com/BleepinComputer/status/705813885673201665

- http://www.bleepingcomputer.com/news/security/padcrypt-the-first-ransomware-with-live-support-chat-and-an-uninstaller/

- http://www.bleepingcomputer.com/news/security/the-padcrypt-ransomware-is-still-alive-and-kicking/

- http://johannesbader.ch/2016/03/the-dga-of-padcrypt/

"""

import argparse

import hashlib

from datetime import datetime

configs = {

"2.2.86.1" : {

'nr

mapping': "abcdnfolmk",

'separator': ':',

},

"2.2.97.0" : {

'nr

mapping': "abcdnfolmk",

'separator': '|'

}

}

def dga(date, config

dm = config[]

tlds = config[]

for i in range(config[]):

seed

str.encode('ascii')).hexdigest()

domain = ""

for hh in h[]:

domain += dm[] if '0' 

= len(tlds) else tld

yield domain

if =="":

parser = argparse.ArgumentParser()

parser.add

argument("-v", "--version", help="dga version", 

choices=["2.2.86.1", "2.2.96.1"], default="2.2.86.1")

args = parser.parse_args()

if args.date:

d = datetime.strptime(args.date, "%Y-%m-%d")

else:

d = datetime.now()

for domain in dga(d, args.version): 

print(domain)

0×03  特征

下面是 PadCrypt DGA 的特征:

勒索软件PadCrypty域名生成算法分析

只有 11 个字符组成二级域名的字符集。连同 16 个字符的固定长度,这就使得域名更好的归因于 PadCrypt 。分配如下:

a: 12.5 % 

b: 12.5 %

c: 12.5 %

d: 12.5 %

e:  6.25 %

f: 12.5 %

k:  6.25 %

l:  6.25 %

m:  6.25 %

n:  6.25 %

o:  6.25 %

在顶级域名中, .com 占据 37.5% ,其余的 10 个顶级域名大概占据 6.25%

0×05  附录 - 如何逆向

推特上有人私信我如何逆向 DGA ,这里展示如何简单逆向 PadCrypt

PadCrypt 使用 .NET4.5 编写的。我们可以使用 .NET 反编译器打开二进制文件。我用的是免费且很好用的 dnSpy 。自然 PadCrypt 的作者意识到,反编译中间语言比较简单,因此他们使用一定的保护手段。因此在 PadCrypt 2.2.86.1, 2.2.97.0  和最近的版本  2.2.120.0 使用了 DeepSea4.1 ,当你用 dnSpy 打开二进制文件时,只会得到散乱的代码。下面是 DGA 混淆后的代码截图:

勒索软件PadCrypty域名生成算法分析

反编译的程序总共268行,并且是无法读取的。幸运的是,对应大多数已知的混淆器都有反混淆器。我使用的是免费开源的 de4dot 。它配备了21个反混淆器,使用下面的命令:

de4dot.exe padcrypt_2.2.97.0.exe -o padcrypt_2.2.97.0_deobf.exe

再来看一遍 DGA 程序,这次更短了,可读性较强的 C# 代码:

勒索软件PadCrypty域名生成算法分析

如果你喜欢, VB 代码也可:

勒索软件PadCrypty域名生成算法分析

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

原文  http://www.freebuf.com/vuls/98403.html
正文到此结束
Loading...