使用FakeNet-NG改进动态恶意软件分析

实际上 FakeNet-NG 有许多有用的功能,但通常很多人都不知道。本文将会展示一些使用 FakeNet-NG 的案例,使得 FakeNet-NG 成为网络分析的好帮手。

自从 2016 年 发布 以来, FakeNet-NG 进行了数次改进,新增包括支持 Linux 平台与 基于内容的协议检测 等新功能。最近我们又更新了 FakeNet-NG,包括 HTTP 和二进制协议的自定义响应。

在开始之前提供关于配置 FakeNet-NG 的概览:

配置文件位于 fakenet\configs 中。可以修改 default.ini 或将其复制到新文件,然后 FakeNet-NG 使用 -c 参数加载配置文件。如 fakenet.py -c custom.ini

默认文件位于 fakenet\defaultFiles,而 Listener 的实现位于 fakenet\listeners

文件 fakenet\configs\default.ini 中默认配置包含全局配置与自定义 Listener 配置

自定义响应配置文件包括在目录 fakenet\configs 中的 CustomProviderExample.py、sample_custom_response.ini 和 sample_raw_response.txt

FLARE VM 中的 FARENet-NG 安装在 C:\Python27\lib\site-packages\fakenet。该目录下还有名为 defaultFiles、configs 和 listeners 的子目录

在 FLARE VM 中,桌面的 fakenet_logs 文件夹可以找到 FakeNet-NG 的数据包捕获原文件与 HTTP 请求

自定义文件响应

FakeNet-NG 不仅限于提供 HTML 页面。根据请求文件类型的不同,FakeNet-NG 可以提供 PE 文件、ELF 文件、JPG 文件、GIF 文件等。FakeNet-NG 默认提供几种常见类型的文件,也可以配置自定义文件。在 defaultFiles 目录下有多种类型的标准响应文件。如恶意软件发送 FTP GET 请求拉取 evil.exe,FakeNet-NG 则会将 defaultFiles\FakeNetMini.exe 作为响应返回。该文件是有效的可执行文件,会显示一个提示框。通过提供响应的 PE 文件,可以在恶意软件尝试下载并执行恶意软件时进行观察。下图显示了一个 FTP 会话以及下载默认文件的后续执行:

系统可以处理大多数的请求,但是恶意软件有时会请求特定格式的文件,例如嵌入 PowerShell 代码的图像、带有哈希值的可执行文件可用于完整性检查。在这种情况下,可以使用符合恶意软件要求的文件替换默认文件即可。每个相关的 Listener 配置里都有一个选项可以修改 defaultFiles 的路径。这使得 FakeNet-NG 可以在不修改默认文件的情况下提供不同的文件。自定义的 FakeNet.html 文件如下所示:

自定义二进制协议

许多恶意软件都实现了需要满足特定字节序列的自定义二进制协议。例如 GHOST 家族的恶意软件可能要求每个消息内容都以诸如 GHOST 之类的特定值开头。默认情况下,FakeNet-NG 的 RawLister 使用接收的数据作为响应回显未知请求。通常来说,这样就足够了。但是在需要自定义响应的情况下,仍然可以通过 FakeNet-NG 定制恶意软件想要的数据内容。

FakeNet-NG 现在可以自定义 TCP 和 UDP 响应。假设一个恶意软件样本将字符串 Hello 发送到 C&C 服务器,并且等待以 FLARE 开头随后是数字指令(0-9)的响应包。现在,我们可以介绍如何利用 FakeNet-NG 处理这种情况。

静态自定义响应

可以自行配置原生 TCP/UDP Listener 的响应内容。在本例中,我们配置 FakeNet-NG 如何响应任何原生 TCP 请求(未检测到协议)。如下所示,取消注释 fakenet/configs/default.ini 文件中 RawTCPListener 部分的 Custom 配置选项。

[RawTCPListener]
Enabled:     True
Port:        1337
Protocol:    TCP
Listener:    RawListener
UseSSL:      No
Timeout:     10
Hidden:      False
# To read about customizing responses, see docs/CustomResponse.md
Custom:    sample_custom_response.ini

