文章定位
在企业中遇到不明文件时,如何快速初步的判断它是否为恶意文件?
在攻防演练过程里,某平台告警恶意文件或收到钓鱼邮件时,如何快速判断该样本是否为恶意?
如何在不必学习C++的同时进行API分析工作?
您不想用“牛刀”分析一个月再给出结论,只想在“短时间”内快速给出大概率是“正确”的初步结论?
寻找溯源过程里您感兴趣的信息。
初步观察与轻量级分析。
强化您的体验感,让工作更有趣。
获取文件哈希指纹
工具:pestudio (https://www.winitor.com/) 或PPEE (https://www.mzrst.com/)
主要是拿md5,sha1,sha256的“文件哈希指纹”
然后来VT进行搜素:https://www.virustotal.com/gui/home/search
建议使用sha256:因为即使您用md5值搜素,它也会自动转成sha256去匹配。
判断文件签名
我们看待文件并不是去看一个文件的后缀名是不是.exe等。具有其他文件后缀名的文件仍然可以执行,比如.jpg可执行文件。
简而言之:不论什么文件都可将其内容转成十六进制的值。然后再将十六进制的值与真实性文件做比对。
举个例子:如果您将.exe和.jpg分别用十六进制编辑器打开,开头都是4D 5A。您就可非常肯定,这个.jpg文件就是可执行文件。
如何获取真实性文件?这更简单,系统是您的,您可以新建文件修改后缀名为exe再用十六进制编辑器打开看看它的头部分。
我们将上面的东西统称为“文件签名”:您也可认为这是文件取证或恢复中数据雕刻的重要资源。
当您遇到这些八股文所提及的工具时,它们都可拿来干文件签名这种事情。
我怎么知道上百种的文件签名分别都是什么?使用此网站已轻松搜素:https://www.garykessler.net/library/file_sigs.html
判断文件是否被混淆与打包
不用太在意混淆,打包,加密,加壳等概念的区别。因为它们的最终目的都是“隐藏真实内容”。为了增强体验感与“我上我也行”,直接从本质出发:任何商业软件都不想被任何人看见其代码内容,为此他们引入各种乱七八糟的“技术”。
这个工具怎么用?看什么地方?这非常简单,任何人都可以干这种“活”。
在这个文件中,我们发现了有趣的内容:FSG 1.0 -> dulek/xt
搜素一下便可得知这个文件进行了打包。
可选工具:TrID(http://mark0.net/soft-trid-e.html)、TRIDNet(http://mark0.net/soft-tridnet-e.html) ,轻松检测(http://ntinfo.biz/)、RDG Packer检测器(http://www.rdgsoft.net/)、packerid.py(https://github.com/sooshie/packerid)和PEiD (http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml)
【注意】:这些检测混淆,打包工具的本质是它们提出准备了一个打包指纹的文本数据库来与具体文件进行匹配,最后给出“结论”。(就是提前记录123456,如果目标文件中存在123456的指纹,则”告警“)
IDA free 加壳检测初体验
工具:https://hex-rays.com/ida-free/
我们如果知道该文件是可执行文件,则选择第一个。如果不知道则更加好办,每个都看看。。
该文件仅导入了两个API?这很奇怪,可用其他正常文件基线值来比对一下(我们需要注意库文件叫什么,导入的API name叫什么)
其他工具也提供了导入库导入API的查看功能
注意:运行之后导入的后续API则不在此工具里“显示”
一个文件它要编写,读取,查看,保存,初始化配置等多功能性,怎么可能只需要导入两个API?以下是正常文件打开时导入的API示例之一:
.text: 一般包含运行PE文件时执行的CPU指令。此部分被标记为可执行。
.data: PE文件使用的全局变量和其他全局数据。
.rsrc: 资源,例如图像、图标等。
AV样本中的导入API查看:
https://www.virustotal.com/gui/file/d8b87863c68d2da9bf62d7f029b8f2fda567f6a61e71a2bac0a3a390a765c0b3/details
点击第二个标签进入详情:
这些都是导入的库文件与API:
查看文件字符串
划重点:将所有的十六进制,编码成ASCII或者utf-8等字符串,再从字符串里面看看有什么异常。
sysinternals套件的strings工具:https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings
下载,解压缩并进入到sysinternals目标下的strings工具中,”相对路径“来运行strings工具并给出”绝对路径“目标文件。
strings "C:\Users\Analysis\Desktop\67844C01"
您会得到大量有”含义“的字符串。
除此之外,还有其他字符串提取工具
pestudio (https://www.winitor.com/) 工具字符串提取
linux系统中的strings命令提取字符串:man strings
一些字符串看起来像长编码的地址,可以尝试搜一搜区块链:https://live.blockcypher.com/
一些字符串看起来像 Windows API。 例如,
CloseHandle
,GetExitCodeProcess
,TerminateProcess
。当提及API时,感觉很“深奥”,事实证明它们也可以很简单,比如类似python中的导库导函数罢了。
这可以去微软的官方文档中搜索确认其API的功能:https://docs.microsoft.com/en-us/windows/win32/api/_winprog/
其他字符串google搜索,进行初步关联。
如果您看见以下毫无意义可言的字符串,则说明该文件使用了打包和混淆。
尝试解码混淆后的字符串
使用FLOSS解码混淆后的字符串
大多数时候,恶意软件作者使用简单的字符串混淆技术来避免检测。 这种情况下,字符串打印将杂乱无章。 FireEye Labs混淆字符串求解器(FLOSS),用于自动识别并从恶意软件中提取混淆字符串。
参考资料:https://www.fireeye.com/blog/threat-research/2016/06/automatically-extracting-obfuscated-strings.html
软件包下载
https://github.com/fireeye/flare-floss/releases
使用手册
https://github.com/fireeye/flare-floss/blob/master/doc/usage.md
下载并解压,cmd开箱即用
floss.exe -h
floss.exe malware.bin
沙箱资源部分
诞生于2010 年google某开源项目的杜鹃沙箱(现在已过时):https://cuckoosandbox.org/
CAPE沙箱,目前得到积极的开发:https://github.com/kevoreilly/CAPEv2
在线沙箱
https://cuckoo.cert.ee/
https://www.capesandbox.com/
https://any.run/
https://analyze.intezer.com/
https://hybrid-analysis.com/
反分析技术
长时间的休眠调用:恶意软件开发者熟悉沙箱运行时间有限,长时间的睡眠使得沙箱过期。
用户活动检测:恶意软件开发者加入鼠标移动检测功能来识别是否为自动化的沙箱。
追踪用户活动:恶意软件开发者检测是否存在office办公文件记录,浏览器信息等来识别沙箱。
检测虚拟机:恶意软件开发者检测虚拟机与沙箱相关的文件,进程等指纹来识别沙箱。
关于Yara规则
语法糖如下:
https://yara.readthedocs.io/en/v3.7.0/writingrules.html
简而言之:Yara是一种字符串匹配。比如您发现123456是恶意软件的特征值,您想基于123456的特征进行“全盘”搜索已寻找所有感染。这就是Yara的“战场”。
您只需要知道,最重要的特征,数据或者指纹信息才是最本质的东西。如果找不到恶意软件本身的特征,编写Yara规则将成为一件毫无意义的事情
您可将Yara规则视同于一切其他规则一样(基于各种玄学设备的防御产品,IDS/IPS,AI。代码本身也是另一种“规则”)
一个示例如下:
搜索samples/文件夹下的所有文件
yara -r suspicious.yara samples/
搜索特征123456,使用ASCII码或Unicode(wide),不区分大小写(nocase)【文件在机器中已十六进制提现是机器的事情,数据取出来怎么“显示”是您的事情(取成“各种”编码,图表,或者图片都行,只要能找到特征。)】
rule suspicious_strings
{
strings:
$a = "123456" ascii wide nocase
$b = "123456" ascii wide nocase
$c = "123456" ascii wide nocase
condition:
($a or $b or $c)
}
全流量数据包下的威胁狩猎示例如下:
...
strings:
$gst1 = {47 68 30 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst2 = {63 62 31 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst3 = {30 30 30 30 30 30 30 30 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst4 = {45 79 65 73 32 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst5 = {48 45 41 52 54 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$any_variant = /.{5,16}\x00\x00..\x00\x00\x78\x9c/
...
yara poc.yara pcaps/
监视服务、网络连接、磁盘活动
Process Hacker (http://processhacker.sourceforge.net/)
Process Monitor (https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx)
示例:
执行恶意软件样本后,创建了一个新进程 iexplorer.exe,进程 ID 为 1272。该进程可执行文件位于 %Appdata% 目录中。
自定义通信协议
80端口通信的TCP流,如下图所示,不是标准的HTTP流量; 这表明恶意软件可能使用自定义协议或加密通信。
在大多数情况下,恶意软件使用自定义协议或对其网络流量进行加密以绕过基于网络的签名。
这种特征也是一种研判辅证。
动态链接库 (DLL) 分析
您可将DLL文件视为库文件,类似python中的导入库文件再使用函数。
攻击者可自定义一个DLL库文件包含恶意行为函数,再使用该函数,类似python编程中导入的库文件依赖本身出了问题被植入恶意代码,导致您使用函数时执行了恶意代码。
DLL库文件需要包含或者导入(注入到进程里面才能使用它的恶意函数)
分析 DLL 并不简单。
DLL文件在被导入时(类似包含,导入语法)可能执行恶意函数,导出时(类似函数调用)也可能执行恶意函数。就是包含它时干了啥,调用它的函数时又想干啥。
DLL 需要一个进程才能运行。 在 Windows 上,rundll32.exe 可用于启动 DLL 并调用从 DLL 导出的函数。语法如下:rundll32.exe <full path to dll>,<export function> <optional arguments>
导入时示例:
WININET.dll文件被导入,它可能在导入时执行InternetOpenA与InternetOpenUrlA的API函数,它们可能涉及HTTP 或 FTP 协议C2隧道的建立。
导出时示例:
它要注册(Register)服务了。触发了与 C2 服务器的 HTTPS 通信。
如何知道这个API触发了C2服务器HTTPS通信的?C:\>rundll32.exe c:\poc.dll,DllRegisterServer
在语法正确或错误(就连web渗透非200都可以利用成功,它也可以。)的情况下运行它并抓包网络流量看看
DLL注入攻击
工具示例:RemoteDLL (http://securityxploded.com/remotedll.php)
大多数情况下,使用 rundll32.exe 启动 DLL 可以正常工作它们的恶意函数。但总有一些其他DLL需要一些不同的环境来启动。
比如tdl.dll会检查它是否在spoolsv.exe下运行,如果不是则初始化失败,DLL注入攻击则失败。
一旦注入进程成功,就会引爆恶意DLL的行为,就可以使用监视类工具观察服务、网络连接、磁盘、注册表活动等。
为了控制篇幅长度,今先聊到这。
感谢师傅们很有耐心的阅读到了这里。我们还会再见面的。共勉。
参考资料
Learning Malware Analysis Explore the concepts, tools, and techniques to analyze and investigate Windows malware by Monnappa K A
https://tryhackme.com/module/malware-analysis
https://www.freebuf.com/articles/system/282301.html 恶意软件分析101