由于工作的需要,在平常经常会遇到这么一个情景“有一个软件,运行过程中不知道进行了什么网络连接、下载释放了什么文件,加载了什么驱动与dll、向哪个进程注入了什么shellcode、读取了哪个进程的什么内存、随后又远程启动了哪些最终干活的线程,导致了广告、图标、盗号等现象的出现”。
基于这个经常遇到的问题,我们大部分的排查思路就是借助现成的工具,例如PM、PeExp、
ARK、火绒剑等工具进行现场追踪,但是很遗憾,大部分的工具只能抓到皮毛,而且无法进行有效性的拓扑关联。为了有效的解决这个问题,我在这里构思了一个动态的沙箱,围绕以上的问题点,需要以下的功能支撑:
1. 通过MiniFilter文件过滤引擎捕获“进程-线程-[打开/创建/读取/写入/删除/重命名/映射/删除]-文件路径”;
2.通过WFP网络引擎捕获“进程-线程-DNS解析/目标IP清单” + “进程-线程-HTTP-GET/POST完整路径” + “进程-线程-TCP/UDP-本机IP:PORT/远端IP:PORT”;
3.通过四类回调捕获相关其他操作:
进程回调捕获“进程-线程-创建了哪个进程-目标全路径”
线程回调捕获“进程-线程-创建了哪个线程”,并解析出线程所属的模块地址与代码信息;
镜像回调捕获“进程-线程-加载了什么dll/sys”,并计算模块的MD5与IAT Hash信息;
注册表回调捕获““进程-线程-注册表操作”;
4.通过InfinityHook引擎,拦截SSDT与SSSDT中的相关API,包含但不限于以下API:
SSDT
NtCreateUserProcess
NtCreateProcessEx
NtQuerySystemInformation
NtOpenThread
NtCreateThread
NtSetContextThread
NtCreateThreadEx
NtOpenProcess
NtAllocateVirtualMemory
NtCreateFile
NtUserCreateWindowEx
NtWriteVirtualMemory
NtReadVirtualMemory
NtTerminateProcess
SSSDT
NtUserPostMessage
NtUserMessageCall
NtUserCreateWindowEx
NtUserGetClassName
NtUserBuildHwndList
NtUserWindowFromPoint
NtUserQueryWindow
NtUserGetForegroundWindow
NtUserFindWindowEx
通过4组引擎的数据采集分析,建立基于PID/TID/模块基址/窗口创建/窗口枚举查询/代码地址与代码特征的立体网络拓扑关系,从而实现“牵一发而动全身”。也就是说无论从哪个信息作为抓手,都能够按照关联的时间与动作顺序将与之相关的信息全部扒出,这样就能实现清晰的问题排查。
下面是一个基于Beta版本以上数据分析的一个SF类劫持程序的的拓扑图:
目前该沙箱仍处于Beta状态,驱动部分基本完成,能够完整生成数据,但是应用层的数据组织、挖掘与关联部分仍处于开发中,感兴趣的同学可以联系qq1669941649。