completed server half

This commit is contained in:
MeexReay 2025-07-28 20:03:17 +03:00
parent 4903ac3ab1
commit 95c1765c43
3 changed files with 43 additions and 3 deletions

1
Cargo.lock generated
View file

@ -1196,6 +1196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes",
"io-uring", "io-uring",
"libc", "libc",
"mio", "mio",

View file

@ -9,4 +9,4 @@ clap = { version = "4.5.41", features = ["derive"] }
quinn = { version = "0.11.8", features = ["rustls"] } quinn = { version = "0.11.8", features = ["rustls"] }
rcgen = "0.14.3" rcgen = "0.14.3"
rustls = { version = "0.23.30", features = ["ring"] } rustls = { version = "0.23.30", features = ["ring"] }
tokio = { version = "1.47.0", features = ["rt", "macros", "rt-multi-thread"] } tokio = { version = "1.47.0", features = ["rt", "macros", "rt-multi-thread", "net", "io-util"] }

View file

@ -1,6 +1,7 @@
use std::{error::Error, net::SocketAddr, str, sync::Arc}; use std::{error::Error, net::{IpAddr, SocketAddr}, str, sync::Arc};
use quinn::crypto::rustls::QuicServerConfig; use quinn::crypto::rustls::QuicServerConfig;
use rustls::pki_types::PrivatePkcs8KeyDer; use rustls::pki_types::PrivatePkcs8KeyDer;
use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::TcpStream};
pub async fn run_server(host: SocketAddr, password: &str) -> Result<(), Box<dyn Error>> { pub async fn run_server(host: SocketAddr, password: &str) -> Result<(), Box<dyn Error>> {
let cert = rcgen::generate_simple_self_signed(vec![ let cert = rcgen::generate_simple_self_signed(vec![
@ -69,6 +70,13 @@ async fn handle_connection(conn: quinn::Incoming, password: String) -> Result<()
} }
} }
fn is_local_address(socket_addr: &SocketAddr) -> bool {
match socket_addr.ip() {
IpAddr::V4(ip) => ip.is_loopback() || ip.is_private(),
IpAddr::V6(ip) => ip.is_loopback() || ip.is_unique_local(),
}
}
async fn handle_request( async fn handle_request(
stable_id: usize, stable_id: usize,
mut send: quinn::SendStream, mut send: quinn::SendStream,
@ -130,8 +138,39 @@ async fn handle_request(
} }
} }
} }
if stack != 4 {
return Err("bad request very bad".into())
}
todo!(); let remote: SocketAddr = remote.parse()?;
if is_local_address(&remote) {
return Err("backdoor attack!!! absolutely not good!!!!!!".into())
}
let stream = TcpStream::connect(remote).await?;
let (mut remote_recv, mut remote_send) = stream.into_split();
remote_send.write_all(&mut body_data).await?;
tokio::spawn(async move {
loop {
let mut buf = [0; 1024];
let Ok(len) = remote_recv.read(&mut buf).await else { break; };
if len == 0 { break; };
let Ok(_) = send.write_all(&buf[..len]).await else { break; };
}
});
tokio::spawn(async move {
loop {
let mut buf = [0; 1024];
let Ok(Some(len)) = recv.read(&mut buf).await else { break; };
if len == 0 { break; };
let Ok(_) = remote_send.write_all(&buf[..len]).await else { break; };
}
});
Ok(()) Ok(())
} }