样本的概要分析是10号的时候就写好的,拖延症一直没有把中间有一部分写清楚,今天抽了个时间完善了一下,在这里分享给大家。
由于微信号图片被压缩的原因,感兴趣的朋友可以到我语雀上查看,地址:
https://www.yuque.com/p1ut0/qtmgyx/hg3gzu
这是一个个人公众号,偶尔想起来会在这上面随便叨叨两句,言论、观点仅代表个人。谢谢大家支持。
样本来源于日常app.any.run的样本
样本MD5:71bdecdea1d86dd3e892ca52c534fa13
样本上传名:exe.PDF.bat
样本上传时间,就是今天(2020年9月10日)下午四点十分
可以看到any.run已经将其标记为恶意并且可以从 any.run的沙箱中看到恶意行为是执行了一段powershell指令。
在VT上查了一下样本,惊奇的发现,现在居然只有一家厂商给出了明确的报毒:Downloader.WannaMine
原始样本的确是bat的文件,编辑工具加载后内容如下:
这是一段很简单的bat内嵌powershell代码,通过bat脚本隐藏窗口执行powershell代码,执行的代码为红色部分。
大概阅读一下这段powershell代码就可以知道这里是将前面的@符号替换并进行转换然后通过最后的I`E`X加载执行。
所以直接把最后面的I`E`X 更改为echo 然后把这一整段powershell代码抽出来保存到一个ps1文件中:
然后powershell窗口执行这个ps1脚本,通过管道输出到新文件中,解码出来的内容如下:
这段代码首先是通过$Tbone='*EX'.replace('*','I')声明了一个名为$Tbone的变量,这个变量实际就是IEX
接着通过sal M $Tbone给变量定义了别名M,可以看到M在程序最后有使用,这是一种免杀操作。
格式化一下代码如下:
代码首先会尝试connection连接google.com保证网络畅通。
当确保网络畅通之后,代码在后面拼接一个对象,用于通过IEX执行一个下载指令,将下载回来的内容存储到变量$mv中,这里的下载链接为: http://topometria.com.cy/A12.jpg
关于topometria,暂时没有相关的威胁情报。
最后,程序将下载回来的数据$mv 以 - 分割,然后作为byte数组加载执行
还好,现在样本能够正常下载回来。
下载回来的文件名为A12.jpg,用编辑器打开可以看到是一段以-分割的数据
根据之前的代码操作,可以知道这里会首先将-分割成一个数组,然后转成byte,我们知道最后的数据类型是byte,所以这里直接将- 替换为空格
然后以byte的形式赋值到010中:
这里可以看到,byte解码出来其实是一段脚本代码
通过010转换为文本即可看到源码:
看到这种代码不要怕,观察一下就可以找到关键地方
首先看看脚本最开始的地方,首先是执行了$t0=-Join ((111, 105, 130)
这里的111 105 130 解出来就是IEX
所以最开始是同样的操作,给IEX声明了一个别名g用于后面调用。
然后程序声明了一个超级长的String,根据开头的[String]$nebj='4D5A9>^>^3>^可以知道这里其实是一个PE文件,后面肯定会有操作把这里的 特殊符号替换为00
所以跳转到最下面的代码看看:
这里首先可以看到, 在刚才声明的长字符串最后,果然通过replace将特殊符号替换为了00
然后可以看到程序执行了一个 [Byte[]]$JJAr=PuKkpsGJ $CDbvWcpeO
这里可以看出来是将$CDbvWcpeO(暂时不知道是什么) 作为参数传递给了PuKkpsGJ 函数,PuKkpsGJ 函数运算之后会得到一个数组赋值给$JJAr
搜索找一下PuKkpsGJ 函数:
顺便找到了CDbvWcpeO的定义,这里可以看到,CDbvWcpeO是第二个PE文件。
PuKkpsGJ的功能也很简单,就是对传入进来的内容进行分割和转码。
关于这里处理后的数据之后再看,先看看后面的代码做了什么。
$y='[System.Ap!%%%%#######@@@@@@@****************ain]'.replace('!%%%%#######@@@@@@@****************','pDom')|g;$g55=$y.GetMethod("get_CurrentDomain")
这类替换之后代码就是:
$y='[System.AppDomain]'|g;
$g55=$y.GetMethod("get_CurrentDomain")
同样的,把下面几行的代码也替换了得到
$uy='$g55.Invoke($null,$null)'| g
$vmc2=$uy.Load($JJAr)
$vmc2| g
这里很明显,就是最后Invoke load执行$JJAr,而这个$JJAr就是上面通过PuKkpsGJ 处理后的数组。
所以直接写一个ps脚本,把这段数据处理完之后写入到桌面的222.txt文件中即可
最后,程序还会通过
[g8fg0000.gfjhfdgpoerkj]::gihjpdfg('InstallUtil.exe',$nebj2)
解码出第二个PE文件,这里看样子是通过InstallUtil安装,虽然不太看得出来这里是怎么加载起来的,但还是先dump出来后面看看。
计算一下文件hash,分别为:
8A738F0E16C427C9DE68F370B2363230
498EC58566B52AA5875497CADF513547
对应的检出情况如下:
498EC58566B52AA5875497CADF513547目前无检出,样本上传之后发现这应该是一个名为Mass KeyLogger的新型键盘监听器
而且国外的厂家形容这是非常危险的新型木马
样本使用dnspy去混淆之后还是有比较好的可读性的,这里就大概看一下。
此外,dump_file2,也就是这个keylogger的资源中有个四个资源文件,后面可能会解密加载这些资源
首先在dnspy中定位到样本的入口点如下:
样本入口点是内部类xW的实例化函数xW()
在xW函数中,主要是调用了aP类的bx方法。
这里过来可以知道bx方法中调用的是pC4类的Fvq方法:
过来给Fvq方法设置一个断点:
在Fvq方法中,程序首先是加载了上面名为LR4Cc2YdSbtlPu3Gpn.gkaT3RqoEIxDLaxtck的资源数据
然后把资源赋值给了array数组,并在下面循环去解密这个资源数据
最后,程序将数据以键值对的方式存放到Dictionary中然后赋值给Jbgkf0diFn,在下面通过反射加载调用。
由于断点已经设置在了Fvq函数这里,直接程序F5过来
成功读取到元数据
成功解密,重新给array赋值:
成功生成字典:
得到要调用的对应的函数,用委托的方式反射加载
如下:
这里会遍历加载所有用到的函数
直接往后走,读取名为b7XmD97o14L13xFEcR.B1Pe7UrZbjaNUkiGSk的资源
解密一个数据放到array4
这里是一个超长的switch case,干扰分析用的
这个类的代码超级长,肯定不能直接走,但是这里我想,既然它读取了资源放到了array4变量中,后面肯定要操作这个变量的,所以直接对所有操作了aray4这个变量的地方设置断点
这里发现程序将array4的长度new了一个新的byte为array6,所以同样的,对array6所以操作点设置断点:
程序这里在动态解密array6
所以最后只保留一个array6的赋值断点即可
成功命中断点:
此时把array6给dump出来,这里应该是程序用到的所有的字符串信息
往下走,这里result返回回来会有一些用到的关键信息,包括要检测的杀软等:
后面的解密配置信息,包括ftp服务器的地址,账号密码等都是通过这里解密出来
在YWc类的sCo方法中获取一些机密信息并格式化,包括用户名,出口IP、国家信息、操作系统版本、位数、SerialKey、CPU、GPU、AV、Screen Resolution、Current Time、Started、Interval、Process、Melt、Exit after delivery、是否是Administrator、所有运行中的进程名和窗口名(应该是用于反调试检测)
获取到的完整信息如下:
{User Name: xxxxx
IP: 127.0.0.1
Country: CN
Windows OS: Microsoft Windows 7 家庭普通版 64bit
Windows Serial Key: YGFVB-xxxxx-xxxxxx-PTWTJ-YRYRV
CPU: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
GPU: VMware SVGA 3D
AV: NA
Screen Resolution: 1920x1080
Current Time: 2020/9/16 12:25:50
Started: 2020/9/16 12:17:21
Interval: 96 hour
Process: C:\Users\Shyt\Desktop\xxxxxxx-cleaned.exe
Melt: false
Exit after delivery: false
As Administrator: False
Processes:
Name:dnSpy-x86, Title:dnSpy v6.0.5 (32-bit, 调试中)
Name:吾爱本地破解工具包, Title:Rolan
}
@"C:\Users\Shyt\AppData\Roaming\FileZilla\recentservers.xml"
包括后续还会尝试获取各类邮件服务器的隐私信息
在JA类的KWk方法中尝试获取主流浏览器的隐私信息
将获取到的所有的信息添加到list中并返回
获取计算计算机的HWID
将获取到的信息都通过<|| 和||>拼接
由于这个样本的代码和功能类实在是太多,这里就不一一详细分析了
直接把样本丢在any.run的沙箱跑一下行为:
看起来并没有反调试之类的东西,而且any.run已经识别出来这是一个massLogger了。
这个样本的C2为:192.185.155.49 : 21
这里的端口是21 应该是FTP服务登录的
解析出来的域名是nankasa.com.ar
其中api.ipify.org用于获取用户的出口IP
PASS Aloraboy21!@#
第二个数据包中就是上传的一些基本信息:
将数据包下载回来看一下,发现的确是FTP的方式进行通信的:
然后使用这个用户密码成功登录了攻击者的FTP服务器,这里的命名方式应该是
用户名_地区_HWID_版本
这个文件内容就是从用户主机收集上传的信息,包括之前看到的基本信息以及后面收集的浏览器相关的内容。
成功获取一组facebook的账号密码:
这里应该是攻击者用于测试的账号密码
睡觉前又看到有新信息上传了 哈哈,但是新文件还是没有数据,应该还是测试或是其他分析人员传的。
但是第二天登录的时候,发现密码已经修改了,应该攻击者知道有人异地登录了服务器,于是舍弃了该木马。
看来国外的大佬说此样本可能会取代AgentTesla的身份是有道理的,目前来看,该款木马功能比AgentTesla完善,代码结构更复杂,干扰分析的代码也很多,并且最直接的是,AgentTesla主要是通过多吃解密资源的方式加载,而MassKeLogger使用了多次非PE加载的方式,在这方面的技术已经比较成熟,这样做最直接的好处就是应该会有更好的免杀性。
最后,感谢大家看到这里。笔者个人的从业方向是恶意代码分析、APT、威胁情报。感兴趣的小伙伴可添加微信进行交流~ 感谢大家支持~
-yousaysayyou-