使用开源网络分析工具 FakeNet-NG 改进动态恶意软件分析
在2016年,FLARE推出了一款用Python编写的开源网络分析工具FakeNet-NG。FakeNet-NG允许安全分析人员在单个Windows主机上使用标准或自定义协议来观察网络应用程序并与其进行交互,这对恶意软件分析和逆向工程特别有用。自从FakeNet-NG的推出以来,FLARE又对其进行了一些升级,比如增加了对附加协议的支持。 FakeNet-NG现在具有DNS,HTTP(包括BITS),FTP,TFTP,IRC,SMTP,POP,TCP和UDP以及SSL的即用支持。
最近更新了FakeNet-NG,其中包括我们最需要的功能之一:HTTP和二进制协议的自定义响应。
这篇博客文章提供了七个“阶段”来帮助您掌握不同的FakeNet-NG策略。我们根据分析恶意软件时遇到的常见情况来介绍它们。随时跳到与您当前分析相关的部分,和/或使它们适合您的个人需求。这些阶段介绍如下:
准备阶段:配置FakeNet-NG
这是FakeNet-NG配置和日志数据位置的快速参考。
- 配置文件位于fakenet \ configs中。您可以修改default.ini或将其复制到新文件,然后使用-c将FakeNet-NG指向备用配置。例如:fakenet.py -c custom.ini。
- 默认文件位于fakenet \ defaultFiles,监听器实现位于fakenet \ listeners。
- 该fakenet \ CONFIGS \ Default.ini中默认配置包括全局配置设置和个人监听器的配置。
- 自定义响应配置示例包含在文件CustomProviderExample.py,sample_custom_response.ini和sample_raw_response.txt文件中的fakenet \ configs目录中。
- FARENet-NG在FLARE VM中的安装位置为C:\ Python27 \ lib \ site-packages \ fakenet。您将在此目录中找到包含defaultFiles,configs和listeners的子目录。
- 在FLARE VM中,可以在桌面上的fakenet_logs目录中找到FakeNet-NG数据包捕获文件和HTTP请求。
阶段1:自定义文件响应
您可能已经注意到,FakeNet-NG不仅限于提供HTML页面。根据请求的文件类型,FakeNet-NG可以提供PE文件,ELF文件,JPG,GIF等。FakeNet-NG配置有几种常见类型的默认文件,也可以配置为提供自定义文件。该defaultFiles目录中包含多种类型的标准响应文件。例如,如果恶意软件发送对evil.exe的FTP GET请求,则FakeNet-NG将以文件defaultFiles \ FakeNetMini.exe进行响应。(.exe请求的默认响应)。此文件是有效的可移植可执行文件,显示一个消息框。通过提供实际的PE文件,我们可以在恶意软件尝试下载并执行恶意有效负载时对其进行观察。图1显示了一个FTP会话示例以及下载的默认文件的后续执行。
图1:使用FTP下载FakeNet-NG的默认可执行响应
该系统已充分处理了大多数请求。但是,恶意软件有时会期望使用特定格式的文件,例如带有嵌入式PowerShell脚本的图像,或带有哈希值的可执行文件,该可执行文件将附加到文件中以进行完整性检查。在这种情况下,您可以将一个默认文件替换为符合恶意软件期望的文件。每个相关的监听器(实现网络协议的模块)配置中也都有一个选项可以修改defaultFiles路径。这使FakeNet-NG可以在不覆盖或修改默认数据的情况下提供不同的文件。图2显示了一个自定义的FakeNet.html文件。
图2:修改默认的FakeNet.html文件以自定义响应
阶段2:自定义二进制协议
许多恶意软件样本实现了需要特定字节序列的自定义二进制协议。例如,GH0ST家族中的恶意软件可能要求每条消息都以诸如“ GH0ST”之类的签名开头。默认的FakeNet-NG RawListener通过回显响应未知请求,也就是说,它发送的数据与接收到的相同。这种行为通常就足够了。但是,在需要自定义响应的情况下,您仍然可以发送恶意软件期望的数据。
FakeNet-NG现在可以自定义TCP和UDP响应,假设有一个恶意软件样本,它将字符串“Hello”发送到它的命令与控制(C2)服务器,并等待一个以“FLARE”开头,然后是一个数字命令(0-9)的响应包。现在,我们将演示FakeNet-NG处理此场景的几种有趣方法。
静态自定义响应
您可以配置TCP和/或UDP原始监听器如何响应流量。在此示例中,我们告诉FakeNet-NG如何响应任何TCP原始请求(未检测到协议)。首先,取消注释fakenet / configs / default.ini的RawTCPListener部分中的Custom配置选项,如图3所示。
图3:激活自定义TCP响应
接下来,如图4所示,在fakenet \ configs \ sample_custom_response.ini中配置TcpRawFile自定义响应。确保注释掉或替换默认的RawTCPListener实例。
图4:TCP静态自定义响应规范
创建内容为FLARE0的文件fakenet \ configs \ flare_command.txt。现在将根据文件的内容生成TCP响应。
动态自定义响应
也许您想动态发布命令,而不是提交flare_command.txt中的特定命令。这可以通过编程实现。如图5所示,在fakenet \ configs \ sample_custom_response.ini中配置TcpDynamic定制响应。请确保注释掉或替换现有的RawTCPListener实例。
图5:TCP动态定制响应规范
可以将文件fakenet \ configs \ CustomProviderExample.py用作我们的动态响应文件flare_command.py的模板。我们修改HandleTcp()函数并生成新文件fakenet \ configs \ flare_command.py,如图6所示。现在,您可以在恶意软件执行时选择每个命令。图7演示了使用此配置动态发布命令。
图6:TCP动态响应脚本
图7:发出TCP动态命令
阶段3:自定义HTTP响应
恶意软件经常在流行的HTTP协议上实现自己的加密方案。例如,您的示例可能会发送一个HTTP GET请求到/comm.php?nonce=<random>并期望C2服务器响应使用nonce值进行RC4加密。这个过程如图8所示。我们如何能轻易地迫使恶意软件执行它的关键代码路径来观察或调试它的行为?
图8:恶意软件示例期望基于信标数据的特定密钥
对于此类情况,我们最近引入了对HTTP自定义响应的支持。与TCP自定义响应一样,HTTPListener也具有名为Custom的新设置,该设置可启用动态HTTP响应。此设置还允许FakeNet-NG选择与特定主机或URI匹配的适当响应。使用此功能,我们现在可以根据我们的恶意软件样本快速编写一个小的Python脚本来动态处理HTTP流量。
首先取消注释HTTPListener80部分中的Custom配置选项,如图9所示。
图9:HTTP监听器配置
接下来,如图10所示,在fakenet \ configs \ sample_custom_response.ini中配置HttpDynamic定制响应。确保注释掉或替换默认的HttpDynamic实例。
图10:HttpDynamic配置
可以将文件fakenet \ configs \ CustomProviderExample.py用作我们的动态响应文件http_example.py的模板。我们修改HandleRequest()函数,如图11所示。FakeNet-NG现在将使用随机数动态加密响应。
图11:动态HTTP请求处理程序
阶段4:手动自定义响应
为了获得更大的灵活性,可以使用功能强大的网络实用程序netcat替代FakeNet-NG监听器。例如,您可能希望使用netcat充当C2服务器,并在端口80上的执行期间动态发出命令。在启动FakeNet-NG之前启动netcat侦听器,目的地为相应端口的流量将被转移到netcat监听器。然后,您可以使用netcat界面动态发出命令,如图12所示。
图12:使用ncat.exe手动处理流量
FakeNet-NG的自定义响应功能多种多样。
阶段5:列入黑名单流程
一些分析师更喜欢从单独的系统调试恶意软件。这样做有很多原因。最常见的是在恶意软件不可避免地破坏环境时保留IDA数据库和其他保存的数据。该过程通常涉及在仅主机的网络上配置两个虚拟机。在此设置中,FakeNet-NG拦截了两台计算机之间的网络流量,这使得远程调试变得不可能。为了克服这一障碍,我们可以通过指示FakeNet-NG忽略调试服务器进程中的流量,将调试服务器列入黑名单。
使用IDA Pro进行远程调试时,用于32位可移植可执行文件的标准调试服务器进程是win32_remote.exe(对于WinDbg,则为dbgsrv.exe)。您所需要做的就是将流程名称添加到ProcessBlackList配置中,如图13所示。然后,调试服务器仍可以与IDA Pro自由通信,而所有其他网络流量都由FakeNet-NG捕获和重定向。
图13:修改后的configs / default.ini以允许使用IDA Pro进行远程调试
将黑名单用于从污染Fakenet-NG捕获的网络流量中筛选出嘈杂的进程也很有用。示例包括尝试更新Windows系统或其他恶意软件分析工具的过程。
其他设置可用于将端口和主机列入黑名单。
阶段6:在连接事件上执行命令
可以将Fakenet-NG配置为在与侦听器建立连接时执行命令。例如,此选项可用于在尝试进行连接时将调试器附加到正在运行的样本。想象一个场景,我们分析了来自实用恶意软件分析实验室的名为Lab18-01.exe的打包样本。使用动态分析,我们可以看到恶意软件使用HTTP协议通过TCP端口80将信标发送到C2服务器,如图14所示。
图14:通过TCP端口80到其C2服务器的恶意软件信标
建立连接后,如果我们可以将调试器神奇地附加到Lab18-01.exe,这不是很好吗?我们可以加快样本运行速度,并绕过整个拆箱存根以及样本可能采用的任何潜在的反调试技巧。
要将Fakenet-NG配置为启动调试器并将其附加到任何进程,请修改fakenet \ configs \ default.ini中的[ HTTPListener80 ]部分以包括ExecuteCmd选项。图15显示了完整的[ HTTPListener80 ]部分的示例。
图15:执行命令选项以运行并附加x32dbg
在此示例中,我们在端口80上配置HTTPListener以执行调试器x32dbg.exe,该调试器将附加到正在运行的进程,该进程的进程ID在运行时确定。与HTTPListener建立连接时,FakeNet-NG会自动将字符串{pid}替换为建立连接的进程的进程ID。
重新启动Fakenet-NG并再次运行示例后,我们看到x32dbg启动并自动附加到Lab18-01.exe。现在,我们可以使用内存转储工具(例如Scylla或OllyDumpEx插件)转储可执行文件并进行静态分析。如图16和图17所示。
图16:使用FakeNet-NG将x32dbg附加到示例(动画)
图17:Fakenet-NG在连接至Practicalmalwareanalysis.com后执行x32dbg
阶段7:解密SSL流量
恶意软件通常使用SSL进行网络通信,由于对数据包数据进行了加密,因此极大地阻碍了流量分析。使用Fakenet-NG的ProxyListener,可以创建具有解密流量的数据包捕获。这可以使用协议检测功能来完成。
代理可以检测SSL,并使用Python的OpenSSL库在SSL中“中间人”使用套接字。然后,它与恶意软件以及与HTTP侦听器保持全双工连接,而双方都不知道对方。因此,在代理和HTTP监听器之间存在明文HTTP通信流,如图18所示。
图18:Fakenet-NG组件之间的明文流
为了使FakeNet-NG尽可能简单,FakeNet-NG的当前默认设置没有代理在端口443上拦截HTTPS通信并创建解密的流。为了代理数据,您需要将HTTPListener443 Hidden属性设置为True,如图19所示。这告诉代理拦截数据包并根据数据包内容检测协议。
图19:隐藏监听器,以便代理流量
现在,我们可以检查Fakenet-NG产生的数据包捕获。明文可以在TCP流在localhost临时端口(之间找到ProxyListener)和在本地主机端口80(HTTPListener)。如图20所示。
图20:HTTPListener和代理侦听器之间的明文流量
结论(New Game+)
Fakenet-NG是用于恶意软件分析的事实上的标准网络仿真工具。它无需安装即可运行,并且包含在FLARE VM中。除了经过验证的默认设置外,Fakenet还提供了无数功能和配置选项。在此博客文章中,我们介绍了一些技巧来处理常见的分析场景。要下载最新版本,查看所有配置选项的完整列表或对Fakenet-NG有所贡献,请参阅我们的Github存储库。
