首页
社区
课程
招聘
[原创]【梦幻开讲了】带伙伴们入手计算机病毒分析第四天
发表于: 2021-9-18 18:03 11297

[原创]【梦幻开讲了】带伙伴们入手计算机病毒分析第四天

2021-9-18 18:03
11297


今天学习的内容是动静结合分析病毒,若有不当之处希望伙伴们可以指出,让我们共同完善,共同进步
注意:文章内容只是分享自身的知识储备,只是自身的理解,不一定准确,希望观看的时候只是参考,思维不要被其所局限。
开始进入正文:

根据之前所学的静态、动态分析技术,结合起来分析测试样本

找到程序,载入分析工具分析

ifconfig命令
可查询网卡发送数据情况,对比日期所需,若发送数据过大或接收发送对比差异过段(未下载数据)则说明可疑,存在异常,需深入排查

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


看到进程1在发送与接收数据,查看详情

top命令
查询指定进程资源占用情况


开始监控资源占用不到,后期逐步占用过高,可能为远控木马驻留,后收到命令执行攻击行为如:搜索指定文件

根据PID查找进程路径

猜测状态查询外联IP

根据端口反查进程

未方便理解模拟了一个攻击程序根据一个存在溢出漏洞程序进行攻击的过程。
简单分析攻击程序利用思路与溢出漏洞产生原因

备注:根据STACK1_VS_2017.cpp修改
工具链:Mingw

根据源码看到若gets函数获取的数据为**DCBA(*通配符,例如:11DCBA,字符串DCBA的16进制为44434241,因堆栈数据读写顺序为先进后出故真正调用时为ABCD),则证明利用了此程序的缓冲区溢出漏洞并显示了隐藏信息(根据代码逻辑,程序正常运行不满足显示此隐藏信息的条件)
缓冲区漏洞成因:buf申请的缓冲区大小为2,并且用gets获取导致未对缓冲区进行保护,若获取的数据超过2则溢出。

效果:缓冲区溢出成功,并输入特定代码读取了隐藏信息
图片描述
监控:
procexp64
图片描述
Procmon64
图片描述

定位到利用脚本test.py

运行到模块值为:test.exe
图片描述
入口断点断下,未看到泄露信息相关内容,字符串搜索快速定位漏洞函数代码块
备注:编译器为了使可执行程序正常工作和启动,增加了很多代码。故第一次入口函数断点往往不会断到main函数
图片描述
反编译对照:
MapoAnalyzer
图片描述
Snowman
图片描述
跟踪分析:
在输入字符串时,在堆栈窗口看到两变量对应的地址紧挨着
图片描述
根据反编译结果分析输入的字符串的是对应buf变量的值,但现在cookie对应也有值,分析数据溢出,导致cookie对应的地址有值并且为输入数值减两位即DCBA,如下图所示:
图片描述

图片描述
可以看到输入的字符串已满足条件,跳转不成功,导致隐藏信息被调取
扩展分析:
gets函数

结合分析因程序使用gets函数获取输入数据导致存在溢出漏洞,其中此程序根据此隐患隐藏了特定字符。

