public override MetadataWrapper generateMetadataWrapper()
        {
            MetadataWrapper metadata = base.generateMetadataWrapper();

            // For Drone controller, currentTime should be based on
            // fixed update passes so use DroneTimeSinceStart instead of TimeSinceStart
            metadata.currentTime = DroneTimeSinceStart();

            // TODO: clean this up with reflection.
            // it works, but will not update when something changes to AgentMetadata
            // metadata.agent = new
            AgentMetadata baseAgent = metadata.agent;

            DroneAgentMetadata droneMeta = new DroneAgentMetadata();

            droneMeta.name               = "drone";
            droneMeta.position           = baseAgent.position;
            droneMeta.rotation           = baseAgent.rotation;
            droneMeta.cameraHorizon      = baseAgent.cameraHorizon;
            droneMeta.inHighFrictionArea = baseAgent.inHighFrictionArea;

            // New drone stuff for agent metadata
            droneMeta.LauncherPosition = GetLauncherPosition();

            metadata.agent = droneMeta;
            return(metadata);
        }
Пример #2
0
        public async Task CreateOrUpdateAgentMetadataAsync(AgentMetadata metadata)
        {
            using (var ctx = new SmsServiceDbEntities(this.connectionString))
            {
                var entity = await ctx.ConnectorAgentMetadata.SingleOrDefaultAsync(
                    a => a.Provider == metadata.ConnectorName &&
                    a.Id == metadata.ConnectorId);

                if (entity == null)
                {
                    entity                      = new ConnectorAgentMetadataEntity();
                    entity.Provider             = metadata.ConnectorName;
                    entity.Id                   = metadata.ConnectorId;
                    entity.LastMessageSendTime  = metadata.LastMessageSendTime;
                    entity.LastReportUpdateTime = metadata.LastReportUpdateTime;
                    entity.PendingReceive       = metadata.PendingReceive;
                    entity.Modified             = DateTime.UtcNow;

                    ctx.ConnectorAgentMetadata.Add(entity);
                }
                else
                {
                    entity.LastMessageSendTime  = metadata.LastMessageSendTime;
                    entity.LastReportUpdateTime = metadata.LastReportUpdateTime;
                    entity.PendingReceive       = metadata.PendingReceive;
                    entity.Modified             = DateTime.UtcNow;
                }

                await ctx.SaveChangesAsync();
            }
        }
Пример #3
0
        private void HandleStageOneRequest(AgentMetadata metadata, C2Data c2Data)
        {
            var stage = PayloadControllerBase.GenerateStageOne(new StageRequest
            {
                TargetFramework = TargetFramework.Net40
            });

            Agent.SendDataToAgent(metadata.AgentID, "", "StageOne", stage);
        }
Пример #4
0
 public void UpdateSession(AgentMetadata metadata)
 {
     if (!ConnectedAgents.Where(a => a.Metadata.AgentID.Equals(metadata.AgentID, StringComparison.OrdinalIgnoreCase)).Any())
     {
         CreateSession(metadata);
     }
     else
     {
         ConnectedAgents.Where(a => a.Metadata.AgentID.Equals(metadata.AgentID, StringComparison.OrdinalIgnoreCase))
         .FirstOrDefault().LastSeen = DateTime.UtcNow;
     }
 }
Пример #5
0
        public static AgentMetadata ToModel(this ConnectorAgentMetadataEntity entity)
        {
            var meta = new AgentMetadata();

            meta.ConnectorName        = entity.Provider;
            meta.ConnectorId          = entity.Id;
            meta.LastMessageSendTime  = entity.LastMessageSendTime;
            meta.LastReportUpdateTime = entity.LastReportUpdateTime;
            meta.PendingReceive       = entity.PendingReceive ?? 0;

            return(meta);
        }
