信息偷窃软件的研究案例解读(一)

      信息偷窃软件的研究案例解读(一)无评论

  介绍

  信息偷窃软件(stealer)是一种寻找机器上保存的密码并且远程发送(比如mail、HTTP)给攻击者的恶意软件。大部分stealer使用web接口来帮助浏览数据,特别当有众多重要目标的时候。比如说Pony的web接口,提供了对盗取数据以及信息来源于哪个应用程序的统计。

信息偷窃软件的研究案例解读(一)

  Pony的web接口上的统计数据

  Pony恶意软件窃取的大部分信用凭证是FTP账号和Bitcoin钱包。它也能盗取Firefox、Chrome以及Internet Explorer的数据。Pony配置程序给攻击者提供了一种选择,可以决定对哪个应用程序(被称为插件)最感兴趣。下面是配置程序界面的样子:

信息偷窃软件的研究案例解读(一)

  Pony信息窃取软件的配置程序

  对恶意软件的初次查看

  这次我们分析的样本是几天前上传到域名为“heritageibn.com”的服务器上的。不幸被下载了下来。Poney面板(web 接口)也放置在同样的web网站上,需要输入账号和密码才能进入。因为Web接口不在这篇文章的关注范围之内。我们将目光锁定到被我命名为“Pony.exe”的样本上。

  你可以在文章末尾的引用中提供的链接处下载样本。

  要想有一个好的恶意软件分析练习,我们需要在安全的环境中分析恶意软件。也就是,我们将使用Windows7 32位的虚拟机来执行和分析Pony窃密软件样本。

  恶意软件通常都会加壳,你或许已经注意到了上面的Pony配置程序界面,其中有一个包含对可执行程序UPX加壳的选项。也许你也知道,UPX压缩的文件是最容易提取的。实际上,UPX加壳程序提供了一个对UPX加壳的可执行程序脱壳的服务,除非对加壳程序的源代码或者可执行程序进行了修改。让我们用一个十六进制编辑器打开这个可执行程序,看看是否能够找到标识这个样本使用UPX加壳的字符串(如果加壳的选项被选中的话):

信息偷窃软件的研究案例解读(一)

  很清楚,这个文件使用了UPX加壳。因此,我们需要对这个样本脱壳。有两种方式可以实现。

  第一种方式是从互联网上下载UPX加壳程序,然后使用-d(decompress)参数来脱壳。

信息偷窃软件的研究案例解读(一)

  这种方法的问题在于,攻击者只需要修改UPX字符串中的一个字母,就会导致-d命令解压缩失败。这是因为工具在分析目标文件的时候会被干扰。

  第二种方法是在调试的过程中脱壳。当UPX代码在内存中完成对文件的解密后,他会跳到原始入口点OEP(Original Entry Point)处,然后执行Pony窃密软件的代码。在这种情况下提取出可执行文件非常容易,尤其是面对UPX的时候,因为它没有采取任何反提取(anti-dumping)的把

  因为脱壳不在这篇文章的范围之内,我不会深入细节。我们将继续在已经脱壳的可执行程序的基础上开展工作。

  下载我们有了脱壳了的可执行程序,首先我们提取出它里面的字符串,下面是一些提取出的字符串,可以使用OllyDbg,IDA Pro或者其它字符串提取工具完成。

信息偷窃软件的研究案例解读(一)

  其实有大量的字符串,我不能在一张图上把他们都包含进来,因此,我尽量展示一些我们感兴趣的。你可以清楚得看到,Firefox的注册表键被访问,或者是读取或者是写入!你也可以注意到,Pony攻击比特币钱包,如果你拥有比特币并且进行交易的话,会非常危险。关于比特币,wallet.dat文件中包含了下述细节:

  每个拥有者的密钥对的地址

  拥有者的交易地址。

  用户资料

  默认密钥

  保留密钥

  账户

  版本号

  密钥池

  遗憾的是,我们不能分析Pony窃密软件攻击的每一个应用程序,因为太多了,一个一个得分析是太耗费时间和精力。我们感兴趣的是恶意软件的行为,它是怎么加密数据的,它是怎么把数据发送到C&C服务器上的。

  入口点

  脱壳之后的样本的入口点是在0x00410EBF处

信息偷窃软件的研究案例解读(一)

  我们首先看下执行0x00410ED2之前的那一段启动代码,这段启动代码实际上在Pony的大部分函数中都有,它很容易理解。

  XOR EDX,EDX ; 把EDX置0

  XOR EAX,EAX

  XOR EDX,EDX

  push 00410ED2 ; 把实际要去执行的地址入栈

  NOP

  CLC ; CF = 0

  NOP

  JB SHORT 00410ED1 ;如果CF为1则跳转

  NOP

  RETN ; 弹出地址并且执行0x00410ED2处的指令

  程序在执行完0x00410E45处的指令并返回后,调用了ExitProcess函数,因此,我们到0x00410E45处看看它到底做了什么。

  构造一个定制的导入表

  除了默认的IAT(导入地址表)之外,样本还够造了第二个后续执行时会用到的导入表。这个表有一个定制的格式,而且使用如下方法调用表里指向的函数:CALL DWORD PTR DS:[ Address ]。这些函数是从下列DLL中导入的。

  ole32.dll

  crypt32.dll

  advapi32.dll

  shell32.dll

  netapi32.dll

  kernel32.dll

  msi.dll

  pstorec.dll

  userenv.dll

  对于每一个库,都会调用一个包含一些函数的循环来填写这个导入表,功能都是负责调用LoadLibrary获取一个被加载了的模块的句柄,然后针对这个模块调用GetProcAddress。

