jenkinsmichpa/coconut_crab
GitHub: jenkinsmichpa/coconut_crab
基于 Rust 的勒索软件攻击模拟平台,用于安全教育和事件响应培训。
Stars: 1 | Forks: 1
# Coconut Crab

# 描述
## 概述
这是一个使用 Rust 构建的客户端 (coconut_crab_client) / 服务器 (coconut_crab_server) 应用程序,用于模拟勒索软件攻击。
**本软件仅限用于教育目的,不得用于造成损害。**
包含以下附加应用程序:
- **coconut_crab_base_drop** - 一个基本的投放器,带有自包含的 Web 客户端,用于下载并执行 coconut_crab_client
- **group_docx_tool** - 用于创建和验证先前为组创建的 DOCX 文件真实性的工具
- **group_docx_drop** - 附带的 bash 脚本,用于将 DOCX 文件复制到其关联组的 DC 共享中 **(未经测试)**
- **coconut_crab_blue_drop** - 封装 [AutoBlue](https://github.com/3ndG4me/AutoBlue-MS17-010/blob/master/zzz_exploit.py) 的工具,利用 MS-17-010 漏洞下载并执行 coconut_crab_client **(未经测试)**
### 通信
以下 HTTPS 请求按顺序发送:
1. **Download(下载)** - 客户端下载非对称公钥
2. **Registration(注册)** - 客户端上传 ID 和主机名
3. **Symmetric Key Upload(对称密钥上传)** - 客户端上传经过非对称加密的对称密钥
4. **Symmetric Key Recovery(对称密钥恢复)** - 客户端因过早结束请求对称密钥(如果未完成且在可接受的时间段内)
5. **Completion Announcement(完成通知)** - 客户端通知已完成加密过程
6. **Symmetric Key Download(对称密钥下载)** - 客户端提供解密代码并下载对称密钥
### 加密管道
客户端执行以下步骤来加密文件:
1. 遍历文件系统
2. 分析文件以避开蜜罐(可选)
3. 创建新的加密文件
4. 覆盖并删除现有的明文文件
### 客户端 GUI

## 功能特性
- 除非能访问到服务器,否则不会运行(以对抗沙箱)
- 分析模式:列出文件而不加密
- 可配置的受害者 GUI,接受代码进行解密
- 可配置的传输中 TLS 加密
- 可配置且易于修改以存在缺陷或生成用于检测的工件
- 可配置的允许和阻止列表
- 文件系统路径
- 文件扩展名
- 可配置的加密延迟时间和抖动
- 可配置的蜜罐 avoidance(规避)
- 分析 PDF 和 Office / Zip 文件
- 避开隐藏目录和文件
- 识别关键字
- 识别非默认 URL
- 识别损坏的图像
- 通过注册表项实现可配置的持久化
- 实现具有(可能过于)详细输出的日志 crate
- 客户端输出在 debug 模式下自动显示,在 release 模式下隐藏
- 不太可疑的输出可执行文件
- Windows PE 文件,包含图标和属性
- 所有必要的证书 / 资产都嵌入在 EXE 文件中
- 包括由服务器提供的客户端 EXE
- 所有持久化应用程序信息都存储在 CSV 中,以便于查看和修改
- 可配置的桌面壁纸设置
- 享受使用 Rust 编写的好处,包括
- AV(杀毒软件)对它的效果不佳
- 速度
- 编译后的可执行文件
- 客户端的多线程管道
- 服务器的异步设计
- 内存安全 / 无垃圾回收
- 跨平台(-ish)
- 实现标准 / 经过审查的加密 crate(RSA 和 ChaCha20)
## 注意事项
由于这是一个用于教育而非实际使用的应用程序,设计中采取了一些捷径,包括以下内容:
- 使用内置的 secret 进行请求验证,并且每个客户端共享该 secret
- 作为缓解措施,该 secret 使用 litcrypt 进行了混淆
- 发送到服务器的每个请求都结合 secret 进行了 SHA265 哈希处理以进行验证
- 服务器容易受到 DoS 攻击,因为它没有实现速率限制
- 服务器不具备抗重放攻击能力
- 默认情况下,应用程序配置为使用公开已知的 RSA 密钥对进行加密
- 这些可以在编译前更改
- 默认情况下,应用程序配置为不验证 HTTPS 证书,以允许使用自签名证书
- 可以通过配置启用验证
- 客户端必须先从服务器请求公钥才能开始(以便为学生创建工件)
- 默认情况下,公钥会写入受害者的硬盘。这可以通过配置禁用。
**我不是软件工程师,这也是我第一次接触 Rust。小心数据丢失!**
# 用法
## 配置
### 客户端配置
客户端配置变量位于 `coconut_crab_client/src/main.rs` 的顶部
变量 | 摘要
--- | ---
server_port | 远程 Web 服务器端口(必须与服务器匹配)
server_fqdn | 远程 Web 服务器主机名或服务器的 IP 地址
allowlist_paths | 要目标的路径
blocklist_paths | 要避开的路径(可选)
allowlist_extensions | 要目标的文件扩展名(可选)
blocklist_extensions | 要避开的文件扩展名(可选)
encrypted_extension | 应用于加密文件的文件扩展名
save_public_key_to_disk | 客户端是否应将公共加密密钥保存到磁盘
set_wallpaper | 客户端是否应将桌面壁纸设置为应用程序图标
https | 客户端是否应使用 HTTP 或带有 TLS 的 HTTPS
verify_server | 客户端是否应验证 HTTPS 证书
analyze_mode | 是否应记录文件而不是加密
persist | 是否应创建注册表启动项
avoid_hidden | 客户端是否应避开隐藏目录和文件
avoid_urls | 客户端是否应避开 Office 文件中非原生出现的 URL
avoid_keywords | 客户端是否应避开与蜜罐文件关联的关键字
avoid_broken_images | 客户端是否应避开无法正确渲染的图像
analyze_office_zip | 客户端是否应分析 office 和 zip 文件中的蜜罐
analyze_pdf | 客户端是否应分析 pdf 文件中的蜜罐
random_order | 客户端是否应随机化文件加密顺序
wait_time | 文件加密之间等待的时间(设置为 0 表示无延迟)
jitter_time | 应用于 wait_time 的时间差异
preshared_secret | 用于验证 Web 请求的代码(必须与服务器匹配)
GUI 文本可以在 `coconut_crab_client/ui/main.slint` 中配置
应用程序图标放置在 `coconut_crab_client/assets/img/favicon.ico`
EXE 属性可以在 `coconut_crab_client/Cargo.toml` 的 `[package.metadata.winres]` 下配置
持久化客户端变量可以在可执行文件生成的 `status.csv` 中找到
### 服务器配置
客户端配置变量位于 `coconut_crab_server/src/main.us` 的顶部
变量 | 摘要
--- | ---
PORT | Web 服务器端口(必须与客户端匹配)
RECOVERY_WINDOW | 客户端丢失对称密钥时可恢复的时间段
PRESHARED_SECRET | 用于验证 Web 请求的代码(必须与客户端匹配)
BYPASS_CODE | 用于解锁任何客户端解密的代码
解密代码可以在可执行文件生成的 `victims.csv` 文件中找到
## 编译
### 配置 HTTPS 证书
HTTPS 证书放置在以下路径中:
- `coconut_crab_lib/assets/cert/ca-cert.pem`
- `coconut_crab_lib/assets/cert/cert.pem`
- `coconut_crab_lib/assets/cert/key.pem`
HTTPS 证书生成示例:
```
openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem -out ca-cert.pem -sha256 -days 3650 -nodes -config ./ca-cert.cnf
openssl req -newkey rsa:4096 -nodes -keyout key.pem -out server.csr -config ./cert.cnf
openssl x509 -req -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -days 3650 -sha256 -extfile cert.ext
```
- 有关示例配置和扩展文件,请参阅 `coconut_crab_lib/assets/cert/ca-cert.cnf`、`coconut_crab_lib/assets/cert/cert.ext` 和 `coconut_crab_lib/assets/cert/cert.ext`
### 配置加密证书
加密证书放置在以下路径中:
- `coconut_crab_server/assets/public/asym-pub-key.pem`
- `coconut_crab_server/assets/private/asym-priv-key.pem`
加密证书生成示例:
```
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
openssl rsa -in private.pem -out private_pkcs1.pem -traditional
openssl rsa -pubin -in public.pem -RSAPublicKey_out -out public_pkcs1.pem -traditional
```
### 准备 Windows 以进行编译
1. 下载并安装 [rustup](https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe)
2. 下载并安装 [cmake](https://cmake.org/download/)
### 准备 Linux 以进行编译
```
apt update
apt install build-essential pkg-config libssl-dev mingw-w64
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
rustup target add x86_64-pc-windows-gnu
```
### 在 Windows 上编译客户端以用于 Windows
```
cargo build --release --bin coconut_crab_client
```
编译后的可执行文件将输出到 `target/release/coconut_crab_client.exe`
### 在 Windows 上编译服务器以用于 Windows
将编译后的客户端可执行文件复制到 `coconut_crab_server/assets/public/coconut_crab_client.exe`
```
cargo build --release --bin coconut_crab_server
```
编译后的可执行文件将输出到 `target/release/coconut_crab_server.exe`
### 在 Linux 上编译客户端以用于 Windows
```
cargo build --release --target x86_64-pc-windows-gnu --bin coconut_crab_client
```
编译后的可执行文件将输出到 `target/x86_64-pc-windows-gnu/release/coconut_crab_client.exe`
### 在 Linux 上编译服务器以用于 Linux
将编译后的客户端可执行文件复制到 `coconut_crab_server/assets/public/coconut_crab_client.exe`
```
cargo build --release --bin coconut_crab_server
```
编译后的可执行文件将输出到 `target/release/coconut_crab_server`
# 支持
如果您在使用本应用程序时遇到任何问题,请随时联系 [Michael Jenkins](https://jenkinsmichpa.com)。
# 作者与致谢
本项目由 [Michael Jenkins](https://jenkinsmichpa.com) 在 [Samuel Ho](mailto:ho176@purdue.edu) 的帮助下开发,用于普渡大学 CNIT 47000 - 事件响应管理课程的教学。
# 许可证
本项目采用 MIT 许可证授权。
标签:DAST, DNS 反向解析, dropper, HTTPS通信, IP 地址批量处理, PE 加载器, Rust, 下载器, 云配置检测, 勒索软件, 可视化界面, 子域名变形, 安全教育, 客户端/服务器, 对称加密, 底层编程, 恶意软件分析, 文件加密, 模拟攻击, 永恒之蓝, 沙箱规避, 网络攻击模拟, 网络流量审计, 网络防御训练, 自动化审计, 通知系统, 非对称加密