Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
        }