http://192.168.86.144/word.cab
解析:cab是windows的压缩格式,我这边使用7-z提取
http://192.168.86.144/word.cab
解析:cab是windows的压缩格式,我这边使用7-z提取
正常:就是打开一个word文档
可疑:调用了控制面板程序control.exe
并通过控制面板执行临时文件夹下名为msword.inf配置文件,之后通过运行cmd程序打开计算器程序calc.exe(这里代指恶意程序)
正常:就是打开一个word文档
可疑:调用了控制面板程序control.exe
并通过控制面板执行临时文件夹下名为msword.inf配置文件,之后通过运行cmd程序打开计算器程序calc.exe(这里代指恶意程序)
关键call:
00007FF67F1128E3 | E8 C8F4FFFF              | call control.7FF67F111DB0               |
关键call:
00007FF67F1128E3 | E8 C8F4FFFF              | call control.7FF67F111DB0               |
*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"
*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"
定位技巧:字符串搜索关键信息,之后双击进入反汇编页面查看
定位技巧:字符串搜索关键信息,之后双击进入反汇编页面查看
在模块列表看到了RPCRT4.DLL
文件描述:远程程序调用运行时
在explorer.exe进程树下
判断:可疑模块,一般情况程序有远程需求才会加载,当前测试机无已知远程,test.exe加载了此模块不正常,并且因此进程在explorer.exe进程树下判断为用户启动
在模块列表看到了RPCRT4.DLL
文件描述:远程程序调用运行时
在explorer.exe进程树下
判断:可疑模块,一般情况程序有远程需求才会加载,当前测试机无已知远程,test.exe加载了此模块不正常,并且因此进程在explorer.exe进程树下判断为用户启动
test下调用了某些程序
ipconfig.exe:(运行了如下命令:ipconfig,行为解析查询当前IP)
whoami.exe:(运行了如下命令:whoami,行为解析显示已登录的用户信息)
net.exe:(运行了如下命令:net  user 123 123 add,行为解析创建账号行为 )
test下调用了某些程序
ipconfig.exe:(运行了如下命令:ipconfig,行为解析查询当前IP)
whoami.exe:(运行了如下命令:whoami,行为解析显示已登录的用户信息)
net.exe:(运行了如下命令:net  user 123 123 add,行为解析创建账号行为 )
频繁外联此IP:192.168.86.114
初步判断为攻击者使用的IP
频繁外联此IP:192.168.86.114
初步判断为攻击者使用的IP
Windows API函数,用于申请内存空间
Windows API函数,用于申请内存空间
Windows API函数,用于结束调用进程及其所有线程。
Windows API函数,用于结束调用进程及其所有线程。
关键call:00007FF8054B2A59 | 48:FF15 301F0500         | call qword ptr ds:[<&NtDeviceIoControlF |
进入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函数解析:为提供的缓冲区构建描述符,并将非类型化数据传递给与文件句柄关联的设备驱动程序。
关键call:00007FF8054B2A59 | 48:FF15 301F0500         | call qword ptr ds:[<&NtDeviceIoControlF |
进入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函数解析:为提供的缓冲区构建描述符,并将非类型化数据传递给与文件句柄关联的设备驱动程序。
RX Packets // 接收到的数据包数量
TX Packets // 发送数据包的数量
RX Bytes   // 接收到的字节数
TX Bytes   // 发送出去的字节数
RX Packets // 接收到的数据包数量
TX Packets // 发送数据包的数量
RX Bytes   // 接收到的字节数
TX Bytes   // 发送出去的字节数
dev        网卡
sent       发送
received   接收
dev        网卡
sent       发送
received   接收
top -p 7132  //7132为进程pid
top -p 7132  //7132为进程pid
cd  /proc/7132  //7132为进程pid
ls -ail        //exe对应的就是可执行文件路径信息
补充知识:
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
ls -ail [目录名]:打印当前/指定目录的目录文件
组合查询:ls -ail /proc/7132
若非root权限会导致有些信息查询不到,如提示如下信息:
ls: 无法读取符号链接'/proc/7132/cwd': 权限不够
ls: 无法读取符号链接'/proc/7132/root': 权限不够
ls: 无法读取符号链接'/proc/7132/exe': 权限不够
cd  /proc/7132  //7132为进程pid
ls -ail        //exe对应的就是可执行文件路径信息
补充知识:
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
ls -ail [目录名]:打印当前/指定目录的目录文件
组合查询:ls -ail /proc/7132
若非root权限会导致有些信息查询不到,如提示如下信息:
ls: 无法读取符号链接'/proc/7132/cwd': 权限不够
ls: 无法读取符号链接'/proc/7132/root': 权限不够
ls: 无法读取符号链接'/proc/7132/exe': 权限不够
netstat -na|grep ESTABLISHED
netstat -na|grep ESTABLISHED
netstat -nap | grep 47074
netstat -nap | grep 47074
pmap -d 3885
pmap -d 3885
kill -HUP 3885
kill -HUP 3885
#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");
 
}
#include <stdlib.h>
#include  <stdio.h>

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-2-7 12:43 被梦幻的彼岸编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 1109
活跃值: (558)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
楼主有什么好的办法可以跟踪syscall吗,用Windbg内核调试模式在syscall处下断,不能单步跟踪进去,只能看到syscall执行完返回的结果
2021-11-5 16:09
0
雪    币: 3017
活跃值: (27722)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
3

目前我也遇到此类问题,使用调试工具跟踪到syscall时发现无法在单步,直接调用系统功能实现了软件所需的某些功能(例如一个Windows 64位进程有访问了特定的网址功能,下网络函数断点,单步跟踪看到了网址信息,此时动态监控发现还未访问,之后继续单步跟踪到syscall,执行后监控发现已访问了特定网址原理猜测:Windows系统限制,要访问需切换权限才能使用某些功能,此程序使用 syscall 实现由用户切换到内核模式,进行了系统调用访问了特定网址)但分析发现需要跟踪的参数在调用syscal之前已压入堆栈,目前的思路往前找压入的参数,不在往下跟踪了(还需深入的话感觉结合反编译定位或内核调试分析)

备注:目前还未接触内核级调试这是我目前临时的解决思路(查询资料内容级别调试除了使用内核调试引擎分析外还有本地内核调试方案如:LiveKD导出转储文件之后通过调试此转储文件来进行分析如:WinDBG或KD。)

未实验资料:启用内核调试选项,使用WinDBG进行本地内核调试(File --Kernel Debug --Local)


最后于 2022-1-4 15:27 被梦幻的彼岸编辑 ,原因:
2022-1-4 14:31
0
游客
登录 | 注册 方可回帖
返回
//