{"id":1316,"date":"2026-11-11T17:30:00","date_gmt":"2026-11-11T16:30:00","guid":{"rendered":"https:\/\/remivernier.com\/?p=1316"},"modified":"2026-11-11T17:30:00","modified_gmt":"2026-11-11T16:30:00","slug":"dcsync-replication-ms-drsr-wireshark","status":"publish","type":"post","link":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/","title":{"rendered":"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark"},"content":{"rendered":"<h2>R\u00e9pliquer, un simple droit?<\/h2>\n<p>Cet \u00e9t\u00e9, l&rsquo;\u00e9quipe de cirosec a publi\u00e9 <a href=\"https:\/\/cirosec.de\/en\/news\/microsoft-defender-for-identity-evasions-in-2026-part-i\/\">la premi\u00e8re partie d&rsquo;une \u00e9tude sur le contournement des d\u00e9tections de Microsoft Defender for Identity en 2026<\/a>. L&rsquo;alerte DCSync y figure: sa logique repose sur la r\u00e9solution NNR (Network Name Resolution), qui permet au capteur de savoir si la machine source est un contr\u00f4leur de domaine, et des r\u00e9ponses NNR falsifi\u00e9es suffisent \u00e0 la tromper. En avril, Trellix rappelait de son c\u00f4t\u00e9 dans <a href=\"https:\/\/www.trellix.com\/blogs\/research\/dcsync-detection-without-signatures-trellix-ndr\/\">un billet sur la d\u00e9tection r\u00e9seau<\/a> qu&rsquo;une requ\u00eate DsGetNCChanges est une fonction tout \u00e0 fait l\u00e9gitime du protocole, et qu&rsquo;elle ne devient suspecte que lorsqu&rsquo;elle part d&rsquo;une machine qui n&rsquo;est pas un contr\u00f4leur de domaine.<\/p>\n<p>Si l&rsquo;alerte d&rsquo;un produit peut \u00eatre contourn\u00e9e, il reste le protocole lui-m\u00eame et le journal de s\u00e9curit\u00e9 du contr\u00f4leur de domaine, et c&rsquo;est l\u00e0 que nous allons regarder.<\/p>\n<p>Les contr\u00f4leurs de domaine se r\u00e9pliquent entre eux gr\u00e2ce au protocole <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-drsr\/58f33216-d9f1-43bf-a183-87e3c899c410\">[MS-DRSR]<\/a>, port\u00e9 par l&rsquo;interface RPC drsuapi (UUID e3514235-4b06-11d1-ab04-00c04fc2dcd2, version 4.0). Le contr\u00f4leur de destination tire les modifications du contr\u00f4leur source en appelant la m\u00e9thode <a href=\"https:\/\/learn.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-drsr\/b63730ac-614c-431c-9501-28d6aca91894\">IDL_DRSGetNCChanges (opnum 3)<\/a>. Rien n&rsquo;oblige l&rsquo;appelant \u00e0 \u00eatre un contr\u00f4leur de domaine: n&rsquo;importe quel client qui parle DRSUAPI et dispose des bons droits peut demander la r\u00e9plication d&rsquo;un objet, attributs secrets compris. C&rsquo;est cela, DCSync, r\u00e9f\u00e9renc\u00e9 par MITRE sous <a href=\"https:\/\/attack.mitre.org\/techniques\/T1003\/006\/\">T1003.006<\/a>, et utilis\u00e9 par des groupes comme LAPSUS$, Storm-0501 ou Mustang Panda. L&rsquo;attaquant n&rsquo;ex\u00e9cute aucun code sur le contr\u00f4leur, ne touche ni \u00e0 NTDS.dit ni \u00e0 LSASS: il demande poliment.<\/p>\n<p>Les droits en question sont des droits de contr\u00f4le d&rsquo;acc\u00e8s \u00e9tendus, pos\u00e9s sur la t\u00eate du contexte de nommage, ici l&rsquo;objet DC=test,DC=local. Le <a href=\"https:\/\/threathunterplaybook.com\/library\/windows\/active_directory_replication.html\">Threat Hunter Playbook<\/a> en donne la liste avec leurs GUID:<\/p>\n<ul>\n<li>DS-Replication-Get-Changes (\u00ab Replicating Directory Changes \u00bb): 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2<\/li>\n<li>DS-Replication-Get-Changes-All (\u00ab Replicating Directory Changes All \u00bb): 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2<\/li>\n<li>DS-Replication-Get-Changes-In-Filtered-Set: 89e95b76-444d-4c62-991a-0facbeda640c<\/li>\n<\/ul>\n<p>Le premier suffit pour r\u00e9pliquer les attributs ordinaires, et de nombreux outils de synchronisation en ont besoin. <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/adschema\/r-ds-replication-get-changes-all\">Le second<\/a> autorise la r\u00e9plication des donn\u00e9es secr\u00e8tes du domaine: unicodePwd, ntPwdHistory, supplementalCredentials (les cl\u00e9s Kerberos AES), etc\u2026 C&rsquo;est la combinaison des deux qui rend DCSync possible. Par d\u00e9faut, seuls les groupes Administrateurs, Contr\u00f4leurs de domaine et Contr\u00f4leurs de domaine d&rsquo;entreprise les d\u00e9tiennent, et Admins du domaine en h\u00e9rite au travers d&rsquo;Administrateurs. Il faut y ajouter les comptes \u00e0 qui un projet les a donn\u00e9s, \u00e0 commencer par le compte de connecteur MSOL_ d&rsquo;Entra Connect, qui en a besoin pour Password Hash Sync comme nous l&rsquo;avions vu dans l&rsquo;article sur <a href=\"https:\/\/remivernier.com\/index.php\/2019\/11\/23\/azure-ad-office-365-password-hash-sync-et-seamless-sso-en-profondeur\/\">Password Hash Sync et Seamless SSO<\/a>.<\/p>\n<p>Attention: un compte qui a GenericAll ou WriteDacl sur la racine du domaine, ou une entr\u00e9e \u00ab Tous les droits \u00e9tendus \u00bb (ObjectType vide), peut s&rsquo;accorder lui-m\u00eame ces droits. Il faut donc aussi le compter parmi les comptes capables de DCSync.<\/p>\n<p>Pour dresser l&rsquo;inventaire, ce petit script lit l&rsquo;ACL de la racine du domaine et ne garde que les entr\u00e9es concern\u00e9es:<\/p>\n<pre class=\"wp-block-code\"><code>Import-Module ActiveDirectory\n$droits = @{\n  '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2' = 'DS-Replication-Get-Changes'\n  '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2' = 'DS-Replication-Get-Changes-All'\n  '89e95b76-444d-4c62-991a-0facbeda640c' = 'DS-Replication-Get-Changes-In-Filtered-Set'\n  '00000000-0000-0000-0000-000000000000' = 'Tous les droits etendus'\n}\n(Get-Acl \"AD:\\DC=test,DC=local\").Access |\n  Where-Object { $droits.ContainsKey($_.ObjectType.ToString()) -and\n                 $_.ActiveDirectoryRights -match 'ExtendedRight|GenericAll' } |\n  Select-Object IdentityReference, AccessControlType,\n                @{n='Droit';e={$droits[$_.ObjectType.ToString()]}}<\/code><\/pre>\n<h2>Pr\u00e9sentation de la maquette<\/h2>\n<p>Nom du domaine: test.local (TESTLOCAL)<\/p>\n<p>Contr\u00f4leurs de domaine: dc01.test.local (192.168.0.101) et dc02.test.local (192.168.0.102)<\/p>\n<p>Serveur membre: srv01.test.local (192.168.0.110)<\/p>\n<p>Compte de test: svc.audit@test.local, objet cibl\u00e9: utilisateur.test<\/p>\n<p>Pour reproduire l&rsquo;appel sans compte d&rsquo;administration, nous d\u00e9l\u00e9guons les deux droits au compte svc.audit, puis nous activons l&rsquo;audit des acc\u00e8s au service d&rsquo;annuaire sur les contr\u00f4leurs (une GPO sur l&rsquo;OU Domain Controllers est pr\u00e9f\u00e9rable \u00e0 auditpol en production):<\/p>\n<pre class=\"wp-block-code\"><code>dsacls \"DC=test,DC=local\" \/G \"TESTLOCAL\\svc.audit:CA;Replicating Directory Changes\"\ndsacls \"DC=test,DC=local\" \/G \"TESTLOCAL\\svc.audit:CA;Replicating Directory Changes All\"\n\nauditpol \/set \/subcategory:\"Directory Service Access\" \/success:enable<\/code><\/pre>\n<p>La capture se fait sur dc01, avec Wireshark ou nativement avec netsh trace comme d\u00e9crit dans l&rsquo;article <a href=\"https:\/\/remivernier.com\/index.php\/2018\/07\/21\/outils-danalyse-reseau\/\">Outils d&rsquo;analyse r\u00e9seau<\/a>. Pour d\u00e9chiffrer le trafic de svc.audit, nous g\u00e9n\u00e9rons un keytab avec ktpass, comme dans l&rsquo;article sur <a href=\"https:\/\/remivernier.com\/index.php\/2018\/09\/16\/exploration-des-entetes-http-www-authenticate\/\">les ent\u00eates WWW-Authenticate<\/a>:<\/p>\n<pre class=\"wp-block-code\"><code>ktpass \/out svc.audit.keytab \/princ svc.audit@TEST.LOCAL \/pass * \/ptype KRB5_NT_PRINCIPAL \/crypto All<\/code><\/pre>\n<p>Attention, sans \/mapuser: avec cette option, ktpass modifie le compte dans l&rsquo;annuaire. Ici nous voulons seulement calculer les cl\u00e9s \u00e0 partir du mot de passe.<\/p>\n<h2>GetNCChanges sur le r\u00e9seau<\/h2>\n<p>Commen\u00e7ons par une r\u00e9plication tout \u00e0 fait normale. Sur dc01, nous for\u00e7ons une r\u00e9plication entrante depuis dc02:<\/p>\n<pre class=\"wp-block-code\"><code>repadmin \/replicate dc01.test.local dc02.test.local DC=test,DC=local<\/code><\/pre>\n<p>Avec le filtre d&rsquo;affichage \u00ab drsuapi \u00bb, la s\u00e9quence est toujours la m\u00eame: r\u00e9solution du port dynamique via l&rsquo;Endpoint Mapper (tcp\/135), bind sur l&rsquo;interface DRSUAPI, DsBind (opnum 0), puis DsGetNCChanges (opnum 3). Le contenu, lui, n&rsquo;est pas lisible:<\/p>\n<pre class=\"wp-block-code\"><code>DCE\/RPC Request, Fragment: Single, FragLen: 1172, Call: 3, Ctx: 0\n    Opnum: 3\n    Auth Info: SPNEGO, Packet privacy, AuthContextId(0)\n        Auth type: SPNEGO (9)\n        Auth level: Packet privacy (6)\n    Encrypted stub data: 8f3a61c2e07d...\nDRSUAPI\n    Operation: DsGetNCChanges (3)<\/code><\/pre>\n<p>La r\u00e9plication utilise le niveau d&rsquo;authentification Packet privacy (6): seul le stub est chiffr\u00e9. L&rsquo;en-t\u00eate DCE\/RPC, avec l&rsquo;opnum, reste en clair, de m\u00eame que les adresses IP.<\/p>\n<p>-> Sans aucune cl\u00e9, un capteur r\u00e9seau sait donc qui appelle GetNCChanges et sur quel contr\u00f4leur. C&rsquo;est sur ce signal que s&rsquo;appuient les sondes NDR.<\/p>\n<p>Passons \u00e0 srv01. Apr\u00e8s un \u00ab klist purge \u00bb pour que la capture contienne l&rsquo;AS-REQ, nous lan\u00e7ons sous l&rsquo;identit\u00e9 de svc.audit un outil d&rsquo;audit de mots de passe qui impl\u00e9mente le client DRSUAPI (le module DSInternals de Michael Grafnetter, con\u00e7u pour l&rsquo;audit de la qualit\u00e9 des mots de passe), en ne demandant que l&rsquo;objet utilisateur.test. Le sch\u00e9ma ci dessous reprend les \u00e9changes observ\u00e9s c\u00f4t\u00e9 dc01, avec en bas la r\u00e9plication l\u00e9gitime de dc02 pour comparaison.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 480\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<defs>\n<marker id=\"fl\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><path d=\"M0,0 L10,4 L0,8 z\" fill=\"#333\"\/><\/marker>\n<\/defs>\n<rect x=\"30\" y=\"20\" width=\"130\" height=\"44\" fill=\"#e8f0fe\" stroke=\"#333\"\/>\n<text x=\"95\" y=\"40\" text-anchor=\"middle\" font-size=\"14\">srv01<\/text>\n<text x=\"95\" y=\"56\" text-anchor=\"middle\">svc.audit<\/text>\n<rect x=\"365\" y=\"20\" width=\"130\" height=\"44\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"430\" y=\"40\" text-anchor=\"middle\" font-size=\"14\">dc01<\/text>\n<text x=\"430\" y=\"56\" text-anchor=\"middle\">KDC + DRSUAPI<\/text>\n<rect x=\"585\" y=\"20\" width=\"110\" height=\"44\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"640\" y=\"47\" text-anchor=\"middle\" font-size=\"14\">dc02<\/text>\n<line x1=\"95\" y1=\"64\" x2=\"95\" y2=\"460\" stroke=\"#333\" stroke-dasharray=\"4,4\"\/>\n<line x1=\"430\" y1=\"64\" x2=\"430\" y2=\"460\" stroke=\"#333\" stroke-dasharray=\"4,4\"\/>\n<line x1=\"640\" y1=\"64\" x2=\"640\" y2=\"460\" stroke=\"#333\" stroke-dasharray=\"4,4\"\/>\n<line x1=\"95\" y1=\"100\" x2=\"428\" y2=\"100\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"94\" text-anchor=\"middle\">AS-REQ \/ TGS-REQ (Kerberos, tcp\/88)<\/text>\n<line x1=\"430\" y1=\"130\" x2=\"97\" y2=\"130\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"124\" text-anchor=\"middle\">AS-REP \/ TGS-REP<\/text>\n<line x1=\"95\" y1=\"165\" x2=\"428\" y2=\"165\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"159\" text-anchor=\"middle\">EPM tcp\/135: Map DRSUAPI<\/text>\n<line x1=\"430\" y1=\"195\" x2=\"97\" y2=\"195\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"189\" text-anchor=\"middle\">port dynamique 49xxx<\/text>\n<line x1=\"95\" y1=\"230\" x2=\"428\" y2=\"230\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"224\" text-anchor=\"middle\">Bind e3514235-\u2026 (Packet privacy)<\/text>\n<line x1=\"95\" y1=\"262\" x2=\"428\" y2=\"262\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"256\" text-anchor=\"middle\">DsBind (opnum 0)<\/text>\n<line x1=\"95\" y1=\"294\" x2=\"428\" y2=\"294\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"288\" text-anchor=\"middle\">DsCrackNames (opnum 12)<\/text>\n<line x1=\"95\" y1=\"326\" x2=\"428\" y2=\"326\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"320\" text-anchor=\"middle\">DsGetNCChanges (opnum 3) EXOP_REPL_OBJ<\/text>\n<line x1=\"430\" y1=\"360\" x2=\"97\" y2=\"360\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"262\" y=\"354\" text-anchor=\"middle\">unicodePwd, supplementalCredentials\u2026<\/text>\n<rect x=\"445\" y=\"290\" width=\"180\" height=\"50\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"535\" y=\"311\" text-anchor=\"middle\">Journal S\u00e9curit\u00e9 dc01<\/text>\n<text x=\"535\" y=\"328\" text-anchor=\"middle\">4662 Control Access<\/text>\n<line x1=\"640\" y1=\"420\" x2=\"432\" y2=\"420\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"536\" y=\"412\" text-anchor=\"middle\">opnum 3 (compte dc02$)<\/text>\n<\/svg><figcaption>Appel DRSUAPI depuis srv01 et r\u00e9plication l\u00e9gitime depuis dc02, vus depuis dc01<\/figcaption><\/figure>\n<p>Dans Wireshark, \u00ab Edit \/ Preferences \/ Protocols \/ KRB5 \u00bb, nous cochons \u00ab Try to decrypt Kerberos blobs \u00bb et indiquons svc.audit.keytab. La cl\u00e9 de svc.audit ouvre l&rsquo;AS-REP, Wireshark y apprend la cl\u00e9 de session du TGT, puis celle du ticket de service dans le TGS-REP, et enfin la cl\u00e9 qui prot\u00e8ge le contexte RPC. Le stub de la requ\u00eate devient lisible (extrait simplifi\u00e9, les libell\u00e9s varient un peu selon la version de Wireshark):<\/p>\n<pre class=\"wp-block-code\"><code>DRSUAPI, DsGetNCChanges\n    Operation: DsGetNCChanges (3)\n    bind_handle: 0000000057c1e2a4...\n    level: 8\n    DsGetNCChangesRequest8\n        destination_dsa_guid: 9f2c4b1e-...\n        naming_context\n            dn: CN=utilisateur.test,CN=Users,DC=test,DC=local\n        extended_op: DRSUAPI_EXOP_REPL_OBJ (6)<\/code><\/pre>\n<p>La diff\u00e9rence avec la r\u00e9plication de dc02 saute aux yeux: un contr\u00f4leur de domaine demande les changements d&rsquo;un contexte de nommage entier \u00e0 partir de son vecteur de mise \u00e0 jour, alors qu&rsquo;ici la requ\u00eate vise un seul objet avec l&rsquo;op\u00e9ration \u00e9tendue EXOP_REPL_OBJ.<\/p>\n<p>Dans la r\u00e9ponse, nous retrouvons l&rsquo;objet avec ses attributs identifi\u00e9s par leur ATTRTYP: 0x0009005A (unicodePwd), 0x0009005E (ntPwdHistory), 0x0009007D (supplementalCredentials). Leurs valeurs restent opaques, car MS-DRSR chiffre une seconde fois les attributs secrets avec une cl\u00e9 d\u00e9riv\u00e9e de la cl\u00e9 de session RPC. Pour une analyse apr\u00e8s incident, la capture suffit pourtant \u00e0 savoir quels comptes ont \u00e9t\u00e9 r\u00e9pliqu\u00e9s et quels secrets sont partis.<\/p>\n<p>Attention: le d\u00e9chiffrement n&rsquo;est pas toujours complet. Le ticket <a href=\"https:\/\/gitlab.com\/wireshark\/wireshark\/-\/issues\/19699\">#19699<\/a> du projet Wireshark d\u00e9crit des paquets DRSUAPI qui restent chiffr\u00e9s alors que les \u00e9changes Kerberos le sont. Pour aller plus loin, <a href=\"https:\/\/archives.pass-the-salt.org\/Pass%20the%20SALT\/2023\/slides\/PTS2023-Talk-20-Decrypt_Kerberos_NTLM_with_Wireshark.pdf\">les supports de Pass the SALT 2023<\/a> sur le d\u00e9chiffrement Kerberos et NTLM dans Wireshark pr\u00e9sentent tr\u00e8s bien la m\u00e9thode, DRSUAPI compris. Le keytab contient l&rsquo;\u00e9quivalent du mot de passe de svc.audit: il se supprime d\u00e8s la fin de l&rsquo;analyse.<\/p>\n<h2>Ce que voit le d\u00e9fenseur<\/h2>\n<p>Sur dc01, chaque appel produit un \u00e9v\u00e9nement 4662 dans le journal de s\u00e9curit\u00e9:<\/p>\n<pre class=\"wp-block-code\"><code>An operation was performed on an object.\nSubject:\n    Security ID:     TESTLOCAL\\svc.audit\n    Account Name:    svc.audit\n    Logon ID:        0x5A3F21\nObject:\n    Object Server:   DS\n    Object Type:     %{19195a5b-6da0-11d0-afd3-00c04fd930c9}\n    Object Name:     %{4c1f6d3a-...}\nOperation:\n    Accesses:        Control Access\n    Access Mask:     0x100\n    Properties:      Control Access\n                     {1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}\n                     {19195a5b-6da0-11d0-afd3-00c04fd930c9}<\/code><\/pre>\n<p>Object Type est la classe domainDNS, Object Name le GUID de l&rsquo;objet domaine (pas son DN), le masque 0x100 indique un contr\u00f4le d&rsquo;acc\u00e8s \u00e9tendu et Properties contient le GUID du droit v\u00e9rifi\u00e9. Cet \u00e9v\u00e9nement n&rsquo;appara\u00eet que si la sous-cat\u00e9gorie \u00ab Audit Directory Service Access \u00bb est activ\u00e9e en succ\u00e8s, ce qui <a href=\"https:\/\/blog.blacklanternsecurity.com\/p\/detecting-dcsync\">n&rsquo;est pas le cas par d\u00e9faut<\/a>, et si la SACL de la racine du domaine contient une entr\u00e9e d&rsquo;audit qui couvre ces droits. V\u00e9rifiez cette SACL sur votre propre domaine plut\u00f4t que de la supposer.<\/p>\n<p>La r\u00e9plication normale de dc02 produit le m\u00eame \u00e9v\u00e9nement, sous le compte dc02$. La tentation est d&rsquo;exclure tous les comptes qui finissent par \u00ab $ \u00bb, mais cirosec rappelle qu&rsquo;un attaquant peut op\u00e9rer avec l&rsquo;identit\u00e9 d&rsquo;un compte machine de contr\u00f4leur de domaine, par exemple apr\u00e8s un relais vers AD CS (ESC8). Je pr\u00e9f\u00e8re exclure uniquement les comptes des contr\u00f4leurs connus, puis rapprocher le Logon ID de l&rsquo;\u00e9v\u00e9nement 4624 correspondant (champ TargetLogonId, type 3) pour obtenir l&rsquo;adresse IP source:<\/p>\n<pre class=\"wp-block-code\"><code>$droits = '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2','1131f6ad-9c07-11d1-f79f-00c04fc2dcd2','89e95b76-444d-4c62-991a-0facbeda640c'\n$dcs = (Get-ADDomainController -Filter *).Name | ForEach-Object { \"$_`$\" }\nGet-WinEvent -FilterHashtable @{LogName='Security'; Id=4662} | ForEach-Object {\n    $d = @{}; ([xml]$_.ToXml()).Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }\n    [pscustomobject]@{ Heure=$_.TimeCreated; Compte=$d.SubjectUserName; LogonId=$d.SubjectLogonId; Props=$d.Properties }\n} | Where-Object { $p = $_.Props; ($droits | Where-Object { $p -match $_ }) -and ($dcs -notcontains $_.Compte) }<\/code><\/pre>\n<p>C\u00f4t\u00e9 r\u00e9seau, le filtre \u00ab drsuapi &amp;&amp; dcerpc.opnum == 3 &amp;&amp;!(ip.src in {192.168.0.101 192.168.0.102}) \u00bb isole les appels GetNCChanges qui ne viennent pas d&rsquo;un contr\u00f4leur. Sur la maquette, il ne reste que srv01. En production il restera aussi le serveur Entra Connect: c&rsquo;est une exception \u00e0 documenter.<\/p>\n<p>Ces deux signaux comptent parce que, vu de l&rsquo;annuaire, un DCSync n&rsquo;a rien d&rsquo;une attaque. Le sc\u00e9nario type commence par un poste compromis, se poursuit par une \u00e9l\u00e9vation vers l&rsquo;un des comptes inventori\u00e9s plus haut (souvent le compte MSOL_ sur un serveur Entra Connect moins prot\u00e9g\u00e9 que les contr\u00f4leurs, ou un compte qui a WriteDacl sur la racine), puis se termine par une seule requ\u00eate qui rapporte la cl\u00e9 de krbtgt. \u00c0 partir de l\u00e0, l&rsquo;attaquant forge des tickets pour n&rsquo;importe quel compte, r\u00e9utilise les hashs NT de tous les utilisateurs, r\u00e9cup\u00e8re les cl\u00e9s des comptes d&rsquo;approbation pour passer dans les for\u00eats approuv\u00e9es et la cl\u00e9 du compte AZUREADSSOACC$ pour rejouer Seamless SSO vers Entra ID. Il n&rsquo;y a rien \u00e0 r\u00e9voquer c\u00f4t\u00e9 session: il faut r\u00e9initialiser deux fois le mot de passe de krbtgt en laissant la r\u00e9plication se faire entre les deux, puis ceux des comptes de service, d&rsquo;approbation et d&rsquo;AZUREADSSOACC$.<\/p>\n<p>Attention, un attaquant qui veut revenir plus tard ajoute souvent une ACE de r\u00e9plication \u00e0 un compte discret. La sous-cat\u00e9gorie \u00ab Audit Directory Service Changes \u00bb produit alors un \u00e9v\u00e9nement 5136 sur la modification de nTSecurityDescriptor de la racine du domaine, et le script d&rsquo;inventaire de la premi\u00e8re partie, lanc\u00e9 r\u00e9guli\u00e8rement, le fera appara\u00eetre.<\/p>\n<p>Pour le durcissement, il faut r\u00e9duire la liste des d\u00e9tenteurs au strict n\u00e9cessaire, traiter le serveur Entra Connect comme un contr\u00f4leur de domaine (tier 0) et, si votre parc le permet, poser un filtre RPC sur l&rsquo;interface DRSUAPI et l&rsquo;opnum 3 qui n&rsquo;autorise que les contr\u00f4leurs et le serveur Entra Connect, comme le d\u00e9taille <a href=\"https:\/\/blog.nviso.eu\/2023\/12\/08\/rpc-or-not-here-we-log-preventing-exploitation-and-abuse-with-rpc-firewall\/\">NVISO<\/a>. Sur la maquette, il ne reste plus qu&rsquo;\u00e0 retirer les droits de svc.audit:<\/p>\n<pre class=\"wp-block-code\"><code>dsacls \"DC=test,DC=local\" \/R \"TESTLOCAL\\svc.audit\"<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>DCSync vu de l&rsquo;int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.<\/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":[166,136,162,164,165,163,49],"class_list":["post-1316","post","type-post","status-publish","format-standard","hentry","category-active-directory","category-kerberos","category-securite","tag-166","tag-active-directory","tag-dcsync","tag-drsuapi","tag-getncchanges","tag-ms-drsr","tag-wireshark"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER<\/title>\n<meta name=\"description\" content=\"DCSync vu de l&#039;int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.\" \/>\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\/11\/dcsync-replication-ms-drsr-wireshark\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER\" \/>\n<meta property=\"og:description\" content=\"DCSync vu de l&#039;int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e9mi VERNIER\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-11T16:30:00+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=\"11 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\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/\"},\"author\":{\"name\":\"R\u00e9mi\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"headline\":\"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark\",\"datePublished\":\"2026-11-11T16:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/\"},\"wordCount\":1863,\"commentCount\":0,\"keywords\":[\"4662\",\"active directory\",\"dcsync\",\"drsuapi\",\"getncchanges\",\"ms-drsr\",\"wireshark\"],\"articleSection\":[\"Active Directory\",\"Kerberos\",\"S\u00e9curit\u00e9\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/\",\"url\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/\",\"name\":\"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\"},\"datePublished\":\"2026-11-11T16:30:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"description\":\"DCSync vu de l'int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/dcsync-replication-ms-drsr-wireshark\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/remivernier.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DCSync: lire la r\u00e9plication MS-DRSR 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":"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER","description":"DCSync vu de l'int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.","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\/11\/dcsync-replication-ms-drsr-wireshark\/","og_locale":"fr_FR","og_type":"article","og_title":"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER","og_description":"DCSync vu de l'int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.","og_url":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/","og_site_name":"R\u00e9mi VERNIER","article_published_time":"2026-11-11T16:30:00+00:00","author":"R\u00e9mi","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"R\u00e9mi","Dur\u00e9e de lecture estim\u00e9e":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/#article","isPartOf":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/"},"author":{"name":"R\u00e9mi","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"headline":"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark","datePublished":"2026-11-11T16:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/"},"wordCount":1863,"commentCount":0,"keywords":["4662","active directory","dcsync","drsuapi","getncchanges","ms-drsr","wireshark"],"articleSection":["Active Directory","Kerberos","S\u00e9curit\u00e9"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/","url":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/","name":"DCSync: lire la r\u00e9plication MS-DRSR dans Wireshark - R\u00e9mi VERNIER","isPartOf":{"@id":"https:\/\/remivernier.com\/#website"},"datePublished":"2026-11-11T16:30:00+00:00","author":{"@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"description":"DCSync vu de l'int\u00e9rieur: droits de r\u00e9plication, appel DRSUAPI GetNCChanges d\u00e9chiffr\u00e9 dans Wireshark et \u00e9v\u00e9nement 4662 sur le contr\u00f4leur de domaine.","breadcrumb":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/dcsync-replication-ms-drsr-wireshark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/remivernier.com\/"},{"@type":"ListItem","position":2,"name":"DCSync: lire la r\u00e9plication MS-DRSR 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\/1316","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=1316"}],"version-history":[{"count":1,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1316\/revisions"}],"predecessor-version":[{"id":1320,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1316\/revisions\/1320"}],"wp:attachment":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}