Two critical remote code execution bugs this week: PHP2Shell, GitLab (CVSS 10). Patch them first.
But patch night isn't the end of it. When an app server gets popped, attackers often drop a webshell and look around. There's a high chance they're looking for Active Directory, because once they own AD they own pretty much everything else.
There's more than one way an app server can hand AD to an attacker:
1. LDAP sign-in. The app usually keeps a bind account in its config, and every password a user types passes through the app in clear text before it's checked.
2. AD service accounts, with the password in a config file or connection string.
3. Domain-joined servers, which can hold the credentials of admins who sign in interactively.
4. Unconstrained Kerberos delegation, which captures the tickets of users who connect.
5. And most of them need a network path to your domain controllers.
The long-term fix is to take these apps off AD and modernise how they authenticate, wherever you can:
- Move sign-in to Entra ID with OpenID Connect or SAML. The app gets a signed token, never a password, and Entra handles MFA, passkeys and Conditional Access. GitLab supports this today.
- Use managed identities or workload identity federation instead of passwords in config.
- Publish legacy Kerberos apps through Entra Private Access with Kerberos SSO.
- Remove the bind accounts you no longer need and firewall these servers off from your DCs.
The hard part is finding them. PHP hides inside intranet portals, help desks, wikis and appliances, often as an embedded runtime nobody owns. Defender for Identity flags services sending LDAP credentials in clear text, and Private Access application discovery shows which private apps people actually use.
None of this fixes the bugs. Patching does. But next time an app gets popped, it's a bad day for that app, not for your whole domain.
The video includes clips from Tarek Dawoud (Microsoft Security) and
@richardhicks from past
Entra.Chat episodes.