public static string Decrypt(StagingMessage stagingMessage) { byte[] password = Encoding.UTF8.GetBytes(stagingMessage.Payload.Key); byte[] iv = Convert.FromBase64String(stagingMessage.IV); byte[] hmac = Convert.FromBase64String(stagingMessage.HMAC); string message = stagingMessage.Message; return(Decrypt(iv, password, message, hmac)); }
public async Task Handle(NewStagingMessage newStagingMessage, string replyTo, string correlationId) { Console.WriteLine($"[i] Got StagingMessage Message."); Payload payload = _taskRepository.GetPayload(newStagingMessage.PayloadName); if (payload.Enabled) { StagingMessage stagingMessage = new StagingMessage(); // Decode and Decrypt AgentTaskResponse stagingMessage.HMAC = newStagingMessage.HMAC; stagingMessage.IV = newStagingMessage.IV; stagingMessage.Message = newStagingMessage.Message; stagingMessage.PayloadName = newStagingMessage.PayloadName; stagingMessage.TransportId = newStagingMessage.TransportId; stagingMessage.SourceIp = newStagingMessage.SourceIp; stagingMessage.Payload = payload; stagingMessage.PayloadId = stagingMessage.Payload.Id; _taskRepository.Add(stagingMessage); // Decrypt Message from Agent string decryptedMessage = Crypto.Decrypt(stagingMessage); Console.WriteLine($"Got response {decryptedMessage}"); // Process taskResults // TODO: Probably a better way to check if the message is blank. if ((decryptedMessage != "[]") || (!String.IsNullOrEmpty(decryptedMessage))) { Agent agent = JsonConvert.DeserializeObject <Agent>(decryptedMessage); agent.Name = Utility.GenerateSecureString(12); agent.AesPassword = Utility.GenerateSecureString(32); agent.InitialCheckin = DateTime.UtcNow; agent.LastCheckin = DateTime.UtcNow; agent.BeaconInterval = stagingMessage.Payload.BeaconInterval; agent.ExternalIp = stagingMessage.SourceIp; agent.TransportId = stagingMessage.TransportId; agent.Jitter = stagingMessage.Payload.Jitter; agent.AgentType = _taskRepository.GetAgentType(stagingMessage.Payload.AgentTypeId); agent.AgentType.Language = _taskRepository.GetLanguage(agent.AgentType.LanguageId); agent.AgentTypeId = stagingMessage.Payload.AgentType.Id; agent.Transport = _taskRepository.GetTransport(stagingMessage.TransportId); agent.Payload = stagingMessage.Payload; _taskRepository.Add(agent); NewAgent newAgent = new NewAgent(agent); _eventBus.Publish(newAgent); // Create Agent tasks to setup agent List <OutboundTask> stagingTasks = new List <OutboundTask>(); AgentTask agentNameTask = new AgentTask(); agentNameTask.AgentId = agent.Id; agentNameTask.Action = "SET"; agentNameTask.Command = $"Name:{agent.Name}"; _taskRepository.Add(agentNameTask); stagingTasks.Add(new OutboundTask(agent.Name, agentNameTask)); AgentTask passwordTask = new AgentTask(); passwordTask.AgentId = agent.Id; passwordTask.Action = "SET"; passwordTask.Command = $"Password:{agent.AesPassword}"; _taskRepository.Add(passwordTask); stagingTasks.Add(new OutboundTask(agent.Name, passwordTask)); AgentTask beaconTask = new AgentTask(); beaconTask.AgentId = agent.Id; beaconTask.Action = "SET"; beaconTask.Command = $"BeaconInterval:{agent.BeaconInterval.ToString()}"; _taskRepository.Add(beaconTask); stagingTasks.Add(new OutboundTask(agent.Name, beaconTask)); AgentTask jitterTask = new AgentTask(); jitterTask.AgentId = agent.Id; jitterTask.Action = "SET"; jitterTask.Command = $"Jitter:{agent.Jitter.ToString()}"; _taskRepository.Add(jitterTask); stagingTasks.Add(new OutboundTask(agent.Name, jitterTask)); AgentTask payloadNameTask = new AgentTask(); payloadNameTask.AgentId = agent.Id; payloadNameTask.Action = "SET"; payloadNameTask.Command = $"PayloadName:null"; _taskRepository.Add(payloadNameTask); stagingTasks.Add(new OutboundTask(agent.Name, payloadNameTask)); AgentTask stagerIdTask = new AgentTask(); stagerIdTask.AgentId = agent.Id; stagerIdTask.Action = "SET"; stagerIdTask.Command = $"StagingId:null"; _taskRepository.Add(stagerIdTask); stagingTasks.Add(new OutboundTask(agent.Name, stagerIdTask)); // Convert outbound message to json and encrypt with the staging message password string jsonOutboundMessage = JsonConvert.SerializeObject(stagingTasks); Dictionary <string, string> encCommand = Crypto.Encrypt(jsonOutboundMessage, agent.Id, stagingMessage.Payload.Key); // Create a StagingResponse object with the seralized/encrypted message contents StagingResponse stagingResponse = new StagingResponse(); stagingResponse.Agent = agent; stagingResponse.Message = encCommand["encryptedMsg"]; stagingResponse.AgentId = agent.Id; stagingResponse.HMAC = encCommand["hmac"]; stagingResponse.IV = encCommand["iv"]; stagingResponse.Sent = false; _taskRepository.Add(stagingResponse); // Package for delivery string stagingJson = JsonConvert.SerializeObject(new OutboundStagingResponse(stagingResponse)); string encodedMessage = Convert.ToBase64String(Encoding.UTF8.GetBytes(stagingJson)); Dictionary <string, string> outboundMessage = new Dictionary <string, string>(); outboundMessage["AgentName"] = agent.StagingId; outboundMessage["Message"] = encodedMessage; _eventBus.Publish(outboundMessage, replyTo, correlationId); } else { Console.WriteLine($"[i] Payload is disabled. Staging message ignored."); } } }