自从 2016 年以来, 进行了数次改进,新增包括支持 Linux 平台与等新功能。最近我们又更新了 FakeNet-NG,包括 HTTP 和二进制协议的自定义响应。
在开始之前提供关于配置 FakeNet-NG 的概览:
配置文件位于 fakenetconfigs 中。可以修改 default.ini 或将其复制到新文件,然后 FakeNet-NG 使用 -c 参数加载配置文件。如 fakenet.py -c custom.ini
默认文件位于 fakenetdefaultFiles,而 Listener 的实现位于 fakenetlisteners
文件 fakenetconfigsdefault.ini 中默认配置包含全局配置与自定义 Listener 配置
自定义响应配置文件包括在目录 fakenetconfigs 中的 CustomProviderExample.py、sample_custom_response.ini 和 sample_raw_response.txt
FLARE VM 中的 FARENet-NG 安装在 C:Python27libsite-packagesfakenet。该目录下还有名为 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 则会将 defaultFilesFakeNetMini.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
接着在 fakenetconfigssample_custom_response.ini 中 TcpRawFile 部分配置自定义响应。请确保注释掉或替换默认的 RawTCPListener 实例。
[ExampleTCP] InstanceName: RawTCPListener ListenerType: TCP TcpRawFile: flare_command.txt
在 fakenetconfigsflare_command.txt 文件内容中添加 FLARE0 即可根据文件内容生成 TCP 响应。
动态自定义响应
如果命令也想要动态进行响应,而不是只能响应 fakenetconfigsflare_command.txt 中的特定命令也可以实现。如下所示,在 fakenetconfigsflare_command.txt 中配置 TcpDynamic 部分自定义响应。请确保注释掉或替换默认的 RawTCPListener 实例。
[ExampleTCP] InstanceName: RawTCPListener TcpDynamic: flare_command.py
可将文件 fakenetconfigsCustomProviderExample.py 当作动态响应文件 flare_command.py 的模板。修改 HandleTcp 函数并生成新文件 fakenetconfigsflare_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
如下所示,在
fakenetconfigssample_custom_response.ini 文件中配置 HttpDynamic 响应。请确保注释掉或替换默认的 HttpDynamic 实例。
[Example2] ListenerType: HTTP HttpURIs: comm.php HttpDynamic: http_example.py
可以将文件 fakenetconfigsCustomProviderExample.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 = ‘Ahoyrn’ 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 实现上述功能,要修改 fakenetconfigsdefault.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} 替换为建立连接的进程。此处支持使用的变量的完整列表,可以查看文档。
现在即可使用 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
有关协议检测与代理可以查看其他博客文章。
结论
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!