mandiant/flare-fakenet-ng
GitHub: mandiant/flare-fakenet-ng
FakeNet-NG 是一款由 Mandiant 开源的动态网络流量拦截与模拟工具,主要用于恶意软件行为分析和渗透测试中的网络特征提取。
Stars: 2102 | Forks: 379
```
______ _ ________ _ _ ______ _______ _ _ _____
| ____/\ | |/ / ____| \ | | ____|__ __| | \ | |/ ____|
| |__ / \ | ' /| |__ | \| | |__ | |______| \| | | __
| __/ /\ \ | < | __| | . ` | __| | |______| . ` | | |_ |
| | / ____ \| . \| |____| |\ | |____ | | | |\ | |__| |
|_|/_/ \_\_|\_\______|_| \_|______| |_| |_| \_|\_____|
D O C U M E N T A T I O N
```
FakeNet-NG 3.5 是一款面向恶意软件分析师和渗透测试人员的下一代动态网络分析工具。它是开源的,专为最新版本的 Windows(以及特定运行模式下的 Linux)设计。FakeNet-NG 基于由 Andrew Honig 和 Michael Sikorski 开发的优秀 Fakenet 工具。
该工具允许您拦截和重定向所有或特定的网络流量,同时模拟合法的网络服务。使用 FakeNet-NG,恶意软件分析师可以快速识别恶意软件的功能并捕获网络特征。渗透测试人员和漏洞猎手会发现,在测试应用程序的特定功能和制作 PoC 原型时,FakeNet-NG 可配置的拦截引擎和模块化框架非常有用。
# 安装
您可以通过几种不同的方式安装 FakeNet-NG。请注意,以下安装过程会将 FakeNet-NG 使用的第三方开源库下载到您的系统中。这些库将在运行时动态加载,其中一些库可能采用 LGPL 许可。
## 独立可执行文件
最简单的方法是直接下载编译好的版本,可以从发布页面获取:
```
https://github.com/mandiant/flare-fakenet-ng/releases
```
通过运行 'fakenet.exe' 来执行 FakeNet-NG。
这是在 Windows 上使用 FakeNet-NG 的首选方法,因为它不需要您安装任何额外的模块,非常适合恶意软件分析机。
*注意*:FakeNet-NG 可能会被杀毒软件 (AV) 和端点检测与响应 (EDR) 解决方案(例如 Windows Defender、Chrome 的安全浏览)标记为恶意软件。这可能是由于它具备修改网络流量和模拟网络服务的能力,此外还使用了 PyInstaller 来构建发布可执行文件。官方发布的二进制文件是安全的,这些检测应被视为误报。再次提醒,FakeNet-NG 专为受控和隔离的环境(例如虚拟机 (VM))设计并强烈建议在这些环境中使用,在此环境中它可以安全地更改系统的网络设置。
## 安装模块
1. 安装适用于 Windows/Linux 操作系统的 Python 3.10.11 和最新版 pip。
2. 在 Windows 上,下载并安装 [Visual C++ build tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)。
在 Linux 上安装需要以下依赖项:
* Python pip 包管理器(例如 Ubuntu 的 python-pip)。
* Python 开发文件(例如 Ubuntu 的 python-dev)。
* OpenSSL 开发文件(例如 Ubuntu 的 libssl-dev)。
* libffi 开发文件(例如 Ubuntu 的 libffi-dev)。
* libnetfilterqueue 开发文件(例如 Ubuntu 的 libnetfilter-queue-dev)。
使用以下命令安装这些依赖项:
sudo apt-get install build-essential python3.10-dev libnetfilter-queue-dev
3. 使用 pip 将 FakeNet-NG 作为 Python 模块安装:
python -m pip install https://github.com/mandiant/flare-fakenet-ng/zipball/master
或者通过获取最新源代码并手动安装:
git clone https://github.com/mandiant/flare-fakenet-ng/
4. 使用管理员权限运行以下命令来安装 Python 依赖项:
在 Linux(已在 Ubuntu 24.04.2 LTS 上测试)中,在运行 setup.py 之前运行以下命令:
python -m pip install --upgrade setuptools
# build wheel for python 3.10
python -m pip install --force-reinstall netifaces
# Observed "ModuleNotFoundError: No module named '_cffi_backend'" error while testing
# This will get the required version of cffi packages for cryptography
python -m pip install --upgrade cryptography
如果是手动安装,请将目录切换到下载的 flare-fakenet-ng 并使用管理员权限运行以下命令:
python setup.py install
5. 在 Linux 中,释放端口 53 供 DNS 监听器使用:
sudo systemctl stop systemd-resolved
在特权 shell 中从任意目录运行 'fakenet' 来执行 FakeNet-NG。
## 免安装
最后,如果您不想安装 FakeNet-NG,只想按原样运行它(例如用于开发),则需要获取源代码并按如下方式安装依赖项:
1. 为 64 位或 32 位版本的 Windows/Linux 分别安装对应的 64 位或 32 位 [Python](https://www.python.org/downloads/windows/) 3.10.11。
2. 在 Windows 中,使用管理员权限运行以下命令来安装 Python 依赖项:
python -m pip install pydivert dnslib dpkt pyopenssl==24.2.1 pyftpdlib netifaces jinja2
*注意*:pydivert 还会下载 WinDivert 库和驱动程序并安装到 `%PYTHONHOME%\DLLs` 目录中。FakeNet-NG 已打包这些文件,因此正常使用不需要此操作。
在 Linux 中,使用管理员权限运行以下命令来安装 Python 依赖项:
python -m pip install --upgrade setuptools
# build wheel for python 3.10
python -m pip install --force-reinstall netifaces
# Observed "ModuleNotFoundError: No module named '_cffi_backend'" error while testing
# This will get the required version of cffi packages for cryptography
python -m pip install --upgrade cryptography
python -m pip install netfilterqueue dnslib dpkt pyopenssl==24.2.1 pyftpdlib netifaces jinja2
(可选)您可以安装以下用于测试的模块:
python -m pip install requests
3. 下载 FakeNet-NG 源代码:
git clone https://github.com/mandiant/flare-fakenet-ng
4. 在 Linux 中,释放端口 53 供 DNS 监听器使用:
sudo systemctl stop systemd-resolved
在特权 shell 中使用 Python 解释器运行 FakeNet-NG:
python -m fakenet.fakenet
# 使用方法
运行 FakeNet-NG 最简单的方法是以管理员身份直接执行提供的可执行文件。您可以提供 `--help` 命令行参数来获取简单的帮助信息:
```
C:\tools\fakenet-ng>fakenet.exe --help
______ _ ________ _ _ ______ _______ _ _ _____
| ____/\ | |/ / ____| \ | | ____|__ __| | \ | |/ ____|
| |__ / \ | ' /| |__ | \| | |__ | |______| \| | | __
| __/ /\ \ | < | __| | . ` | __| | |______| . ` | | |_ |
| | / ____ \| . \| |____| |\ | |____ | | | |\ | |__| |
|_|/_/ \_\_|\_\______|_| \_|______| |_| |_| \_|\_____|
Version 3.5
_____________________________________________________________
Developed by FLARE Team
Copyright (C) 2016-2026 Mandiant, Inc. All rights reserved.
_____________________________________________________________
Usage: python -m fakenet.fakenet [options]:
Options:
-h, --help show this help message and exit
-c FILE, --config-file=FILE
configuration filename
-v, --verbose print more verbose messages (default: False)
-l LOG_FILE, --log-file=LOG_FILE
-s, --log-syslog Log to syslog via /dev/log (default: False)
-f STOP_FLAG, --stop-flag=STOP_FLAG
terminate if stop flag file is created
-p, --no-pause disable pause for confirmation before closing the console
(default: pause)
-n, --no-console-output
Suppress console output (for testing on Linux)
```
从上面的简单帮助信息可以看出,可以配置用于启动 FakeNet-NG 的配置文件。默认情况下,该工具使用 `configs\default.ini`;但是,可以使用 `-c` 参数进行更改。`configs` 目录中有几个示例配置文件。由于设置众多,FakeNet-NG 依靠配置文件来控制其功能。
注意:FakeNet-NG 将首先尝试使用提供的绝对或相对路径来定位指定的配置文件,以防您希望存储所有的配置。如果未找到指定的配置文件,那么它会尝试在其 `configs` 目录中查找。
其余的命令行选项允许您控制显示的日志输出量,以及将其重定向到文件而不是直接输出到屏幕上。
## 简单运行
在深入了解并运行 FakeNet-NG 之前,让我们先介绍几个基本概念。该工具由多个协同工作的模块组成。其中一个重要的模块是 Diverter,它负责将流量重定向到一系列监听器。Diverter 强制应用程序与 FakeNet-NG 进行交互,而不是与真实服务器交互。监听器是处理传入连接并允许我们检查应用程序流量(例如恶意软件特征)的单个服务。
让我们通过运行以下命令使用默认设置启动 FakeNet-NG:
```
C:\tools\fakenet-ng>fakenet.exe
```
下面是带有注释的输出日志,展示了拦截 DNS 请求和 HTTP 连接的示例:
```
______ _ ________ _ _ ______ _______ _ _ _____
| ____/\ | |/ / ____| \ | | ____|__ __| | \ | |/ ____|
| |__ / \ | ' /| |__ | \| | |__ | |______| \| | | __
| __/ /\ \ | < | __| | . ` | __| | |______| . ` | | |_ |
| | / ____ \| . \| |____| |\ | |____ | | | |\ | |__| |
|_|/_/ \_\_|\_\______|_| \_|______| |_| |_| \_|\_____|
Version 3.5
_____________________________________________________________
Developed by FLARE Team
Copyright (C) 2016-2026 Mandiant, Inc. All rights reserved.
_____________________________________________________________
07/06/16 10:20:52 PM [ FakeNet] Loaded configuration file: configs/default.ini
/
default configuration file /
07/06/16 10:20:52 PM [ Diverter] Capturing traffic to packets_20160706_222052.pcap
/
PCAP output file /
07/06/16 10:20:52 PM [ FakeNet] Anonymous Forwarder listener on TCP port 8080...
\
\ Anonymous Listener rule
07/06/16 10:20:52 PM [ RawTCPListener] Starting...
07/06/16 10:20:52 PM [ RawUDPListener] Starting...
07/06/16 10:20:52 PM [ FilteredListener] Starting...
07/06/16 10:20:52 PM [ DNS Server] Starting...
07/06/16 10:20:52 PM [ HTTPListener80] Starting...
07/06/16 10:20:52 PM [ HTTPListener443] Starting...
07/06/16 10:20:52 PM [ SMTPListener] Starting...
07/06/16 10:20:52 PM [ Diverter] Starting...
\
\ Listeners starting up
07/06/16 10:20:52 PM [ Diverter] Diverting ports:
07/06/16 10:20:52 PM [ Diverter] TCP: 1337, 80, 443, 25
07/06/16 10:20:52 PM [ Diverter] UDP: 1337, 53
/
Summary of diverted ports /
07/06/16 10:21:03 PM [ Diverter] Modifying outbound external UDP request packet:
07/06/16 10:21:03 PM [ Diverter] from: 192.168.250.140:49383 -> 4.2.2.1:53
07/06/16 10:21:03 PM [ Diverter] to: 192.168.250.140:49383 -> 192.168.250.140:53
07/06/16 10:21:03 PM [ Diverter] pid: 456 name: malware.exe
/
Intercepted traffic to the DNS server from malware.exe /
07/06/16 10:21:03 PM [ DNS Server] Received A request for domain 'evil.com'.
\
\ Fake DNS Listener handling the above request
07/06/16 10:21:04 PM [ Diverter] Modifying outbound external TCP request packet:
07/06/16 10:21:04 PM [ Diverter] from: 192.168.250.140:2179 -> 192.0.2.123:80
07/06/16 10:21:04 PM [ Diverter] to: 192.168.250.140:2179 -> 192.168.250.140:80
07/06/16 10:21:04 PM [ Diverter] pid: 456 name: malware.exe
/
Intercepted traffic to the web server from malware.exe /
07/06/16 10:21:08 PM [ HTTPListener80] Received a GET request.
07/06/16 10:21:08 PM [ HTTPListener80] --------------------------------------------------------------------------------
07/06/16 10:21:08 PM [ HTTPListener80] GET / HTTP/1.0
07/06/16 10:21:08 PM [ HTTPListener80]
07/06/16 10:21:08 PM [ HTTPListener80] --------------------------------------------------------------------------------
\
\ Fake HTTP Listener handling the above request
```
请注意,每行日志都带有一个当前正在运行的 FakeNet-NG 模块的名称。例如,当它正在分流流量时,日志将带有 `Diverter` 标签前缀:
```
07/06/16 10:21:03 PM [ Diverter] Modifying outbound external UDP request packet:
07/06/16 10:21:03 PM [ Diverter] from: 192.168.250.140:49383 -> 4.2.2.1:53
07/06/16 10:21:03 PM [ Diverter] to: 192.168.250.140:49383 -> 192.168.250.140:53
07/06/16 10:21:03 PM [ Diverter] pid: 456 name: malware.exe
```
同时,每当各个监听器处理分流后的流量时,日志将带有配置文件中设置的名称标签:
```
07/06/16 10:21:03 PM [ DNS Server] Received A request for domain 'evil.com'.
```
要停止 FakeNet-NG 并将生成的 PCAP 文件和 HTML 报告保存到磁盘,只需按 `CTRL-C`:
```
07/06/16 10:21:41 PM [ FakeNet] Stopping...
07/06/16 10:21:42 PM [ HTTPListener80] Stopping...
07/06/16 10:21:42 PM [ HTTPListener443] Stopping...
07/06/16 10:21:42 PM [ SMTPListener] Stopping...
07/06/16 10:21:43 PM [ Diverter] Stopping...
07/06/16 10:21:43 PM [ Diverter] Generated new HTML report: report_20160607_102143.html
[Press Enter to exit]
```
等待 PCAP 和报告生成完毕,然后按 `Enter` 退出。在此之前控制台窗口将保持打开状态;可以使用 `--no-pause` 标志禁用此功能(例如在脚本中)。
## 用户界面
在每次 FakeNet-NG 会话中,都会生成一份包含整个会话期间捕获的基于网络的指标 (NBI) 的 HTML 报告。当通过按 `CTRL-C` 终止 FakeNet 时,此 HTML 文件将保存到 FakeNet 的根目录中。用户可以通过在 Chrome 或 Firefox 等浏览器中查看此 HTML 文件来查看 NBI。
HTML 报告充当交互式图形用户界面 (GUI),以用户友好的方式呈现 NBI 摘要。它包含各种用于选择、过滤和复制 NBI 的功能,使网络分析更容易。UI 根据进程信息组织所有的 NBI,然后根据它们使用的应用层或传输层协议进一步分类。
#### NBI 摘要表
NBI 摘要表中的信息以表格格式呈现,包含以下详细信息:
* 选择:点击复选框将选择相应的 NBI。您可以跨不同或相同协议选择多个 NBI。也可以通过点击行内的任意位置来选择整行。选定的 NBI 可以使用“Copy Selected NBIs”按钮进行复制。
* NBI:此单元格代表实际捕获的 NBI。它包括客户端针对监听器生成的命令、参数、URI 和其他重要活动。该单元总结了恶意软件的行为,以便更好地理解。
* 附加信息:此单元格提供有关每个 NBI 请求的额外信息,例如使用的传输层协议、目标 IP、端口和 SSL 加密。
* 操作:此单元格允许您对单个 NBI 执行操作。目前仅支持复制。点击复制按钮将以适合创建报告的 Markdown 格式复制特定的 NBI 单元格数据。
#### 交互功能
UI 还包括各种交互功能:
* 复选框选择:每个进程和协议块之前都有复选框。勾选复选框会选择该进程或协议下的所有 NBI。当您希望选择特定进程或协议的所有 NBI 时,这非常有用。然后,您可以使用 `Copy Selected NBIs` 按钮复制选定的数据。
* 搜索栏:搜索栏允许您键入关键字,并且只有在进程名称、NBI 或附加信息中包含这些关键字的行才会显示在 HTML 页面中。然后,您可以使用“Copy Filtered Data”按钮以 Markdown 格式复制显示的数据。清除搜索查询将恢复原始表格视图。
* 复制按钮:
* `Copy Selected Data`:以 Markdown 格式复制所有选定的 NBI。您可以通过勾选复选框来选择单个 NBI 或进程下的所有 NBI。
* `Copy Filtered Data`:以 Markdown 格式复制过滤后的 NBI 数据。如果未使用搜索查询,此按钮将复制全部数据。
* `Copy All NBIs`:以 Markdown 格式复制 HTML 页面中存在的所有 NBI。即使应用了过滤器,点击此按钮也会复制所有 NBI。
* 免责声明按钮:显示免责声明,其中概述了用户在对显示的 NBI 摘要做出假设之前需要考虑的重要事实。
* 返回顶部按钮:当页面内容超出可视区域时出现。点击此按钮将带您返回页面顶部,您可以在那里访问重要的按钮,例如 `Copy Selected NBIs`、`Copy All NBIs`、`Copy Filtered NBIs` 和搜索栏。
## 配置
为了充分利用 FakeNet-NG 的功能,我们必须了解其配置文件的结构和设置。以下是一个示例配置文件:
```
###############################################################################
# Fakenet Configuration
[FakeNet]
DivertTraffic: Yes
###############################################################################
# Diverter Configuration
[Diverter]
NetworkMode: Auto
LinuxRedirectNonlocal: *
LinuxFlushIptables: Yes
LinuxFlushDNSCommand: service dns-clean restart
DumpPackets: Yes
DumpPacketsFilePrefix: packets
ModifyLocalDNS: No
StopDNSService: Yes
RedirectAllTraffic: Yes
DefaultTCPListener: RawTCPListener
DefaultUDPListener: RawUDPListener
###############################################################################
# Listener Configuration
[DNS Server]
Enabled: True
Port: 53
Protocol: UDP
Listener: DNSListener
DNSResponse: 192.0.2.123
NXDomains: 0
Hidden: False
[RawTCPListener]
Enabled: True
Port: 1337
Protocol: TCP
Listener: RawListener
UseSSL: No
Timeout: 10
Hidden: False
```
配置文件分为几个部分。
* **[FakeNet]** - 控制应用程序本身的行为。目前唯一有效的选项是 `DivertTraffic`。启用时,它会指示工具启动相应的 Diverter 插件并拦截流量。如果禁用此选项,FakeNet-NG 仍将启动监听器,但将依靠另一种方法将流量导向它们(例如手动更改 DNS 服务器)。
* **[Diverter]** - 用于重定向流量的设置。下面将详细介绍。
* **[Listener Name]** - 一组监听器配置。每个监听器都有一组默认设置(例如端口、协议)以及特定于监听器的配置(例如 HTTPListener 的 DumpHTTPPosts)。
## Diverter 配置
假设您在 `[FakeNet]` 配置块中启用了 `DivertTraffic` 设置,该工具将启用其流量重定向引擎,从现在起我们将其称为 Diverter,以致敬在 Windows 平台上用于在幕后执行神奇操作的出色 `WinDivert` 库(Diverter 的 Linux 实现使用 [python-netfilterqueue](https://github.com/kti/python-netfilterqueue/)))。
Diverter 将检查所有的传出数据包,并将它们与已启用监听器的协议和端口列表进行匹配。如果有一个监听器正在监听该数据包的端口和协议,那么目标地址将被更改为运行监听器的本地机器的 IP 地址。同时,来自监听器的响应也会被更改,从而使源 IP 地址看起来像是来自最初请求的主机。
您可以选择启用 `DumpPackets` 设置,将 FakeNet-NG 观察到的所有流量(重定向或转发的)存储到 PCAP 文件中。可以使用 SSL 支持在拦截的应用程序和其中一个监听器之间解密 SSL 流量。请按照以下页面上的说明进行操作:
```
https://wiki.wireshark.org/TLS
```
FakeNet-NG 服务器使用的密钥 `privkey.pem` 和 `server.pem` 位于应用程序的根目录中。
* **NetworkMode** - 指定运行 FakeNet-NG 的网络模式。
* 有效设置为:
* `SingleHost`:操纵来自本地进程的流量。
* `MultiHost`:操纵来自其他系统的流量。
* `Auto`:使用在当前平台上功能最全的 `NetworkMode`。
* 目前并非所有平台都支持所有 `Network` 设置。以下是当前的支持状态:
* Windows 仅支持 `SingleHost`
* Linux 支持 `MultiHost` 并在实验性基础上支持 `SingleHost` 模式(除了进程、端口和主机黑名单及白名单外均可正常工作)。
* 目前,将其设置为 `Auto` 即可在 Windows 上获取 `SingleHost` 模式,在 Linux 上获取 `MultiHost` 模式。
Diverter 通常支持以下与 DNS 相关的设置:
* **ModifyLocalDNS** - 将本地机器的 DNS 服务指向 FakeNet-NG 的 DNS 监听器。
Windows 上的 Diverter 实现支持以下与 DNS 相关的设置:
* **StopDNSService** - 停止 Windows DNS 客户端服务。这允许 FakeNet-NG 看到解析域名的实际进程,而不是通用的 'svchost.exe' 进程。
Linux 上的 Diverter 实现支持以下设置:
* **LinuxRedirectNonlocal** - 当使用 FakeNet-NG 为不同的主机模拟 Internet 连接时,这指定了哪些面向外部的网络接口要重新路由到 FakeNet-NG。
* **LinuxFlushIptables** - 在为 FakeNet-NG 添加规则之前清空所有 `iptables` 规则。只要其终止序列未被中断,Linux Diverter 就会恢复旧规则。
* **LinuxFlushDnsCommand** - 指定适用于您的 Linux 发行版的正确命令以刷新 DNS 解析器缓存(如果适用)。
* **DebugLevel** - 指定要显示的细粒度调试事件。有关有效标签,请参阅 [fakenet/diverters/linutil.py](fakenet/diverters/linutil.py)。
## 重定向所有流量
默认情况下,Diverter 仅拦截为其创建了专用监听器的流量。但是,通过启用 `RedirectAllTraffic` 设置并使用 `DefaultTCPListener` 和 `DefaultUDPListener` 设置配置默认的 TCP 和 UDP 处理程序,可以动态处理发往未在某个监听器中显式定义的端口的流量。例如,让我们看一个示例配置,它将所有流量重定向到本地端口 1234 上的 TCP 和 UDP 监听器:
```
RedirectAllTraffic: Yes
DefaultTCPListener: TCPListener1234
DefaultUDPListener: UDPListener1234
```
*注意*:我们在监听器定义方面有些超前了,但只需假设 `TCPListener1234` 和 `UDPListener1234` 将在下面的部分中进行定义。
使用 `RedirectAllTraffic` 设置,FakeNet-NG 不仅会修改目标地址,还会修改目标端口,以便它可以由其中一个默认监听器处理。以下是发往外部主机 IP 地址 1.1.1.1 上端口 4444 的流量的示例日志,该流量被重定向到了端口 1234 上的默认监听器:
```
07/06/16 01:13:47 AM [ Diverter] Modifying outbound external TCP request packet:
07/06/16 01:13:47 AM [ Diverter] from: 192.168.66.129:1650 -> 1.1.1.1:4444
07/06/16 01:13:47 AM [ Diverter] to: 192.168.66.129:1650 -> 192.168.66.129:1234
07/06/16 01:13:47 AM [ Diverter] pid: 3716 name: malware.exe
```
需要注意的是,发往某个显式定义的监听器所在端口的流量仍将由该监听器处理,而不是默认监听器。例如,如果定义了单独的 UDP 端口 53 DNS 监听器,则默认的 UDP 监听器将不处理 DNS 流量。
启用 `RedirectAllTraffic` 选项时的一个问题是,您可能仍然希望放行一些流量以确保机器的正常运行。考虑这样一个场景:您正在尝试分析一个仍然需要连接到外部 DNS 服务器的应用程序。您可以利用 `BlackListPortsTCP` 和 `BlackListPortsUDP` 设置来定义一系列端口,发往这些端口的流量将被忽略并无修改地转发,或者使用 `BlackListIDsICMP`(仅限 Windows)来定义要过滤并忽略的 ICMP ID 列表:
```
BlackListPortsUDP: 53
```
您可以考虑的其他一些 Diverter 设置是 `ProcessBlackList` 和 `HostBlackList`,它们允许 Diverter 忽略并转发来自特定进程名称或发往特定主机的流量。
## 监听器配置
监听器配置定义了各个监听器的行为。让我们看一个示例监听器配置:
```
[TCPListener1234]
Enabled: True
Port: 1234
Protocol: TCP
Listener: RawListener
UseSSL: Yes
Timeout: 10
Hidden: False
```
上面的配置由监听器名称 `TCPListener1234` 组成。它将用于日志记录目的,以便您可以区分处理连接的不同监听器,即使它们处理的是相同的协议。
以下设置是所有监听器通用的:
* **Enabled** - 指定是否启用该监听器。
* **Port** - 要监听的 TCP 或 UDP 端口。
* **Protocol** - TCP 或 UDP
* **Listener** - 处理流量的监听器名称。
* **ProcessWhiteList** - 仅修改来自这些进程的流量,其余的将直接转发。
* **ProcessBlackList** - 除了来自这些进程的流量外,所有其他的流量都将直接转发,而指定的这些进程的流量将根据需要进行修改。
* **HostWhiteList** - 仅修改发往这些主机的流量,其余的将直接转发。
* **HostBlackList** - 发往这些主机的流量将被直接转发,其余的流量将根据需要进行修改。
* **ExecuteCmd** - 在第一个连接数据包上执行命令。此功能有助于扩展 FakeNet-NG 的功能(例如,在连接的 pid 上启动调试器以帮助解包和解码)。
* **Hidden** - 不允许流量直接定向到此监听器,而是必须通过代理,代理将根据数据包内容确定协议。
监听器需要 `Port` 和 `Protocol` 设置才能知道要绑定到哪些端口,并且如果它们支持多种协议(例如 RawListener),则可以决定使用哪种协议。Diverter 也使用它们来确定要重定向哪些端口和协议。
`Listener` 设置定义了可用的监听器插件之一,用于处理重定向的流量。当前版本的 FakeNet-NG 附带以下监听器:
* **DNSListener** - 支持 DNS 协议,并使用本地机器的 IP 地址或 `DNSResponse` 设置中可配置的地址来回复 A 记录。您还可以将 `NXDomains` 属性设置为监听器应忽略的请求数量。这样您可能能够让恶意软件请求其所有备用 C2 控制器名称。该监听器支持 TCP 和 UDP 协议。
* **RawListener** - 支持基本的 TCP 和 UDP 二进制协议。默认行为是将接收到的数据包简单地回显给客户端。支持 SSL 连接。
* **HTTPListener** - 支持 HTTP 和 HTTPS 协议。根据请求的文件扩展名,使用可配置的 `Webroot` 目录中的不同文件进行响应。可选择将 POST 请求转储到可配置的文件中,可以使用 `DumpHTTPPosts` 和 `DumpHTTPPostsFilePrefix` 设置来指定。
* **SMTPListener** - 支持 SMTP 协议。
* **ProxyListener**- 根据数据包内容检测协议并相应地重定向数据包。
注意:FakeNet-NG 将首先尝试使用提供的绝对或相对路径来定位 webroot 目录。如果未找到指定的 webroot 路径,那么它会尝试在其 `defaultFiles` 目录中查找。
作为一种特殊情况,Windows Diverter 实现在运行时会自动响应所有的 ICMP 请求。因此,如果恶意软件试图 ping 主机以测试连接性,它将获得有效的响应。Linux Diverter 会记录所有 ICMP 数据包并将其转发到 localhost。
注意:某些监听器可以处理文件上传(例如 TFTPListener 和 BITSListener)。所有上传的文件将与可配置的前缀(例如 TFTP 上传的 "tftp_")一起存储在当前工作目录中。
## 监听器过滤
FakeNet-NG 支持由进程和主机黑名单及白名单组成的几种过滤规则。白名单被视为允许连接到监听器的规则,而黑名单用于忽略传入连接并让它们直接转发。
例如,考虑下面带有进程和主机过滤器的配置:
```
[FilteredListener]
Enabled: True
Port: 31337
Protocol: TCP
Listener: RawListener
UseSSL: No
Timeout: 10
ProcessWhiteList: malware.exe, ncat.exe
HostBlackList: 5.5.5.5
```
上面的 `FilteredListener` 将只处理来自进程 `malware.exe` 和 `cat.exe` 的连接,但会忽略发往主机 `5.5.5.5` 的任何连接。这意味着,如果一个名为 `test.exe` 的进程试图连接到端口 31337,它将不会被重定向到监听器,并且在路由可用的情况下将被转发到其最初的目标。
同时,如果进程 `malware.exe` 试图连接到除 `5.5.5.5` 之外的任何主机上的端口 31337,它将被分流到 `FilteredListener`。来自进程 `malware.exe` 且发往 `5.5.5.5` 的任何连接都将被允许通过。
## 监听器命令执行
另一个强大的配置设置是 `ExecuteCmd`。它本质上允许您在检测到连接的第一个数据包时执行任意命令。`ExecuteCmd` 的值可以使用几个格式字符串变量:
* `{pid}` - 进程 ID
* `{procname}` - 进程可执行文件名称
* `{src_addr}` - 源地址
* `{src_port}` - 源端口
* `{dst_addr}` - 目标地址
* `{dst_port}` - 目标端口
考虑一个加壳恶意软件样本的场景,该样本连接到配置在端口 8443 上的 C2 服务器(如果端口未知,请使用 `RedirectAllTraffic`)。在许多情况下,恶意软件在进行连接时已经完成了自解包,这使得执行过程中的这个时间点非常适合使用调试器附加到进程,并转储其解包版本以供进一步分析。
让我们看看如何利用它在首次连接时自动启动调试器:
```
[C2Listener]
Enabled: True
Port: 8443
Protocol: TCP
Listener: RawListener
UseSSL: Yes
Timeout: 300
ProcessWhiteList: malware.exe
ExecuteCmd: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe -p {pid}
```
一旦 FakeNet-NG 检测到来自白名单进程 `malware.exe` 的新连接(此设置是可选的),它将自动启动 `windbg` 并将其附加到连接的进程。
*注意*:如果恶意软件需要进一步与监听器交互,您可能需要延长正常的 `Timeout` 设置。
## 匿名监听器
有一种特殊的用例,您可以在不定义实际处理流量的监听器的情况下创建新的监听器配置:
```
[Forwarder]
Enabled: True
Port: 8080
Protocol: TCP
ProcessWhiteList: chrome.exe
```
在没有定义监听器的情况下,FakeNet-NG 仍然会将流量分流到本地机器,但是用户必须手动启动一个单独的监听器。例如,您可能有一个 HTTP 代理监听端口 8080 上的连接,并让 FakeNet-NG 拦截所有不使用系统代理服务器设置或使用硬编码 IP 地址的应用程序的流量。使用匿名监听器,您可以将 FakeNet-NG 的高级流量和进程过滤功能引入第三方工具。
您可能还希望启用 Diverter 的 `ProcessBlackList` 设置,以允许外部工具与 Internet 进行通信。例如,要允许 HTTP 代理转发代理流量,请将其进程名称添加到进程黑名单中。例如,添加以下进程以允许 Burp Proxy 与 Internet 进行通信:
```
ProcessBlackList: java.exe
```
在应用程序通过未知端口进行通信,但您仍希望将其重定向到端口 8080 上的匿名监听器的场景中,您可以按如下方式定义默认监听器:
```
RedirectAllTraffic: Yes
DefaultTCPListener: ForwarderTCP
DefaultUDPListener: RawUDPListener
```
最后,为了允许 DNS 流量仍能发往 Internet 上的默认 DNS 服务器,同时重定向所有其他流量,请将端口 53 添加到 Diverter 的 UDP 端口黑名单中,如下所示:
```
BlackListPortsUDP:
```
## 代理监听器
最新版本的 FakeNet-NG 实现了一个新的代理监听器,它能够动态检测通信协议(包括 SSL 流量)并将连接重定向到相应的监听器。
您可以按照下面的配置说明,将代理监听器配置为在特定端口上工作:
```
[ProxyTCPListener]
Enabled: True
Protocol: TCP
Listener: ProxyListener
Port: 38926
Listeners: HTTPListener, RawListener, FTPListener, DNSListener, POPListener, SMTPListener, TFTPListener, IRCListener, BITSListener
Hidden: False
```
请注意,新的 `Listeners` 参数定义了一系列针对所有传入连接尝试的潜在协议处理程序列表。
还建议通过更新以下 Diverter 配置,将代理监听器定义为您的默认处理程序:
```
RedirectAllTraffic: Yes
DefaultTCPListener: ProxyTCPListener
DefaultUDPListener: ProxyUDPListener
```
在默认监听器指向代理监听器的情况下,所有未知连接都将得到妥善处理。您仍然可以将特定监听器分配给端口以强制使用特定协议(例如,端口 80 始终使用 HTTP 监听器)。
代理通过使用 taste() 函数轮询所有可用的监听器来确定数据包的协议。每个实现了 taste() 的监听器将返回一个分数,指示该监听器处理的协议与数据包内容匹配的可能性。代理会将数据包转发给返回最高分数的监听器。RawListener 将始终返回分数 1,因此在所有其他监听器返回 0 的情况下,它将被选择作为默认值。
用户可以在每个监听器的配置中更改 'Hidden' 配置参数。如果 Hidden 为 'False',监听器将绑定到特定端口并自动接收该端口上的所有流量。如果 Hidden 设置为 'True',则监听器只能接收通过代理重定向的流量。
# 开发
FakeNet-NG 是使用 Python 开发的,这使您能够快速开发新插件并扩展现有功能。有关详细信息,请参阅 [为 FakeNet-NG 开发](docs/developing.md)。
# 已知问题
## [WinError 87] 参数不正确
在撰写本文时,pydivert 中的默认缓冲区大小为 1500。如果 FakeNet-NG 遇到大于默认缓冲区大小的数据包,您可能会看到此错误。一种解决方法是在 fakenet/diverters/windows 的 self.handle.recv(bufsize=) 中指定所需的缓冲区大小。
参见[此处](https://github.com/ffalcinelli/pydivert/issues/42#issuecomment-495036124)
## 在启用了仅主机模式的 VMWare 上无法运行
请参阅下面的“未拦截流量”。
## 未拦截流量
为了使 FakeNet-NG 能够拦截和修改数据包,必须存在有效的网络路由,数据包才能到达其目的地。
有一种的方法可以检查路由设置是否正确。在工具未运行的情况下,尝试 ping 目标主机。您应该会看到有效的响应或超时消息。如果您收到的是目标不可达错误,则说明您没有有效的路由。这通常是由于您的网关未设置或不可达造成的。例如,在启用了仅主机模式的 VMWare 机器上,您的机器将没有配置网关,从而阻止 FakeNet-NG 看到任何流量。
要解决此问题,请手动将您的主接口配置为同一子网中的网关。首先检查接口名称:
```
C:\>netsh interface show interface
Admin State State Type Interface Name
-------------------------------------------------------------------------
Enabled Connected Dedicated Local Area Connection
```
在这种情况下,接口名称是“Local Area Connection”,因此我们将在其余的命令中使用它。
按如下方式手动配置接口 IP 地址和网关:
```
C:\>netsh interface ip set address name="Local Area Connection" static 192.168.249.123 255.255.255.0 192.168.249.254
```
手动设置 DNS 服务器 IP 地址
```
C:\>netsh interface ip set dns name="Local Area Connection" static 4.2.2.2
```
如果您仍有问题,请确保网关 IP 地址本身是可路由的。
## DNS 无法解析名称
确保 DNS 监听器成功绑定到其端口。类似以下的错误表明 DNS 监听器未成功绑定:
```
05/01/17 11:11:16 AM [ FakeNet] Error starting DNSListener listener:
05/01/17 11:11:16 AM [ FakeNet] [Errno 98] Address already in use
```
使用 `netstat`、`tcpview` 或其他工具来发现哪个应用程序绑定到了该端口,并参考相应的操作系统或应用程序文档来禁用该服务。
在进行重新配置之前捕获虚拟机快照可能是有意义的。例如,Ubuntu 通常在 `/etc/NetworkManager/NetworkManager.conf` 中通过 `dns=dnsmasq` 这行配置启用 `dnsmasq` 服务。禁用它(例如通过将其注释掉)并重新启动 `network-manager` 服务(例如 `service network-manager restart`)足以在重新启动 FakeNet-NG 之前释放该端口。
在更新版本的 Ubuntu 或其他发行版中,使用 `lsof -i` 可能会发现使用的是 `systemd-resolved`。在这些情况下,您可以尝试以下改编自
的步骤:
```
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
```
然后在 `/etc/NetworkManager/NetworkManager.conf` 的 `[main]` 部分下,添加一行指定:
```
dns=default
```
删除符号链接 `/etc/resolv.conf`,即 `rm /etc/resolv.conf`。
最后,重启 `NetworkManager`:
```
sudo systemctl restart NetworkManager
```
## 错误:找不到 WinDivert DLL 或其组件之一
请确保将 FakeNet-NG 解压到本地 C: 驱动器,以确保 WinDivert 驱动程序正确加载。
## 错误:应用程序无法启动,因为其并行配置不正确。
运行 Fakenet 的独立可执行版本时可能会出现此错误。请下载并安装 Visual C++ 2008 运行时可执行文件。
# 限制
* `SingleHost` 模式仅支持 Windows Vista+。请在 Windows XP/2003 操作系统上使用原版 Fakenet。
* `MultiHost` 模式仅支持 Linux。
* 旧版本的 python-netfilterqueue 可能会导致 `python` 中出现段错误。如果您遇到此问题,请检查您使用的是否是最新版本的 python-netfilterqueue。
* 由于 python-netfilterqueue 使用的硬编码缓冲区大小,Linux Diverter 无法正确处理大小超过 4,016 字节的数据包。实际上,对于配置了常规 1,500 字节最大传输单元 (MTU) 的接口,这不会影响 Linux 的 `MultiHost` 模式。如果您与 FakeNet-NG 一起使用的 Linux 接口支持超过 4016 的 MTU,则需要重新编译 python-netfilterqueue 以支持 ` + 80` 的缓冲区大小(python-netfilterqueue 为开销分配了 80 字节的缓冲区)。
* 在 Windows 上不拦截仅限本地机器的流量(例如,如果您尝试直接连接到其中一个监听器)。
* 仅拦截使用 TCP、UDP 和 ICMP 协议的流量。
# 鸣谢
* FakeNet-NG 由 Peter Kacherginsky 设计和开发。
* 特别感谢 Andrew Honig、Michael Sikorski 等人开发了最初启发我们开发此工具的 FakeNet。
* Linux Diverter 由 Michael Bailey 设计和开发。
* 感谢 Matthew Haigh 开发了代理协议自动检测功能。
* 感谢 Cody Pierce 和 Antony Saba 报告并修复了文件系统遍历漏洞。
# 联系方式
如有 Bug、崩溃或其他意见,请联系
FakeNet@mandiant.com。
订阅 FLARE 邮件列表以获取社区公告!发送“subscribe”至 [flare-external@google.com](mailto:flare-external@google.com?subject=subscribe)。
标签:Bug Bounty, DAST, FLARE, IP 地址批量处理, Mandiant, 二进制发布, 动态网络分析, 协议分析, 可自定义解析器, 开源工具, 恶意软件分析, 数字取证, 权限提升, 沙箱环境, 流量拦截, 流量重定向, 网络安全, 网络服务模拟, 网络签名提取, 自动化脚本, 逆向工具, 隐私保护