一个邮件钓鱼木马的分析 (一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/basketwill/article/details/76412066


已发表于本人专栏:  http://www.freebuf.com/column/142406.html


最近收到一个钓鱼木马邮件,内容形式如下:

 TIM图片20170729150824.png

邮件里有个链接,当点开链接后会下载一个doc文档,打开文档会发现有宏代码

 TIM图片20170729150913.png

经过一些列解密后悔执行shell执行宏命令,打印出这个信息出来后发现,原来执行了powershell命令

 TIM图片20170729160531.png

是从网络url中下载一些文件并且 StartProcess,看来这才是真正的木马,下载的是一个exe,名字是随机的四个字符的exe名字。

 TIM图片20170729151006.png

下面就开始分析这个木马,用ollydbg加载木马,在Winmain函数入口点下断点:

 TIM图片20170729151029.png

F9飞一次,停在了入口,慢慢 F8单步,木马直接到了0300149C的地址

 TIM图片20170729151052.png

F7继续进入函数:

进入函数不久木马一直两个代码间循环,无法继续往下走,

(1) 循环起止1.

 TIM图片20170729151114.png

(2) 循环往上跳

 TIM图片20170729151128.png

当我们F9的时候一直不能跳出循环,我们通过IDA查看发现他做了一个时间判断故意为了防止被分析做了一个时间开关,这个时间有点太大了。

 TIM图片20170729151140.png

我们直接修改EIP到循环外的地址,跳过这个循环。

 TIM图片20170729151326.png

继续往下走。

 TIM图片20170729151351.png

下面有Call VirtualProtect,而这个VirtualProtect把刚才分配的地址改写成PAGE_EXECUTE_READWRITE的属性,也就是变成一个可读写可执行的代码页。

 TIM图片20170729151412.png

下面就到了木马对内置的加密代码的解密了,可以明显看到原始数据被加密了。

 TIM图片20170729151436.png

解密完后我们可以看到内存地址内容了,

 TIM图片20170729151503.png

到此这个函数就执行完毕,返回到入口函数位置后,下面有个cal [3011744] 实际上是前面函数内解密分配的shellcode函数 。

 TIM图片20170729161322.png

实际上是call 001AA618,进入函数

 TIM图片20170729151545.png

再次进入就进入真正的函数位置了

 TIM图片20170729151611.png

很明显字符串 75 73 65 72 33 32用字节码写出来,作者做了一些免杀处理。

在shellcode遇到第一个函数这个函数call 001AA008,函数的功能是查找木马的导入表找到LoadLibraryA函数和GetProcAddress这两个函数地址

 TIM图片20170729151816.png

 TIM图片20170729151659.png

接下来就是通过LoadLibrary GetProcAddress函数动态获取一些API的地址,

 TIM图片20170729151722.png

TIM图片20170729151752.png

 

一共要获取几十个函数的地址,这块我们跳过去,F9一路飞到地址001AB4EF

 TIM图片20170729151816.png

这个函数直接调用函数下面的地址,继续 F8单步到001AB50F

 TIM图片20170729151844.png

继续F7进入001AB50F函数

 TIM图片20170729151909.png

在这里他会判断木马目录下有没有apfHQ文件,所以我们事先需要生成一个apfHQ文件在目录下,空文件也行,这个过程完毕后就进入了01AA408函数。

 TIM图片20170729151935.png

 TIM图片20170729151945.png

继续往1AA408函数内部F7,会经过一些列的RegisterClassEx, CreateWinodwsGetMssage等窗口函数后就进入了1AA108函数

 TIM图片20170729152108.png

继续F7进入1AA108函数,在进入函数不久,木马会去取一个内存数据,并且判断4550 “PE”这个标志位

 TIM图片20170729152438.png

接下来调用 GetStartUpInfo,取得当前进程的启动信息

 TIM图片20170729152227.png

然后接续获得当前进程的命令行参数

 TIM图片20170729152247.png

然后调用CreateProcess 来把自己作为子进程创建起来,而且创建标志位是

CREATE_SUSPENDED

0×00000004

是以悬挂进程的方式创建子进程

 TIM图片20170729152318.png

然后继续通过GetThreadContext函数获得子进程的线程上下文

 TIM图片20170729152438.png

然后在子进程的0×400000的地址远程分配一个大小0xC00大小的内存,内存属性0×40,即读写可执行的属性内存PAGE_EXECUTE_READWRITE  0×40

 TIM图片20170729152512.png

接下来木马就会使用ZwWriteVirtualMemory函数往子进程的0×400000地址写入大小0×400的数据,通过查看写入的数据发现是个PE

 TIM图片20170729152539.png

下面就是PE头数据

 TIM图片20170729152605.png

然后木马会解析这个内存里的PE文件的各个节.text .data .rdata 等等节段,通过ZwWriteVirtualMemory函数分别往子进程的相应内存里远程写入数据。

 TIM图片20170729152634.png

分别写完数据后,然后改写子进程PE加载器的子进程的执行加载的首地址为0×400000

 TIM图片20170729152659.png

然后使用SetThreadContext设置子进程的当前线程EIP 指向0x408FE5

 TIM图片20170729152741.png

最后调用ResumeThread函数恢复子进程的线程继续执行

 TIM图片20170729152802.png

                    最后父进程退出,子进程开始干一些真正的盗取行为,到此我们可以知道木马是通过创建子自身子进程通过GetThreadContext、ZwWriteVirtualMemory、SetThreadContext、ResumeThread,来实现hook方法达到隐藏真实pe的目的来增加分析人员的分析难度,他的真实PE文件加密存贮在数据段中解密后如下:

TIM图片20170729153237.png

          现在的木马的隐蔽性越来越深,也经常使用多进程交互,真正的执行逻辑可能已经变换的找不到来源,而过去常用的进程关系行为越来越难以检测了,这就要求安全人员更加深入地研究。


没有更多推荐了,返回首页