async void AsyncTcpProcess(object o) { TcpClient tc = (TcpClient)o; NetworkStream stream = tc.GetStream(); byte[] outBuf = new byte[1024]; int numBytesRead = 0; string ipAddr; int port; byte[] buff; System.Console.WriteLine("Socket connection established"); int fd = (int)tc.Client.Handle; if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { addr_type peerAddr = get_peer_name(fd); if (peerAddr.port == -1) { throw new Exception(); } string ip = TLSHandshakeClient.ParseIP(peerAddr.ip); var originalAddr = TLSHandshakeClient.GetOriginalAddrMach(ip, peerAddr.port); ipAddr = originalAddr.ip; port = originalAddr.port; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { addr_type originalAddr = get_original_addr(fd); if (originalAddr.port == -1) { throw new Exception(); } ipAddr = TLSHandshakeClient.ParseIP(originalAddr.ip); port = originalAddr.port; } else { System.Console.WriteLine("OS Not supported!"); return; } int nBytes = 0; using (var ms = new MemoryStream()) { while (stream.DataAvailable && (numBytesRead = stream.Read(outBuf, 0, outBuf.Length)) > 0) { ms.Write(outBuf, 0, outBuf.Length); nBytes += numBytesRead; System.Console.WriteLine(numBytesRead); } buff = ms.ToArray(); } System.Console.WriteLine(BitConverter.ToString(buff).Replace("-", " ")); if (nBytes <= 0) { return; } if (buff[0] == 0x16) // TLS Handshake packet { System.Console.WriteLine("Handshake"); var rand = new Random(); byte[] iv = new byte[16]; rand.NextBytes(iv); byte[] encryptedData = SecurityModule.AESDecrypt256(buff, this.key, iv); string bodyString = $"{ipAddr}|{port}|{Convert.ToBase64String(encryptedData)}"; byte[] encryptedInput, decryptedInput; encryptedInput = await PostData($"http://{remoteIpAddr}:{remotePort}/tls", bodyString); System.Console.WriteLine($"Received {encryptedInput.Length} bytes"); decryptedInput = SecurityModule.AESDecrypt256(encryptedInput, key, iv); stream.Write(decryptedInput, 0, decryptedInput.Length); } else // IDK just bypass it { System.Console.WriteLine($"Normal Packet: Initiating connection to {ipAddr}:{port}"); TcpClient bypass = new TcpClient(ipAddr, port); NetworkStream bypassStream = bypass.GetStream(); System.Console.WriteLine($"Writing {nBytes} bytes to stream"); bypassStream.Write(buff, 0, nBytes); while (bypassStream.DataAvailable && (numBytesRead = bypassStream.Read(outBuf, 0, outBuf.Length)) > 0) { stream.Write(outBuf, 0, numBytesRead); System.Console.WriteLine(bypassStream.DataAvailable); } System.Console.WriteLine("Normal Stream Closed"); } stream.Flush(); stream.Close(); tc.Close(); }
async void AsyncTcpProcess(object o) { TcpClient tc = (TcpClient)o; NetworkStream stream = tc.GetStream(); byte[] encryptedInput, decryptedOutput, encryptedOutput; byte[] data; int numBytesRead = 0; byte[] outBuf = new byte[1024]; using (var ms = new MemoryStream()) { while (stream.DataAvailable && (numBytesRead = stream.Read(outBuf, 0, outBuf.Length)) > 0) { ms.Write(outBuf, 0, numBytesRead); } encryptedInput = ms.ToArray(); } System.Console.WriteLine(Encoding.UTF8.GetString(encryptedInput)); string[] split = Encoding.UTF8.GetString(encryptedInput).Split('|'); if (split.Length < 2) { stream.Write(new byte[] { 00 }, 0, 1); stream.Close(); return; } string ipAddr = split[0]; int port = Int32.Parse(split[1]); data = SecurityModule.AESDecrypt256(Convert.FromBase64String(split[2]), key); System.Console.WriteLine(BitConverter.ToString(data).Replace('-', ' ')); System.Console.WriteLine($"Opening socket to {ipAddr}:{port}"); TcpClient proxy = new TcpClient(); proxy.Connect(ipAddr, port); System.Console.WriteLine($"Socket opened to {ipAddr}:{port} - status: {proxy.Connected}"); System.Console.WriteLine($"Sending {data.Length} bytes"); NetworkStream proxyStream = proxy.GetStream(); proxyStream.Write(data, 0, data.Length); System.Console.WriteLine($"Sent {data.Length} bytes"); int nBytes = 0; using (var ms = new MemoryStream()) { try { while ((numBytesRead = proxyStream.Read(outBuf, 0, outBuf.Length)) > 0) { ms.Write(outBuf, 0, numBytesRead); nBytes += numBytesRead; } } catch (IOException e) { System.Console.WriteLine("Stream closed"); } decryptedOutput = ms.ToArray(); } System.Console.WriteLine($"Received {nBytes} bytes from remote"); System.Console.WriteLine(BitConverter.ToString(decryptedOutput).Replace("-", " ")); encryptedOutput = SecurityModule.AESEncrypt256(decryptedOutput, key); stream.Write(encryptedOutput, 0, encryptedOutput.Length); System.Console.WriteLine($"Sent {encryptedOutput.Length} bytes to proxy client"); stream.Flush(); stream.Close(); }