PadCrypt是一款勒索软件的名字,首次在 推特@abuse_ch 提及到。 BleepinComputer.com 写了 两篇 关于PadCrypt的 文章 。 MalwareHunterTeam 也 在推特上提到了PadCrypt version 2.2.86.1的域名生成算法(DGA):
BleepinComputer.com 推送的版本是 2.2.97.0 :
下面是版本 2.2.86.1 在 2016 年 3 月 6 号生成的 24 个域名:
下面是版本 2.2.97.0 在 2016 年 3 月 6 号生成的 72 个域名:
为了重现 DGA ,我使用的样本是 PadCrypt 2.2.86.1 来源 Hybrid-Analysis 。
201510()
link
下面的这个样本是 PadCrypt 2.2.97.0, 来源 Lawrence Abrams 这里 ,可以从 virusshare 上下载。这个样本在 DGA 上做了很小的修改(具体可以看上面的推特)。
201619
link
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:
剩下的值 1010-1111 映射到相关的十六进制表示, ” a ” 到 ” f ” 。由于字母 a,b,c,d 和 f 同样在硬编码的映射中,和字母 ” enolmk ” 一样出现两次。
使用 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)
下面是 PadCrypt DGA 的特征:
只有 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% 。
推特上有人私信我如何逆向 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 混淆后的代码截图:
反编译的程序总共268行,并且是无法读取的。幸运的是,对应大多数已知的混淆器都有反混淆器。我使用的是免费开源的 de4dot 。它配备了21个反混淆器,使用下面的命令:
de4dot.exe padcrypt_2.2.97.0.exe -o padcrypt_2.2.97.0_deobf.exe
再来看一遍 DGA 程序,这次更短了,可读性较强的 C# 代码:
如果你喜欢, VB 代码也可:
*参考来源: johannesbader.ch ,FB小编东二门陈冠希编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)