AD-KRB-001: krbtgt password not rotated recently¶
high Kerberos MITRE ATT&CK T1558.001 Reads: LDAP
The krbtgt password is older than 180 days, so a stolen krbtgt key keeps forging valid Kerberos tickets (golden tickets) for that long.
Also known as: golden-ticket
Why it matters¶
Every Kerberos ticket-granting ticket (TGT) in the domain is encrypted and signed with
a key derived from the krbtgt account's password. Anyone who has that key can create
a TGT for any user, with any group memberships and any lifetime, without talking to a
domain controller first: a golden ticket.
The key leaks whenever the domain is compromised once: DCSync rights
(AD-ACL-001), a copy of ntds.dit from a backup or a DC disk, or code
execution on a DC. Resetting admin passwords afterwards does not help, because the
forged tickets do not depend on them. Only changing the krbtgt password, twice,
invalidates them, since the account keeps the previous password in its history and DCs
still accept tickets made with it.
A krbtgt password that has not changed for years means that any compromise in all
those years may still be live.
How ad-doctor detects it¶
From the LDAP snapshot: the account whose sAMAccountName is krbtgt, and when its
password was last set. That time is the older of pwdLastSet and the last write of
unicodePwd in replication metadata, because pwdLastSet can be moved forward
(AD-ACC-012). ad-doctor compares it with the time the snapshot was taken
and reports the account when the difference is more than 180 days. The finding
gives the age in days, for example:
The object is always krbtgt. The per-RODC accounts (krbtgt_12345) are not
examined. If neither time is readable, the check stays silent.
Attributes and probes read
sAMAccountNamepwdLastSetmsDS-ReplAttributeMetaData (unicodePwd)
Severity¶
Always high: the check fires only when the krbtgt password is more than 180 days
old, and every forged ticket made with a key stolen in that window still works.
False positives and limits¶
- A reset that happened very recently is not a false positive of the scan, but a snapshot taken on another DC before replication finished can still show the old date. Re-run the scan after replication.
- A single reset clears the finding while the previous key is still in the account's history. The check cannot tell whether you reset once or twice; follow the remediation fully.
Fix¶
-
Check the current age (read-only):
-
Reset the password once. The value you type does not matter: the DC generates a strong random password for
krbtgtitself. Microsoft'sNew-KrbtgtKeys.ps1script (see references) runs the same reset with replication checks and has a simulation mode. With the AD module: -
Wait until the change has replicated to every DC and at least the maximum ticket lifetime has passed (10 hours by default), so that no valid ticket still depends on the old key.
-
Reset it a second time. This pushes the compromised key out of the password history, so tickets forged with it stop working.
-
Schedule it. Rotate the
krbtgtpassword at least every 180 days, and immediately (twice, with the wait) after any suspected domain compromise.
Verify¶
To accept the risk instead, add an entry to the file passed with --accept (see accepted risks):
[[accept]]
check = "AD-KRB-001"
objects = ["..."] # optional; without it the whole check is accepted
reason = "..."
expires = 2027-03-31
Related checks¶
References¶
Microsoft and vendors
Research
- Kerberos & KRBTGT: Active Directory's Domain Kerberos Service Account (Sean Metcalf)
- Kerberos Golden Tickets are Now More Golden (Sean Metcalf)
Tools
MITRE ATT&CK
Available since 0.1.0.