public void BuildResponse() { // Possible suspects as to why the Xbox won't accept AS_REP // - cname/sname // - ticket // - enckdcpart // TODO: Find out what the MD4 hashed key is. AsnElt accountInfo = new PA_DATA().Encode203(1, Client.GamerTag, Client.Domain, Client.Realm, Encoding.UTF8.GetBytes(new char[16])); List <string> cnames = new List <string>() { Client.SerialNumber, Client.Realm }; List <AsnElt> allNodes = new List <AsnElt>(); // Header AsnElt pvnoASN = AsnElt.MakeInteger(5); AsnElt pvnoSEQ = AsnElt.Make(AsnElt.SEQUENCE, pvnoASN); pvnoSEQ = AsnElt.MakeImplicit(AsnElt.CONTEXT, 0, pvnoSEQ); allNodes.Add(pvnoSEQ); AsnElt msg_typeASN = AsnElt.MakeInteger(11); AsnElt msg_typeSEQ = AsnElt.Make(AsnElt.SEQUENCE, msg_typeASN); msg_typeSEQ = AsnElt.MakeImplicit(AsnElt.CONTEXT, 1, msg_typeSEQ); allNodes.Add(msg_typeSEQ); // End // Machine Account Info PA_DATA EncryptedData encryptedAccount = new EncryptedData((int)Interop.KERB_ETYPE.rc4_hmac, KerberosCrypto.KerberosEncrypt(Interop.KERB_ETYPE.rc4_hmac, Interop.KRB_KEY_USAGE_KRB_PRIV_ENCRYPTED_PART, nonceHmac, accountInfo.Encode())); AsnElt typeElt = AsnElt.MakeInteger(203); AsnElt nameTypeSeq = AsnElt.Make(AsnElt.SEQUENCE, typeElt); nameTypeSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 2, nameTypeSeq); AsnElt padataSeq = AsnElt.Make(AsnElt.SEQUENCE, nameTypeSeq, encryptedAccount.Encode()); allNodes.Add(padataSeq); // End // crealm AsnElt crealmElt = AsnElt.MakeString(AsnElt.UTF8String, "PASSPORT.NET"); AsnElt crealmSeq = AsnElt.Make(AsnElt.SEQUENCE, crealmElt); crealmSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 3, crealmSeq); allNodes.Add(crealmSeq); // End // cname cname = new PrincipalName(cnames, 1); AsnElt cnameElt = cname.Encode(); cnameElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 4, cnameElt); allNodes.Add(cnameElt); // End // ticket reqTicket = new Ticket(); AsnElt ticketElt = reqTicket.Encode(OnlineKey); ticketElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 5, ticketElt); allNodes.Add(ticketElt); // End // enckdcpart EndPart = new EncKDCRepPart(); { EndPart.key = new EncryptionKey(); { EndPart.key.keytype = (int)Interop.KERB_ETYPE.rc4_hmac; EndPart.key.keyvalue = OnlineKey; // fill it with 0's :P } EndPart.lastReq = new LastReq(); { // 0 - no info // 1 - last intial TGT request // 2 - last intial request // 3 - newest TGT used // 4 - last renewal // 5 - last request (of any type) EndPart.lastReq.lr_type = 6; EndPart.lastReq.lr_value = DateTime.Now; } EndPart.nonce = (uint)(new Random(1206).Next(1000, 10000)); EndPart.key_expiration = new DateTime(2021, 12, 5); EndPart.flags = Interop.TicketFlags.enc_pa_rep; EndPart.authtime = DateTime.Now; EndPart.starttime = DateTime.Now; EndPart.endtime = new DateTime(2019, 8, 7); EndPart.renew_till = new DateTime(2021, 12, 5); EndPart.realm = "MACS.XBOX.COM"; } // TODO: Move encryption to EncryptedData class byte[] EndPartData = EndPart.Encode().Encode(); EndPartData = KerberosCrypto.KerberosEncrypt(Interop.KERB_ETYPE.rc4_hmac, Interop.KRB_KEY_USAGE_AS_REP_EP_SESSION_KEY, Client.Key, EndPartData); EncryptedData encData = new EncryptedData((int)Interop.KERB_ETYPE.rc4_hmac, EndPartData); AsnElt encPart = AsnElt.MakeImplicit(AsnElt.CONTEXT, 6, encData.Encode()); allNodes.Add(encPart); // End AsnElt seq = AsnElt.Make(AsnElt.SEQUENCE, allNodes.ToArray()); byte[] toSend = seq.Encode(); Console.WriteLine("AS-REQ: Response -> " + BitConverter.ToString(toSend).Replace("-", "")); this.Client.Send(toSend); Program.AuthAttempts += 1; }
public void BuildResponse() { // Possible suspects as to why the Xbox won't accept AS_REP // - cname/sname // - ticket // - enckdcpart // TODO: Find out what the MD4 hashed key is. AsnElt accountInfo = new PA_DATA().Encode203(1, Client.GamerTag, Client.Domain, Client.Realm, Encoding.UTF8.GetBytes("e8e17429c4701a494f7e0baadfbabc55")); List <string> cnames = new List <string>() { Client.SerialNumber, Client.Realm }; List <AsnElt> allNodes = new List <AsnElt>(); // Header AsnElt pvnoASN = AsnElt.MakeInteger(5); AsnElt pvnoSEQ = AsnElt.Make(AsnElt.SEQUENCE, pvnoASN); pvnoSEQ = AsnElt.MakeImplicit(AsnElt.CONTEXT, 0, pvnoSEQ); allNodes.Add(pvnoSEQ); AsnElt msg_typeASN = AsnElt.MakeInteger(11); AsnElt msg_typeSEQ = AsnElt.Make(AsnElt.SEQUENCE, msg_typeASN); msg_typeSEQ = AsnElt.MakeImplicit(AsnElt.CONTEXT, 1, msg_typeSEQ); allNodes.Add(msg_typeSEQ); // End // Machine Account Info PA_DATA EncryptedData encryptedAccount = new EncryptedData((int)Interop.KERB_ETYPE.rc4_hmac, 1, KerberosCrypto.KerberosEncrypt(Interop.KERB_ETYPE.rc4_hmac, Interop.KRB_KEY_USAGE_KRB_PRIV_ENCRYPTED_PART, nonceHmac, accountInfo.Encode())); AsnElt typeElt = AsnElt.MakeInteger(203); AsnElt nameTypeSeq = AsnElt.Make(AsnElt.SEQUENCE, typeElt); nameTypeSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 2, nameTypeSeq); AsnElt padataSeq = AsnElt.Make(AsnElt.SEQUENCE, nameTypeSeq, encryptedAccount.Encode()); //allNodes.Add(padataSeq); // End // crealm AsnElt crealmElt = AsnElt.MakeString(AsnElt.GeneralString, "PASSPORT.NET"); AsnElt crealmSeq = AsnElt.Make(AsnElt.SEQUENCE, crealmElt); crealmSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 3, crealmSeq); allNodes.Add(crealmSeq); // End // cname cname = new PrincipalName(cnames, 2); AsnElt cnameElt = cname.Encode(); cnameElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 4, cnameElt); allNodes.Add(cnameElt); // End // ticket reqTicket = new Ticket(); AsnElt ticketElt = reqTicket.Encode(OnlineKey); ticketElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 5, ticketElt); allNodes.Add(ticketElt); // End // enckdcpart EndPart = new EncKDCRepPart(); { // Used to send the online key, now we're sending an arbitrary session key EndPart.key = new EncryptionKey(); { EndPart.key.keytype = (int)Interop.KERB_ETYPE.rc4_hmac; EndPart.key.keyvalue = SessionKey; } EndPart.lastReq = new LastReq(); { // 0 - no info // 1 - last intial TGT request // 2 - last intial request // 3 - newest TGT used // 4 - last renewal // 5 - last request (of any type) EndPart.lastReq.lr_type = 6; EndPart.lastReq.lr_value = DateTime.Now; } EndPart.nonce = (uint)(new Random(1206).Next(1000, 10000)); EndPart.flags = Interop.TicketFlags.initial | Interop.TicketFlags.pre_authent; EndPart.authtime = DateTime.Now; EndPart.endtime = new DateTime(2019, 8, 7); EndPart.realm = "MACS.XBOX.COM"; } // TODO: Move encryption to EncryptedData class byte[] EndPartData = EndPart.Encode().Encode(); EndPartData = KerberosCrypto.KerberosEncrypt(Interop.KERB_ETYPE.rc4_hmac, Interop.KRB_KEY_USAGE_AS_REP_EP_SESSION_KEY, Client.Key, EndPartData); EncryptedData encData = new EncryptedData((int)Interop.KERB_ETYPE.rc4_hmac, 1, EndPartData); AsnElt encPart = AsnElt.MakeImplicit(AsnElt.CONTEXT, 6, encData.Encode()); allNodes.Add(encPart); // End AsnElt seq = AsnElt.Make(AsnElt.SEQUENCE, allNodes.ToArray()); AsnElt seq2 = AsnElt.Make(AsnElt.SEQUENCE, seq); seq2 = AsnElt.MakeImplicit(AsnElt.APPLICATION, 11, seq2); byte[] toSend = seq2.Encode(); this.Client.Send(toSend); }