Esempio n. 1
0
        public void TestKerberosValidatorRC4ModifiedPac()
        {
            var key = ReadFile("rc4-key-data");

            var infoBuffer = "dv///9uwIJUdzAWaCdn16YcrrEk=";
            var pac        = "BQAAAAAAAAABAAAAIAMAAFgAAAAAAAAACgAAABwAAAB4AwAAAAAAAAwAAABQAAAAmAMAAAAAAAAGAAAAFAAAAOgDAAAAAAAABwAA" +
                             "ABQAAAAABAAAAAAAAAEQCADMzMzMEAMAAAAAAAAAAAIAYE1z2X1yyQH/////////f/////////9/sFbR+dRwyQGwFjsknnHJAf////////" +
                             "9/EgASAAQAAgASABIACAACAAAAAAAMAAIAAAAAABAAAgAAAAAAFAACAAAAAAAYAAIALgAAAFIEAAABAgAACwAAABwAAgAgAAAAAAAAAAAA" +
                             "AAAAAAAAAAAAAAwADgAgAAIADAAOACQAAgAoAAIAAAAAAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAsAAIAAA" +
                             "AAAAAAAAAAAAAACQAAAAAAAAAJAAAAdQBzAGUAcgAuAHQAZQBzAHQAAAAJAAAAAAAAAAkAAABVAHMAZQByACAAVABlAHMAdAAAAAAAAAAA" +
                             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAgAABwAAAFAEAAAHAAAAAQIAAAcAAAAEAgAABwAAAA" +
                             "MCAAAHAAAACAIAAAcAAAAAAgAABwAAAAkCAAAHAAAABgIAAAcAAAAHAgAABwAAAPIBAAAHAAAABwAAAAAAAAAGAAAAVwBTADIAMAAwADgA" +
                             "BwAAAAAAAAAGAAAARABPAE0AQQBJAE4ABAAAAAEEAAAAAAAFFQAAAELcI/DfA8DDi6apKQcAAAAwAAIABwAAIDQAAgAHAAAgOAACAAcAAC" +
                             "A8AAIABwAAIEAAAgAHAAAgRAACAAcAACBIAAIABwAAIAUAAAABBQAAAAAABRUAAABC3CPw3wPAw4umqSk8AgAABQAAAAEFAAAAAAAFFQAA" +
                             "AELcI/DfA8DDi6apKTsCAAAFAAAAAQUAAAAAAAUVAAAAQtwj8N8DwMOLpqkp6QMAAAUAAAABBQAAAAAABRUAAABC3CPw3wPAw4umqSnoAw" +
                             "AABQAAAAEFAAAAAAAFFQAAAELcI / DfA8DDi6apKQUCAAAFAAAAAQUAAAAAAAUVAAAAQtwj8N8DwMOLpqkpTwQAAAUAAAABBQAAAAAABR" +
                             "UAAABC3CPw3wPAw4umqSkpAgAAAL9Len5yyQESAHUAcwBlAHIALgB0AGUAcwB0AAAAAAAoABAAFAA4AAAAAAAAAAAAdQBzAGUAcgAuAHQA" +
                             "ZQBzAHQAQABkAG8AbQBhAGkAbgAuAGMAbwBtAEQATwBNAEEASQBOAC4AQwBPAE0AAAAAAHb///8AAAAAAAAAAAAAAAAAAAAAAAAAAHb//" +
                             "/8AAAAAAAAAAAAAAAAAAAAAAAAAAA==";

            var infoBufferBytes = Convert.FromBase64String(infoBuffer);
            var pacBytes        = Convert.FromBase64String(pac);

            var rand = new Random();

            for (var i = 20; i < 50; i++)
            {
                pacBytes[i] = (byte)rand.Next(0, 254);
            }

            var pacSign = new PacSignature(infoBufferBytes, ref pacBytes);

            pacSign.Validator.Validate(new KerberosKey(key));
        }
Esempio n. 2
0
        private void ParsePacType(PacType type, ReadOnlyMemory <byte> pacInfoBuffer, out int exclusionStart, out int exclusionLength)
        {
            exclusionStart  = 0;
            exclusionLength = 0;

            if (!KnownTypes.TryGetValue(type, out Type pacObjectType))
            {
                return;
            }

            var attribute = (PacObject)Activator.CreateInstance(pacObjectType);

            if (pacInfoBuffer.Length > 0)
            {
                PacSignature signature = null;

                if (attribute is PacSignature)
                {
                    signature = (PacSignature)attribute;
                    signature.SignatureData = pacData;
                }

                attribute.Unmarshal(pacInfoBuffer);

                if (signature != null)
                {
                    exclusionStart  = signature.SignaturePosition;
                    exclusionLength = signature.Signature.Length;
                }
            }

            attributes[type] = attribute;
        }
