{"id":1237,"date":"2026-10-27T11:03:06","date_gmt":"2026-10-27T10:03:06","guid":{"rendered":"https:\/\/remivernier.com\/?p=1237"},"modified":"2026-10-27T11:03:06","modified_gmt":"2026-10-27T10:03:06","slug":"kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac","status":"publish","type":"post","link":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/","title":{"rendered":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9"},"content":{"rendered":"<p>L&rsquo;objectif de cet article n&rsquo;est pas de r\u00e9expliquer Kerberos de A \u00e0 Z. Il existe d\u00e9j\u00e0 beaucoup de tr\u00e8s bons sch\u00e9mas sur les trois t\u00eates du chien. Ce qui manque souvent, c&rsquo;est le lien entre ce sch\u00e9ma th\u00e9orique et ce que l&rsquo;on voit r\u00e9ellement sur le r\u00e9seau, dans le cache du poste client et dans le journal de s\u00e9curit\u00e9 du contr\u00f4leur de domaine. Quand un site web en authentification int\u00e9gr\u00e9e retombe en NTLM sans pr\u00e9venir, ou qu&rsquo;un service renvoie un \u00ab KRB_AP_ERR_MODIFIED \u00bb, c&rsquo;est pourtant ce lien qui permet de trouver la cause en quelques minutes.<\/p>\n<p>Nous allons voir dans cet article comment lire un ticket de service de bout en bout: la requ\u00eate KRB_TGS_REQ, la r\u00e9ponse KRB_TGS_REP, l&rsquo;AP-REQ pr\u00e9sent\u00e9e au service et la validation du PAC. Pour chaque \u00e9tape je donne le filtre Wireshark et la commande qui permettent de la refaire sur votre propre maquette.<\/p>\n<h2>Pr\u00e9sentation de la maquette<\/h2>\n<p>La maquette est volontairement minimale:<\/p>\n<ul>\n<li>Nom du domaine: test.local (royaume Kerberos TEST.LOCAL)<\/li>\n<li>dc01.test.local: contr\u00f4leur de domaine Windows Server 2025, 192.168.0.10<\/li>\n<li>srv01.test.local: serveur membre IIS, 192.168.0.20, qui h\u00e9berge le site monsite.test.local<\/li>\n<li>cli01.test.local: poste Windows 11 sur lequel l&rsquo;utilisateur testuser01 est connect\u00e9<\/li>\n<li>svc.monsite@test.local: compte de service utilis\u00e9 comme identit\u00e9 du pool d&rsquo;application IIS<\/li>\n<\/ul>\n<p>Le SPN du site est port\u00e9 par le compte de service et non par le compte machine srv01$. Ce point est tr\u00e8s important pour la suite, puisque c&rsquo;est lui qui d\u00e9termine avec quelle cl\u00e9 le ticket sera chiffr\u00e9. C\u00f4t\u00e9 pr\u00e9paration, cela donne:<\/p>\n<pre class=\"wp-block-code\"><code># Sur dc01\nNew-ADUser -Name svc.monsite -SamAccountName svc.monsite `\n  -UserPrincipalName svc.monsite@test.local `\n  -AccountPassword (Read-Host -AsSecureString) -Enabled $true\n\n# -S v\u00e9rifie l'absence de doublon avant d'ajouter le SPN (contrairement \u00e0 -A)\nsetspn -S HTTP\/monsite.test.local TESTsvc.monsite\n\n# AES128 + AES256 uniquement (0x18)\nSet-ADUser svc.monsite -Replace @{'msDS-SupportedEncryptionTypes'=24}\n\n# Sur srv01: le pool tourne sous TESTsvc.monsite, authentification Windows activ\u00e9e\n%windir%system32inetsrvappcmd set config \"monsite\" -section:system.webServer\/security\/authentication\/windowsAuthentication \/useAppPoolCredentials:true \/commit:apphost<\/code><\/pre>\n<p>Le param\u00e8tre <code>useAppPoolCredentials<\/code> indique \u00e0 IIS de d\u00e9chiffrer les tickets avec la cl\u00e9 de l&rsquo;identit\u00e9 du pool plut\u00f4t qu&rsquo;avec celle du compte machine, ce qui est n\u00e9cessaire avec l&rsquo;authentification en mode noyau. Sans lui, le sc\u00e9nario d&rsquo;erreur que nous verrons en fin d&rsquo;article appara\u00eet directement.<\/p>\n<p>Une remarque sur les etypes. \u00c0 l&rsquo;heure o\u00f9 j&rsquo;\u00e9cris ces lignes (octobre 2026), Microsoft a termin\u00e9 le retrait par d\u00e9faut de RC4 c\u00f4t\u00e9 KDC. D&rsquo;apr\u00e8s <a href=\"https:\/\/support.microsoft.com\/en-us\/topic\/how-to-manage-kerberos-kdc-usage-of-rc4-for-service-account-ticket-issuance-changes-related-to-cve-2026-20833-1ebcda33-720a-4da8-93c1-b0496e1910dc\">l&rsquo;article de support Microsoft li\u00e9 \u00e0 la CVE-2026-20833<\/a>, la phase d&rsquo;audit a commenc\u00e9 avec les mises \u00e0 jour du 13 janvier 2026, l&rsquo;application avec retour arri\u00e8re manuel le 14 avril 2026, et les mises \u00e0 jour de juillet 2026 suppriment la prise en charge de la valeur de registre <code>RC4DefaultDisablementPhase<\/code>. Le <a href=\"https:\/\/mc.merill.net\/message\/MC1427604\">message MC1427604<\/a> confirme qu&rsquo;il ne reste que le mode application, RC4 n&rsquo;\u00e9tant plus possible que par configuration explicite. Sur une maquette \u00e0 jour, il ne devrait donc plus y avoir d&rsquo;etype 23 dans les tickets de service, sauf si vous l&rsquo;avez r\u00e9activ\u00e9 volontairement.<\/p>\n<h2>Petit rappel sur l&rsquo;\u00e9change TGS<\/h2>\n<p>Le poste client poss\u00e8de d\u00e9j\u00e0 un TGT obtenu \u00e0 l&rsquo;ouverture de session (\u00e9change AS). Pour acc\u00e9der \u00e0 http:\/\/monsite.test.local, il doit obtenir un ticket pour le SPN HTTP\/monsite.test.local, puis le pr\u00e9senter au serveur.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 420\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<defs>\n<marker id=\"fl1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0,0 L10,5 L0,10 z\" fill=\"#333\"\/><\/marker>\n<\/defs>\n<rect x=\"15\" y=\"20\" width=\"150\" height=\"50\" rx=\"6\" fill=\"#e8f0fe\" stroke=\"#333\"\/>\n<text x=\"90\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">cli01<\/text>\n<text x=\"90\" y=\"60\" text-anchor=\"middle\">poste client<\/text>\n<rect x=\"295\" y=\"20\" width=\"150\" height=\"50\" rx=\"6\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"370\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">dc01<\/text>\n<text x=\"370\" y=\"60\" text-anchor=\"middle\">KDC<\/text>\n<rect x=\"555\" y=\"20\" width=\"150\" height=\"50\" rx=\"6\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"630\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">srv01<\/text>\n<text x=\"630\" y=\"60\" text-anchor=\"middle\">IIS \/ svc.monsite<\/text>\n<line x1=\"90\" y1=\"70\" x2=\"90\" y2=\"410\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<line x1=\"370\" y1=\"70\" x2=\"370\" y2=\"410\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<line x1=\"630\" y1=\"70\" x2=\"630\" y2=\"410\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<text x=\"230\" y=\"98\" text-anchor=\"middle\">1. KRB_TGS_REQ<\/text>\n<text x=\"230\" y=\"114\" text-anchor=\"middle\">TGT + sname HTTP\/monsite<\/text>\n<line x1=\"90\" y1=\"124\" x2=\"366\" y2=\"124\" stroke=\"#333\" stroke-width=\"1.5\" marker-end=\"url(#fl1)\"\/>\n<text x=\"230\" y=\"154\" text-anchor=\"middle\">2. KRB_TGS_REP<\/text>\n<text x=\"230\" y=\"170\" text-anchor=\"middle\">ticket chiffr\u00e9 (cl\u00e9 svc.monsite)<\/text>\n<line x1=\"370\" y1=\"180\" x2=\"94\" y2=\"180\" stroke=\"#333\" stroke-width=\"1.5\" marker-end=\"url(#fl1)\"\/>\n<text x=\"360\" y=\"226\" text-anchor=\"middle\">3. KRB_AP_REQ dans \u00ab Authorization: Negotiate \u00bb<\/text>\n<line x1=\"90\" y1=\"236\" x2=\"626\" y2=\"236\" stroke=\"#333\" stroke-width=\"1.5\" marker-end=\"url(#fl1)\"\/>\n<text x=\"500\" y=\"270\" text-anchor=\"middle\">4. V\u00e9rification signature KDC<\/text>\n<text x=\"500\" y=\"286\" text-anchor=\"middle\">(Netlogon, si exig\u00e9e)<\/text>\n<line x1=\"630\" y1=\"296\" x2=\"374\" y2=\"296\" stroke=\"#333\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" marker-end=\"url(#fl1)\"\/>\n<text x=\"500\" y=\"326\" text-anchor=\"middle\">5. R\u00e9sultat<\/text>\n<line x1=\"370\" y1=\"336\" x2=\"626\" y2=\"336\" stroke=\"#333\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" marker-end=\"url(#fl1)\"\/>\n<text x=\"360\" y=\"378\" text-anchor=\"middle\">6. HTTP 200 + KRB_AP_REP (authentification mutuelle)<\/text>\n<line x1=\"630\" y1=\"388\" x2=\"94\" y2=\"388\" stroke=\"#333\" stroke-width=\"1.5\" marker-end=\"url(#fl1)\"\/>\n<\/svg><figcaption>\u00c9change TGS puis AP sur la maquette. Les \u00e9tapes 4 et 5 n&rsquo;ont lieu que si le service exige la validation du PAC.<\/figcaption><\/figure>\n<h2>Capture r\u00e9seau<\/h2>\n<p>Commen\u00e7ons par vider le cache du client pour forcer une nouvelle requ\u00eate TGS. Sans cela, le ticket d\u00e9j\u00e0 en cache est r\u00e9utilis\u00e9 et vous ne verrez que l&rsquo;AP-REQ.<\/p>\n<pre class=\"wp-block-code\"><code>klist purge<\/code><\/pre>\n<p>Attention, <code>klist purge<\/code> supprime aussi le TGT. Le client refera alors un \u00e9change AS avant le TGS, ce qui n&rsquo;est pas g\u00eanant et nous donne au passage l&rsquo;AS-REP dans la capture.<\/p>\n<p>Si Wireshark est install\u00e9 sur cli01, une capture avec le filtre de capture <code>port 88 or port 80<\/code> suffit. Si vous ne voulez rien installer, pktmon fait le travail nativement depuis Windows 10 2004 et sait produire un pcapng:<\/p>\n<pre class=\"wp-block-code\"><code>pktmon filter add KRB -p 88\npktmon filter add HTTP -p 80\npktmon start --capture --pkt-size 0 --file-name C:tempkrb.etl\n\n# Dans une autre console, on d\u00e9clenche l'acc\u00e8s\nInvoke-WebRequest -Uri http:\/\/monsite.test.local -UseDefaultCredentials\n\npktmon stop\npktmon etl2pcap C:tempkrb.etl -o C:tempkrb.pcapng\npktmon filter remove<\/code><\/pre>\n<p>J&rsquo;utilise <code>Invoke-WebRequest<\/code> plut\u00f4t qu&rsquo;un navigateur pour \u00e9viter les questions de zone Intranet: un nom avec des points comme monsite.test.local est vu comme Internet par d\u00e9faut et Edge n&rsquo;enverra pas forc\u00e9ment ses identifiants. Autre possibilit\u00e9, <code>klist get HTTP\/monsite.test.local<\/code> d\u00e9clenche uniquement le TGS-REQ, sans contacter le serveur web. C&rsquo;est pratique pour isoler le dialogue avec le KDC.<\/p>\n<p>Une fois le fichier ouvert dans Wireshark, voici les filtres d&rsquo;affichage que j&rsquo;utilise:<\/p>\n<pre class=\"wp-block-code\"><code>kerberos                                          tout le trafic Kerberos\nkerberos.msg_type == 12 || kerberos.msg_type == 13   TGS-REQ \/ TGS-REP\nkerberos.SNameString == \"monsite.test.local\"      tout ce qui concerne le SPN\nkerberos.msg_type == 14                           AP-REQ (y compris dans HTTP\/SPNEGO)\nkerberos.msg_type == 30                           KRB-ERROR\nkerberos.error_code == 41                         KRB_AP_ERR_MODIFIED<\/code><\/pre>\n<p>Les noms de champs peuvent changer l\u00e9g\u00e8rement d&rsquo;une version de Wireshark \u00e0 l&rsquo;autre. En cas de doute, un clic droit sur le champ dans le d\u00e9tail du paquet puis \u00ab Appliquer comme filtre \u00bb donne le nom exact.<\/p>\n<h2>Lecture du KRB_TGS_REQ<\/h2>\n<p>Le TGS-REQ (msg-type 12) se compose de deux blocs: les padata, qui prouvent l&rsquo;identit\u00e9 du client, et le req-body, qui d\u00e9crit ce qu&rsquo;il demande. Dans Wireshark, l&rsquo;arborescence a cette forme (valeurs de la maquette, \u00e0 adapter):<\/p>\n<pre class=\"wp-block-code\"><code>tgs-req\n    pvno: 5\n    msg-type: krb-tgs-req (12)\n    padata: 2 items\n        PA-DATA pA-TGS-REQ (1)\n            ap-req\n                ticket                     &lt;- le TGT\n                    realm: TEST.LOCAL\n                    sname: krbtgt\/TEST.LOCAL\n                    enc-part\n                        etype: eTYPE-AES256-CTS-HMAC-SHA1-96 (18)\n                        kvno: 2            &lt;- version de cl\u00e9 du compte krbtgt\n                        cipher: ...\n                authenticator\n                    etype: eTYPE-AES256-CTS-HMAC-SHA1-96 (18)\n                    cipher: ...            &lt;- chiffr\u00e9 avec la cl\u00e9 de session du TGT\n        PA-DATA pA-PAC-OPTIONS (167)\n    req-body\n        kdc-options: 40810000 (forwardable, renewable, canonicalize)\n        realm: TEST.LOCAL\n        sname\n            name-type: kRB5-NT-SRV-INST (2)\n            sname-string: 2 items\n                SNameString: HTTP\n                SNameString: monsite.test.local\n        till: ...\n        nonce: ...\n        etype: 3 items (18, 17, 23...)<\/code><\/pre>\n<p>Trois \u00e9l\u00e9ments retiennent l&rsquo;attention:<\/p>\n<ol>\n<li>Le sname du req-body est le SPN demand\u00e9, en clair. C&rsquo;est lui que le KDC va rechercher dans l&rsquo;annuaire (attribut <code>servicePrincipalName<\/code>). Si le client construit un mauvais SPN (alias DNS, port non standard, etc\u2026), c&rsquo;est ici qu&rsquo;on le voit.<\/li>\n<li>La liste <code>etype<\/code> du req-body est celle que le client accepte. Elle sert au choix de la cl\u00e9 de session, pas \u00e0 celui du chiffrement du ticket. Le chiffrement du ticket d\u00e9pend du compte qui porte le SPN (<code>msDS-SupportedEncryptionTypes<\/code>, ou \u00e0 d\u00e9faut la politique du domaine). On confond souvent les deux.<\/li>\n<li>Le TGT est pr\u00e9sent\u00e9 tel quel, chiffr\u00e9 avec la cl\u00e9 du compte krbtgt. Le kvno qu&rsquo;on lit dans son enc-part est celui de krbtgt, pas celui du service.<\/li>\n<\/ol>\n<h2>Lecture du KRB_TGS_REP<\/h2>\n<p>La r\u00e9ponse (msg-type 13) contient deux parties chiffr\u00e9es avec deux cl\u00e9s diff\u00e9rentes. C&rsquo;est le point qui pose le plus de questions \u00e0 la lecture d&rsquo;une capture, d&rsquo;o\u00f9 le sch\u00e9ma ci dessous.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 300\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<rect x=\"10\" y=\"10\" width=\"700\" height=\"280\" rx=\"8\" fill=\"#e8f0fe\" stroke=\"#333\"\/>\n<text x=\"25\" y=\"34\" font-size=\"15\">KRB_TGS_REP (msg-type 13), crealm TEST.LOCAL, cname user01<\/text>\n<rect x=\"25\" y=\"50\" width=\"400\" height=\"225\" rx=\"6\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"40\" y=\"72\" font-size=\"14\">ticket (lisible par srv01 uniquement)<\/text>\n<text x=\"40\" y=\"92\">en clair: tkt-vno 5, realm, sname HTTP\/monsite.test.local<\/text>\n<rect x=\"40\" y=\"105\" width=\"370\" height=\"155\" rx=\"6\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"55\" y=\"126\">enc-part: etype 18, kvno = msDS-KeyVersionNumber<\/text>\n<text x=\"55\" y=\"143\">chiffr\u00e9e avec la cl\u00e9 de svc.monsite<\/text>\n<text x=\"55\" y=\"170\">EncTicketPart:<\/text>\n<text x=\"70\" y=\"188\">flags, cl\u00e9 de session de service<\/text>\n<text x=\"70\" y=\"206\">cname, authtime, endtime<\/text>\n<text x=\"70\" y=\"224\">authorization-data -&gt; AD-IF-RELEVANT<\/text>\n<text x=\"85\" y=\"242\">-&gt; AD-WIN2K-PAC (le PAC)<\/text>\n<rect x=\"440\" y=\"50\" width=\"255\" height=\"225\" rx=\"6\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"455\" y=\"72\" font-size=\"14\">enc-part (lisible par le client)<\/text>\n<text x=\"455\" y=\"92\">etype 18, pas de kvno<\/text>\n<text x=\"455\" y=\"110\">chiffr\u00e9e avec la cl\u00e9 de session<\/text>\n<text x=\"455\" y=\"128\">du TGT<\/text>\n<text x=\"455\" y=\"160\">EncTGSRepPart:<\/text>\n<text x=\"470\" y=\"178\">cl\u00e9 de session de service<\/text>\n<text x=\"470\" y=\"196\">nonce, flags<\/text>\n<text x=\"470\" y=\"214\">starttime, endtime<\/text>\n<text x=\"470\" y=\"232\">srealm, sname<\/text>\n<\/svg><figcaption>Les deux parties chiffr\u00e9es d&rsquo;un TGS-REP. Le client ne peut pas lire le ticket, il le transmet tel quel au service.<\/figcaption><\/figure>\n<p>Dans Wireshark:<\/p>\n<pre class=\"wp-block-code\"><code>tgs-rep\n    pvno: 5\n    msg-type: krb-tgs-rep (13)\n    crealm: TEST.LOCAL\n    cname: user01\n    ticket\n        tkt-vno: 5\n        realm: TEST.LOCAL\n        sname: HTTP\/monsite.test.local\n        enc-part\n            etype: eTYPE-AES256-CTS-HMAC-SHA1-96 (18)\n            kvno: 3                 &lt;- d\u00e9pend de l'historique du compte\n            cipher: ...\n    enc-part\n        etype: eTYPE-AES256-CTS-HMAC-SHA1-96 (18)\n        cipher: ...<\/code><\/pre>\n<p>-> L&rsquo;etype du ticket (18 ici) est celui que le KDC a choisi pour le compte de service. Avec <code>msDS-SupportedEncryptionTypes<\/code> \u00e0 0x18, on doit voir 17 ou 18, jamais 23.<\/p>\n<p>-> Le kvno du ticket correspond \u00e0 l&rsquo;attribut <code>msDS-KeyVersionNumber<\/code> du compte qui porte le SPN. Il s&rsquo;incr\u00e9mente \u00e0 chaque changement de mot de passe. C&rsquo;est un indice pr\u00e9cieux: il dit pour quel compte et pour quelle version de cl\u00e9 le ticket a \u00e9t\u00e9 chiffr\u00e9.<\/p>\n<pre class=\"wp-block-code\"><code>Get-ADUser svc.monsite -Properties msDS-KeyVersionNumber | Select-Object Name, msDS-KeyVersionNumber\nGet-ADComputer srv01 -Properties msDS-KeyVersionNumber | Select-Object Name, msDS-KeyVersionNumber<\/code><\/pre>\n<p>Si le kvno lu dans la capture correspond \u00e0 svc.monsite, le KDC a fait son travail. Si un service n&rsquo;arrive pas \u00e0 d\u00e9chiffrer ce ticket, le probl\u00e8me est c\u00f4t\u00e9 serveur (mauvaise identit\u00e9, keytab p\u00e9rim\u00e9\u2026).<\/p>\n<h2>Correspondance avec klist et l&rsquo;\u00e9v\u00e9nement 4769<\/h2>\n<p>C\u00f4t\u00e9 client, <code>klist<\/code> affiche le ticket obtenu. La sortie a cette forme:<\/p>\n<pre class=\"wp-block-code\"><code>#1&gt;     Client: user01 @ TEST.LOCAL\n        Server: HTTP\/monsite.test.local @ TEST.LOCAL\n        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96\n        Ticket Flags 0x40a10000 -&gt; forwardable renewable pre_authent name_canonicalize\n        Start Time: ...\n        End Time:   ...\n        Renew Time: ...\n        Session Key Type: AES-256-CTS-HMAC-SHA1-96\n        Cache Flags: 0\n        Kdc Called: dc01.test.local<\/code><\/pre>\n<p>C\u00f4t\u00e9 contr\u00f4leur de domaine, chaque d\u00e9livrance de ticket de service g\u00e9n\u00e8re un \u00e9v\u00e9nement 4769 \u00ab A Kerberos service ticket was requested \u00bb, \u00e0 condition que la sous-cat\u00e9gorie soit audit\u00e9e. On le v\u00e9rifie et on interroge le journal ainsi:<\/p>\n<pre class=\"wp-block-code\"><code>auditpol \/get \/subcategory:\"Kerberos Service Ticket Operations\"\n\nGet-WinEvent -LogName Security -MaxEvents 5 -FilterXPath `\n  \"*[System[EventID=4769] and EventData[Data[@Name='ServiceName']='svc.monsite']]\" |\n  Format-List TimeCreated, Message<\/code><\/pre>\n<p>Le pi\u00e8ge classique: dans le 4769, le champ \u00ab Service Name \u00bb ne contient pas le SPN mais le compte qui le porte (svc.monsite, ou SRV01$ pour un compte machine). Wireshark montre le SPN demand\u00e9, le 4769 montre le compte trouv\u00e9 par le KDC. Mettre les deux c\u00f4te \u00e0 c\u00f4te suffit souvent \u00e0 d\u00e9masquer un SPN mal plac\u00e9.<\/p>\n<table>\n<thead>\n<tr>\n<th>Information<\/th>\n<th>Wireshark<\/th>\n<th>klist<\/th>\n<th>\u00c9v\u00e9nement 4769<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Service demand\u00e9<\/td>\n<td>req-body \/ sname (SPN)<\/td>\n<td>Server<\/td>\n<td>Service Name (compte)<\/td>\n<\/tr>\n<tr>\n<td>Chiffrement du ticket<\/td>\n<td>ticket \/ enc-part \/ etype<\/td>\n<td>KerbTicket Encryption Type<\/td>\n<td>Ticket Encryption Type (0x11, 0x12, 0x17)<\/td>\n<\/tr>\n<tr>\n<td>Cl\u00e9 de session<\/td>\n<td>choisie parmi les etypes du req-body<\/td>\n<td>Session Key Type<\/td>\n<td>champs \u00e9tendus (voir ci dessous)<\/td>\n<\/tr>\n<tr>\n<td>Options<\/td>\n<td>kdc-options (0x40810000)<\/td>\n<td>Ticket Flags (0x40a10000)<\/td>\n<td>Ticket Options<\/td>\n<\/tr>\n<tr>\n<td>Version de cl\u00e9<\/td>\n<td>ticket \/ enc-part \/ kvno<\/td>\n<td>non affich\u00e9e<\/td>\n<td>non affich\u00e9e<\/td>\n<\/tr>\n<tr>\n<td>Erreur KDC<\/td>\n<td>KRB-ERROR \/ error-code<\/td>\n<td>message de <code>klist get<\/code><\/td>\n<td>Failure Code<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pour le d\u00e9codage: 0x11 correspond \u00e0 AES128 (etype 17), 0x12 \u00e0 AES256 (18) et 0x17 \u00e0 RC4-HMAC (23). Les options demand\u00e9es (0x40810000: forwardable, renewable, canonicalize) diff\u00e8rent des flags du ticket d\u00e9livr\u00e9 (0x40a10000), car le KDC ajoute pre_authent. Concernant les champs \u00e9tendus, <a href=\"https:\/\/www.socsimulator.com\/event-ids\/4769\">cette fiche sur l&rsquo;\u00e9v\u00e9nement 4769<\/a> indique que depuis la mise \u00e0 jour de janvier 2025, Windows Server 2016 et ult\u00e9rieurs produisent une version 2 de l&rsquo;\u00e9v\u00e9nement avec, entre autres, les etypes annonc\u00e9s par le client, le type de la cl\u00e9 de session et les cl\u00e9s disponibles pour le demandeur, le service et le DC. Je n&rsquo;ai pas trouv\u00e9 de source Microsoft plus pr\u00e9cise sur le format exact. Le plus simple reste de v\u00e9rifier sur vos propres DC ce que contient l&rsquo;onglet \u00ab D\u00e9tails \u00bb de l&rsquo;\u00e9v\u00e9nement.<\/p>\n<h2>D\u00e9chiffrer le ticket avec un keytab<\/h2>\n<p>Jusqu&rsquo;ici, le contenu du ticket reste opaque. Pour lire l&rsquo;EncTicketPart et le PAC, il faut fournir \u00e0 Wireshark la cl\u00e9 du compte de service sous forme de keytab. Le <a href=\"https:\/\/wiki.wireshark.org\/Kerberos\">wiki Wireshark<\/a> indique que le fichier se d\u00e9clare dans les pr\u00e9f\u00e9rences du protocole KRB5, ou en ligne de commande avec l&rsquo;option <code>-K<\/code>, r\u00e9p\u00e9table pour charger plusieurs keytabs. Il pr\u00e9cise aussi que les anciennes versions Windows avaient des limitations, corrig\u00e9es depuis.<\/p>\n<p>Sur la maquette, je g\u00e9n\u00e8re le keytab de svc.monsite depuis une machine Linux avec le ktutil du MIT, en indiquant le kvno lu pr\u00e9c\u00e9demment:<\/p>\n<pre class=\"wp-block-code\"><code>$ ktutil\nktutil:  addent -password -p svc.monsite@TEST.LOCAL -k 3 -e aes256-cts-hmac-sha1-96\nPassword for svc.monsite@TEST.LOCAL:\nktutil:  wkt svc.monsite.keytab\nktutil:  quit\n$ klist -kte svc.monsite.keytab<\/code><\/pre>\n<p>La cl\u00e9 AES d\u00e9pend d&rsquo;un sel. Pour un compte utilisateur AD, ce sel est construit \u00e0 partir du royaume en majuscules et du nom du compte, ce qui correspond au sel par d\u00e9faut de ktutil pour le principal svc.monsite@TEST.LOCAL. Si le compte a \u00e9t\u00e9 renomm\u00e9, ou si vous visez un compte machine (sel diff\u00e9rent), la cl\u00e9 produite sera fausse et Wireshark ne d\u00e9chiffrera rien. Une alternative, d\u00e9crite dans <a href=\"https:\/\/medium.com\/tenable-techblog\/decrypt-encrypted-stub-data-in-wireshark-deb132c076e7\">cet article du blog Tenable<\/a>, consiste \u00e0 utiliser le script keytab.py de Dirk-jan Mollema, qui construit le keytab directement \u00e0 partir des cl\u00e9s brutes en hexad\u00e9cimal, sans mot de passe. L&rsquo;auteur y pr\u00e9cise que le nom du principal ou du domaine dans le keytab importe peu pour Wireshark.<\/p>\n<p>Ensuite, dans \u00ab Edit \u00bb > \u00ab Preferences \u00bb > \u00ab Protocols \u00bb > \u00ab KRB5 \u00bb, cochez \u00ab Try to decrypt Kerberos blobs \u00bb et indiquez le fichier keytab. En ligne de commande:<\/p>\n<pre class=\"wp-block-code\"><code>tshark -r krb.pcapng -K svc.monsite.keytab -o kerberos.decrypt:TRUE -Y \"kerberos.msg_type == 13\" -V<\/code><\/pre>\n<p>Une fois la cl\u00e9 connue, le ticket se d\u00e9plie dans le TGS-REP comme dans l&rsquo;AP-REQ. Si vous ajoutez au keytab la cl\u00e9 de user01, Wireshark peut aussi d\u00e9chiffrer l&rsquo;AS-REP, en d\u00e9duire la cl\u00e9 de session du TGT, puis l&rsquo;authentificateur du TGS-REQ et la partie client du TGS-REP. C&rsquo;est tr\u00e8s parlant en formation, mais un keytab contenant des cl\u00e9s de comptes reste un secret: avec la cl\u00e9 de svc.monsite, on peut forger des tickets pour ce service.<\/p>\n<h2>Le PAC et sa validation<\/h2>\n<p>Dans l&rsquo;EncTicketPart d\u00e9chiffr\u00e9, le champ authorization-data contient un \u00e9l\u00e9ment AD-IF-RELEVANT (1) qui encapsule un AD-WIN2K-PAC (128). C&rsquo;est le PAC d\u00e9crit dans la sp\u00e9cification [MS-PAC]. Wireshark en affiche les buffers, avec des libell\u00e9s qui varient selon les versions:<\/p>\n<ul>\n<li>LOGON_INFO (1): SID de l&rsquo;utilisateur, groupes, etc\u2026<\/li>\n<li>CLIENT_INFO (10) et UPN_DNS_INFO (12)<\/li>\n<li>SERVER_CHECKSUM (6): signature calcul\u00e9e avec la cl\u00e9 du service<\/li>\n<li>PRIVSVR_CHECKSUM (7): signature calcul\u00e9e avec la cl\u00e9 du compte krbtgt<\/li>\n<li>sur un DC \u00e0 jour, des buffers ajout\u00e9s au fil des correctifs de 2021 et 2022 (signature du ticket, attributs du PAC, demandeur, signature compl\u00e8te du PAC)<\/li>\n<\/ul>\n<p>Le service v\u00e9rifie forc\u00e9ment la signature serveur, puisqu&rsquo;il poss\u00e8de la cl\u00e9 qui a servi \u00e0 la calculer. En revanche il ne peut pas v\u00e9rifier seul la signature KDC, qui repose sur la cl\u00e9 de krbtgt. C&rsquo;est le r\u00f4le de la validation du PAC: le serveur transmet cette signature au contr\u00f4leur de domaine via le canal s\u00e9curis\u00e9 Netlogon (message KERB_VERIFY_PAC), et le DC r\u00e9pond si elle est valide. Ce sont les \u00e9tapes 4 et 5 du premier sch\u00e9ma.<\/p>\n<p>Malheureusement cette validation n&rsquo;a pas lieu \u00e0 chaque fois. D&rsquo;apr\u00e8s la documentation Microsoft historique, elle est ignor\u00e9e lorsque le processus qui accepte le contexte dispose du privil\u00e8ge \u00ab Agir en tant que partie du syst\u00e8me d&rsquo;exploitation \u00bb (SeTcbPrivilege), ce qui est le cas des services lanc\u00e9s sous SYSTEM. Le comportement a \u00e9volu\u00e9 au fil des versions et des correctifs PAC, et je ne le consid\u00e8re pas comme garanti pour un processus donn\u00e9. Pour savoir si srv01 valide r\u00e9ellement le PAC, il faut regarder le trafic. Sur la capture prise c\u00f4t\u00e9 serveur, filtrez:<\/p>\n<pre class=\"wp-block-code\"><code>ip.addr == 192.168.0.10 &amp;&amp; (netlogon || dcerpc)<\/code><\/pre>\n<p>Un appel Netlogon de srv01 vers dc01 juste apr\u00e8s l&rsquo;AP-REQ indique une validation. Le contenu est g\u00e9n\u00e9ralement chiffr\u00e9 par le canal s\u00e9curis\u00e9, on ne voit donc que l&rsquo;appel. Du point de vue s\u00e9curit\u00e9, ce point compte: un ticket forg\u00e9 avec la seule cl\u00e9 du service (silver ticket) porte une signature serveur valide et une signature KDC fausse. Seule la validation du PAC le d\u00e9tecte, et elle est souvent absente.<\/p>\n<h2>Cas d&rsquo;erreur: KRB_AP_ERR_MODIFIED<\/h2>\n<p>Cassons maintenant la maquette de la fa\u00e7on la plus courante. Deux variantes produisent le m\u00eame sympt\u00f4me:<\/p>\n<ol>\n<li>Quelqu&rsquo;un ajoute le SPN HTTP\/monsite.test.local sur le compte machine srv01 avec <code>setspn -A<\/code>, qui ne v\u00e9rifie pas les doublons. Le SPN existe alors sur deux comptes.<\/li>\n<li>Le pool d&rsquo;application repasse en ApplicationPoolIdentity, ou <code>useAppPoolCredentials<\/code> est retir\u00e9. Le SPN reste sur svc.monsite, mais IIS tente de d\u00e9chiffrer avec la cl\u00e9 de srv01$.<\/li>\n<\/ol>\n<p>Dans les deux cas, le ticket est chiffr\u00e9 avec la cl\u00e9 d&rsquo;un compte et le service essaie de le d\u00e9chiffrer avec celle d&rsquo;un autre. Le serveur renvoie l&rsquo;erreur 41 (0x29), KRB_AP_ERR_MODIFIED, d\u00e9finie dans la RFC 4120. Dans la capture:<\/p>\n<p>-> Le TGS-REQ et le TGS-REP sont normaux. Pas d&rsquo;erreur c\u00f4t\u00e9 KDC, et donc un 4769 avec un \u00ab Failure Code \u00bb \u00e0 0x0. C&rsquo;est logique: le DC a bien d\u00e9livr\u00e9 un ticket.<\/p>\n<p>-> L&rsquo;AP-REQ part dans l&rsquo;en-t\u00eate \u00ab Authorization: Negotiate \u00bb et le serveur r\u00e9pond par un nouveau 401. Selon l&rsquo;impl\u00e9mentation, l&rsquo;en-t\u00eate \u00ab WWW-Authenticate \u00bb de cette r\u00e9ponse peut transporter un KRB-ERROR, visible avec <code>kerberos.error_code == 41<\/code>.<\/p>\n<p>-> Le client enregistre dans le journal Syst\u00e8me un \u00e9v\u00e9nement 4 de la source Security-Kerberos, qui mentionne l&rsquo;erreur KRB_AP_ERR_MODIFIED et le nom de la cible.<\/p>\n<p>-> Si NTLM est autoris\u00e9, le navigateur retente en NTLM et l&rsquo;utilisateur ne voit rien. C&rsquo;est ce qui rend ce probl\u00e8me si discret en production.<\/p>\n<p>Pour la variante du doublon, le contr\u00f4leur de domaine enregistre aussi un \u00e9v\u00e9nement 11 de la source KDC dans son journal Syst\u00e8me, qui signale plusieurs comptes portant le m\u00eame SPN. Le comportement exact du KDC face au doublon (refus ou choix d&rsquo;un des comptes) n&rsquo;est pas quelque chose que je consid\u00e8re comme garanti. L&rsquo;\u00e9v\u00e9nement 11 est le signal fiable. C\u00f4t\u00e9 diagnostic, on combine ce que nous avons vu:<\/p>\n<pre class=\"wp-block-code\"><code># Qui porte le SPN?\nsetspn -Q HTTP\/monsite.test.local\n\n# Tous les doublons de la for\u00eat\nsetspn -X -F\n\n# Pour quel compte le ticket a-t-il \u00e9t\u00e9 chiffr\u00e9? Comparer avec le kvno de la capture\nGet-ADUser svc.monsite -Properties msDS-KeyVersionNumber\nGet-ADComputer srv01 -Properties msDS-KeyVersionNumber<\/code><\/pre>\n<p>Le keytab rend aussi service ici. Si le keytab de svc.monsite d\u00e9chiffre le ticket de l&rsquo;AP-REQ, le KDC a chiffr\u00e9 pour le bon compte et c&rsquo;est la configuration de srv01 qu&rsquo;il faut corriger. S&rsquo;il ne le d\u00e9chiffre pas, le ticket a \u00e9t\u00e9 \u00e9mis pour un autre compte et c&rsquo;est le SPN qu&rsquo;il faut corriger. Le m\u00eame raisonnement vaut pour un service Linux dont le keytab n&rsquo;a pas suivi un changement de mot de passe: le kvno de la capture ne correspond plus \u00e0 celui du fichier.<\/p>\n<p>Une fois le SPN en double supprim\u00e9 (<code>setspn -D HTTP\/monsite.test.local srv01<\/code>) ou l&rsquo;identit\u00e9 du pool corrig\u00e9e, n&rsquo;oubliez pas le client: il garde en cache le ticket fautif jusqu&rsquo;\u00e0 son expiration, dix heures par d\u00e9faut. Un <code>klist purge<\/code> sur cli01, ou une fermeture de session, est n\u00e9cessaire avant de retester. Enfin, supprimez le keytab g\u00e9n\u00e9r\u00e9 pour la maquette d\u00e8s que vous n&rsquo;en avez plus besoin.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l&rsquo;\u00e9v\u00e9nement 4769.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,4,37],"tags":[52,5,17,50,15,7,51,49],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-active-directory","category-kerberos","category-securite","tag-evenement-4769","tag-kerberos","tag-keytab","tag-klist","tag-pac","tag-spn","tag-tgs-req","tag-wireshark"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER<\/title>\n<meta name=\"description\" content=\"D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l&#039;\u00e9v\u00e9nement 4769.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER\" \/>\n<meta property=\"og:description\" content=\"D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l&#039;\u00e9v\u00e9nement 4769.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e9mi VERNIER\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-27T10:03:06+00:00\" \/>\n<meta name=\"author\" content=\"R\u00e9mi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"R\u00e9mi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/\"},\"author\":{\"name\":\"R\u00e9mi\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"headline\":\"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9\",\"datePublished\":\"2026-10-27T10:03:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/\"},\"wordCount\":2789,\"commentCount\":0,\"keywords\":[\"\u00e9v\u00e9nement 4769\",\"kerberos\",\"keytab\",\"klist\",\"pac\",\"spn\",\"tgs-req\",\"wireshark\"],\"articleSection\":[\"Active Directory\",\"Kerberos\",\"S\u00e9curit\u00e9\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/\",\"url\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/\",\"name\":\"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\"},\"datePublished\":\"2026-10-27T10:03:06+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"description\":\"D\u00e9cortiquons un \u00e9change TGS-REQ\\\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l'\u00e9v\u00e9nement 4769.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/10\\\/27\\\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/remivernier.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\",\"url\":\"https:\\\/\\\/remivernier.com\\\/\",\"name\":\"R\u00e9mi VERNIER\",\"description\":\"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/remivernier.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\",\"name\":\"R\u00e9mi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"caption\":\"R\u00e9mi\"},\"sameAs\":[\"http:\\\/\\\/www.linkedin.com\\\/in\\\/remi-vernier\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER","description":"D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l'\u00e9v\u00e9nement 4769.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/","og_locale":"fr_FR","og_type":"article","og_title":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER","og_description":"D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l'\u00e9v\u00e9nement 4769.","og_url":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/","og_site_name":"R\u00e9mi VERNIER","article_published_time":"2026-10-27T10:03:06+00:00","author":"R\u00e9mi","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"R\u00e9mi","Dur\u00e9e de lecture estim\u00e9e":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/#article","isPartOf":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/"},"author":{"name":"R\u00e9mi","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"headline":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9","datePublished":"2026-10-27T10:03:06+00:00","mainEntityOfPage":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/"},"wordCount":2789,"commentCount":0,"keywords":["\u00e9v\u00e9nement 4769","kerberos","keytab","klist","pac","spn","tgs-req","wireshark"],"articleSection":["Active Directory","Kerberos","S\u00e9curit\u00e9"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/","url":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/","name":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9 - R\u00e9mi VERNIER","isPartOf":{"@id":"https:\/\/remivernier.com\/#website"},"datePublished":"2026-10-27T10:03:06+00:00","author":{"@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"description":"D\u00e9cortiquons un \u00e9change TGS-REQ\/TGS-REP sur maquette AD: etypes, kvno, ticket chiffr\u00e9 et PAC, avec les filtres Wireshark, klist et l'\u00e9v\u00e9nement 4769.","breadcrumb":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/remivernier.com\/index.php\/2026\/10\/27\/kerberos-lire-ticket-service-klist-wireshark-tgs-req-pac\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/remivernier.com\/"},{"@type":"ListItem","position":2,"name":"Kerberos: lire un ticket de service avec klist et Wireshark, du KRB_TGS_REQ au PAC valid\u00e9"}]},{"@type":"WebSite","@id":"https:\/\/remivernier.com\/#website","url":"https:\/\/remivernier.com\/","name":"R\u00e9mi VERNIER","description":"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/remivernier.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906","name":"R\u00e9mi","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","caption":"R\u00e9mi"},"sameAs":["http:\/\/www.linkedin.com\/in\/remi-vernier"]}]}},"_links":{"self":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/comments?post=1237"}],"version-history":[{"count":1,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1237\/revisions"}],"predecessor-version":[{"id":1239,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1237\/revisions\/1239"}],"wp:attachment":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}