Example #1
0
        /// <summary>
        /// Creates a new Reverse Port Forward.
        /// </summary>
        /// <param name="BindPort">The port to bind on the local system.</param>
        /// <param name="ForwardAddress">The IP Address or DNS name to forward traffic to.</param>
        /// <param name="ForwardPort">The port to forward traffic to.</param>
        /// <returns>Bool.</returns>
        /// <author>Daniel Duggan (@_RastaMouse)</author>
        public static bool CreateReversePortForward(int BindPort, IPAddress ForwardAddress, int ForwardPort)
        {
            // Check if bindPort is not already bound.
            if (_boundSockets.ContainsKey(BindPort))
            {
                return(false);
            }

            // Bind the sockets
            Socket boundSocket = BindSocket(IPAddress.Any, BindPort);

            if (boundSocket == null)
            {
                return(false);
            }

            ReversePortForward newReversePortForward = new ReversePortForward
            {
                BindAddress    = IPAddress.Any,
                BindPort       = BindPort,
                ForwardAddress = ForwardAddress,
                ForwardPort    = ForwardPort
            };

            // Add to Lists
            _reversePortForwards.Add(newReversePortForward);
            _boundSockets[BindPort] = boundSocket;

            // Kick off client sockets in new thread.
            new Thread(() => CreateClientSocketThread(boundSocket, ForwardAddress, ForwardPort)).Start();
            return(true);
        }
Example #2
0
        /// <summary>
        /// Deletes an active Reverse Port Forward.
        /// </summary>
        /// <param name="BindPort">The bind port of the Reverse Port Forward.</param>
        /// <returns>Bool.</returns>
        /// <author>Daniel Duggan (@_RastaMouse)</author>
        public static bool DeleteReversePortForward(int BindPort)
        {
            if (!_boundSockets.TryGetValue(BindPort, out Socket socket))
            {
                return(false);
            }

            try
            {
                try { socket.Shutdown(SocketShutdown.Both); }
                catch (SocketException) { }
                socket.Close();

                _boundSockets.Remove(BindPort);

                ReversePortForward reversePortForward = _reversePortForwards.FirstOrDefault(r => r.BindPort.Equals(BindPort));
                _reversePortForwards.Remove(reversePortForward);

                return(true);
            }
            catch { }

            return(false);
        }
Example #3
0
        private void StartReversePortForward(byte[] data)
        {
            try
            {
                var args        = Encoding.UTF8.GetString(data).Split(' ');
                var bindPort    = int.Parse(args[0]);
                var forwardHost = args[1];
                var forwardPort = int.Parse(args[2]);

                if (ReversePortForwards.Any(k => k.Key.BindPort == bindPort))
                {
                    Agent.SendError($"rportfwd already exists on port {bindPort}");
                    return;
                }

                var rportfwd = new ReversePortForward
                {
                    BindPort          = bindPort,
                    ForwardHost       = forwardHost,
                    ForwardPort       = forwardPort,
                    CancellationToken = new CancellationTokenSource()
                };

                var bindAddress = IPAddress.Parse("0.0.0.0");
                var endPoint    = new IPEndPoint(bindAddress, bindPort);
                var listener    = new Socket(bindAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                listener.Bind(endPoint);
                listener.Listen(100);

                var token = rportfwd.CancellationToken.Token;

                Task.Factory.StartNew(delegate()
                {
                    while (true)
                    {
                        if (token.IsCancellationRequested)
                        {
                            return;
                        }

                        try
                        {
                            var handler = listener.Accept();

                            var buffer    = new byte[65535];
                            var bytesRecv = handler.Receive(buffer);

                            if (bytesRecv > 0)
                            {
                                var outPacket = new ReversePortForwardPacket
                                {
                                    ID          = Guid.NewGuid().ToString(),
                                    ForwardHost = rportfwd.ForwardHost,
                                    ForwardPort = rportfwd.ForwardPort,
                                    Data        = buffer.TrimBytes()
                                };

                                Agent.SendModuleData("ReversePortForward", "DataFromAgent", Serialisation.SerialiseData(outPacket));

                                // wait

                                while (true)
                                {
                                    var packets = InboundPackets.ToArray();

                                    if (packets.Any(p => p.ID.Equals(outPacket.ID, StringComparison.OrdinalIgnoreCase)))
                                    {
                                        var inPacket = InboundPackets.FirstOrDefault(p => p.ID.Equals(outPacket.ID, StringComparison.OrdinalIgnoreCase));
                                        InboundPackets.Remove(inPacket);

                                        handler.Send(inPacket.Data);
                                        handler.Shutdown(SocketShutdown.Both);
                                        handler.Close();

                                        break;
                                    }
                                }
                            }
                        }
                        catch (SocketException e)
                        {
                            // socket is probably disposed
                            Agent.SendError(e.Message);
                        }
                    }
                }, token);

                ReversePortForwards.Add(rportfwd, listener);
            }
            catch (Exception e)
            {
                Agent.SendError(e.Message);
            }
        }