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(); } }
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"))); }
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)); }
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)); }
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(); } }
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(); } }
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; }