{"id":20674628,"url":"https://github.com/ricky8955555/attackr","last_synced_at":"2025-10-05T00:38:20.202Z","repository":{"id":263151462,"uuid":"889518436","full_name":"ricky8955555/attackr","owner":"ricky8955555","description":"一个基于 Rust + Rocket.rs + MiniJinja 开发的 CTF 平台","archived":false,"fork":false,"pushed_at":"2025-04-24T15:45:34.000Z","size":564,"stargazers_count":17,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-24T16:50:49.281Z","etag":null,"topics":["ctf","ctf-platform","diesel","diesel-rs","jinja","jinja2","koto","minijinja","rocket","rocket-rs","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ricky8955555.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-16T14:34:50.000Z","updated_at":"2025-04-24T15:44:44.000Z","dependencies_parsed_at":"2025-01-17T14:39:29.984Z","dependency_job_id":"e8e336ae-8ade-4980-9421-e67999b376d9","html_url":"https://github.com/ricky8955555/attackr","commit_stats":null,"previous_names":["ricky8955555/attackr"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ricky8955555/attackr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ricky8955555%2Fattackr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ricky8955555%2Fattackr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ricky8955555%2Fattackr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ricky8955555%2Fattackr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ricky8955555","download_url":"https://codeload.github.com/ricky8955555/attackr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ricky8955555%2Fattackr/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266694580,"owners_count":23969795,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ctf","ctf-platform","diesel","diesel-rs","jinja","jinja2","koto","minijinja","rocket","rocket-rs","rust"],"created_at":"2024-11-16T21:06:29.311Z","updated_at":"2025-10-05T00:38:20.122Z","avatar_url":"https://github.com/ricky8955555.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# attackr\n\n## 简介\n\nattackr 是使用 [Rust](https://www.rust-lang.org) + [Rocket](https://rocket.rs) + [MiniJinja](https://github.com/mitsuhiko/minijinja) 开发的 CTF 平台，并使用 [Koto](https://koto.dev/) 脚本语言实现动态积分及对用户倍数赋分支持以及事件推送支持。\n\n由于设计限制，本平台只支持在单个实例上配置单个比赛，且不支持配置多实例进行负载平衡，适合小型比赛使用。\n\n## 局限性\n\n- 仅支持在单个实例进行单个比赛\n- 使用 SQLite 数据库，不适合大并发场景\n- 只支持控制本机 Docker，无法实现多设备 Docker 负载平衡\n- 不支持二进制产物及附件的内容分发\n- 使用 SSR (服务端渲染)，对服务器性能有一定的消耗\n- 不支持数据渲染分页面，在访问具有大量数据的页面下可能会导致浏览器卡顿\n\n## 功能\n\n### 核心功能\n\n- 主页\n    - 可配置并显示比赛名称、介绍及时间 (支持调节时区)\n    - 显示当前比赛状态\n- 用户\n    - 登录 / 注册用户\n    - 使用 Argon2id 对密码进行 Hash 储存\n    - 查看用户主页\n    - 修改用户信息\n    - 支持通过 Gravatar 获取用户头像\n    - 可在用户主页查看各题目的解题时间及得分情况\n    - 可在用户主页查看各题集的解题及得分情况\n    - 支持昵称中使用 Tag 并根据 Hash 设置 Tag 颜色\n    - 限制被禁用的用户进行登录及访问其他页面\n    - 可配置用户注册审核\n    - 重置密码时注销所有会话\n    - 可配置 Session 有效时间\n- 题目\n    - 静态题目 (Flag 在题目创建时确定) \n    - 动态题目 (Flag 在用户触发构建时确定)\n    - Docker 镜像的构建及容器的启停\n    - 二进制产物构建及下载\n    - 重新构建动态题目\n    - 支持 Markdown 题目描述\n    - 支持区分题集 (可用于实现区分题目方向)\n    - 支持区分难度 (可自定义难度的颜色)\n    - 可配置脚本实现动态积分\n    - 可配置脚本实现单个题目对指定排名的用户进行倍数赋分 (可用于实现前三血功能)\n    - 支持单个题目多个产物 (包括二进制产物和 Docker 产物)\n    - 显示题目当前通过人数及分数\n    - 禁止用户在比赛前访问题目\n    - 检验用户输入 Flag\n    - 可配置题目及产物的储存路径\n    - 可配置 Docker 监听的地址及端口 (支持 IPv4、IPv6)\n    - 可配置 Docker 端口映射 (仅作为对用户的显示，并不能实现功能上的映射)\n    - 可配置 Docker 容器自动销毁时间\n    - 可限制 Docker 的 CPU、内存、储存占用\n    - 可通过 Bind 挂载的 `/var/lib/attackr` 公开 Docker 容器相关状态文件 (可用于实现前置认证)\n    - 可配置在题目解出后自动清理产物\n    - 可配置题目是否公开\n    - 可配置是否显示未分类题集的题目\n- 榜单\n    - 积分变化曲线 (可显示得分下降)\n    - 用户排名及各题目得分表\n    - 可显示各题集的分榜单\n    - 禁止用户在比赛前访问榜单\n\n### 管理员功能\n\n- 用户\n    - 修改用户信息 (包括权限组，在修改用户至管理员后将取消所有得分)\n    - 注销用户所有会话\n    - 启用 / 禁用用户 (禁用用户后用户将无法进行任何操作，并将取消所有得分)\n    - 在去除取消得分的操作后可恢复用户得分\n    - 按照启用 / 禁用情况区分用户\n- 题目\n    - 添加题目\n    - 修改题目信息 (不支持修改题目源码及附件)\n    - 查看题目详情 (包括构建脚本参数)\n    - 批量公开题目\n    - 重新计算题目分数及用户得分\n- 产物\n    - 查看产物信息\n    - 删除用户产物\n    - 重新构建产物\n- 题集 (题目类别)\n    - 添加 / 修改 / 删除题集\n- 难度\n    - 添加 / 修改 / 删除难度\n- 提交记录\n    - 查看用户提交记录\n    - 可筛选指定用户 / 题目查看提交记录\n\n### 事件推送\n\n\u003e 该功能需通过配置条件编译 (Features) 启用，详见 [构建](#构建) 一节。\n\n利用 Koto 脚本实现对事件 (Activity) 的监听。\n\n- 题目\n    - 解题通过事件 (Solved)\n\n## 截图\n\n\u003cdetails\u003e\n\n\u003csummary\u003e显示所有截图\u003c/summary\u003e\n\n![](assets/1.webp)\n\n![](assets/2.webp)\n\n![](assets/4.webp)\n\n![](assets/3.webp)\n\n\u003c/details\u003e\n\n## 构建\n\n目前支持的条件编译 (Features):\n\n- `koto_exec`: 在 Koto 脚本中添加 `exec` 以支持外部程序的运行\n- `koto_json`: 在 Koto 脚本中添加 [`json`](https://github.com/koto-lang/koto/tree/main/libs/json) 库依赖\n- `koto_tempfile`: 在 Koto 脚本中添加 [`tempfile`](https://github.com/koto-lang/koto/tree/main/libs/tempfile) 库依赖\n- `koto_random`: 在 Koto 脚本中添加 [`random`](https://github.com/koto-lang/koto/tree/main/libs/random) 库依赖\n- `activity`: 启用事件推送 (Activity) 支持\n\n选择相应的所需支持，使用指令 `./build.sh [features]`，将 `[features]` 替换为所需的编译条件，多个编译条件使用 `,` 分隔开。如无需启用其他支持，置空 `[features]` 即可。\n\n示例:\n\n- 不带其他支持: `./build.sh`\n- 带 `koto_exec` 及 `activity` 支持: `./build.sh koto_exec,activity`\n\n编译成功后将会在根目录下产生 `attackr.tar.gz`，将内容解压至工作目录即可。\n\n## 配置及脚本编写\n\n### 平台配置\n\n参见 [examples/configs](examples/configs) 中给出的示例。\n\n### 动态积分脚本\n\n动态积分脚本必须要提供两个函数:\n\n- `calculate_points`: 计算题目动态积分\n- `calculate_factor`: 计算题目对指定排名用户的分数倍数\n\n脚本可放在任意位置，并将脚本路径配置到 `challenge.yml` 配置文件下的 `dynpoints` 配置项 (详见 [examples/configs/challenge.yml](examples/configs/challenge.yml))\n\n详细参见 [examples/dynpoints](examples/dynpoints) 中给出的示例。\n\n## 题目源代码编写\n\n\u003e 注: 如果不需要使用平台进行构建的，可以先在本地构建成产物，然后再通过附件形式上传到平台，可减小平台相应构建负担。\n\n题目源代码需要以 *Tarball Identity* (`.tar`) 档案包的形式上传到平台，并且档案包根目录下必须含有 `build.yml` 文件指引源代码的构建。\n\n详细参见 [examples/challenges](examples/challenges) 中给出的示例。\n\n## 事件监听脚本编写\n\n配置文件参见 [examples/configs/activity.yml](examples/configs/activity.yml) 中给出的示例。\n\n事件监听脚本参见 [examples/activity](examples/activity) 中给出的示例。\n\n## 运行\n\n在编写好相应配置文件及脚本之后直接运行 `attackr` 即可。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fricky8955555%2Fattackr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fricky8955555%2Fattackr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fricky8955555%2Fattackr/lists"}