{"id":1297,"date":"2026-11-07T14:45:29","date_gmt":"2026-11-07T13:45:29","guid":{"rendered":"https:\/\/remivernier.com\/?p=1297"},"modified":"2026-11-07T14:45:29","modified_gmt":"2026-11-07T13:45:29","slug":"ntlm-lire-echange-ntlmssp-wireshark","status":"publish","type":"post","link":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/","title":{"rendered":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark"},"content":{"rendered":"<p>Quand un client Windows s&rsquo;authentifie en NTLM sur un serveur, que voit-on r\u00e9ellement passer sur le r\u00e9seau, et comment \u00eatre certain qu&rsquo;il s&rsquo;agit bien de NTLMv2 avec un MIC et pas d&rsquo;un vieux NTLMv1? La r\u00e9ponse tient en trois messages NTLMSSP (NEGOTIATE, CHALLENGE, AUTHENTICATE) que Wireshark d\u00e9code nativement avec le filtre <code>ntlmssp<\/code>. La longueur de la r\u00e9ponse du client, la pr\u00e9sence d&rsquo;une NTProofStr et la valeur de l&rsquo;attribut MsvAvFlags suffisent pour trancher.<\/p>\n<p>Dans cet article nous allons capturer une authentification NTLM sur une maquette, lire chaque message champ par champ, puis recalculer la NTProofStr \u00e0 partir du mot de passe pour v\u00e9rifier que nous avons bien compris le m\u00e9canisme. Nous verrons ensuite ce que cette m\u00eame capture apporte \u00e0 un attaquant.<\/p>\n<h2>Pr\u00e9sentation de la maquette<\/h2>\n<p>Nom du domaine: test.local (TESTLOCAL)<\/p>\n<p>Contr\u00f4leur de domaine: dc01.test.local<\/p>\n<p>Serveur web: srv01.test.local (Windows Server 2022, IIS 10), site monsite.test.local<\/p>\n<p>Client: WIN11, compte user1@test.local, mot de passe Azerty123<\/p>\n<p>Pour \u00eatre certain de ne voir que du NTLM, nous supprimons le fournisseur \u00ab Negotiate \u00bb dans les param\u00e8tres de l&rsquo;authentification Windows du site et ne laissons que \u00ab NTLM \u00bb. Le serveur r\u00e9pondra alors uniquement <code>WWW-Authenticate: NTLM<\/code> et le client n&rsquo;essaiera m\u00eame pas Kerberos. Si votre objectif est au contraire de comprendre pourquoi un site configur\u00e9 en Negotiate retombe en NTLM, nous avions d\u00e9roul\u00e9 ce diagnostic dans l&rsquo;article <a href=\"https:\/\/remivernier.com\/index.php\/2026\/10\/31\/kerberos-retombe-ntlm-diagnostic-maquette\/\">Pourquoi Kerberos retombe en NTLM<\/a>.<\/p>\n<p>Attention: le site est publi\u00e9 en HTTP sur le port 80 pour que Wireshark lise les en-t\u00eates sans d\u00e9chiffrement TLS. C&rsquo;est acceptable sur une maquette isol\u00e9e, jamais en production. En HTTPS, il faudra exporter les cl\u00e9s de session via la variable d&rsquo;environnement <code>SSLKEYLOGFILE<\/code> du navigateur et les d\u00e9clarer dans les pr\u00e9f\u00e9rences TLS de Wireshark.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 400\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<defs><marker id=\"fl\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L9,3 L0,6 z\" fill=\"#333\"\/><\/marker><\/defs>\n<rect x=\"20\" y=\"15\" width=\"130\" height=\"40\" fill=\"#e8f0fe\" stroke=\"#333\"\/><text x=\"85\" y=\"40\" text-anchor=\"middle\">WIN11 (client)<\/text>\n<rect x=\"300\" y=\"15\" width=\"150\" height=\"40\" fill=\"#fdf3e1\" stroke=\"#333\"\/><text x=\"375\" y=\"40\" text-anchor=\"middle\">srv01 (IIS)<\/text>\n<rect x=\"570\" y=\"15\" width=\"130\" height=\"40\" fill=\"#e6f4ea\" stroke=\"#333\"\/><text x=\"635\" y=\"40\" text-anchor=\"middle\">dc01 (Netlogon)<\/text>\n<line x1=\"85\" y1=\"55\" x2=\"85\" y2=\"390\" stroke=\"#333\" stroke-dasharray=\"4\"\/>\n<line x1=\"375\" y1=\"55\" x2=\"375\" y2=\"390\" stroke=\"#333\" stroke-dasharray=\"4\"\/>\n<line x1=\"635\" y1=\"55\" x2=\"635\" y2=\"390\" stroke=\"#333\" stroke-dasharray=\"4\"\/>\n<line x1=\"85\" y1=\"85\" x2=\"373\" y2=\"85\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"80\">1. GET \/ (anonyme)<\/text>\n<line x1=\"375\" y1=\"125\" x2=\"87\" y2=\"125\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"120\">2. 401, WWW-Authenticate: NTLM<\/text>\n<line x1=\"85\" y1=\"165\" x2=\"373\" y2=\"165\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"160\">3. Authorization: NTLM TlRMTVNTUAAB\u2026<\/text>\n<text x=\"95\" y=\"180\" font-size=\"12\">NEGOTIATE (drapeaux)<\/text>\n<line x1=\"375\" y1=\"215\" x2=\"87\" y2=\"215\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"210\">4. 401, NTLM TlRMTVNTUAAC\u2026<\/text>\n<text x=\"95\" y=\"230\" font-size=\"12\">CHALLENGE (nonce + TargetInfo)<\/text>\n<line x1=\"85\" y1=\"265\" x2=\"373\" y2=\"265\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"260\">5. Authorization: NTLM TlRMTVNTUAAD\u2026<\/text>\n<text x=\"95\" y=\"280\" font-size=\"12\">AUTHENTICATE (NTLMv2 + MIC)<\/text>\n<line x1=\"375\" y1=\"300\" x2=\"633\" y2=\"300\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"385\" y=\"295\">6. NetrLogonSamLogonEx<\/text>\n<line x1=\"635\" y1=\"335\" x2=\"377\" y2=\"335\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"385\" y=\"330\">7. validation + cl\u00e9 de session<\/text>\n<line x1=\"375\" y1=\"370\" x2=\"87\" y2=\"370\" stroke=\"#333\" marker-end=\"url(#fl)\"\/><text x=\"95\" y=\"365\">8. 200 OK<\/text>\n<\/svg><figcaption>\u00c9change NTLM sur HTTP et validation pass-through vers le contr\u00f4leur de domaine<\/figcaption><\/figure>\n<p>Le serveur IIS transmet le challenge et la r\u00e9ponse de user1 au contr\u00f4leur de domaine via Netlogon, et c&rsquo;est le DC, seul d\u00e9tenteur du hash du mot de passe, qui valide l&rsquo;authentification et renvoie la cl\u00e9 de session. Ce point explique pourquoi une authentification NTLM r\u00e9ussie ne laisse aucune trace Kerberos sur le DC, seulement des \u00e9v\u00e9nements de validation d&rsquo;identifiants.<\/p>\n<h2>Capture et filtre ntlmssp<\/h2>\n<p>Nous lan\u00e7ons Wireshark sur WIN11, sur l&rsquo;interface r\u00e9seau du domaine, avec un filtre de capture <code>host srv01.test.local and tcp port 80<\/code> pour ne pas se noyer. Nous ouvrons ensuite http:\/\/monsite.test.local dans le navigateur, puis nous arr\u00eatons la capture une fois la page affich\u00e9e.<\/p>\n<p>Le dissecteur NTLMSSP de Wireshark extrait automatiquement le contenu base64 des en-t\u00eates <code>Authorization<\/code> et <code>WWW-Authenticate<\/code>, comme il le fait pour SMB, LDAP ou DCE\/RPC. La liste compl\u00e8te des champs exploitables est publi\u00e9e dans la <a href=\"https:\/\/www.wireshark.org\/docs\/dfref\/n\/ntlmssp.html\">r\u00e9f\u00e9rence des filtres d&rsquo;affichage ntlmssp<\/a>. Les filtres utiles:<\/p>\n<pre class=\"wp-block-code\"><code>ntlmssp                                   -&gt; les trois messages\nntlmssp.messagetype == 0x00000001         -&gt; NEGOTIATE\nntlmssp.messagetype == 0x00000002         -&gt; CHALLENGE\nntlmssp.messagetype == 0x00000003         -&gt; AUTHENTICATE\nntlmssp.messagetype == 0x00000003 &amp;&amp; !ntlmssp.ntlmv2_response   -&gt; AUTHENTICATE sans NTLMv2<\/code><\/pre>\n<p>Le dernier filtre sert d&rsquo;audit rapide sur une capture plus large: tout ce qu&rsquo;il remonte est du NTLMv1 (ou de l&rsquo;anonyme) et m\u00e9rite une enqu\u00eate.<\/p>\n<p>Comme nous l&rsquo;avions vu dans l&rsquo;article sur les <a href=\"https:\/\/remivernier.com\/index.php\/2018\/09\/16\/exploration-des-entetes-http-www-authenticate\/\">ent\u00eates HTTP WWW-Authenticate et Authorization<\/a>, le pr\u00e9fixe <code>TlRMTVNTUA<\/code> correspond \u00e0 \u00ab NTLMSSP \u00bb encod\u00e9 en base64. Le caract\u00e8re qui suit trahit le type de message: <code>TlRMTVNTUAAB<\/code>, <code>\u2026AAC<\/code>, <code>\u2026AAD<\/code> pour les types 1, 2 et 3.<\/p>\n<h2>Lecture des trois messages<\/h2>\n<h3>NEGOTIATE<\/h3>\n<p>Le client annonce ce qu&rsquo;il sait faire. L&rsquo;en-t\u00eate envoy\u00e9 ressemble \u00e0 ceci:<\/p>\n<pre class=\"wp-block-code\"><code>Authorization: NTLM TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAPRlAAAADw==<\/code><\/pre>\n<p>Une fois d\u00e9cod\u00e9 par Wireshark:<\/p>\n<pre class=\"wp-block-code\"><code>NTLM Secure Service Provider\n    NTLMSSP identifier: NTLMSSP\n    NTLM Message Type: NTLMSSP_NEGOTIATE (0x00000001)\n    Negotiate Flags: 0xe2088297\n        1... = Negotiate 56\n        .1.. = Negotiate Key Exchange\n        ..1. = Negotiate 128\n        .... ..1. = Negotiate Version\n        .... 1... = Negotiate Extended Session Security\n        1... = Negotiate Always Sign\n        .1.. = Negotiate NTLM key\n        1... = Negotiate Lan Manager Key\n        ...1 .... = Negotiate Sign\n        .... .1.. = Request Target\n        .... ..1. = Negotiate OEM\n        .... ...1 = Negotiate UNICODE\n    Version 10.0 (Build 26100); NTLM Current Revision 15<\/code><\/pre>\n<p>Les drapeaux sont d\u00e9finis dans la section 2.2.2.5 de <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-nlmp\/99d90ff4-957f-4c8a-80e4-5bfe5a9a9832\">[MS-NLMP]<\/a>. Celui qui nous int\u00e9resse ici est NTLMSSP_NEGOTIATE_SIGN (0x00000010): le client demande la n\u00e9gociation d&rsquo;une cl\u00e9 de session pour signer les messages. Selon la sp\u00e9cification, si le client l&rsquo;envoie, le serveur doit le renvoyer dans le CHALLENGE.<\/p>\n<p>Attention: aucun drapeau n&rsquo;indique NTLMv1 ou NTLMv2. La sp\u00e9cification le pr\u00e9cise dans la section consacr\u00e9e \u00e0 <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-nlmp\/5e550938-91d4-459f-b67d-75d70009e3f3\">NTLM v2<\/a>: la version est configur\u00e9e de chaque c\u00f4t\u00e9, sous Windows par la strat\u00e9gie \u00ab S\u00e9curit\u00e9 r\u00e9seau: niveau d&rsquo;authentification LAN Manager \u00bb. Le drapeau \u00ab Negotiate NTLM key \u00bb existe dans les deux cas, il ne prouve rien. Seul le message AUTHENTICATE permet de trancher.<\/p>\n<h3>CHALLENGE<\/h3>\n<pre class=\"wp-block-code\"><code>NTLM Message Type: NTLMSSP_CHALLENGE (0x00000002)\nTarget Name: TESTLOCAL\nNegotiate Flags: 0xe2898215\nNTLM Server Challenge: 3f1a9c62d84b07e5\nTarget Info\n    Attribute: NetBIOS domain name: TESTLOCAL\n    Attribute: NetBIOS computer name: SRV01\n    Attribute: DNS domain name: test.local\n    Attribute: DNS computer name: srv01.test.local\n    Attribute: DNS tree name: test.local\n    Attribute: Timestamp\n    Attribute: End of list\nVersion 10.0 (Build 20348); NTLM Current Revision 15<\/code><\/pre>\n<p>Le serveur renvoie les drapeaux retenus (Negotiate Sign est bien pr\u00e9sent, Negotiate Target Info s&rsquo;est ajout\u00e9), le nonce de 8 octets <code>3f1a9c62d84b07e5<\/code> et une structure TargetInfo compos\u00e9e d&rsquo;AV_PAIR. Cette TargetInfo est importante pour la suite: le client va la recopier, enrichie, dans sa r\u00e9ponse NTLMv2, et elle sera couverte par le calcul de la NTProofStr.<\/p>\n<h3>AUTHENTICATE<\/h3>\n<pre class=\"wp-block-code\"><code>NTLM Message Type: NTLMSSP_AUTH (0x00000003)\nLan Manager Response: 000000000000000000000000000000000000000000000000\nNTLM Response: a1c406a268ef03d09905c99198bd4748010100000000000000709e0b\u2026\n    Length: 242\n    NTLMv2 Response\n        NTProofStr: a1c406a268ef03d09905c99198bd4748\n        Response Version: 1\n        Hi Response Version: 1\n        Time: Nov  7, 2026 09:12:00 UTC\n        NTLMv2 Client Challenge: a41c7e09d25b3f86\n        Attribute: NetBIOS domain name: TESTLOCAL\n        \u2026\n        Attribute: Flags\n            Flags: 0x00000002\n        Attribute: Target Name: HTTP\/monsite.test.local\n        Attribute: End of list\nDomain name: TESTLOCAL\nUser name: user1\nHost name: WIN11\nNegotiate Flags: 0xe2888215\nVersion 10.0 (Build 26100); NTLM Current Revision 15\nMIC: 4e7d\u2026<\/code><\/pre>\n<p>Trois \u00e9l\u00e9ments permettent de r\u00e9pondre \u00e0 la question de d\u00e9part:<\/p>\n<ol>\n<li>La NtChallengeResponse fait 242 octets. Une r\u00e9ponse NTLMv1 fait toujours 24 octets, et c&rsquo;est ce seuil (longueur sup\u00e9rieure \u00e0 0x18) que la sp\u00e9cification utilise c\u00f4t\u00e9 serveur pour reconna\u00eetre le NTLMv2. Wireshark l&rsquo;affiche alors sous \u00ab NTLMv2 Response \u00bb avec ses sous-champs.<\/li>\n<li>Les 16 premiers octets constituent la NTProofStr, le reste est le \u00ab blob \u00bb du client: version, horodatage, challenge client de 8 octets et la TargetInfo recopi\u00e9e.<\/li>\n<li>Dans ce blob, l&rsquo;attribut MsvAvFlags vaut 0x00000002. D&rsquo;apr\u00e8s la section <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-nlmp\/8bbf686d-06d1-4511-9502-b0c071f9d6d7\">3.1.5.2.1 de [MS-NLMP]<\/a>, ce bit indique que le client a fourni un MIC dans le message.<\/li>\n<\/ol>\n<p>Le MIC est un HMAC_MD5 calcul\u00e9 avec l&rsquo;ExportedSessionKey sur la concat\u00e9nation des trois messages NEGOTIATE, CHALLENGE et AUTHENTICATE (champ MIC mis \u00e0 z\u00e9ro pendant le calcul). Le serveur le recalcule et, s&rsquo;il diff\u00e8re, l&rsquo;authentification \u00e9choue, comme le d\u00e9crit la section <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-nlmp\/f9e6fbc4-a953-4f24-b229-ccdcc213b9ec\">3.2.5.1.2<\/a>. Un interm\u00e9diaire ne peut donc plus retirer le drapeau Negotiate Sign au passage sans casser le MIC, et il ne peut pas non plus supprimer le MIC puisque le bit 0x2 de MsvAvFlags est lui-m\u00eame prot\u00e9g\u00e9 par la NTProofStr.<\/p>\n<h2>Recalculer la NTProofStr?<\/h2>\n<p>Pour v\u00e9rifier que nous lisons correctement la capture, rien ne vaut un recalcul. Le pseudo-code de <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-nlmp\/5e550938-91d4-459f-b67d-75d70009e3f3\">[MS-NLMP] 3.3.2<\/a> se r\u00e9sume \u00e0 trois lignes:<\/p>\n<pre class=\"wp-block-code\"><code>NTHash     = MD4(UTF-16LE(motdepasse))\nNTOWFv2    = HMAC_MD5(NTHash, UTF-16LE(MAJUSCULE(utilisateur) + domaine))\nNTProofStr = HMAC_MD5(NTOWFv2, ServerChallenge + blob)<\/code><\/pre>\n<p>Pour Azerty123, le hash NT vaut <code>9ab14788afc13c83576dfb13ac619152<\/code>, et le NTOWFv2 pour user1 \/ TESTLOCAL vaut <code>5f9826e92806b709caaa263122f4e49c<\/code>. Attention, seul le nom d&rsquo;utilisateur est pass\u00e9 en majuscules, le domaine est pris tel que le client l&rsquo;a envoy\u00e9.<\/p>\n<p>Nous extrayons d&rsquo;abord les valeurs avec tshark:<\/p>\n<pre class=\"wp-block-code\"><code>tshark -r ntlm.pcapng -Y \"ntlmssp.messagetype == 0x00000002\" -T fields -e ntlmssp.ntlmserverchallenge\ntshark -r ntlm.pcapng -Y \"ntlmssp.messagetype == 0x00000003\" -T fields -e ntlmssp.auth.username -e ntlmssp.auth.domain -e ntlmssp.ntlmv2_response<\/code><\/pre>\n<p>Puis ce petit script Python fait la v\u00e9rification:<\/p>\n<pre class=\"wp-block-code\"><code>import hashlib, hmac, sys\n\ndef md4(data):\n    try:\n        return hashlib.new(\"md4\", data).digest()\n    except ValueError:\n        from Crypto.Hash import MD4\n        return MD4.new(data).digest()\n\npwd, user, dom, schal, resp = sys.argv[1:6]\nschal = bytes.fromhex(schal.replace(\":\", \"\"))\nresp  = bytes.fromhex(resp.replace(\":\", \"\"))\n\nnthash = md4(pwd.encode(\"utf-16le\"))\nntowf  = hmac.new(nthash, (user.upper() + dom).encode(\"utf-16le\"), hashlib.md5).digest()\nproof  = hmac.new(ntowf, schal + resp[16:], hashlib.md5).digest()\n\nprint(\"NTProofStr calcul\u00e9e :\", proof.hex())\nprint(\"NTProofStr captur\u00e9e :\", resp[:16].hex())\nprint(\"OK\" if proof == resp[:16] else \"KO\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>python3 ntproof.py Azerty123 user1 TESTLOCAL 3f1a9c62d84b07e5 a1c406a268ef03d0\u2026\nNTProofStr calcul\u00e9e : a1c406a268ef03d09905c99198bd4748\nNTProofStr captur\u00e9e : a1c406a268ef03d09905c99198bd4748\nOK<\/code><\/pre>\n<p>Attention: sur les distributions r\u00e9centes, OpenSSL 3 d\u00e9sactive MD4 dans son fournisseur par d\u00e9faut et <code>hashlib.new(\"md4\")<\/code> l\u00e8ve une erreur; le script bascule alors sur pycryptodome. Selon la version de tshark, les champs de type octets sortent avec ou sans \u00ab: \u00bb, d&rsquo;o\u00f9 le <code>replace<\/code>.<\/p>\n<h2>Ce que la capture livre \u00e0 un attaquant<\/h2>\n<p>Le script que nous venons d&rsquo;\u00e9crire est, \u00e0 peu de chose pr\u00e8s, le c\u0153ur d&rsquo;un outil de cassage hors ligne. Il suffit de remplacer le mot de passe connu par un dictionnaire. Tout ce qui est n\u00e9cessaire se trouve dans la capture: utilisateur, domaine, challenge serveur, NTProofStr et blob. Hashcat attend ces \u00e9l\u00e9ments sous la forme suivante (mode 5600, NetNTLMv2):<\/p>\n<pre class=\"wp-block-code\"><code>user1::TESTLOCAL:3f1a9c62d84b07e5:a1c406a268ef03d09905c99198bd4748:0101000000000000\u2026<\/code><\/pre>\n<p>NTLMv2 ralentit l&rsquo;attaque par rapport \u00e0 NTLMv1, dont la r\u00e9ponse se ram\u00e8ne \u00e0 du DES et se casse ind\u00e9pendamment de la complexit\u00e9 du mot de passe, mais un mot de passe faible comme Azerty123 tombera quand m\u00eame en quelques instants. C&rsquo;est ce que r\u00e9cup\u00e8re un outil comme Responder lorsqu&rsquo;il empoisonne LLMNR ou NBT-NS, comme nous l&rsquo;avions vu dans l&rsquo;article <a href=\"https:\/\/remivernier.com\/index.php\/2018\/08\/26\/protocoles-nbt-ns-llmnr-et-exploitation-des-failles\/\">Protocoles NBT-NS, LLMNR et exploitation des failles<\/a>.<\/p>\n<p>M\u00eame sans casser quoi que ce soit, le CHALLENGE fournit gratuitement de la reconnaissance: noms NetBIOS et DNS du serveur, du domaine et de la for\u00eat, version de build de Windows. Il suffit d&rsquo;envoyer un NEGOTIATE \u00e0 n&rsquo;importe quel point d&rsquo;entr\u00e9e qui accepte NTLM pour obtenir ces informations.<\/p>\n<p>Reste le relais: l&rsquo;attaquant ne cherche plus le mot de passe, il retransmet les trois messages en temps r\u00e9el vers un autre service. C&rsquo;est l\u00e0 que le MIC et la signature jouent leur r\u00f4le. Sur SMB ou LDAP, une signature exig\u00e9e rend le relais inutile, car l&rsquo;attaquant ne poss\u00e8de pas la cl\u00e9 de session. La vuln\u00e9rabilit\u00e9 CVE-2019-1040 (\u00ab Drop the MIC \u00bb) permettait justement de retirer ce MIC; les syst\u00e8mes corrig\u00e9s le refusent. Sur HTTP, la signature NTLM ne prot\u00e8ge pas les requ\u00eates qui suivent l&rsquo;authentification: la parade est la protection \u00e9tendue (EPA), qui lie l&rsquo;authentification au canal TLS gr\u00e2ce \u00e0 l&rsquo;attribut MsvAvChannelBindings du blob. Sur notre maquette en HTTP, cet attribut n&rsquo;a aucun sens et le site reste relayable.<\/p>\n<p>Sur un parc r\u00e9el, le filtre <code>ntlmssp.messagetype == 0x00000003 &amp;&amp; !ntlmssp.ntlmv2_response<\/code> combin\u00e9 \u00e0 la strat\u00e9gie \u00ab Envoyer uniquement les r\u00e9ponses NTLMv2. Refuser LM et NTLM \u00bb permet d\u00e9j\u00e0 de faire dispara\u00eetre le NTLMv1. Pour le reste, je recommande d&rsquo;activer EPA sur les sites IIS en authentification Windows et d&rsquo;exiger la signature LDAP et SMB: une capture NTLMv2 ne servira alors plus qu&rsquo;\u00e0 tenter de casser le mot de passe hors ligne.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu&rsquo;une capture livre \u00e0 un attaquant.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,3,37],"tags":[6,115,100,113,114,116,117,49],"class_list":["post-1297","post","type-post","status-publish","format-standard","hentry","category-ntlm","category-protocoles","category-securite","tag-iis","tag-mic","tag-ntlm","tag-ntlmssp","tag-ntlmv2","tag-ntproofstr","tag-relais-ntlm","tag-wireshark"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER<\/title>\n<meta name=\"description\" content=\"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu&#039;une capture livre \u00e0 un attaquant.\" \/>\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\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER\" \/>\n<meta property=\"og:description\" content=\"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu&#039;une capture livre \u00e0 un attaquant.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e9mi VERNIER\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-07T13:45:29+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=\"10 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\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/\"},\"author\":{\"name\":\"R\u00e9mi\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"headline\":\"NTLM: lire un \u00e9change NTLMSSP dans Wireshark\",\"datePublished\":\"2026-11-07T13:45:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/\"},\"wordCount\":1519,\"commentCount\":0,\"keywords\":[\"iis\",\"mic\",\"ntlm\",\"ntlmssp\",\"ntlmv2\",\"ntproofstr\",\"relais ntlm\",\"wireshark\"],\"articleSection\":[\"NTLM\",\"Protocoles\",\"S\u00e9curit\u00e9\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/\",\"url\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/\",\"name\":\"NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\"},\"datePublished\":\"2026-11-07T13:45:29+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"description\":\"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu'une capture livre \u00e0 un attaquant.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/07\\\/ntlm-lire-echange-ntlmssp-wireshark\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/remivernier.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NTLM: lire un \u00e9change NTLMSSP dans Wireshark\"}]},{\"@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":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER","description":"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu'une capture livre \u00e0 un attaquant.","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\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/","og_locale":"fr_FR","og_type":"article","og_title":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER","og_description":"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu'une capture livre \u00e0 un attaquant.","og_url":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/","og_site_name":"R\u00e9mi VERNIER","article_published_time":"2026-11-07T13:45:29+00:00","author":"R\u00e9mi","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"R\u00e9mi","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/#article","isPartOf":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/"},"author":{"name":"R\u00e9mi","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"headline":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark","datePublished":"2026-11-07T13:45:29+00:00","mainEntityOfPage":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/"},"wordCount":1519,"commentCount":0,"keywords":["iis","mic","ntlm","ntlmssp","ntlmv2","ntproofstr","relais ntlm","wireshark"],"articleSection":["NTLM","Protocoles","S\u00e9curit\u00e9"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/","url":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/","name":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark - R\u00e9mi VERNIER","isPartOf":{"@id":"https:\/\/remivernier.com\/#website"},"datePublished":"2026-11-07T13:45:29+00:00","author":{"@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"description":"D\u00e9coder NEGOTIATE, CHALLENGE et AUTHENTICATE dans Wireshark, v\u00e9rifier NTLMv2 et le MIC, recalculer la NTProofStr et voir ce qu'une capture livre \u00e0 un attaquant.","breadcrumb":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/07\/ntlm-lire-echange-ntlmssp-wireshark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/remivernier.com\/"},{"@type":"ListItem","position":2,"name":"NTLM: lire un \u00e9change NTLMSSP dans Wireshark"}]},{"@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\/1297","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=1297"}],"version-history":[{"count":1,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1297\/revisions"}],"predecessor-version":[{"id":1299,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1297\/revisions\/1299"}],"wp:attachment":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}