Пример #6
0
        private void CreateSession(AgentMetadata metadata)
        {
            ConnectedAgents.Add(new AgentSessionData
            {
                Metadata  = metadata,
                FirstSeen = DateTime.UtcNow,
                LastSeen  = DateTime.UtcNow
            });

            var data = string.Format("{0}@{1} ({2})", metadata.Identity, metadata.IPAddress, metadata.Hostname);

            OnServerEvent?.Invoke(this, new ServerEvent(ServerEventType.InitialAgent, data));
            Log.Logger.Information("AGENT {Event} {AgentID} {Hostname}", ServerEventType.InitialAgent.ToString(), metadata.AgentID, metadata.Hostname);
        }
Пример #7
0
        public void Init()
        {
            var metadata = new AgentMetadata
            {
                AgentID     = Common.Helpers.GeneratePseudoRandomString(8),
                Hostname    = Helpers.GetHostname,
                IPAddress   = Helpers.GetIpAddress,
                Integrity   = Helpers.GetIntegrity,
                Identity    = Helpers.GetIdentity,
                ProcessName = Helpers.GetProcessName,
                ProcessID   = Helpers.GetProcessId,
                Arch        = Helpers.GetArch,
                CLR         = Helpers.GetCLRVersion
            };

            Config.SetOption(ConfigSetting.Metadata, metadata);
        }
Пример #8
0
    public void Init(string agentID, string parentAgentID)
    {
        AgentMetadata = new AgentMetadata
        {
            AgentID       = agentID,
            ParentAgentID = parentAgentID,
            Hostname      = Helpers.GetHostname,
            IPAddress     = Helpers.GetIpAddress,
            Integrity     = Helpers.GetIntegrity,
            Identity      = Helpers.GetIdentity,
            ProcessName   = Helpers.GetProcessName,
            ProcessID     = Helpers.GetProcessId,
            Arch          = Helpers.GetArch,
            CLR           = Helpers.GetCLRVersion
        };

        P2P = new P2PController(this);
    }
Пример #9
0
        private void HandleC2Data(AgentMetadata metadata, C2Data c2Data)
        {
            OnServerCommand CallBack;

            try
            {
                CallBack = ServerModules
                           .Where(m => m.Name.Equals(c2Data.Module, StringComparison.OrdinalIgnoreCase))
                           .Select(m => m.ServerCommands).FirstOrDefault()
                           .Where(c => c.Name.Equals(c2Data.Command, StringComparison.OrdinalIgnoreCase))
                           .Select(c => c.CallBack).FirstOrDefault();
            }
            catch
            {
                return;
            }

            CallBack?.Invoke(metadata, c2Data);
        }
Пример #10
0
        public void RegisterAgentModule(AgentMetadata metadata, AgentModule module)
        {
            var agent = ConnectedAgents.FirstOrDefault(a => a.Metadata.AgentID.Equals(metadata.AgentID, StringComparison.OrdinalIgnoreCase));

            if (agent == null)
            {
                CreateSession(metadata);
                agent = ConnectedAgents.FirstOrDefault(a => a.Metadata.AgentID.Equals(metadata.AgentID, StringComparison.OrdinalIgnoreCase));
            }

            if (agent.LoadModules.Any(m => m.Name.Equals(module.Name, StringComparison.OrdinalIgnoreCase)))
            {
                agent.LoadModules.Remove(agent.LoadModules.FirstOrDefault(m => m.Name.Equals(module.Name, StringComparison.OrdinalIgnoreCase)));
            }

            agent.LoadModules.Add(module);
            OnAgentEvent?.Invoke(this, new AgentEvent(agent.Metadata.AgentID, AgentEventType.ModuleRegistered, module.Name));
            Log.Logger.Information("AGENT {Event} {ModuleName}", AgentEventType.ModuleRegistered.ToString(), module.Name);
        }
