public static ConsoleMessage ProcessHelpMessage(ConsoleMessage consoleMessage) { ConsoleMessage consoleResponse = new ConsoleMessage(); consoleResponse.AgentId = consoleMessage.AgentId; consoleResponse.UserId = 1; consoleResponse.Received = DateTime.UtcNow; consoleResponse.Type = "HelpResponse"; // Remove the leading "HELP ", if we can't do this lets assume its just "help" string recievedCommand = ""; try { recievedCommand = consoleMessage.Content.Remove(0, 5); } catch { consoleResponse.Display = $"Faction Agent Help:\n\n* 'show commands' will return a list of available commands.\n* 'show modules' will show available modules\n* 'help <command>` will give you details about a command\n* 'help <command> /<paramater>' will give you details about a commands paramter"; return(consoleResponse); } FactionCommand factionCommand = ProcessCommand(recievedCommand); if (factionCommand.Arguments.Count > 0) { string ParameterName = factionCommand.Arguments.Keys.Last().ToString(); CommandParameter parameter; try { parameter = _taskRepository.GetCommandParameter(factionCommand.Command, ParameterName); if (String.IsNullOrEmpty(parameter.Help)) { consoleResponse.Display = $"No help available for parameter: {parameter.Name} under command {factionCommand.Command}"; } else { consoleResponse.Display = $"Name: {parameter.Name}\nRequired: {parameter.Required}\nAccepted Values: {parameter.Values}\n\n## Help\n{parameter.Help}"; } } catch { consoleResponse.Display = $"No parameter named {ParameterName} found for command {factionCommand.Command}"; } } else { try { Command command = _taskRepository.GetCommand(factionCommand.Command); if (String.IsNullOrEmpty(command.Help)) { consoleResponse.Display = $"No help available for command {command.Name}"; } else { consoleResponse.Display = $"Name: {command.Name}"; consoleResponse.Display += $"\nDescription: {command.Description}"; consoleResponse.Display += $"\nMitre ATT&CK Reference: {command.MitreReference}"; consoleResponse.Display += $"\nOpsecSafe: {command.OpsecSafe}"; consoleResponse.Display += $"\nLoaded: {AgentDetails.IsCommandAvailable(command)}"; consoleResponse.Display += $"\n\nHelp:\n{command.Help}\n"; List <CommandParameter> parameters = _taskRepository.GetCommandParameters(command.Id); if (parameters.Count() > 0) { string parameterText = "\nParameters:"; foreach (CommandParameter param in parameters) { parameterText += $"\nName: {param.Name}"; parameterText += $"\nRequired: {param.Required.ToString()}"; if (param.Position.HasValue) { parameterText += $"\nPosition: {param.Position.Value.ToString()}"; } else { parameterText += $"\nPosition: N/A"; } parameterText += $"\nHelp: {param.Help}\n"; } consoleResponse.Display += parameterText; } if (!String.IsNullOrEmpty(command.Artifacts)) { consoleResponse.Display += "\n\nArtifacts:"; string[] artifacts = command.Artifacts.Split(","); foreach (string artifact in artifacts) { consoleResponse.Display += $"\n* {artifact}"; } } consoleResponse.Display += "\n"; } } catch { consoleResponse.Display = $"No command found named {recievedCommand}"; } } return(consoleResponse); }