为什么红队要用 Rust

Rust 系统教程:Rust 教程总目录 | Rust 学习路径

Rust 正在成为系统编程和安全工具开发的新标准。与传统脚本语言相比,Rust 在红队工作中优势明显:

  • 性能:编译为原生机器码,执行速度远超 Python,适合大规模扫描、哈希破解等计算密集型任务。
  • 内存安全:所有权系统和借用检查器在编译期杜绝了 UAF、缓冲区溢出、悬垂指针等内存漏洞。红队工具本身不该成为被攻击的目标。
  • 跨平台编译:一条命令即可交叉编译到 Windows/Linux/macOS,生成的二进制无需任何运行时依赖,丢到目标机器就能跑。
  • 生态系统reqwesttokiopnetclap 等高质量的 crate 让网络安全开发事半功倍。

Rust 被 NSA、CISA 等机构推荐为内存安全语言的首选。未来 5-10 年,安全工具的主流语言大概率是 Rust。红队队员应当尽早掌握。

如果你已经熟悉 Python 安全脚本,可以把 Rust 看做 Python 的「编译后无依赖版」——但更快、更安全。参考 补充-Python黑客脚本基础

安全脚本开发核心概念

Cargo 项目起步

cargo new port_scanner
cd port_scanner
# 在 Cargo.toml 的 [dependencies] 中添加依赖
# cargo build --release
# ./target/release/port_scanner

典型的 Cargo.toml

[package]
name = "red_tools"
version = "0.1.0"
edition = "2021"
 
[dependencies]
reqwest = { version = "0.12", features = ["blocking"] }
tokio = { version = "1", features = ["full"] }
clap = { version = "4", features = ["derive"] }
rayon = "1.10"

基础语法速览

fn main() {
    // 不可变绑定
    let target = "192.168.1.0/24";
    // 可变绑定
    let mut open_ports = Vec::new();
 
    // if 是表达式
    let verdict = if open_ports.len() > 10 { "活跃" } else { "冷清" };
 
    // loop + match
    for port in 1..=1024 {
        match scan_port(target, port) {
            Ok(true) => open_ports.push(port),
            Ok(false) => {}
            Err(e) => eprintln!("扫描 {} 端口 {} 失败: {}", target, port, e),
        }
    }
}

所有权与借用(安全相关要点)

Rust 的所有权规则确保了内存安全,但写安全工具时要注意:

// 所有权转移:适合消息传递式的并发架构(channel)
let data = vec![1, 2, 3];
std::thread::spawn(move || {
    println!("{:?}", data); // data 的所有权移入线程
});
 
// 借用:多个线程只读访问用 Arc
use std::sync::Arc;
let targets = Arc::new(vec!["host1", "host2", "host3"]);
for _ in 0..3 {
    let t = Arc::clone(&targets);
    std::thread::spawn(move || {
        println!("{}", t[0]); // 只读借用
    });
}

红队中最常见的模式是 Arc<Mutex<T>> 用于共享扫描结果,以及 mpsc::channel 用于生产者-消费者模式。

错误处理

安全工具不能随便 panic。一律用 Result + ? 操作符:

use std::io;
 
fn read_targets(path: &str) -> Result<Vec<String>, io::Error> {
    let content = std::fs::read_to_string(path)?;
    Ok(content.lines().map(String::from).collect())
}
// 调用时
match read_targets("targets.txt") {
    Ok(hosts) => println!("加载了 {} 个目标", hosts.len()),
    Err(e) => eprintln!("读取失败: {}", e),
}

常用 Crate 一览

Crate用途红队场景
reqwestHTTP 客户端爆破、目录扫描、信息收集
tokio异步运行时高并发扫描、网络请求
rayon数据并行多线程端口扫描、哈希计算
clapCLI 参数解析所有工具的命令行接口
serde / serde_json序列化处理 API 响应、配置文件
pnet原始套接字包构造、嗅探、SYN 扫描
trust-dns-resolverDNS 解析子域名枚举
rustlsTLS 库HTTPS 请求(替代 OpenSSL)
base64Base64 编解码载荷编码
rand随机数生成随机 UA、延迟等

Rust vs Python:何时用哪个

维度RustPython
执行速度极快(原生)慢(解释执行)
内存占用极低较高
开发速度较慢(编译、生命周期标注)极快
部署单文件二进制,零依赖需解释器 + pip 包
并发模型tokio(真异步)、rayon(数据并行)asyncio(GIL 限制)
网络库reqwest、pnetrequests、scapy
学习曲线陡峭平缓
适合场景持久化工具、高并发扫描、载荷生成、OPSEC 敏感任务快速原型、一次性脚本、后渗透利用

实战建议

  • 先用 Python 快速验证思路(10 分钟搞定),确认可行后用 Rust 重写为生产版本。
  • 需要丢到目标机器长期运行的工具(C2 agent、持久化、keylogger)优先 Rust。
  • 临时的一次性任务、与 Metasploit/CobaltStrike 交互的脚本,Python 仍是首选。
  • Rust 的二进制体积可以通过 strip / UPX / opt-level = "z" + lto = true 控制在数百 KB 以内,非常适合做小体积 payload。
  • 参考 补充-Python黑客脚本基础 对比两边的实现方式。

扩展资源

书籍

开源安全工具参考

项目GitHub说明
RustScanhttps://github.com/RustScan/RustScan极速端口扫描器
feroxbusterhttps://github.com/epi052/feroxbusterRust 写的目录爆破器
xhhttps://github.com/ducaale/xh类似 httpie 的 HTTP 客户端
sniffgluehttps://github.com/kpcyrd/sniffglue安全嗅探器
mqtt2psqlhttps://github.com/kpcyrd/mqtt2psqlArch Linux 安全研究员的 Rust 工具集
kerberoasthttps://github.com/n4r1b/kerberoast-rsKerberoasting 工具

在线资源


下一篇推荐阅读:红队队员完整学习手册 (已归档) — 将所有技能串联成完整攻击链。