有个笑话:女的说,你们能让论坛上的人吵起来,我就做你女朋友。男的发了一句话:PHP是世界上最好的语言。瞬间论坛就炸锅了,女的说好吧,我同意了,咱们去吃饭吧。男的:不!我一定要说服他们PHP必须是世界上最好的语言。今天揭秘一个“最好的语言”编写的木马——敲诈者木马。
背景
你永远叫不醒一个装睡的人。但,快递小哥可以!
虽说是一句戏言,但确实多少反映出了快递在大家心中的重要性。如果你收到一个带有快递公司发来的电子邮件通知,你会不会也希望快点打开看看是不是哪个朋友给你寄了什么东西等着你去取呢?最近我们就收到了这样的一个带有“快递单号”的电子邮件附件。唯一有些水土不服的就是——在中国用FedEx的确实并不很多……大写的PITY……
木马起始——FedEx_ID_00645987.doc.js
这个所谓的doc文档,其实是一个javascript脚本,而脚本的内容……好乱……
凌乱的javascript脚本代码经过简单的解密和格式整理,给大家呈现了一个比较漂亮的脚本格式如下:
整理后的javascript脚本代码脚本主要功能就是循环下载并执行木马。脚本中供提供了5个域名供下载(域名作用为备份,如果前面的域名可以下载,则不再尝试后面的域名):
脚本通过给URL传递不同参数的方式,获取不同的文件(返回状态码200且返回内容大于1000字节即判断为下载成功)。
最终木马获取如下文件(p.s. 根据后续实测,这五个文件仍在服务端不定期更新,本文仅描述文章撰写时下载到的样本行为):
如上表所示,脚本下载到本地的5个文件实际上被分成了3组:a1.exe和a2.exe各自独立运行;a.exe、php4ts.dll和a.php则同为一组。必须三个文件同时存在,脚本才会执行该木马,而且还会再执行完第三组之后打扫一下战场——删除掉木马文件并且修改注册表值用于关联被加密的文件:
根据VT的扫描结果来看,54家全球主流杀软中有12款产品可以检出该木马:
PHP木马分析其实这个木马最先引起我们兴趣的是后面下载的这三个一组的文件。之所以引起我们的兴趣,是因为根据我们的记录:a.exe和php4ts.dll其实都是人畜无害的合法程序。实际上,a.exe是PHP Thread Safe CGI(PHP线程安全通用网管接口),而php4ts.dll则是这个接口程序运行所必须导入的一个动态库文件:
把话说的通俗点,这两个程序其实就是一个php脚本的解释器。他们被下载下来的唯一目的——就是让a.php可以执行。所以就让我们看看这个a.php吧:
代码逻辑并不复杂,脚本会遍历C盘到Z盘的所有盘符下的文件,并跳过含有以下字符串的目录:
winntbootsystemwindowstmptempprogramappdataapplicationroamingmsofficetemporarycacherecycle
查找以下这些扩展名的文件:
zip|rar|r00|r01|r02|r03|7z|tar|gz|gzip|arc|arj|bz|bz2|bza|bzip|bzip2|ice|xls|xlsx|doc|docx|pdf|djvu|fb2|rtf|ppt|pptx|pps|sxi|odm|odt|mpp|ssh|pub|gpg|pgp|kdb|kdbx|als|aup|cpr|npr|cpp|bas|asm|cs|php|pas|class|py|pl|h|vb|vcproj|vbproj|java|bak|backup|mdb|accdb|mdf|odb|wdb|csv|tsv|sql|psd|eps|cdr|cpt|indd|dwg|ai|svg|max|skp|scad|cad|3ds|blend|lwo|lws|mb|slddrw|sldasm|sldprt|u3d|jpg|jpeg|tiff|tif|raw|avi|mpg|mp4|m4v|mpeg|mpe|wmf|wmv|veg|mov|3gp|flv|mkv|vob|rm|mp3|wav|asf|wma|m3u|midi|ogg|mid|vdi|vmdk|vhd|dsk|img|iso
打开每一个符合扩展名要求的文件,读取前1024字节并和密钥做循环异或加密。加密完成后再将修改后的文件加上一个.crypted扩展名——万事大吉。
只是让我们很疑惑的是——虽然php这世界上最好的语言(好吧,这只是个梗),但木马作者是如何用php在这么一段并不算长的代码中实现不对称加密的敲诈者代码的?
细读代码之后恍然大悟——并没有实现……这段代码的加密方式采用了对称加密算法,准确的说是循环异或加密。更加“人道主义”的是——这个php的加密代码其实是“两用”的,只要修改脚本中的一个参数,整个脚本立刻成为了解密脚本。可以直接将加密的文档解密回去:
所以说世界已经这么乱了,不对称加密的敲诈者满天飞的今天,对称加密敲诈者能不能就不要来添乱了?
当然,也并不是说这个脚本就人畜无害了——对称加密没有密钥想解开依然很麻烦,虽然我们这里拿到密钥了,但上面已经说了:木马作者再服务端依然持续更新着木马的内容,并且木马运行后会自删除,所以说虽然是对称加密,但依然有可能因为找不到加密时的密钥导致依然很难解开文件(难,但并非无解)……
但这都不是重点,重点是木马在加密完文件之后给出的敲诈信息:
相对于那些动辄两三个比特币的敲诈者木马来说,0.40290个比特币虽然有零有整的程度令人发指,但确实也算是价钱厚道了。但你所谓的“RSA-1024”是什么鬼?明明就是个简单的循环异或加密好么!不要假装自己是高大上的不对称加密好么!WTF……
POWERSHELL木马分析
然后我们再来说说两个独立运行的powershell木马。虽然a1.exe与a2.exe是各自独立运行的,但因为他们的行为基本相同,所以我们这里合并为一个来做统一说明。
样本首先会执行注入功能:
之后对线程做恢复以便执行注入后的代码:
完成后,恶意代码会检测机器环境——对不知处powershell的系统安装微软的KB968930补丁(补丁相关说明:https://www.microsoft.com/en-us/download/details.aspx?id=16818),添加对powershell的支持:
在确保用户环境可以执行powershell之后,注册一个文件关联,在文件打开的shell command中执行一段脚本:
这是一段短小精悍的脚本,但系统会根据这段短小的脚本的指令,再次访问注册表去执行注册表中的另一段恶意代码:
通过这种方式,恶意程序将恶意代码全部保存在注册表中,而落地文件只是用于触发恶意代码的执行,本身并没有恶意代码。落在本地的文件根本没有恶意代码,这样就更容易绕开安全软件的扫描检测。
我们导出含有恶意的代码的注册表内容,如下:
虽然已经是落在注册表中,但显然木马作者还是不放心——依然是用了多次的加密来掩盖这段代码的行为意图。经解密,我们得到的最终执行代码正是一段powershell代码:
显然,虽然已经解密到最终一步,但中间的变量“$sc32”依然让人看着有些不知所云……但看到ps1代码的最后,发现其实这已经是最终代码了。最终就是将$sc32的内容全部加载带内存中执行:
我们把数据dump出来,发现代码会从远端下载文件到本地执行,并且还会判断一下文件是否是有效的可执行程序——典型的下载者木马:
非PE渐成趋势
随着安全软件的普及,木马病毒与安全软件的对抗也逐渐变成了“近身肉搏战”,大家都在钻细节,都想在对方忽略的某个小点上做单点突破——这样一来,各种脚本甚至连脚本都不算的数据文件就显现除了相对于传统PE格式木马更多的优势。
这次出现的敲诈者木马就是典型的例子——一个javascript脚本木马释放出了一个php脚本木马和两个powershell脚本木马。而powershell木马甚至都没有落成ps1脚本而是直接在注册表中存储,php木马有落地的php文件,但php脚本既然能实现对称加密的敲诈者木马,更高一级的不对称加密敲诈者木马真的还会远么?
当然,并不是说非PE就可以为所欲为了,既然是近身肉搏,安全软件的响应自然也不会处于下风——兵来将挡水来土掩,我们已经做好了战斗准备。