信息偷窃软件的研究案例解读(一)

  要填充的表的起始位置是一个静态地址,位于0x004153C5处。

  调整进程的token令牌

  在这一步中,Pony尝试调整进程的权限以便于执行它的任务。恶意软件尝试添加的权限如下:

  SeImpersonatePrivilege

  SeTcbPrivilege

  SeChangeNotifyPrivilege

  SeBackupPrivilege

  SeRestorePrivilege

  SeIncreaseQuotaPrivilege

  SeAssignPrimaryTokenPrivilege

  这些权限通过如下方式被一个一个地添加到token中:

  1、调用LookupPrivilegeValueA来查询权限的LUID。

  2、调用OpenProcessToken,以TOKEN_ADJUST_PRIVILEGES方式打开当前进程。

  3、调用AdjustTokenPrivileges,最终把权限添加到进程的token中。

  偷窃软件也调用GetusernameA函数,获取与当前线程绑定的用户名,并把字符串的指针保存在一个静态地址0×00418681处。

  访问注册表

  在这一部分,Pony开始使用OLE stream对象,并且会在其他任务中使用它们。使用CreateStreamOnHGlobal创建了一个steam对象。这个函数会返回一个指针,指向能用来存储任意类型数据的结构体。

  直接访问steam的结构是不容易的,因此OLE32提供了一个函数来获取真正的存储数据的指针的函数:GetHGlobalFromStream。

  然后,这个恶意软件创建了两个steam对象。我们会在这节的后面了解到,每一个都为了存储一类数据。然后它打开一个注册表键:

  “HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/”

  在Windows下,如果你想要卸载一个程序,比如你访问了控制面板中的添加/删除程序功能。有趣的是,添加/删除程序功能其实是用上述注册表键来获取展现给用户的应用程序的详细信息的。

  Pony所做的是使用RegEnumKeyExA迭代查找上述键的所有子键,然后检查子键是否包含了两个键值:“UninstallString” 和 “DisplayName”。前面的值是一个指向卸载软件的可执行程序的路径,后一个是软件的显示名称。如果这些值真实存在,他就会读取他们的内容然后保存到一个OLE stream中。现在明白了,两个stream用来存储两类不同的数据,一个stream是用来存储“UninstallString”的值的,另外一个用来存储“DisplayName”的值。在迭代完所有的子键之后,每一个stream都被拷贝到一个独立的内存处(动态分配),然后把指针保存到0x0041506E(UninstallString字符串)和0×00415072(DisplayName字符串)。最后,stream被释放掉。

  因为我们没有深入钻研Pony是如何从各类软件中窃取数据的,因为每一个都是独特的。我会展示一个小例子,说明样本是如何利用“UninstallString”的(stealer在其他目标软件中也使用了“DisplayName”)。

信息偷窃软件的研究案例解读(一)

  在这个例子中,Pony攻击CuteFTP软件。它迭代查询所有的卸载字符串,寻找CuteFTP对应的子串,直到它发现CUTEFTP子串在“UninstallString”中。如果在所有的字符串中都没发现这个子串,这就意味着这台机器上没有安装这款软件。

  对加密密钥进行解密

  用来加密与C&C服务器通信数据的加密密钥被一个简单的算法加密了。

  00410522 MOV EAX,DWORD PTR SS:[EBP+8]

  00410525 AND EAX,EAX

  00410527 JZ SHORT 00410535

  00410529 JMP SHORT 00410530

  0041052B DEC BYTE PTR DS:[EAX]

  0041052D DEC BYTE PTR DS:[EAX]

  0041052F INC EAX

  00410530 CMP BYTE PTR DS:[EAX],0

  00410533 JNE SHORT 0041052B

  00410535 LEAVE

  00410536 RETN 4

  加密的字符串“dcdclc{B3456”变成了“babajay@1234”。我们后面会看到,这个字符串会被用到加密过程中。

  解密一个单词表

  在运行过程中,一个加密了的单词表被解密,stealer会在后面用到它。这个加密同样非常弱。

  00402E5F PUSH EBP

  00402E60 MOV EBP,ESP

  00402E62 PUSH EDI

  00402E63 MOV EDI,DWORD PTR SS:[EBP+8]

  00402E66 JMP SHORT 00402E74

  00402E68 JMP SHORT 00402E6E

  00402E6A XOR BYTE PTR DS:[EDI],01 ; decrypting

  00402E6D INC EDI

  00402E6E CMP BYTE PTR DS:[EDI],0

  00402E71 JNE SHORT 00402E6A

  00402E73 INC EDI

  00402E74 CMP BYTE PTR DS:[EDI],0

  00402E77 JNE SHORT 00402E68

  00402E79 POP EDI

  00402E7A LEAVE

  00402E7B RETN 4

  单词表保存在0x00417F27处,被解密后,它包含下面的单词:samantha, michelle, david, eminem, scooter, asdfasdf等等。

  结论

  在这第一部分中,我们观察了Pony在开始盗取数据前做的事情。它读取了什么注册表键,以及为什么要读取!我们也看到它解密了一个字符串,这很明显是一个密钥,还有一个单词表将会被用于暴力猜解攻击。攻击图景现在依然还不完整,在第二部分我们将回答下列问题:

  Pony是如何偷取数据的?

  它是怎样加密他们的?

  Pony只偷取软件的密码吗?

  它在把所有的数据发往C&C之后还会做什么?

发表评论