Esempio n. 3
0
        public void TestKerberosValidatorAes256ModifiedPac()
        {
            var key = ReadFile("aes256-key-data");

            var infoBuffer = "EAAAAHcQyvz922ZFzfua7A==";
            var pac        = "BQAAAAAAAAABAAAAIAMAAFgAAAAAAAAACgAAABwAAAB4AwAAAAAAAAwAAABQAAAAmAMAAAAAAAAGAAAAEAAAAOgDAAAAAAAAB" +
                             "wAAABQAAAD4AwAAAAAAAAEQCADMzMzMEAMAAAAAAAAAAAIAsITafH9yyQH/////////f/////////9/4Cg/sn9yyQHg6KjcSHPJAf//" +
                             "//////9/EgASAAQAAgASABIACAACAAAAAAAMAAIAAAAAABAAAgAAAAAAFAACAAAAAAAYAAIAMQAAAFIEAAABAgAACwAAABwAAgAgAAA" +
                             "AAAAAAAAAAAAAAAAAAAAAAAwADgAgAAIADAAOACQAAgAoAAIAAAAAAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
                             "cAAAAsAAIAAAAAAAAAAAAAAAAACQAAAAAAAAAJAAAAdQBzAGUAcgAuAHQAZQBzAHQAAAAJAAAAAAAAAAkAAABVAHMAZQByACAAVABlA" +
                             "HMAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAgAABwAAAFAEAAAHAAAAAQIA" +
                             "AAcAAAAEAgAABwAAAAMCAAAHAAAACAIAAAcAAAAAAgAABwAAAAkCAAAHAAAABgIAAAcAAAAHAgAABwAAAPIBAAAHAAAABwAAAAAAAAA" +
                             "GAAAAVwBTADIAMAAwADgABwAAAAAAAAAGAAAARABPAE0AQQBJAE4ABAAAAAEEAAAAAAAFFQAAAELcI/DfA8DDi6apKQcAAAAwAAIABw" +
                             "AAIDQAAgAHAAAgOAACAAcAACA8AAIABwAAIEAAAgAHAAAgRAACAAcAACBIAAIABwAAIAUAAAABBQAAAAAABRUAAABC3CPw3wPAw4umq" +
                             "Sk8AgAABQAAAAEFAAAAAAAFFQAAAELcI/DfA8DDi6apKTsCAAAFAAAAAQUAAAAAAAUVAAAAQtwj8N8DwMOLpqkp6QMAAAUAAAABBQAA" +
                             "AAAABRUAAABC3CPw3wPAw4umqSnoAwAABQAAAAEFAAAAAAAFFQAAAELcI / DfA8DDi6apKQUCAAAFAAAAAQUAAAAAAAUVAAAAQtwj8" +
                             "N8DwMOLpqkpTwQAAAUAAAABBQAAAAAABRUAAABC3CPw3wPAw4umqSkpAgAAACRGyX9yyQESAHUAcwBlAHIALgB0AGUAcwB0AAAAAAAo" +
                             "ABAAFAA4AAAAAAAAAAAAdQBzAGUAcgAuAHQAZQBzAHQAQABkAG8AbQBhAGkAbgAuAGMAbwBtAEQATwBNAEEASQBOAC4AQwBPAE0AAAA" +
                             "AABAAAAAAAAAAAAAAAAAAAAB2////AAAAAAAAAAAAAAAAAAAAAAAAAAA=";

            var infoBufferBytes = Convert.FromBase64String(infoBuffer);
            var pacBytes        = Convert.FromBase64String(pac);

            var rand = new Random();

            for (var i = 20; i < 50; i++)
            {
                pacBytes[i] = (byte)rand.Next(0, 254);
            }

            var pacSign = new PacSignature(infoBufferBytes, ref pacBytes);

            pacSign.Validator.Validate(new KerberosKey(key));
        }
Esempio n. 4
0
        private void ParsePacType(PacType type, byte[] infoBuffer, out int exclusionStart, out int exclusionLength)
        {
            exclusionStart  = 0;
            exclusionLength = 0;

            switch (type)
            {
            case PacType.LOGON_INFO:
                LogonInfo = new PacLogonInfo(infoBuffer);
                break;

            case PacType.CREDENTIAL_TYPE:
                CredentialType = new PacCredentialInfo(infoBuffer);
                break;

            case PacType.SERVER_CHECKSUM:
                ServerSignature = new PacSignature(infoBuffer, ref signatureData);

                exclusionStart  = ServerSignature.SignaturePosition;
                exclusionLength = ServerSignature.Signature.Length;
                break;

            case PacType.PRIVILEGE_SERVER_CHECKSUM:
                KdcSignature = new PacSignature(infoBuffer, ref signatureData);

                exclusionStart  = KdcSignature.SignaturePosition;
                exclusionLength = KdcSignature.Signature.Length;
                break;

            case PacType.CLIENT_NAME_TICKET_INFO:
                ClientInformation = new PacClientInfo(infoBuffer);
                break;

            case PacType.CONSTRAINED_DELEGATION_INFO:
                DelegationInformation = new PacDelegationInfo(infoBuffer);
                break;

            case PacType.UPN_DOMAIN_INFO:
                UpnDomainInformation = new UpnDomainInfo(infoBuffer);
                break;

            case PacType.CLIENT_CLAIMS:
                ClientClaims = new ClaimsSetMetadata(infoBuffer);
                break;

            case PacType.DEVICE_INFO:
                break;

            case PacType.DEVICE_CLAIMS:
                DeviceClaims = new ClaimsSetMetadata(infoBuffer);
                break;
            }
        }
