Part 2 of the secure LDAP series about domain controller password exposure
|

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

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

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

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

find each before they break

๐—ง๐—ต๐—ถ๐˜€ ๐—ถ๐˜€ ๐—ฃ๐—ฎ๐—ฟ๐˜ ๐Ÿฎ ๐—ผ๐—ณ ๐—ฎ ๐Ÿฒ-๐—ฝ๐—ฎ๐—ฟ๐˜ ๐˜€๐—ฒ๐—ฟ๐—ถ๐—ฒ๐˜€.

Full series:

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?

Find Cleartext LDAP Binds Before They Break supporting illustration

๐—ฅ๐—ฒ๐—ณ๐—ฒ๐—ฟ๐—ฒ๐—ป๐—ฐ๐—ฒ๐˜€:

๐—š๐—น๐—ผ๐˜€๐˜€๐—ฎ๐—ฟ๐˜†

  • 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

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *