From 95c1765c43db69e7e6fa8daa00a7c441cf74aa4c Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 28 Jul 2025 20:03:17 +0300 Subject: [PATCH] completed server half --- Cargo.lock | 1 + Cargo.toml | 2 +- src/server.rs | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 614a11e..6ec466a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1196,6 +1196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" dependencies = [ "backtrace", + "bytes", "io-uring", "libc", "mio", diff --git a/Cargo.toml b/Cargo.toml index a2c8139..9dc81fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,4 @@ clap = { version = "4.5.41", features = ["derive"] } quinn = { version = "0.11.8", features = ["rustls"] } rcgen = "0.14.3" 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"] } diff --git a/src/server.rs b/src/server.rs index 1f09c6e..e5cb692 100644 --- a/src/server.rs +++ b/src/server.rs @@ -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 rustls::pki_types::PrivatePkcs8KeyDer; +use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::TcpStream}; pub async fn run_server(host: SocketAddr, password: &str) -> Result<(), Box> { 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( stable_id: usize, 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(()) }