Is Your Domain Controller Leaking Passwords? (Part 2 of 6)
Part 2 of 6 ยท Moving Past LDAP Simple Bind
Landed here first? No problem – this one reads fine on its own. All you really need from the rest of the series is this: “securing LDAP” is three different jobs, not one – protecting the connection, proving the login, and locking down the account. This article is about why the old way of doing it quietly fails all three.
In Part 1, I argued that “fixing LDAP” is really three separate jobs – securing the data in transit (A), securing the authentication (B), and securing the account itself (C) – and that doing one does not do the other two. If you only have a second: a sealed tunnel around a reusable password on an over-privileged account is not secure. Hold that framing; this part shows you exactly where simple bind fails, sorted by those three concerns.
๐ช๐ต๐ฎ๐ ๐ฎ๐ฐ๐๐๐ฎ๐น๐น๐ ๐ด๐ผ๐ฒ๐ ๐๐ฟ๐ผ๐ป๐ด
Simple bind is one of two ways LDAP can authenticate (the other is SASL, which Part 4 covers). The client hands over a distinguished name or UPN and the account password directly. When that request is not wrapped in TLS, the password is on the wire in cleartext – readable by anything sitting on the network path.

The password is on the wire in cleartext, readable by anything
It helps to sort the usual failures by which concern each one belongs to, because that is precisely why no single fix covers them all.
๐ง๐ฟ๐ฎ๐ป๐๐ถ๐ ๐ฝ๐ฟ๐ผ๐ฏ๐น๐ฒ๐บ๐ (๐๐ผ๐ป๐ฐ๐ฒ๐ฟ๐ป ๐)
-
Cleartext credential exposure: on an unencrypted connection, anyone who can capture packets reads the password directly.
-
Man-in-the-middle: on plain port 389 the client does not verify a server certificate, so an attacker can impersonate the domain controller and harvest the bind.
-
No integrity protection: without signing, request and response contents can be altered in flight without anyone noticing.
๐๐๐๐ต๐ฒ๐ป๐๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฝ๐ฟ๐ผ๐ฏ๐น๐ฒ๐บ๐ (๐๐ผ๐ป๐ฐ๐ฒ๐ฟ๐ป ๐)
-
Credential relay and replay – a captured password bind can be reused against other services to impersonate the victim, because the password is reusable by design.
๐๐ฑ๐ฒ๐ป๐๐ถ๐๐ / ๐ฎ๐ฐ๐ฐ๐ผ๐๐ป๐ ๐ฝ๐ฟ๐ผ๐ฏ๐น๐ฒ๐บ๐ (๐๐ผ๐ป๐ฐ๐ฒ๐ฟ๐ป ๐)
-
Audit blind spots and over-privilege – service accounts doing simple binds are frequently shared and granted far more access than they need, which makes misuse both more damaging and harder to attribute.

A, B & C – 3 Failures
๐ช๐ต๐ฎ๐ ๐ฐ๐ต๐ฎ๐ป๐ด๐ฒ๐ฑ ๐ถ๐ป ๐ช๐ถ๐ป๐ฑ๐ผ๐๐ ๐ฆ๐ฒ๐ฟ๐๐ฒ๐ฟ ๐ฎ๐ฌ๐ฎ๐ฑ
Earlier Windows Server releases accepted unsigned LDAP and unprotected simple binds by default. Windows Server 2025 raises the floor for new deployments. It is worth being precise here, because there is a lot of loose information floating around on this one.
-
๐๐๐๐ฃ ๐๐ถ๐ด๐ป๐ถ๐ป๐ด ๐ถ๐ ๐ฟ๐ฒ๐พ๐๐ถ๐ฟ๐ฒ๐ฑ ๐ฏ๐ ๐ฑ๐ฒ๐ณ๐ฎ๐๐น๐ ๐ผ๐ป ๐ป๐ฒ๐ ๐ฑ๐ฒ๐ฝ๐น๐ผ๐๐บ๐ฒ๐ป๐๐. A new policy: Domain controller: LDAP server signing requirements enforcement ships unconfigured and behaves as “Require signing.” In practice the DC now rejects unsigned binds, which is what closes the relay and tampering exposure. An unprotected cleartext simple bind on port 389 is unsigned, so it fails too. (In-place upgrades preserve your existing setting rather than flipping this on.)
-
๐๐ต๐ฎ๐ป๐ป๐ฒ๐น ๐ฏ๐ถ๐ป๐ฑ๐ถ๐ป๐ด ๐ถ๐ ๐๐ต๐ฒ ๐ผ๐ป๐ฒ ๐๐ผ ๐๐ฒ๐ฟ๐ถ๐ณ๐, ๐ป๐ผ๐ ๐ฎ๐๐๐๐บ๐ฒ. This is exactly the loose information I warned about. Microsoft’s own documentation is inconsistent: one current Microsoft Learn page lists the 2025 default as “When supported,” while other Microsoft and independent sources say channel binding behavior did not change and remains “Never” until you configure it. What is not in dispute: signing is the control 2025 actually tightened, and channel binding is not “Always” by default either way – so enforcing it is still a choice you make. Confirm the live value on your specific build before relying on it.
-
๐ ๐๐ถ๐บ๐ฝ๐น๐ฒ ๐ฏ๐ถ๐ป๐ฑ ๐๐๐ถ๐น๐น ๐๐ผ๐ฟ๐ธ๐ ๐ถ๐ป๐๐ถ๐ฑ๐ฒ ๐ง๐๐ฆ. This is the subtlety that surprises people. Requiring signing does not ban simple bind; it bans the unsigned, cleartext one. A simple bind carried inside LDAPS or StartTLS is still accepted. (Part 6 returns to this with the controlled exception.)
๐๐ถ๐ป๐ฑ ๐๐ต๐ฒ ๐ฐ๐น๐ฒ๐ฎ๐ฟ๐๐ฒ๐ ๐ ๐ฏ๐ถ๐ป๐ฑ๐ ๐ฏ๐ฒ๐ณ๐ผ๐ฟ๐ฒ ๐๐ต๐ฒ๐ ๐ฏ๐ถ๐๐ฒ
Here is the most important practical step in the entire series, and it costs you nothing but patience: audit before you enforce. Turn on LDAP Interface Events on your existing DCs and watch the Directory Service log. Two events do the heavy lifting:
-
Event ID 2887: a periodic count of unsigned or cleartext simple binds received, so you know the scale.
-
Event ID 2889: names the client IP and the account behind each unsigned or cleartext bind. This is your remediation punch list.