接着在 fakenet\configs\sample_custom_response.ini 中 TcpRawFile 部分配置自定义响应。请确保注释掉或替换默认的 RawTCPListener 实例。

[ExampleTCP]
InstanceName:     RawTCPListener
ListenerType:     TCP
TcpRawFile:       flare_command.txt

在 fakenet\configs\flare_command.txt 文件内容中添加 FLARE0 即可根据文件内容生成 TCP 响应。

动态自定义响应

如果命令也想要动态进行响应,而不是只能响应 fakenet\configs\flare_command.txt 中的特定命令也可以实现。如下所示,在 fakenet\configs\flare_command.txt 中配置 TcpDynamic 部分自定义响应。请确保注释掉或替换默认的 RawTCPListener 实例。

[ExampleTCP]
InstanceName:     RawTCPListener
TcpDynamic:       flare_command.py

可将文件 fakenet\configs\CustomProviderExample.py 当作动态响应文件 flare_command.py 的模板。修改 HandleTcp() 函数并生成新文件 fakenet\configs\flare_command.py 如下所示。

import socket
def HandleTcp(sock):
    while True:
        try:
            data = None
            data = sock.recv(1024)
        except socket.timeout:
            pass
        if not data:
            break
        resp = raw_input('\nEnter a numeric command: ')
        command = bytes('FLARE' + resp + '\n')
        sock.sendall(command)

现在,可以在恶意软件执行时选择不同的命令:

自定义 HTTP 响应

恶意软件经常在 HTTP 协议上使用自定义的加密方案。例如,恶意软件可能会向 /comm.php?nonce= 发送 HTTP 的 GET 请求,希望 C&C 服务器响应 R** 加密的随机值。过程如下所示:

与 TCP 自定义响应类似,HTTPListener 也提供名为 Custom 的配置,该设置可以启用动态 HTTP 响应。此设置还允许 FakeNet-NG 选择与特定主机或 URI 匹配的响应。使用此功能,可以根据恶意软件样本快速编写 Python 脚本来动态处理 HTTP 流量。

取消注释 HTTPListener80 部分中的 Custom 选项,如下所示:

[HTTPListener80]
Enabled:     True
Port:        80
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      No
Webroot:     defaultFiles/
Timeout:     10
#ProcessBlackList: dmclient.exe, OneDrive.exe, svchost.exe, backgroundTaskHost.exe, GoogleUpdate.exe, chrome.exe
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      False
# To read about customizing responses, see docs/CustomResponse.md
Custom:    sample_custom_response.ini

如下所示,在

fakenet\configs\sample_custom_response.ini 文件中配置 HttpDynamic 响应。请确保注释掉或替换默认的 HttpDynamic 实例。

[Example2]
ListenerType:     HTTP
HttpURIs:         comm.php
HttpDynamic:      http_example.py

可以将文件 fakenet\configs\CustomProviderExample.py 作为动态响应文件 http_example.py 的模板。如下所示,修改 HandleRequest() 函数,FakeNet-NG 将使用随机数动态加密响应。

import socket
from arc4 import AR**
# To read about customizing HTTP responses, see docs/CustomResponse.md
def HandleRequest(req, method, post_data=None):
    """Sample dynamic HTTP response handler.
    Parameters
    ----------
    req : BaseHTTPServer.BaseHTTPRequestHandler
        The BaseHTTPRequestHandler that recevied the request
    method: str
        The HTTP method, either 'HEAD', 'GET', 'POST' as of this writing
    post_data: str
        The HTTP post data received by calling `rfile.read()` against the
        BaseHTTPRequestHandler that received the request.
    """
    response = 'Ahoy\r\n'
    nonce = req.path.split('=')[1]
    arc4 = AR**(nonce)
    response = arc4.encrypt(response)
    req.send_response(200)
    req.send_header('Content-Length', len(response))
    req.end_headers()
    req.wfile.write(response)

手动自定义响应

使用 netcat 代替 FakeNet-NG 的 Listener 会更加灵活。比如,使用 netcat 充当 C&C 服务器,并在 80 端口响应命令。在启动 FakeNet-NG 之前启动 netcat,将响应端口的流量转移到 netcat。如下所示,这样可以使用 netcat 处理响应:

