示例#1
0
        private void ReadCallback(IAsyncResult ar)
        {
            var state         = ar.AsyncState as StateObject;
            var bytesReceived = state.workStream.EndRead(ar);

            if (bytesReceived > 0)
            {
                var dataReceived = state.buffer.TrimBytes();

                if (Crypto.VerifyHMAC(dataReceived))
                {
                    var messages = Crypto.Decrypt <List <AgentMessage> >(dataReceived);

                    if (messages != null)
                    {
                        foreach (var message in messages)
                        {
                            if (!string.IsNullOrEmpty(message.Data.Module))
                            {
                                InboundC2Data.Enqueue(message);
                            }
                        }
                    }
                }
            }

            state.workStream.Close();
            state.workClient.Close();
        }
示例#2
0
        public bool RecvData(out AgentMessage message)
        {
            if (InboundC2Data.Count > 0)
            {
                message = InboundC2Data.Dequeue();
                return(true);
            }

            message = null;
            return(false);
        }
示例#3
0
        private void ReadCallback(IAsyncResult ar)
        {
            var state     = ar.AsyncState as StateObject;
            var stream    = state.workStream;
            var bytesRead = 0;

            try
            {
                bytesRead = stream.EndRead(ar);
            }
            catch { }

            if (bytesRead > 0)
            {
                var dataReceived = state.buffer.TrimBytes();

                if (Crypto.VerifyHMAC(dataReceived))
                {
                    var inbound = Crypto.Decrypt <List <AgentMessage> >(dataReceived);

                    if (inbound.Count > 0)
                    {
                        foreach (var dataIn in inbound)
                        {
                            InboundC2Data.Enqueue(dataIn);
                        }
                    }
                }

                var outbound = new List <AgentMessage>();

                if (OutboundC2Data.Count > 0)
                {
                    while (OutboundC2Data.Count != 0)
                    {
                        outbound.Add(OutboundC2Data.Dequeue());
                    }
                }
                else
                {
                    outbound.Add(new AgentMessage
                    {
                        IdempotencyKey = Guid.NewGuid().ToString(),
                        Metadata       = Config.GetOption(ConfigSetting.Metadata) as AgentMetadata,
                        Data           = new C2Data()
                    });
                }

                var dataToSend = Crypto.Encrypt(outbound);

                SendDataToClient(stream, dataToSend);
            }
        }
示例#4
0
        private void ProcessTeamServerResponse(byte[] response)
        {
            if (Crypto.VerifyHMAC(response))
            {
                var messages = Crypto.Decrypt <List <AgentMessage> >(response);

                if (messages != null)
                {
                    foreach (var message in messages)
                    {
                        InboundC2Data.Enqueue(message);
                    }
                }
            }
        }
示例#5
0
        private void ReadCallback(IAsyncResult ar)
        {
            var state     = ar.AsyncState as StateObject;
            var stream    = state.workStream;
            var bytesRead = 0;

            try
            {
                bytesRead = stream.EndRead(ar);
            }
            catch { }

            if (bytesRead > 0)
            {
                var dataReceived = state.buffer.TrimBytes();

                if (bytesRead == state.buffer.Length)
                {
                    if (state.tmpBuffer != null)
                    {
                        var tmp = state.tmpBuffer;
                        state.tmpBuffer = new byte[tmp.Length + dataReceived.Length];
                        Buffer.BlockCopy(tmp, 0, state.tmpBuffer, 0, tmp.Length);
                        Buffer.BlockCopy(dataReceived, 0, state.tmpBuffer, tmp.Length, dataReceived.Length);
                    }
                    else
                    {
                        state.tmpBuffer = new byte[dataReceived.Length];
                        Buffer.BlockCopy(dataReceived, 0, state.tmpBuffer, 0, dataReceived.Length);
                    }

                    Array.Clear(state.buffer, 0, state.buffer.Length);
                    stream.BeginRead(state.buffer, 0, state.buffer.Length, new AsyncCallback(ReadCallback), state);
                }
                else
                {
                    byte[] final;
                    if (state.tmpBuffer != null)
                    {
                        final = new byte[state.tmpBuffer.Length + dataReceived.Length];
                        Buffer.BlockCopy(state.tmpBuffer, 0, final, 0, state.tmpBuffer.Length);
                        Buffer.BlockCopy(dataReceived, 0, final, state.tmpBuffer.Length, dataReceived.Length);
                    }
                    else
                    {
                        final = new byte[dataReceived.Length];
                        Buffer.BlockCopy(dataReceived, 0, final, 0, dataReceived.Length);
                    }

                    var finalData = final.TrimBytes();

                    if (Crypto.VerifyHMAC(finalData))
                    {
                        var inbound = Crypto.Decrypt <List <AgentMessage> >(finalData);

                        if (inbound.Count > 0)
                        {
                            foreach (var dataIn in inbound)
                            {
                                InboundC2Data.Enqueue(dataIn);
                            }
                        }
                    }

                    var outbound = new List <AgentMessage>();

                    if (OutboundC2Data.Count > 0)
                    {
                        while (OutboundC2Data.Count != 0)
                        {
                            outbound.Add(OutboundC2Data.Dequeue());
                        }
                    }
                    else
                    {
                        outbound.Add(new AgentMessage
                        {
                            IdempotencyKey = Guid.NewGuid().ToString(),
                            Metadata       = Config.GetOption(ConfigSetting.Metadata) as AgentMetadata,
                            Data           = new C2Data()
                        });
                    }

                    var dataToSend = Crypto.Encrypt(outbound);

                    SendDataToClient(stream, dataToSend);
                }
            }
        }