Audit before enforcing
1. Raise LDAP Interface Events to level 2 on a DC:
reg add “HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics” /v “16 LDAP Interface Events” /t REG_DWORD /d 2 /f
2. Then mine the 2889 events for the offending clients and accounts:
Get-WinEvent -LogName ‘Directory Service’ | Where-Object { $_.Id -eq 2889 } | Select-Object TimeCreated, @{n=’Client’;e={$_.Properties[0].Value}}, @{n=’Identity’;e={$_.Properties[1].Value}}
Let it run for about 30 days, drive the relevant events toward zero through remediation, and only then enable enforcement – changing one setting at a time. Legacy clients, scanners, appliances, copiers, and home-grown scripts that do cleartext simple bind on port 389 will fail against a 2025 DC. The good news is you can find every one of them before they break.

find each before they break
๐ง๐ต๐ถ๐ ๐ถ๐ ๐ฃ๐ฎ๐ฟ๐ ๐ฎ ๐ผ๐ณ ๐ฎ ๐ฒ-๐ฝ๐ฎ๐ฟ๐ ๐๐ฒ๐ฟ๐ถ๐ฒ๐.
-
Previously: Part 1: Did You Really Secure LDAP – or Just One-Third of It? The three-jobs framing this series runs on.
-
Next: Part 3: Is Your “Encrypted” LDAP Actually Protected? We tackle Concern A properly: LDAPS, StartTLS, and the trap that makes “encrypted” quietly meaningless.
Full series:
-
Part 1 – Did You Really Secure LDAP – or Just One-Third of It?
-
Part 2: Is Your Domain Controller Leaking Passwords? (this article)
-
Part 6 – Are You Hoping Your LDAP Is Secure – or Do You Know?
Run the audit – were you surprised by what showed up in your 2889 events? Almost everyone is.
If you’re going to run that 2887/2889 audit this week, repost this so a peer runs theirs too – most teams have no idea what’s binding in cleartext until they look. Follow for Part 3, where “encrypted” turns out not to mean “protected.”
If this is making you want to check your own Directory Service logs โ good, that’s the point. Repost it so someone else checks theirs. Drop a comment when you’ve run it: were you surprised by what showed up?

๐ฅ๐ฒ๐ณ๐ฒ๐ฟ๐ฒ๐ป๐ฐ๐ฒ๐:
๐๐น๐ผ๐๐๐ฎ๐ฟ๐
-
Simple bind: an LDAP login that sends an account name and password directly. Safe inside TLS; risky in cleartext.
-
SASL: Simple Authentication and Security Layer; a standard “slot” in LDAP that lets a stronger login method plug in place of a password (covered in Part 4).
-
Distinguished name (DN) / UPN: two ways of naming the account logging in: the full directory path, or the user-principal-name form (user@domain).
-
TLS: Transport Layer Security; the encryption that wraps a connection so it cannot be read or altered in transit.
-
LDAPS / StartTLS: the two ways to put LDAP inside TLS: a dedicated secure port (LDAPS, 636), or an upgrade of the standard port (StartTLS, 389).
-
Signing: an integrity control that signs LDAP messages so tampering in transit is detected and rejected; an unsigned cleartext bind is what 2025 blocks.
-
Channel binding (CBT): a token that ties a login to the specific TLS session it was made in, so a captured login cannot be replayed onto another connection.
-
Relay / replay attack: capturing a valid authentication and reusing it against a different server to impersonate the victim.
-
Man-in-the-middle (MITM): an attacker on the network path who can read or alter traffic between client and server.
-
Domain controller (DC): the server that holds the directory and answers authentication requests.
-
Event ID 2887 / 2889: Directory Service log events: 2887 counts unsigned/cleartext binds; 2889 names the client and account behind each one.
#ActiveDirectory #LDAP #WindowsServer2025 #BlueTeam #IdentitySecurity