更多自定义响应的内容可以阅读相关 文档

进程黑名单

分析人员可能会在单独的系统中调试恶意软件,这样会使用两个主机/系统。这样设置的情况下,FakeNet-NG 会拦截两台主机之间的全部网络流量,这样便不能进行远程调试了。可以通过 FakeNet-NG 忽略调试程序进程的流量,将调试程序进程列入黑名单。

使用 IDA Pro 进行远程调试时,32 位程序名为 win32_remote.exe(或 WinDbg 的 dbgsrv.exe)。如下所示,将进程名添加到 ProcessBlackList 配置中。这样调试进程就能与 IDA Pro 正常通信,而其他流量由 FakeNet-NG 捕获。

# Specify processes to ignore when diverting traffic. Windows example used here.
ProcessBlackList: win32_remote.exe, dbgsrv.exe

将污染 FakeNet-NG 流量的进程列入进程黑名单也十分有用。包括 Windows 系统更新或其他恶意软件分析的进程。也可以将端口与主机列入黑名单中,关于黑名单与白名单可以查看 文档

连接事件触发命令

FakeNet-NG 可以配置在 Listener 建立连接时执行命令。例如,可用于在连接时将调试器挂载到正在运行的样本。如下所示,示例样本使用 HTTP 协议通过 TCP 的 80 端口与 C&C 服务器通信。

在样本建立连接后,可以将调试器挂载到样本上。这样可以加快样本的分析速度,绕过脱壳和任何可能存在的反调试措施。

使 FakeNet-NG 实现上述功能,要修改 fakenet\configs\default.ini 中 [HTTPListene80] 部分的 ExecuteCmd 配置。如下所示:

[HTTPListener80]
Enabled:     True
Port:        80
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      No
Webroot:     defaultFiles/
Timeout:     10
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      False
# Execute x32dbg –p to attach to a debugger. {pid} is filled in automatically by Fakenet-NG
ExecuteCmd: x32dbg.exe -p {pid}

如上所示,在 80 端口上配置 HTTPListener 执行调试器 x32dbg.exe,该调试器挂载到正在运行的进程上。在 HTTPListener 建立连接时,FakeNet-NG 会将 {pid} 替换为建立连接的进程。此处支持使用的变量的完整列表,可以查看 文档

重新启动 FakeNet-NG 并再次运行样本后,可以看到 x32dbg 启动且挂载到样本文件上。

现在即可使用 Scylla 或 OllyDumpEx 将可执行文件转存进行静态分析。

解密 SSL 流量

恶意软件使用 SSL 进行网络通信,由于对数据包进行了加密就阻碍的流量分析。使用 FakeNet-NG 的 ProxyListener 可以解密流量。

ProxyListener 检测 SSL 协议,使用 Python 的 OpenSSL 库成为中间人。然后在恶意软件以及 HTTPListener 中间保持全双工状态,从而使得 ProsyListener 与 HTTPListener 之间是明文的 HTTP 通信。

为了使 FakeNet-NG 不变得过于复杂,FakeNet-NG 当前默认情况下没有在 443 端口上拦截 HTTPS 通信并提供明文解密。如果要实现该功能,如下所示,要将 HTTPListener443 Hidden 属性设置为 True。

[HTTPListener443]
Enabled:     True
Port:        443
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      Yes
Webroot:     defaultFiles/
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      True

有关协议检测与代理可以查看其他 博客文章

现在可以查看 FakeNet-NG 捕获的数据包。如下所示,可以看见 localhos 临时端口与 80 端口的明文 TCP 流。

结论

FakeNet-NG 是用于恶意软件分析中的得力工具,无需安装即可运行。FakeNet-NG 在不断迭代中提供了许多功能和配置。本文中提供了一些针对不同分析场景下的用法供分析人员参考,更为详尽的描述请参考 FakeNet-NG 项目的 GitHub

*参考来源: FireEye ,FB 小编 Avenger 编译,转载请注明来自 FreeBuf.COM