分析恶意软件的第一步是收集二进制程序在主机上执行的行为事件,研究人员根据这些行为大体形成一个思路来描述恶意软件的功能。
后门:没有通过合法身份验证的方式链接到目标计算机的通道。
僵尸网路:采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒。
勒索软件:通过骚扰、恐吓甚至采用绑架用户文件等方式,使用户数据资产或计算资源无法正常使用,并以此为条件向用户勒索钱财。
下载者:自动下载病毒的程序。
间谍软件:键盘记录器,截图信息记录等工具。
Rootkit:启发式病毒,操作系统、内核层面的病毒隐藏、执行的方案。
恐吓软件:恐吓用户安装恶意程序。
蠕虫:无须计算机使用者干预即可运行的独立程序,它通过不停的获得网络中存在漏洞的计算机上的部分或全部控制权来进行传播。
无文件病毒:在内存中执行的病毒,并不使用文件作为载体。
APT:高级可持续攻击。
静态分析
静态恶意软件分析是指在不运行PE/ELF文件的情况下对其进行分析。首先通过分析PE/ELF头结构,其中提供了操作系统加载和执行文件的有价值的信息(例如支持的系统版本、内存布局、动态链接库、静态链接库、导出和导入表、资源和线程数据等等)。
研究员需要初步通过恶意文件的功能、证书、编译日期等基本信息来确认文件是否为恶意文件。然后创建控制流分析恶意文件的逻辑进行进一步的调查。与高级静态分析相比,这种分析对于混淆加固的样本是无效的。
我们下面将介绍用于执行静态恶意软件分析的不同工具和方法。
静态分析方法—Virus Total
将样本上传到VirusTotal,引擎会与各种反病毒程序的检测结果进行交叉比对,产生综合报告。同时还提供文件的信息,如SHA256, MD5,文件大小,签名信息,导入导出表等。
静态分析方法—字符串分析
从二进制文件中提取可读的Ascii和Unicode字符。但并不是所有找到的字符串都会被程序使用,黑客会使用虚假字符串来扰乱取证,研究人员需要辨明那些是有用的字符串。
利用XSearch搜索字符串。利用grep -rn/strings命令搜索字符串。利用IDA、apktools等特别工具搜索字符串。
当然如果需要去混淆、降噪等操作。推荐flare-floss:
https://github.com/fireeye/flare-floss
静态分析方法—查壳工具die
“DIE”是一个跨平台的应用程序,除Windows版本外,还有适用于Linux和Mac OS的可用版本。许多此类程序(PEID,PE工具)允许使用第三方签名。不幸的是,这些签名只能通过预设掩码扫描字节。
Detect It Easy完全开放签名架构。可以轻松添加自己的算法来检测或修改已存在的算法。这是通过使用脚本来实现的。脚本语言与JavaScript非常相似,任何了解编程基础知识的人都会很容易理解它的工作原理。可能有人可能会决定脚本工作非常缓慢。
事实上,脚本运行速度比编译代码慢,但是,由于脚本引擎的良好优化,这不会造成任何特别的不便。开放式架构的可能性弥补了这些限制。目前该程序定义了以下类型:
MSDOS可执行文件MS-DOS
PE可执行文件Windows
ELF可执行文件Linux
MACH可执行文件Mac OS
文本文件
二进制文件
静态分析方法—PE结构工具Cff
我们也可以通过分析段的标题,来判断文件是否存在加壳现象(类似die)。我们排除常规名称(.text .data .rsrc等),剩下的,例如本例UPX1。我们可以判断文件通过UPX加壳的。
静态分析方法—ELF结构处理命令readelf
readelf命令,一般用于查看ELF格式的文件信息。选项 -h(elf header),显示elf文件开始的文件头信息。
选项 -l(program headers),segments 显示程序头(段头)信息(如果有数据的话)。
选项 -S(section headers),sections 显示节头信息(如果有数据的话)。
选项 -s,symbols 显示符号表段中的项
选项 -d,dynamic 显示动态段的信息。
静态分析方法—ELF结构处理命令ldd
ldd的作用是打印可执行档依赖的共享库文件。
静态分析方法—PE/ELF/DEX结构处理工具010editor
按F5,即使用对应的模板查看
静态分析方法—Restorator
Restorator 主要用于查看、反汇编和修改 Windows 32/64 位可执行的资源。
静态分析方法—逆向篇(IDA)
反汇编可以对可执行文件综合理解,并了解其运作机制。工具会以汇编代码、伪代码的形式展现程序,并自动分析理解函数执行过程,甚至可以展示出代码执行流程。
使用IDA进行恶意软件分析可以单步谨慎的分析程序执行事件,熟练及了解系统原理的情况下,并不会感染主机本身。而IDA的调试功能,强烈建议研究人员在独立的虚拟化系统中执行。
在IDA中打开可执行文件后,第一步是熟悉可执行文件的基本属性——字符串、函数、导入、导出表、name。所有的都可以在菜单’视图’ > ‘打开子视图’ > ‘字符串’(函数,导入,导出和name他们在同一位置)
导入函数:从外部链接库加载并且样本文件使用的API函数列表。API函数是一种被定义的代码,程序无需在其代码中实现即可调用它。观察导入函数列表中,可以确定可执行文件如何与操作系统、资源(文件系统、注册表、网络、加密等)之间交互的关键点。
导出函数:样本文件提供给外部环境的函数列表。其他程序可以调用和执行。恶意程序对外提供的方法在这里可以被发现。
函数:可执行程序中包含的所有函数的列表。IDA识别标准库函数。
单击函数名并按“x”(或右键单击>“跳转到xref“),显示一个包含所有引用该函数的表。
双击将视图切换到具有InternetConnectA功能的代码段,分析上下文。(如图)
“InternetConnectA”通过CALL访问。根据微软提供的官方文档,“InternetConnectA”功能有8个参数。每个参数是通过PUSH指令按顺序分配给函数的。IDA能够识别已知函数的参数,并通过注释标记它们,这有助于分析人员更好地定位代码并理解代码。如上图所示(图D),参数由’ PUSH ‘指令以相反的顺序将参数推入堆栈——‘ dwContext ’(函数的第八个参数)成为被推入的第一个参数。
相反,‘ hInternet ’(函数的第一个参数)被推为最后一个参数,这是由于CPU的制式决定的。参数’ dwService ‘决定了服务的类型:’ nServerPort ‘中的值50h表示使用标准TCP端口80(50的十六进制等于 80的十进制);’szServerName’的内容为’ C2.malware.info ‘,这就是黑客服务器的域名。
人工分析代码分析是一个非常缓慢的过程,建议不要从一开始就逐个指令地分析整个代码。更好的方法是识别有价值的代码块(基于字符串、导入和函数),回溯上下文并彻底分析它们。
通过使用IDA插件,可以容易地扩展IDA功能。编写插件也是为了自动化分析工作,插件可以用c 、python编写。插件可以完全访问IDA数据库(idb),可以检查或修改(patch)程序或使用读写功能。付费扩展插件(例如hexx – rays反编译器),可以F5一键将汇编代码编译成伪代码。最广泛使用的插件是IDAPython,它支持用Python为IDA编写自定义脚本。
静态分析方法—逆向篇(Ghidra)
Ghidra是由美国国家安全局(NSA)研究部门开发的软件逆向工程(SRE)套件,用于支持网络安全任务。
A – 菜单 B – 段 C – 符号目录 D – 汇编 E – 反汇编
Ghidra通过其强大的反编译器超越了IDA免费版本。虽然IDA也提供了反编译器功能,但这只包含在其商业版本中,并作为需要支付额外费用。
反编译器将汇编代码转换为高级编程语言,代码结构良好,算法的逻辑更加明显。这大大减少了分析工作的时间。当鼠标移动到汇编代码或C代码时,光标会在两个窗口中同时用绿色高亮显示相同的代码部分,如图所示。
动态分析
与静态分析不同,动态恶意程序分析发生在代码运行时。我们建议使用虚拟化的环境来进行动态分析的过程。进一步,逆向工程师需要了解不同架构、制式、语言的指令调试方法(调试器)才能真正的搞清楚恶意程序的原理。
行为分析方法—Process Monitor
使用Process Monitor可以对系统中的任何文件和注册表操作同时进行监视和记录,通过注册表和文件读写的变化,对于帮助诊断系统故障或是发现恶意软件、病毒或木马来说,非常有用。
该软件具有针对微软操作系统产品的行为监视、捕获和过滤多个工件的能力,具体如下:
监视进程和线程的启动和退出,包括退出状态代码
监视映像 (DLL 和内核模式驱动程序) 加载
捕获更多输入输出参数操作
非破坏性的过滤器允许你自行定义而不会丢失任何捕获的数据
捕获每一个线程操作的堆栈,使得可以在许多情况下识别一个操作的根源
可靠捕获进程详细信息,包括映像路径、命令行、完整性、用户和会话ID等等
完全可以自定义任何事件的属性列
过滤器可以设置为任何数据条件,包括未在当前视图中显示的
高级的日志机制,可记录上千万的事件,数GB的日志数据
进程树工具显示所有进程的关系
原生的日志格式,可将所有数据信息保存,让另一个 Process Monitor 实例加载
进程悬停提示,可方便的查看进程信息
详细的悬停提示信息让你方便的查看列中不能完整显示的信息
在下图中,使用Process Monitor过滤功能并应用样本名称为malware.exe的过滤器,分析人员执行样本后根据其引起的事件得到结论。
本例检查事件之后,分析人员了解了恶意程序试图做过的恶意行为。在下图中,可执行程序“malware.exe”正在读取注册表项、创建文件和启动网络连接。
当你有多个事件要处理时,合适配置过滤器是非常重要的,微软官方提供了过滤器Malware.pmf,它预制了基本易懂的过滤选项。
行为分析方法—Strace
strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。
strace可以监控大多数系统调用、参数信息、返回值信息等。研究人员可以通过这种调用获取到恶意程序中有效的行为信息,并加以判断。
行为分析方法—Process Explorer
Process Explorer是一个功能强大的进程管理工具,用于监控正在运行的进程。运行的进程以树状结构显示,该结构显示子进程和父进程的关系等等。进程资源管理器图形界面和颜色代码如下所示:
Process Explorer特点:
默认的树视图显示进程之间的层次关系;
精确的进程CPU使用率;
可以添加托盘图标来监控CPU,磁盘,GPU,网络等;
识别哪个进程加载了DLL文件;
识别进程中的窗口信息;
识别任何进程中的其他信息,包括线程,内存使用,句柄,对象等等;
可以杀死整个进程树;
可以挂起一个进程,冻结它的线程;
为了快速查看系统和正在运行的进程,Process Explorer提供了一个选项,允许分析人员通过比对VirusTotal上的HASH值。例,在下图中,用户可以看到进程名“malware.exe”(它是“explorer.exe”的子进程)在70个检测中存在61个风险,表明该应用程序很有可能是恶意的。
查看属性窗口(用户双击打开),可以提供另一组有用的信息,例如,进程在哪个用户下运行的、内存中的字符串、线程、恶意软件正在发起的活动网络连接和可执行文件在磁盘上的完整路径等等。
网络分析方法—Wireshark
网络流量分析是恶意软件分析的关键。查看网络流量,分析人员可以发现哪些文件正在被窃取,C2服务器与恶意软件是如何通信的,等等。
Wireshark是目前应用最广泛的网络协议分析程序之一,它可以从指定的网卡抓取网络报文,也可以加载之前记录的抓包文件显示网络流量。
在虚拟机上部署Wireshark或其他抓包软件,带有检测机制的恶意软件(见:动态分析方法-打补丁)能够检测到它正在被监视,紧接着隐藏其行为。因此,我们经常选择在默认网关上运行Wireshark。此外,可以在交换机上设置SPAN端口,以发送在受害虚拟机端口上看到的所有网络数据包的流量副本。
Wireshark选择可用的协议列表。恶意软件通信的协议可以被选择,流量可以被捕获。也可以设置协议过滤,以避免大样本分析时造成的噪点问题。
Wireshark从病毒分析的角度保留有用的统计数据。使用Statistics选项卡列出全部连接会话。终端列表允许使用数据包的传输数量对IP进行排序,对话列表可以根据终端之间传输的字节数和它们的数据交换持续时间进行排序。这些信息可用于分析异常的网络行为。
Wireshark可以方便地查看有关主机的所有详细信息、在网络流量中传输的文件、证书等。甚至还有单独的DNS查询和会话列表,可以根据需要进行过滤。
网络分析方法—iNetSim/FakeNet-NG
INetSim是一个基于linux的工具,分析师可以监控恶意软件样本的网络行为,无需将其连接到互联网上。
运行该工具后,左图像显示了INetSim模拟的所有服务,包括它们的默认端口。为了改变工具添加或删除服务的配置设置,用户必须修改文件“etc/inetsim/inetsim.conf”。在运行时,INetSim记录所有入站/出站连接。虽然INetSim目前仍然是许多分析师的首选工具,但随着FakeNet-NG的兴起,分析师又多了一个用于恶意软件分析的跨平台工具,FakeNet-NG可以直接与所有在安全领域不断出现的基于Python的信息工具进行集成。
沙箱分析—Cuckoo
测试的过程中需要限制样本的影响,研究人员在沙箱解决方案中运行恶意软件样本。沙箱工具通常提供内存转储分析功能,因此可以更好地了解内存中发生的情况。
黑客知道,如果他们的恶意软件样本在虚拟机或沙盒中运行,病毒样本会被轻易的执行、行为检测或者自动化的逆向分析出来,黑客会选择自我保护、伪装。其实黑客与安全研究人员的沙箱之间的攻防战争,从来没有结束过。
互联网上有多种免费的沙箱解决方案,研究人员可以在上传样本并等待报告。其中最有名的是:
malwr.com
hybridanalysis.com
any.run
joesandbox.com
cuckoosandbox.org
sandbox.anlyz.io
analyze.intezer.com
threatbook.cn
Cuckoo沙箱被称为安全圈领先的开源自动恶意软件分析系统。研究人员可以自动分析Windows、macOS、Linux或Android下的任何恶意文件。沙箱可以在本地部署,并且需要一台主机(管理终端)和多个沙箱客户端(分析用虚拟机),客户端数量取决于样本数量以及服务器性能。Cuckoo沙箱的特点:
保留已删除文件、记录
转储恶意程序进程的内存
在多机器上并发运行分析
以PCAP格式存储生成的网络流量
递归监控新生成的进程
追踪相关的API进行行为分析
获取虚拟机的全内存转储镜像
让我们看一下cuckoo的系统架构:
其模块化设计,Cuckoo可以作为一个独立的应用程序使用,也可以集成到更大的框架中。可以通过web控制台访问,web控制台如下图所示:
在使用web控制台将文件提交到沙箱之后,样本会被执行,所有的活动都被记录下来,并包含在最终的报告中。研究人员可以通过web控制台访问报告。Cuckoo沙箱有几种报告格式,包括普通格式、MAEC(恶意软件属性枚举和特征)格式。
动态分析方法—初识调试器
调试器看起来很像反汇编程序:两者都以汇编方式显示已检查样本的代码,并提供类似的函数、字符串等列表。不同之处在于,调试器提供了对恶意代码动态监视的能力,对内存、寄存器、堆栈进行深入调查。调试的好处是有机会运行代码、实时中断,并查看寄存器中的特定值、函数的参数及其返回值,有助于更好地理解代码。开源调试器:WinDbg, x64dbg,gdb,adb。
右键单击代码区域,选择“Go to”>“Expression”(或按CTRL G)。
然后按F9(或菜单’ Debug ‘ > ‘ run ‘)启用调试器来运行样本文件。调试器到达断点并停止。’ internettwritefile ‘发送的数据现在可以在堆栈区域中看到。在程序执行期间,与网络和文件操作相关的API函数很有可能被多次调用(一个循环传输多个数据包,一个循环处理多个文件,一个文件的一行,等等)。
动态分析方法—符号访问
要查看符号列表(被导入的外部函数),切换到“symbols”栏,并从所有模块中选择有用函数名(或按CTRL N)。
动态分析方法—去混淆
调试器还有助于处理混淆的、未编译的脚本。下面的例子展示了一个模糊的jsp脚本’ malware.js ‘的分析。这个脚本共有10页长,手动消除混淆是很困难的。
jsp文件需要由脚本解释器执行。Windows有本地脚本引擎’ wscript.exe ‘,位于’ C:\Windows\System32\ ‘目录下。这种混淆的恶意javascript脚本基本用于下载病毒并执行它。我们虽然不能确定具体恶意行为,但它最可能的最终目的就是试图在操作系统中执行任意命令,因此模块’ shell32.dll ‘(例如,函数’ ShellExecute ‘)需要被监控。
从调试器的角度来看,这意味着加载’ wscript.exe ‘,让’ wscript.exe ‘来处理恶意的javascript文件,在’ ShellExecute ‘设置断点,并在触发时分析其上下文:
加载’ wscript.exe ‘ (‘ File ‘ > ‘ Open ‘ > ‘ C:\windows\system32\wscript.exe ‘)。
添加’ malware.js ‘作为参数(‘ File ‘ > ‘ Change Command Line ‘并添加恶意文件的路径;例如”C:\Windows\system32\wscript.exe” C:\malware.js 。
切换到Breakpoints (面板>右键单击> ‘ Add dll breakpoint ‘)并填写 shell32.dll 。
执行并等待直到’ shell32.dll ‘断点被触发(如果触发,意味着DLL及其符号被加载)。
切换到“Symbols”面板 > 在模块中选择“shell32.dll” > 过滤“Execute”函数并断点。
切换回“断点”面板,并从步骤4禁用DLL断点(否则所有与DLL连接的操作都将被断点,而不仅仅是需要手动断点的功能)。
运行并等待一个’ Execute ‘断点被触发,以检查堆栈内存中的参数
其中一个断点在’ ShellExecuteExA ‘函数中触发。该函数只有一个参数——指向“SHELLEXECUTEINFOA”结构的指针。要检查它,右键单击指针值> ‘ Follow DWORD in Dump ‘ > ‘ Dump 1 ‘。结构的第五项是要执行的文件。在’ Dump 1 ‘区域> ‘中右键单击它,在Dump ‘ > ‘ Dump 2 ‘中跟随DWORD,并通过右键单击> ‘ Text ‘ > ‘ Extended ASCII ‘调整格式。
本例中,js执行了命令,启动powershell脚本,从http://jblecsywt6925.cc/documents/下载文件‘ spy20.exe ‘,保存为’ temp.exe ‘并执行。
动态分析方法—打补丁
恶意程序使用特别的保护机制来防止被逆向。包括:反调试,虚拟化环境检测,收集用户网络行为,代码混淆,代码加解密等。如果恶意软件检测到上述情况,它可以自行终止或改变其执行逻辑,以防被研究人员回溯。
研究人员可以通过打补丁来绕过这些检测机制,并将其保存为一个新的可执行文件,可以在不受检测机制影响的情况下进行分析。
案例:病毒防调试的一种方法,执行并判断函数‘ IsDebuggerPresent ’的返回值,恶意软件测试它是否在调试器存在的情况下运行。关闭防御机制的操作步骤如下:
1)在模块间调用中确定’ IsDebuggerPresent ‘函数的位置(右键单击> ‘搜索’ > ‘当前模块’ > ‘模块间调用’)并双击它。
2)在要替换的行上做标记并按空格键(或 ‘ Assemble ‘行上右击)。
3)将出现一个带有原始指令的窗口。用必需的指令(在本例中是’ nop ‘)重写原始指令,然后单击OK。
对所有要修改的行重复步骤3 、4。
4)完成所有修改后,按“CTRL P”(或右键单击>“Patches”)。
动态分析方法—创建规则(Misp & Yara)
Yara规则基于文本或二进制模式创建。每个规则包含一组字符串描述和一个确逻辑表达式。在某些情况下,字符串描述的部分可以省略,但逻辑表达式条件的部分是必要的。
以下是一个Yara规则的案例:
在左边的例子中,当所有二进制文件都包含文本字符串’ malwaredomaine.com ‘或以下十六进制字符串’ A2 24 ?? D8 23 FB ‘,将触发名为’ FirstYaraRule ‘的Yara规则。十六进制字符串内的问号表示通配符(未知且可以匹配任何内容的字节)。用于Yara扫描的测试样本可以到如下链接下载:
https://github.com/virustotal/yara/releases/tag/v4.0.0
执行扫描时使用的语法如下:
https://yara.readthedocs.io/en/v3.4.0/commandline.html
yara [OPTIONS] RULES_FILE TARGET
除了创建自己的一套Yara规则外,研究员还可以从第三方查看以下一个Yara规则资源:
Florian Roth repository:https://github.com/Neo23x0/signature-base/tree/master/yara
GNU-GPLv2:https://github.com/Yara-Rules/rules
awesone-yara:https:https//github.com/InQuest/awesome-yara
所有编写的Yara规则,都可以上传、使用,然后在MISP平台上共享。
MISP是一个开源的威胁情报平台,被各大组织使用。研究员可以将接触到的规则添加到他自己的MISP实例中,并根据数据库中已经存储的其他事件的数据,得出相关性匹配。下图根据MISP平台上传的事件与数据库中的其他事件进行了关联。
通过MISP平台共享信息的措施非常重要,最重要的是可以排除已被分析的样本。
关于MISP平台的更多信息可以在以下网站找到:
https://www.misp-project.org/index.html
总结
本手册涵盖了许多工具及其用法。有些工具具有非常相似的功能,还存在手册中没有列出的其他替代方案,这就需要读者的见仁见智了。
静态代码分析是一个非常耗时的过程,建议将它与动态代码分析结合使用,以提高效率。最理想的方法是从基本的静态和行为分析开始,然后收集前两个阶段的结论继续进行组合(静态和动态)代码分析。进行逆向分析时,研究人员必须建立一个与工作/家庭网络物理隔离的虚拟化环境,以避免损失。
恶意二进制软件分析的结果可以作为安全事件进一步调查取证的输入物,也可以结合自身的沙箱、网络防火墙等等,补充其薄弱的规则,以防止未来发生相同或类似的攻击。
精彩推荐