Пример #11
0
        private void DataFromAgent(AgentMetadata metadata, C2Data c2Data)
        {
            var packet = Serialisation.DeserialiseData <ReversePortForwardPacket>(c2Data.Data);

            if (!IPAddress.TryParse(packet.ForwardHost, out IPAddress ipAddress))
            {
                ipAddress = Dns.GetHostEntry(packet.ForwardHost).AddressList[0];
            }

            var endPoint = new IPEndPoint(ipAddress, packet.ForwardPort);
            var sender   = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.IP);

            sender.Connect(endPoint);
            var bytesSent = sender.Send(packet.Data);

            if (bytesSent > 0)
            {
                Log.Logger.Information("MODULE {ModuleName} {Data}", "ReversePortForward", $"{bytesSent} bytes sent");
            }

            var buffer    = new byte[65535];
            var bytesRecv = sender.Receive(buffer);

            if (bytesRecv > 0)
            {
                packet.Data = buffer.TrimBytes();

                Agent.SendAgentCommand(new AgentCommandRequest
                {
                    AgentId = c2Data.AgentID,
                    Module  = "rportfwd",
                    Command = "DataFromTeamServer",
                    Data    = Convert.ToBase64String(Serialisation.SerialiseData(packet))
                }, null);
            }

            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
        }
Пример #12
0
        private AgentMetadata ExtractAgentMetadata(string webRequest)
        {
            AgentMetadata metadata = null;

            var regex = Regex.Match(webRequest, "Cookie: Metadata=([^\\s].*)");

            if (regex.Captures.Count > 0)
            {
                var encrypted = Convert.FromBase64String(regex.Groups[1].Value);

                if (CryptoController.VerifyHMAC(encrypted))
                {
                    metadata = CryptoController.Decrypt <AgentMetadata>(encrypted);
                }
                else
                {
                    OnAgentEvent?.Invoke(this, new AgentEvent("", AgentEventType.CryptoError, "HMAC validation failed on AgentMetadata"));
                }
            }

            return(metadata);
        }
Пример #13
0
        public TrashBin CreateTrashBin(TimeSpan birthTime, Vector position)
        {
            AgentMetadata agentMetaData = contentManager.GetAgentMetadata("TrashBin");

            return(CreateEquipment <TrashBin>(birthTime, "TrashBin", position, agentMetaData));
        }
Пример #14
0
 public virtual void SetMetadata(string agentID)
 {
     Metadata = new AgentMetadata {
         AgentID = agentID
     };
 }
Пример #15
0
        public SodaMachine CreateSodaMachine(TimeSpan birthTime, Vector position)
        {
            AgentMetadata agentMetaData = contentManager.GetAgentMetadata("SodaMachine");

            return(CreateEquipment <SodaMachine>(birthTime, "SodaMachine", position, agentMetaData));
        }
Пример #16
0
        private T CreateEquipment <T>(TimeSpan birthTime, string texturePathKey, Vector position, AgentMetadata agentMetaData)
            where T : Equipment
        {
            if (log.IsDebugEnabled)
            {
                log.Debug(String.Format("Creating agent of type {0} at ({1},{2}) with birth time: {3}", typeof(T), position.X, position.Y, birthTime));
            }
            Texture texture = GetTextureFromStore(texturePathKey);

            return((T)Activator.CreateInstance(typeof(T), birthTime, texture, position,
                                               agentMetaData.Name, agentMetaData.Price, agentMetaData.Description, agentMetaData.IconKey, agentMetaData.NecessityEffect, agentMetaData.SkillEffect));
        }
Пример #17
0
        private void RegisterAgentModule(AgentMetadata metadata, C2Data c2Data)
        {
            var moduleInfo = Serialisation.DeserialiseData <AgentModule>(c2Data.Data);

            Agent.RegisterAgentModule(metadata, moduleInfo);
        }
Пример #18
0
        private void HandleAgentError(AgentMetadata metadata, C2Data c2Data)
        {
            var error = Encoding.UTF8.GetString(c2Data.Data);

            OnAgentEvent?.Invoke(this, new AgentEvent(metadata.AgentID, AgentEventType.AgentError, error));
        }
Пример #19
0
        private void HandleAgentOutput(AgentMetadata metadata, C2Data c2Data)
        {
            var output = Encoding.UTF8.GetString(c2Data.Data);

            OnAgentEvent?.Invoke(this, new AgentEvent(metadata.AgentID, AgentEventType.CommandResponse, output));
        }
Пример #20
0
 private void HandleAgentCheckin(AgentMetadata metadata, C2Data c2Data)
 {
     Agent.UpdateSession(metadata);
 }