Esempio n. 5
0
        private PacSignature ProcessSignature(PacSignature signature, PacType type)
        {
            if (type == PacType.PRIVILEGE_SERVER_CHECKSUM)
            {
                signature.SignatureData = this.ServerSignature.Signature;
            }
            else
            {
                signature.SignatureData = pacData;
            }

            return(signature);
        }
Esempio n. 6
0
        private static PacSignature GenerateCorruptPac(string infoBuffer, string pac)
        {
            var infoBufferBytes = Convert.FromBase64String(infoBuffer);
            var pacBytes        = Convert.FromBase64String(pac);

            var rand = new Random();

            for (var i = 20; i < 50; i++)
            {
                pacBytes[i] = (byte)rand.Next(0, 254);
            }

            var sig = new PacSignature(pacBytes);

            sig.ReadBody(infoBufferBytes);

            return(sig);
        }
Esempio n. 7
0
        private static bool ValidatePac(KerberosKey kerbKey, byte[] infoBufferBytes, byte[] pacBytes)
        {
            bool pacValidated;

            try
            {
                var sig = new PacSignature(pacBytes);
                sig.ReadBody(infoBufferBytes);
                sig.Validator.Validate(kerbKey);
                pacValidated = true;
            }
            catch (Exception)
            {
                pacValidated = false;
            }

            return(pacValidated);
        }
Esempio n. 8
0
        private void ParsePacType(PacType type, byte[] data)
        {
            switch (type)
            {
            case PacType.LOGON_INFO:
                LogonInfo = new PacLogonInfo(data);
                break;

            case PacType.CREDENTIAL_TYPE:
                CredentialType = data;
                break;

            case PacType.SERVER_CHECKSUM:
                ServerSignature = new PacSignature(data);
                break;

            case PacType.PRIVILEGE_SERVER_CHECKSUM:
                KdcSignature = new PacSignature(data);
                break;

            case PacType.CLIENT_NAME_TICKET_INFO:
                ClientInformation = new PacClientInfo(data);
                break;

            case PacType.CONSTRAINED_DELEGATION_INFO:
                break;

            case PacType.UPN_DOMAIN_INFO:
                UpnDomainInformation = new UpnDomainInfo(data);
                break;

            case PacType.CLIENT_CLAIMS:
                ClientClaims = new ClaimsSetMetadata(data);
                break;

            case PacType.DEVICE_INFO:
                break;

            case PacType.DEVICE_CLAIMS:
                DeviceClaims = new ClaimsSetMetadata(data);
                break;
            }
        }
Esempio n. 9
0
        private void ParsePacType(PacType type, ReadOnlyMemory <byte> pacInfoBuffer, out int exclusionStart, out int exclusionLength)
        {
            exclusionStart  = 0;
            exclusionLength = 0;

            if (!KnownTypes.TryGetValue(type, out Type pacObjectType))
            {
                this.Attributes[type] = new UnknownPacObject(type, pacInfoBuffer);
                return;
            }

            var attribute = (PacObject)Activator.CreateInstance(pacObjectType);

            if (pacInfoBuffer.Length <= 0)
            {
                return;
            }

            PacSignature signature = null;

            if (attribute is PacSignature sig)
            {
                signature = this.ProcessSignature(sig, type);

                if (!this.Mode.HasFlag(SignatureMode.Kdc) && type == PacType.PRIVILEGE_SERVER_CHECKSUM)
                {
                    signature.Ignored = true;
                }
            }

            attribute.Unmarshal(pacInfoBuffer);

            if (signature != null)
            {
                exclusionStart  = signature.SignaturePosition;
                exclusionLength = signature.Signature.Length;
            }

            this.Attributes[type] = attribute;
        }
Esempio n. 10
0
        private static bool ValidatePac(KerberosKey kerbKey, byte[] infoBufferBytes, byte[] pacBytes)
        {
            bool pacValidated;

            try
            {
                var sig = new PacSignature()
                {
                    SignatureData = pacBytes
                };
                sig.Unmarshal(infoBufferBytes);
                sig.Validator.Validate(kerbKey);
                pacValidated = true;
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch
#pragma warning restore CA1031 // Do not catch general exception types
            {
                pacValidated = false;
            }

            return(pacValidated);
        }