Курс — Хакинг на Rust. #30 Продвинутые темы. Интеграция с другими языками: Расширение Python-скриптов через Rust (PyO3)
Здравствуйте, дорогие друзья.
Python — основной язык для многих хакеров и пентестеров благодаря своей простоте и богатой экосистеме (Scapy, Requests, Impacket). Однако его интерпретируемая природа накладывает ограничения на скорость и безопасность. Rust, с его производительностью и строгой типизацией, идеально дополняет Python. В этом разделе мы разберем, как использовать PyO3 — фреймворк для интеграции Rust и Python. Вы научитесь:
- Создавать высокоскоростные модули для Python.
- Обрабатывать уязвимости, которые сложно реализовать в чистом Python.
- Ускорять существующие инструменты (например, фаззеры).
10.1. Зачем интегрировать Rust с Python?
Преимущества:
- Скорость. Критические участки кода (шифрование, перебор паролей) выполняются в разы быстрее.
- Безопасность. Rust предотвращает ошибки вроде переполнения буфера, которые могут возникнуть в C-расширениях.
- Удобство. PyO3 автоматически генерирует Python-биндинги, упрощая интеграцию.
- Доступ к экосистеме. Используйте библиотеки Rust (например,
ring
для криптографии) в Python.
Сценарии применения:
- Ускорение фаззинга.
- Обработка сетевых пакетов на низком уровне.
- Реализация алгоритмов шифрования.
10.2. Введение в PyO3
PyO3 — это библиотека для написания Python-модулей на Rust. Она предоставляет:
- Макросы для определения классов, функций и методов.
- Автоматическую конвертацию типов (например,
Vec<u8>
→bytes
). - Поддержку Python 3.7+ и интеграцию с
pip
.
Установка:
- Добавьте зависимости в
Cargo.toml
:
1 2 3 4 5 6 7 8 9 10 11 |
[package] name = "my_rust_module" version = "0.1.0" edition = "2021" [lib] name = "my_rust_module" crate-type = ["cdylib"] [dependencies] pyo3 = "0.18.0" |
2. Соберите модуль:
1 2 3 |
maturin develop # Для разработки # Или соберите wheel: maturin build --release |
10.3. Создание первого модуля
Пример: Функция подбора пароля
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
use pyo3::prelude::*; use pyo3::types::PyBytes; #[pyfunction] fn crack_hash(target_hash: &str) -> PyResult<Option<String>> { // Пример: подбор пароля по SHA-256 for password in generate_passwords() { let hash = sha256(password.as_bytes()); if hash == target_hash { return Ok(Some(password)); } } Ok(None) } #[pymodule] fn my_rust_module(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(crack_hash, m)?)?; Ok(()) } |
Использование в Python:
1 2 3 4 |
import my_rust_module password = my_rust_module.crack_hash("5f4dcc3b5aa765d61d8327deb882cf99") print(f"Found password: {password}") # Вывод: "Found password: password" |
10.4. Обработка данных и ошибок
Конвертация типов:
String
→str
,Vec<u8>
→bytes
.- Кастомные структуры Rust можно превращать в Python-классы с помощью
#[pyclass]
.
Обработка ошибок:
1 2 3 4 5 6 7 8 9 10 |
use pyo3::exceptions::PyValueError; #[pyfunction] fn risky_operation(data: &[u8]) -> PyResult<()> { if data.is_empty() { Err(PyValueError::new_err("Data cannot be empty")) } else { Ok(()) } } |
10.5. Пример: Ускорение фаззера
Задача: Ускорить генерацию тестовых данных в Python-фаззере.
Решение на Rust:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
use pyo3::prelude::*; use rand::Rng; #[pyfunction] fn generate_payloads(size: usize) -> PyResult<Vec<Vec<u8>>> { let mut rng = rand::thread_rng(); let payloads: Vec<Vec<u8>> = (0..1000) .map(|_| { let mut buf = vec![0u8; size]; rng.fill(&mut buf[..]); buf }) .collect(); Ok(payloads) } #[pymodule] fn fuzzer_core(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(generate_payloads, m)?)?; Ok(()) } |
Интеграция с Python:
1 2 3 4 5 6 |
import fuzzer_core # Генерация 1000 полезных нагрузок по 100 байт payloads = fuzzer_core.generate_payloads(100) for payload in payloads: send_to_target(payload) |
Результат:
Скорость генерации увеличивается в 10-100 раз по сравнению с чистым Python.
10.6. Интеграция с C/C++
PyO3 позволяет не только работать с Python, но и взаимодействовать с C/C++ кодом через FFI.
Пример: Вызов C-функции из Rust-модуля
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use pyo3::prelude::*; use libc::{c_char, c_int}; extern "C" { fn c_decrypt(data: *const c_char, key: c_int) -> *mut c_char; } #[pyfunction] fn decrypt_wrapper(data: &str, key: i32) -> PyResult<String> { let c_data = std::ffi::CString::new(data).unwrap(); let result = unsafe { c_decrypt(c_data.as_ptr(), key) }; let decrypted = unsafe { std::ffi::CStr::from_ptr(result).to_str().unwrap() }; Ok(decrypted.to_owned()) } |
10.7. Этические рекомендации
- Используйте интеграцию ответственно: Убедитесь, что ускоренные инструменты применяются только в легальных сценариях (CTF, авторизованное тестирование).
- Документируйте код: Четко разделяйте Rust- и Python-компоненты для удобства аудита.
- Проверяйте зависимости: Убедитесь, что библиотеки Rust не содержат уязвимостей.
Заключение
PyO3 открывает новые горизонты для хакеров, сочетающих гибкость Python с мощью Rust. В следующем разделе мы разберем создание инструментов для пентеста, включая сканеры уязвимостей и автоматизацию атак.

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