安全分析与研究
专注于全球恶意软件的分析与研究
样本简介
Dridex是目前全球活跃的技术最先进的银行木马之一。该恶意软件的主要目标是从受害者身上窃取银行凭证。Dridex自2014年以来一直存在,并且一直在更新,这些更新帮助恶意软件不断发展并变得越来越强大。
由于黑客组不断的技术改进发展,Dridex当前支持非常先进的功能,例如Atom Bombing注入技术,将Web注入Chrome和Microsoft Word的0day漏洞,这帮助Dridex恶意软件感染了无数机器。
Dridex被归类为GameOver ZeuS的演变,它借鉴了该病毒的C&C架构并对其进行了进一步改进,从而使控制服务器很难确定。Dridex银行木马还具有与其他恶意软件CRIDEX和Bugat相似的特征。尽管最新消息Dridex主要依赖漏洞作为攻击媒介,但Dridex还使用垃圾邮件感染受害者的计算机。
行为分析
变种分析
XSL文件
上面这个样本的服务器已经不能通信了,该病毒的最新变种前面的步骤和上面的都差不多,到这一步的xsl文件内容不同,最新的变种的xsl文件从服务器下载的是个dll文件。保存在C:/Windows/Temp文件下,名称是随机命名的。
第一段shellcode
拷贝数据
将加密的数据复制到指定的地址。
解密数据
对加密的shellcode进行解密。
修改内存页属性
修改shellcode所在地址内存执行权限为可读可写可执行。
执行shellcode
跳转到shellcode执行。
自解密
解密自身中加密的代码
解密shellcode中的代码。
获取指定函数地址
获取函数地址kernel32.dll中指定函数的地址。这里shellcode当中使用的循环,每次都对kernel32.dll的导出表进行遍历,找到需要的函数名之后在从头开始遍历
获取加载基址
通过pe头标志和对地址每次减0x1000来获取加载基址。
申请新的空间
申请内存空间
第二段shellcode
拷贝数据
将shellcode拷贝到刚申请的内存空间当中。
执行并拷贝第三段shellcode
上面拷贝完第二段shellcode之后,接着执行第二段shellcode中的内容,然后拷贝第三段shellcode的内容到内存中。
位置变换
将从dll里面拷贝的数据以特殊的方式进行调整位置。末尾是2FB的函数就是调整位置的函数。
解密shellcode算法
调整完位置之后在对数据进行解密。解密方式用的xor DL,DL中的内容根据循环次数和3做AND操作,为0就变换一次DL中的内容。DL中内容的变换规律是DL和DL相加,结果乘以3然后在右移5位,得到一个新的DL。
末尾是2CE的函数是解密函数。
第四段shellcode
接着申请空间,然后拷贝第四段shellcode的数据到新申请的空间。
拷贝依据
判断是否接着拷贝数据是根据之前第三段shellcode最终解密出来的数据。当值不为0的时候就继续执行拷贝。
最后一次拷贝
最后一次拷贝。
释放空间
释放第三段shellcode申请的空间。
位置变换
对刚才拷贝的数据以特殊的方式进行调整。
解密shellcode
和上面解密第三段shellcode使用的算法相同。
特殊处理
解密之后对数据进行了特殊的处理,处理之后变成了pe文件。
释放FLS
释放FLS索引。
dll替换
修改内存页属性
更改1220000地址的内存页属性为可读可写,这个地址就是dll加载的地址。
清除原来数据
清除加载的dll的内容。
替换dll内容
将上面处理的pe文件拷贝到刚才清空的空间当中。
按照pe信息中的节依次拷贝过去。
修改内存页属性
把上面修改的内存页属性在改回来。
修改对应段的内存页属性
代码段所在内存页修改为可读可执行。
资源数据段内存页修改为可读
数据段内存页修改为可读可写
重定位段内存页修改为可读
释放资源
释放原始数据的空间。
清除当前执行的shellcode。
执行替换之后的dll
之后retn返回到最初加载的dll文件里面,但是这个内存空间里面的数据都是被替换的新的数据,retn到的是新的dll文件的OEP。
替换之后的dll
自己实现的获取字符串的长度。
hash加密
末尾为0510的函数的功能为对指定的字符串进行加密。
在0510函数内部调用的是13C0这个函数,函数内部通过移位异或等方式处理过后在循环0x100次之后加密完成。
加密之后的字符串和0x6AECC489异或之后如果为0xADC2B18也就是ntdll.dll就通过自己实现的GetProcAddress函数获取指定函数的地址。
末尾为4200的函数功能是根据传递的dll的地址和函数名加密后的hash获取函数的地址。这里为获取0xD047C681的地址,也就是RtlAddVectoredExceptionHandler函数。
遍历dll的导出表,然后对函数名进行加密,之后比对加密过后的值是不是自己需要的函数。
注册VEH异常
获取到需要的函数之后,3790函数作用为执行获取到的函数。这里执行RtlAddVectoredExceptionHandler为注册VEH异常,其中6A686CB0为异常处理函数。
上面这些就是0F60函数的功能。
GetProcAddress函数
注册完VEH异常之后获取kernel32.dll中的函数。
在3BB0函数里面判断字符串是不是kernel32.dll
B140函数的主要功能。
函数44C0为GetProcAddress,传递进去的两个参数一个是dll的加载基址,另一个是函数名。这里0xADC2B18是ntdll,0x92E0E512是RtlCreateHeap函数,0xD084EC36是RtlDestroyHeap函数。
执行RtlCreateHeap
异常处理函数
之后获取0xCB389DFD RtlAllocateHeap函数的地址,获取之后判断是否获取成功,之后触发INT3 异常。
跳转到VEH异常处理函数里面。
对异常进行处理,分析发现是直接修改线程上下文,跳过了INT3异常。
跳过异常之后通过retn执行RtlAllocateHeap函数。
通过异常retn执行RtlAllocateHeap循环申请内存空间
获取RtlComputeCrc32函数地址
最终这里获取到ExitProcess函数的地址,然后退出了程序。不知道有什么地方的判断条件不满足,所以程序没有执行下去。
木马特征
1.通过office宏从服务器下载恶意文件。
2.恶意文件被加密做过免杀处理。
3.执行全部过程采用无文件加载,所有的内容都在内存中。
4.关键函数被hash加密处理过。
5.导出表,导入表等信息被加密。
6.自己重写GetProcAddress函数。
7.注册VEH异常,调用异常处理函数执行异常,增加调试难度。
恶意软件研究需要大量的专业知识储备,而且需要掌握很多不同的专业技能,同时需要研究人员持之以恒的研究态度,是一项非常具有挑战性的安全研究工作,需要付出很多的时间和精力,银行类木马又是一种非常复杂的恶意软件家族,这篇文章进行了深入的分析与研究。
威胁情报收集
常常有读者朋友通过微信或其他方式给我发送一些新的恶意软件或遇到的一些网络攻击案例,非常感谢这些朋友或公众号读者给我提供这些最新的攻击样本和威胁情报,同时也欢迎各位读者朋友,不管是你的企业,还是你个人遇到了一些网络安全攻击事件,都可以通过微信或邮件给我提供各种相关的威胁情报,这些威胁情报包含:
样本
域名
IP地址
钓鱼邮件
钓鱼网站
以及其它一些相关的安全威胁情报信息,同时笔者为了让更多从事这方面的专业人员可以一起交流学习,相互讨论,共同进步,也为了培养更多这方面的专业人才,成立了一个"虚拟的"MR安全团队,有一个MR安全团队微信群,群里的成员可以随时交流讨论各种关于恶意软件的相关话题,专注于全球恶意软件家族的分析与研究,跟踪分析全球黑客组织攻击活动
MR安全团队的成员需要分享自己业余时间的一些安全技术分析报告或相关研究文章等,这样可以帮助更多想从事这个方向的新人,有兴趣的可以找我私聊,加入MR安全团队微信群,一起学习,共同进步,同时MR安全团队的成员,可以免费加入笔者的知识星球和专业群,与更多安全行业各个不同方向的朋友进行交流,学习!
目前针对我国的黑客攻击行为越来越多,各种远控木马、窃密后门、勒索病毒、APT攻击行动已经层出不穷,未来有组织有目的的攻击行为会越来越多,全球网络安全战已经开始,各个黑客组织都在不断的研发自己的新的恶意软件以及各种攻击武器,预计到2021年全球的恶意软件成本会高达6万亿美元
可以说恶意软件已经无处不在,企业数据安全受到了严重的威胁,各种窃密木马以及远控软件横行,地下黑客组织的各种网络犯罪活动未来也会越来越多,不管是政府部门,还是各大中小型企业都是黑客攻击的目的,黑客组织无时无刻不在寻找着新的攻击目标
随着未来各种平台的不断增多,各种新型的恶意软件将会无处不在,黑客组织也在不断开发研究新型的恶意软件做为网络攻击武器,未来会需要更多专业的恶意软件研究人员,安全的路很长,坚持,坚持,再坚持!