Пример #21
0
        private void LoadAgentMetadata(string json)
        {
            if (json == null)
            {
                throw new ArgumentNullException("json");
            }

            JObject o = JObject.Parse(json);

            foreach (var equipment in o["equipment"])
            {
                NecessityEffect necessityEffectData = null;
                SkillEffect     skillEffectData     = null;

                string key         = equipment["key"].ToString();
                string name        = equipment["name"].ToString();
                int    price       = Int32.Parse(equipment["price"].ToString());
                string iconKey     = equipment["icon"].ToString();
                string description = equipment["description"].ToString();

                foreach (var necessityEffect in equipment["necessityEffect"])
                {
                    int health  = Int32.Parse(necessityEffect["health"].ToString());
                    int hygiene = Int32.Parse(necessityEffect["hygiene"].ToString());
                    int sleep   = Int32.Parse(necessityEffect["sleep"].ToString());
                    int thirst  = Int32.Parse(necessityEffect["thirst"].ToString());
                    int hunger  = Int32.Parse(necessityEffect["hunger"].ToString());

                    necessityEffectData = new NecessityEffect(health, hygiene, sleep, thirst, hunger);
                }

                foreach (var skillEffect in equipment["skillEffect"])
                {
                    int intelligence  = Int32.Parse(skillEffect["intelligence"].ToString());
                    int creativity    = Int32.Parse(skillEffect["creativity"].ToString());
                    int communication = Int32.Parse(skillEffect["communication"].ToString());
                    int leadership    = Int32.Parse(skillEffect["leadership"].ToString());

                    skillEffectData = new SkillEffect(intelligence, creativity, communication, leadership);
                }

                AgentMetadata agentMetadata = new AgentMetadata(price, name, description, iconKey, necessityEffectData, skillEffectData);
                agentMetadataDictionary.Add(key, agentMetadata);
            }

            foreach (var room in o["rooms"])
            {
                NecessityEffect necessityEffectData = null;
                SkillEffect     skillEffectData     = null;

                string key         = room["key"].ToString();
                string name        = room["name"].ToString();
                int    price       = Int32.Parse(room["price"].ToString());
                string iconKey     = room["icon"].ToString();
                string mapPathKey  = room["map"].ToString();
                string description = room["description"].ToString();

                foreach (var necessityEffect in room["necessityEffect"])
                {
                    int health  = Int32.Parse(necessityEffect["health"].ToString());
                    int hygiene = Int32.Parse(necessityEffect["hygiene"].ToString());
                    int sleep   = Int32.Parse(necessityEffect["sleep"].ToString());
                    int thirst  = Int32.Parse(necessityEffect["thirst"].ToString());
                    int hunger  = Int32.Parse(necessityEffect["hunger"].ToString());

                    necessityEffectData = new NecessityEffect(health, hygiene, sleep, thirst, hunger);
                }

                foreach (var skillEffect in room["skillEffect"])
                {
                    int intelligence  = Int32.Parse(skillEffect["intelligence"].ToString());
                    int creativity    = Int32.Parse(skillEffect["creativity"].ToString());
                    int communication = Int32.Parse(skillEffect["communication"].ToString());
                    int leadership    = Int32.Parse(skillEffect["leadership"].ToString());

                    skillEffectData = new SkillEffect(intelligence, creativity, communication, leadership);
                }

                RoomMetadata roomMetadata = new RoomMetadata(price, name, description, iconKey, necessityEffectData, skillEffectData, mapPathKey);
                roomMetadataDictionary.Add(key, roomMetadata);
            }
        }
Пример #22
0
 public void SetMetadata(AgentMetadata metadata)
 {
     Metadata = metadata;
 }
Пример #23
0
        public OfficeDesk CreateOfficeDesk(TimeSpan birthTime, Vector position)
        {
            AgentMetadata agentMetaData = contentManager.GetAgentMetadata("OfficeDesk");

            return(CreateEquipment <OfficeDesk>(birthTime, "OfficeDesk", position, agentMetaData));
        }