Example #1
0
        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.");
                }
            }
        }