Pwnzer0tt1/exploitfarm

GitHub: Pwnzer0tt1/exploitfarm

一个面向 A/D CTF 攻防赛的分布式 exploit 执行与 flag 自动提交平台,支持多客户端协同攻击和 Web 界面管理。

Stars: 40 | Forks: 6


ExploitFarm 👾

GitHub release (latest by date) GitHub GitHub top language Code 你可以[在这里](https://demo.xfarm.pwnzer0tt1.it/)查看演示
## 什么是 ExploitFarm? Exploit Farm 是一个分布式攻击平台,允许你在 A/D 竞赛中以分布式方式轻松共享和执行 exploits。 该工具旨在提供一种简便的方式来复制攻击并将 flag 提交到竞赛平台,同时尽可能多地收集攻击数据, 以便选手分析并改进他们的 exploits,清晰地查看攻击状态以及可能的失败原因。 其设计灵感来源于 [DestructiveFarm](https://github.com/DestructiveVoice/DestructiveFarm),但是是从零开始开发的,仅复用了极少部分代码。 ![ExploitFarm Web Interface](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/1e62c3c46f181900.png) ## 工作原理 ExploitFarm 有一个主要的中央服务器,负责获取配置、将 exploits 发送给客户端、接收 flag 并提交到平台,以及存储所有攻击数据。服务器本身不执行攻击,它主要负责协调攻击和提交 flag。 其他计算机可以安装 exploitfarm 客户端(使用 xfarm 命令),该客户端连接到主服务器,帮助你创建 exploit 文件夹。在这里你可以编写你的 exploit,通过简单的命令和易于使用的 TUI 测试并复制到所有队伍。你只需要专注于 exploit 本身,剩下的交给 exploitfarm 处理。 ## 快速开始 ### 服务器设置 首先,你需要启动服务器。你无需修改代码中的任何内容,服务器是在运行过程中进行配置的,而不是之前。 你可以使用以下命令启动服务器: ``` sh <(curl -sLf https://pwnzer0tt1.it/xfarm.sh) ``` 如果你无法执行 bash 脚本,可以克隆此仓库并执行 run.py 命令: ``` python3 run.py start --prebuilt ``` 这将启动服务器和数据库。服务器将在 `http://localhost:5050` 上可用,有关更多选项,请参阅 `python3 run.py --help`。 在这里,在将服务器设置为运行状态之前,需要进行配置。 你应该配置的内容: 1. 用于从 exploit 输出中提取 flag 的 flag 正则表达式 2. A/D 竞赛的 tick 持续时间 3. 参赛的队伍 4. 如果 exploitfarm 暴露在互联网上,需设置密码认证 5. 提交器延迟,以便在组织者要求时减慢对平台的请求 6. flag 提交限制,以避免向平台发送过多 flag(这可能导致请求超时并导致 flag 提交失败) 7. 用于向平台提交 flag 的提交器代码(应按照下述要求创建) 可选但推荐的设置: 1. 设置 start_time,你将获得基于真实 tick 数的所有统计数据,并且可以同时启动攻击,通过更改攻击模式并增加少量延迟来避免 tick 不匹配 2. 设置 end_time,你可以在比赛结束后停止服务器,避免服务器长时间运行 3. 比赛中处于活动状态的服务,以便你可以按服务筛选攻击(也可以在 exploit 初始化期间添加) 上述所有选项也可以在 exploitfarm 服务器运行期间更改,所有客户端将动态更新为新的配置。更改配置可能需要重新计算某些统计数据,并将触发额外的攻击执行。 提交器要求: ExploitFarm 将执行你提供的 Python 代码,以将 flag 提交到平台。 执行后,它会寻找一个 `submit` 函数,该函数稍后将被调用以提交 flag。此函数必须将待提交的 flag 列表作为第一个位置参数(必须命名为 `flags`)。此函数还可以有其他被 exploitfarm 识别的 kwargs,并可以使用 exploitfarm API 进行自定义。你也可以添加类型注解,如果类型是 [str, int, float, bool] 之一,该值将被转换为正确的类型,并在服务器需要输入时进行检查。如果使用其他类型或未指定类型,则传递的值可以是任意值。传递的默认参数也将是服务器使用的默认参数。如果类型与默认值不匹配,则服务器必须传递该参数。 示例: ``` import requests, dateutil from pwn import * def submit(flags: List[str], secret:str = None, magic_number:int = 42, verbose:bool = False, other = None): for flag in flags: print(f"Flag {flag} submitted for team {team} on service {service}") ``` 要提交此代码,你需要提交代码字符串,并在 API 的 kargs 参数中设置一个字符串,否则提交器插入将失败。 如果需要,你也可以自定义 `magic_number` 和 `verbose` 参数,但类型必须兼容,`other` 参数可以是任何类型。 Web 界面上提供了指南来帮助你创建提交器代码,编写或编辑代码时也会显示错误。 提交时,你只能使用 Docker 镜像中安装的库,其中一些已安装的库包括: - pwntools - requests - dateutil 如果你需要更多库,可以将它们添加到 [backend/requirements.txt](backend/requirements.txt) 中,并在克隆的仓库中使用 `python3 run.py start` 启动你自己的 exploitfarm 镜像。 注意: - 服务器启动后,你需要在 Web 界面上配置服务器。你可以自动化此过程(也可以只部分自动化,并在执行期间在 Web 界面上完成配置),方法是使用 exploitfarm 库中的某些函数编写脚本:请参阅 [scripts](scripts) 文件夹中的示例脚本。强烈建议创建自动设置脚本。 - 如果你从 Docker 启动服务器,并且需要创建一个提交器,而提交 flag 的服务器位于 localhost,请使用 `host.docker.internal` 代替 `localhost` 来连接服务器。这是由 Docker 网络隔离造成的。 ### 客户端设置 使用以下命令安装客户端: ``` pip3 install -U xfarm && xfarm --install-completion ``` 在 Windows 上请记住使用 `python -m xfarm` 而不是 `xfarm`。 ![ExploitFarm Web Interface](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/26842306a2181908.png) 客户端既是一个 Python 库,提供一些实用工具来帮助你编写 exploit,也是一个与 exploitfarm 服务器交互的命令行工具。 如果你不使用 Python,在编写 exploit 时,请考虑使用 XFARM_HOST 环境变量来获取由 xfarm 传递给你的 exploit 的目标队伍主机地址。 Flags 必须打印到 stdout,xfarm 将使用服务器上设置的正则表达式提取 flags。 在编写 exploit 之前,请使用以下命令初始化你的项目: ``` xfarm exploit init ``` 在这里,如果尚未设置,系统会要求你输入服务器主机、端口、你的昵称(用于统计)以及密码(如果服务器需要认证)。 如果从未设置过,xfarm 会自动要求提供这些信息,并将其存储在 `~/.exploitfarm/` 文件夹中。 初始配置完成后,xfarm 将要求你编写 exploit 的名称、使用的语言以及你正在攻击的服务。如果服务不在列表中,你可以通过输入服务名称来添加。 Exploit 名称将用于创建 exploit 的文件夹,语言将用于创建具有正确扩展名和解释器的 exploit 文件。 在 exploit 文件夹中,你会找到一个初始 exploit 文件和一个 config.toml 文件,你可以自定义该文件以更改解释器或 exploit 的主文件。 要更改其他参数,请在 exploit 文件夹中使用 `xfarm init -e`。 现在你可以编写你的 exploit,并使用以下命令进行测试: ``` xfarm start --test ``` `` 将传递给 XFARM_HOST 环境变量,并用于测试 exploit。攻击将执行一次,如果发现某些 flags,它们将被打印在屏幕上,并作为手动提交发送到服务器。 如果你的 exploit 运行正常,你可以使用以下命令开始攻击: ``` xfarm start ``` 这将启动 TUI 并将攻击复制到 exploitfarm 服务器上注册的所有队伍。 如果 TUI 对你的系统来说负载过重,你可以使用 `xfarm -I start` 来启动 exploit,仅在输出中显示日志。 xfarm start 默认将使用 `cpu_count*10` 的线程池来管理攻击,并根据攻击可用时间应用执行超时,从而允许攻击所有队伍。如果遇到内存使用问题,强烈建议在 Linux 上使用 `zram` 来压缩内存以避免频繁交换。 如果你用 Python 编写 exploit,你还可以使用 exploitfarm 库。强烈建议使用 `from exploitfarm import *`,这会将 Python 的 print 函数默认设置为 flush=True。 exploitfarm 库中的函数: ``` from exploifarm import * get_host() #Gets you the XFARM_HOST environment variable Prio #Enum with high, normal and low values to set the priority of the process nicenessify(priority=Prio.low) #Set the priority of the process (xfarm will set the priority of the process to low by default allowing strange behaviour on the system) get_config() #Get the configuration of the client random_str( length:int|None = None, length_range:int = (8,12), numbers:bool = True, lower:bool = True, upper:bool = True, specials:bool = False, exclude:str = "", include:str = "" ) #Generate a random string with the specified parameters (useful to anonymize the exploit) session( random_agent:bool = True, additional_agents:list = [], additional_headers:dict = {}, user_agent:str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ ) #Create a session with the specified headers (random_agent will set a random user agent) try_tcp_connection( address:str, #Address to connect timeout:float|None = 3 #Timeout of the connection ) -> tuple[bool, str|None] #Try to connect to the address with a tcp connection # 用于 key-value 存储集中化数据的 Store 类 # key value store 对于每个 exploit id 都是不同的。 # 你可以使用它来存储每次 exploit 执行时需要保存和更改的一些数据。 store = Store() # 设置一个值 store.set("example_key", {"example": "data"}) # 获取一个值 (如果不存在则返回 None) data = store.get("example_key") # 删除一个 key store.delete("example_key") # 列出所有 key keys = store.keys() ``` 请参阅 [此处](./client/README.md) 的 xfarm PyPi 页面,了解 exploitfarm 的高级功能。 你在 [docs](docs) 文件夹中找到的所有文档均由 [Domingo Dirutigliano](https://domy.sh) 为 [巴里理工学院](https://www.poliba.it) 的大学项目编写,除 plantuml 生成的图像外,均为意大利语。该文档是为 exploitfarm 的 1.0.0 版本编写的,其中实现了所有初始功能。 Made with ❤️ by Pwnzer0tt1 Copyright (c) 2024 Pwnzer0tt1 ## Star History Star History Chart
标签:AD CTF, Exploit开发, Flag提交, Python, Web界面, 分布式攻击平台, 团队协作, 密码管理, 攻击管理, 攻击编排, 无后门, 漏洞利用框架, 网络安全, 自动化攻击, 请求拦截, 逆向工具, 配置审计, 隐私保护