Exemplo n.º 1
0
        private void HandshakeReceive()
        {
            try
            {
                var bytesRead = _firstPacketLength;

                if (bytesRead > 1)
                {
                    if ((!string.IsNullOrEmpty(_config.AuthUser) || IPSubnet.IsLoopBack(((IPEndPoint)_connection.RemoteEndPoint).Address)) &&
                        _firstPacket[0] == 4 && _firstPacketLength >= 9)
                    {
                        RspSocks4aHandshakeReceive();
                    }
                    else if (_firstPacket[0] == 5 && _firstPacketLength >= 3)
                    {
                        RspSocks5HandshakeReceive();
                    }
                    else
                    {
                        RspHttpHandshakeReceive();
                    }
                }
                else
                {
                    Close();
                }
            }
            catch (Exception e)
            {
                Logging.LogUsefulException(e);
                Close();
            }
        }
Exemplo n.º 2
0
 public void IsLoopBackTest()
 {
     Assert.IsTrue(IPSubnet.IsLoopBack(IPAddress.Loopback));
     Assert.IsTrue(IPSubnet.IsLoopBack(IPAddress.IPv6Loopback));
     Assert.IsTrue(IPSubnet.IsLoopBack(IPAddress.Parse(@"127.0.0.255")));
     Assert.IsTrue(IPSubnet.IsLoopBack(IPAddress.Parse(@"127.255.255.255")));
     Assert.IsFalse(IPSubnet.IsLoopBack(IPAddress.Parse(@"192.168.1.1")));
     Assert.IsFalse(IPSubnet.IsLoopBack(IPAddress.Parse(@"2001:0DB8:ABCD:0012:FFFF:FFFF:FFFF:FFFF")));
 }
Exemplo n.º 3
0
 private bool AuthConnection(string authUser, string authPass)
 {
     if ((_config.AuthUser ?? string.Empty).Length == 0)
     {
         return(true);
     }
     if (_config.AuthUser == authUser && (_config.AuthPass ?? "") == authPass)
     {
         return(true);
     }
     return(IPSubnet.IsLoopBack(((IPEndPoint)_connection.RemoteEndPoint).Address));
 }
Exemplo n.º 4
0
 private bool AuthConnection(string authUser, string authPass)
 {
     if (string.IsNullOrEmpty(_config.AuthUser))
     {
         return(true);
     }
     if (_config.AuthUser == authUser && _config.AuthPass == authPass)
     {
         return(true);
     }
     return(IPSubnet.IsLoopBack(((IPEndPoint)_connection.RemoteEndPoint).Address));
 }
Exemplo n.º 5
0
        private void RspSocks5HandshakeReceive()
        {
            byte[] response = { 5, 0 };
            if (_firstPacket[0] != 5)
            {
                response = new byte[] { 0, 91 };
                Console.WriteLine(@"socks 4/5 protocol error");
                _connection.Send(response);
                Close();
                return;
            }

            var auth       = false;
            var has_method = false;

            for (var index = 0; index < _firstPacket[1]; ++index)
            {
                if (_firstPacket[2 + index] == 0)
                {
                    has_method = true;
                }
                else if (_firstPacket[2 + index] == 2)
                {
                    auth       = true;
                    has_method = true;
                }
            }
            if (!has_method)
            {
                Console.WriteLine(@"Socks5 no acceptable auth method");
                Close();
                return;
            }
            if (auth)
            {
                response[1] = 2;
                _connection.BeginSend(response, 0, response.Length, SocketFlags.None, HandshakeAuthSendCallback, null);
            }
            else if (string.IsNullOrEmpty(_config.AuthUser) ||
                     IPSubnet.IsLoopBack(((IPEndPoint)_connection.RemoteEndPoint).Address))
            {
                _connection.BeginSend(response, 0, response.Length, SocketFlags.None, HandshakeSendCallback, null);
            }
            else
            {
                Console.WriteLine(@"Socks5 Auth failed");
                Close();
            }
        }
Exemplo n.º 6
0
 public void Start(Configuration config, byte[] firstPacket, int length, Socket socket, int targetPort)
 {
     _config            = config;
     _firstPacket       = firstPacket;
     _firstPacketLength = length;
     _local             = socket;
     _targetPort        = targetPort;
     if ((_config.AuthUser ?? string.Empty).Length == 0 ||
         IPSubnet.IsLoopBack(((IPEndPoint)_local.RemoteEndPoint).Address))
     {
         Connect();
     }
     else
     {
         RspHttpHandshakeReceive();
     }
 }
Exemplo n.º 7
0
 private void RspHttpHandshakeReceive()
 {
     _command = 1; // Set TCP connect command
     if (httpProxyState == null)
     {
         httpProxyState = new HttpParser();
     }
     if (IPSubnet.IsLoopBack(((IPEndPoint)_connection.RemoteEndPoint).Address))
     {
         httpProxyState.httpAuthUser = string.Empty;
         httpProxyState.httpAuthPass = string.Empty;
     }
     else
     {
         httpProxyState.httpAuthUser = _config.AuthUser;
         httpProxyState.httpAuthPass = _config.AuthPass;
     }
     for (var i = 1; ; ++i)
     {
         var err = httpProxyState.HandshakeReceive(_firstPacket, _firstPacketLength, out _remoteHeaderSendBuffer);
         if (err == 1)
         {
             if (HttpHandshakeRecv())
             {
                 break;
             }
         }
         else if (err == 2)
         {
             var dataSend = HttpParser.Http407();
             var httpData = Encoding.UTF8.GetBytes(dataSend);
             _connection.Send(httpData);
             if (HttpHandshakeRecv())
             {
                 break;
             }
         }
         else if (err is 3 or 4)
         {
             Connect();
             break;
         }