Navigateur LDAP¶
Reconnaissance Active Directory via relais de beacon LDAP. Le navigateur LDAP permet aux opérateurs d'exécuter des requêtes LDAP arbitraires sur des contrôleurs de domaine à l'aide de la session authentifiée d'un beacon : aucun accès direct au réseau depuis le poste de travail de l'opérateur n'est requis.
Toutes les requêtes sont distribuées sous forme de tâches discovery au beacon sélectionnée, qui effectue la liaison et la recherche LDAP en utilisant son contexte de sécurité actuel. Les résultats sont renvoyés via le pipeline d'interrogation de tâches normal et affichés dans l'interface utilisateur.
Beacons Windows uniquement
Les requêtes LDAP nécessitent un beacon Windows avec un accès réseau à un contrôleur de domaine. Le sélecteur de beacons dans l’interface utilisateur filtre automatiquement les beacons Windows. Les beacons non Windows ne peuvent pas exécuter de requêtes LDAP.
Architecture¶
sequenceDiagram
participant Operator as Operator UI
participant API as Stentor API
participant Queue as Task Queue
participant Beacon as Beacon (Windows)
participant DC as Domain Controller
Operator->>API: POST /cockpit/ldap/query
API->>Queue: Enqueue discovery task (ldap_query)
API-->>Operator: {task_id, status: "queued"}
Beacon->>Queue: Poll for tasks
Queue-->>Beacon: ldap_query task
Beacon->>DC: LDAP search (authenticated bind)
DC-->>Beacon: LDAP result entries
Beacon->>API: Submit task result
Operator->>API: Poll GET /cockpit/beacons/:id/tasks
API-->>Operator: Completed task with LDAPQueryResult Présentation de l'interface utilisateur¶
La page Navigateur LDAP (/ldap) fournit une interface à trois onglets :
| Onglet | Objectif |
|---|---|
| Parcourir | Vue arborescente pour naviguer dans la structure des répertoires AD. L'expansion d'un nœud interroge un niveau d'enfants à l'aide de scope: onelevel. Cliquez sur un nœud pour remplir le champ DN de base dans l'onglet Requête. |
| Requête | Éditeur de filtre LDAP personnalisé avec DN de base, portée et liste d'attributs configurables. Les résultats s'affichent dans un tableau triable avec des colonnes de DN et d'attributs. |
| Modèles | Modèles de requêtes d'équipe rouge prédéfinis organisés par catégorie ATT&CK. La sélection d'un modèle remplit l'onglet Requête avec le filtre et les attributs du modèle. |
Sélecteur de beacon¶
Une liste déroulante en haut de la page répertorie toutes les beacons Windows actives. Chaque entrée affiche le nom d'hôte, le nom d'utilisateur et l'adresse IP. La sélection d'un beacon la définit comme cible pour toutes les requêtes ultérieures.
Tableau des résultats¶
Les résultats de la requête sont affichés sous forme de tableau avec des colonnes pour chaque attribut demandé. Le résultat inclut des métadonnées :
| Champ | Type | Description |
|---|---|---|
entries | tableau | Tableau d'entrées LDAP, chacune avec dn et attributes |
count | int | Nombre total d'entrées renvoyées |
truncated | bool | Si l'ensemble de résultats a été tronqué par max_results |
base_dn | chaîne | Le DN de base utilisé pour la requête |
filter | chaîne | Le filtre LDAP qui a été exécuté |
Exécuter une requête LDAP¶
POST /api/v1/cockpit/ldap/query¶
Mettez en file d’attente une tâche de requête LDAP sur un beacon. Le beacon exécute la requête sur son contrôleur de domaine accessible et renvoie les résultats via le pipeline de tâches.
Corps de la demande :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
beacon_id | chaîne | Oui | UUID du beacon cible |
base_dn | chaîne | Oui | Base de recherche LDAP (par exemple, DC=corp,DC=local) |
filter | chaîne | Oui | Expression de filtre LDAP |
attributes | chaîne[] | Non | Attributs à renvoyer (vide = tous les attributs) |
scope | chaîne | Non | Portée de la recherche : base, onelevel ou subtree (par défaut : subtree) |
dc | chaîne | Non | Nom d'hôte ou adresse IP du contrôleur de domaine cible |
domain | chaîne | Non | Nom de domaine cible |
max_results | int | Non | Nombre maximum d'entrées à retourner |
Exemple : énumérez tous les ordinateurs du domaine :
curl -s -X POST https://stentor.app/api/v1/cockpit/ldap/query \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"beacon_id": "BEACON_UUID",
"base_dn": "DC=corp,DC=local",
"filter": "(objectCategory=computer)",
"attributes": ["sAMAccountName", "dNSHostName", "operatingSystem", "lastLogonTimestamp"],
"scope": "subtree",
"max_results": 500
}'
Réponse :
Le résultat est récupéré en interrogeant la liste des tâches du beacon (GET /api/v1/cockpit/beacons/:beacon_id/tasks) jusqu'à ce que l'état de la tâche passe à completed. La sortie de la tâche contient le LDAPQueryResult JSON.
Syntaxe du filtre LDAP¶
Stentor transmet les filtres directement à l'implémentation LDAP du contrôleur de domaine. La syntaxe de filtre standard RFC 4515 est prise en charge.
| Opérateur | Syntaxe | Exemple |
|---|---|---|
| Égalité | (attribute=value) | (sAMAccountName=admin) |
| Présence | (attribute=*) | (servicePrincipalName=*) |
| Sous-chaîne | (attribute=*value*) | (description=*admin*) |
| ET | (&(filter1)(filter2)) | (&(objectClass=user)(adminCount=1)) |
| OU | (|(filtre1)(filtre2)) | (|(objectClass=utilisateur)(objectClass=ordinateur)) |
| PAS | (!(filter)) | (!(userAccountControl:1.2.840.113556.1.4.803:=2)) |
| ET au niveau du bit | (attr:1.2.840.113556.1.4.803:=value) | Correspondance du drapeau UAC |
| Chaîne (LDAP_MATCHING_RULE_IN_CHAIN) | (attr:1.2.840.113556.1.4.1941:=value) | Appartenance récursive à un groupe |
Correspondance au niveau du bit
L'OID 1.2.840.113556.1.4.803 effectue un ET au niveau du bit par rapport à la valeur de l'attribut. Ceci est essentiel pour les vérifications du drapeau userAccountControl. Par exemple, (userAccountControl:1.2.840.113556.1.4.803:=2) correspond aux comptes pour lesquels l'indicateur ACCOUNTDISABLE (bit 2) est défini.
Portée de la recherche¶
| Portée | Comportement |
|---|---|
base | Seul l'objet spécifié par Base DN est renvoyé |
onelevel | Enfants directs de la base DN (un niveau de profondeur) |
subtree | DN de base et tous les descendants de manière récursive (par défaut) |
L'onglet Parcourir utilise la portée onelevel pour développer les nœuds d'arborescence un niveau à la fois, en interrogeant avec (objectClass=*) et en demandant les attributs objectClass, name et description.
Modèles de requête prédéfinis¶
GET /api/v1/cockpit/ldap/templates¶
Renvoie l'ensemble statique de modèles de requête LDAP prédéfinis. Les modèles sont mis en cache dans l'interface utilisateur pendant 10 minutes.
Champs de réponse du modèle :
| Champ | Type | Description |
|---|---|---|
id | chaîne | Identifiant du modèle |
name | chaîne | Nom lisible par l'homme |
description | chaîne | Ce que trouve la requête |
category | chaîne | Catégorie ATT&CK (credential-access, lateral-movement, discovery, etc.) |
filter | chaîne | Expression de filtre LDAP |
attributes | chaîne[] | Attributs à retourner |
base_dn_suffix | chaîne | Remplacement facultatif du DN de base (utilise l'espace réservé {baseDN}) |
Modèles disponibles¶
| Modèle | Description | Filtrer |
|---|---|---|
| Utilisateurs Kerberoastables | Comptes d'utilisateurs avec des SPN définis (cibles Kerberoasting) | (&(objectCategory=person)(objectClass=user)(servicePrincipalName=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) |
| Utilisateurs de torréfaction AS-REP | Comptes sans pré-authentification Kerberos | (&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304)) |
| Mots de passe LAPS | Ordinateurs avec mots de passe LAPS (nécessite un accès en lecture) | (ms-Mcs-AdmPwd=*) |
| Modèle | Description | Filtrer |
|---|---|---|
| Délégation sans contrainte | Ordinateurs/utilisateurs approuvés pour une délégation sans contrainte | (&(userAccountControl:1.2.840.113556.1.4.803:=524288)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) |
| Délégation contrainte | Objets avec délégation contrainte configurés | (msDS-AllowedToDelegateTo=*) |
| Modèle | Description | Filtrer |
|---|---|---|
| Tous les administrateurs de domaine | Membres des administrateurs de domaine (récursif) | (&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Domain Admins,CN=Users,{baseDN})) |
| Tous les ordinateurs | Tous les objets informatiques du domaine | (objectCategory=computer) |
| Liste des objets de stratégie de groupe | Tous les objets de stratégie de groupe | (objectClass=groupPolicyContainer) |
| Objets de confiance | Relations d'approbation de domaine | (objectClass=trustedDomain) |
| Modèle | Description | Filtrer |
|---|---|---|
| AdminSDHolder protégé | Objets avec adminCount=1 (AdminSDHolder protégé) | (&(adminCount=1)(objectCategory=person)(objectClass=user)) |
| Candidats DCShadow | Contrôleurs de domaine (cibles potentielles de DCShadow) | (&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192)) |
Considérations OPSEC¶
Surface de détection
Les requêtes LDAP génèrent Événement de sécurité Windows 1644 (recherche LDAP terminée) sur les contrôleurs de domaine lorsque la journalisation des diagnostics de recherches coûteuses est activée. Les requêtes LDAP volumineuses ou inhabituelles (par exemple, énumération de tous les SPN) peuvent déclencher des règles de corrélation SIEM.
- MITRE ATT&CK : T1018 (Découverte du système à distance), T1069 (Découverte des groupes d'autorisations)
- Sources d'événements : Événement de sécurité Windows 4662 (accès aux objets d'annuaire), événement 1644 (statistiques de requête LDAP)
| Préoccupation | Atténuation |
|---|---|
| Volume de requête | Utilisez max_results pour limiter les jeux de résultats. Évitez l’énumération complète des sous-arborescences dans les environnements surveillés. |
| Modèles de requête | Les requêtes Kerberoastable/AS-REP sont des signatures bien connues. Envisagez de diviser votre requête en plusieurs requêtes plus petites au fil du temps. |
| Liaison authentifiée | Les requêtes s'exécutent dans le contexte de sécurité du beacon. Le contrôleur de domaine enregistre l'utilisateur de liaison. |
| Trafic réseau | Le trafic LDAP circule de l'hôte du beacon vers le contrôleur de domaine, et non depuis le poste de travail de votre opérateur. Assurez-vous que le modèle d’accès au réseau du beacon est cohérent avec son identité de couverture. |
| Calendrier | Espacez les requêtes sur les cycles d’enregistrement des beacons. Les requêtes LDAP rapides provenant d’un seul hôte sont anormales. |
Réduire le bruit LDAP
Demandez uniquement les attributs dont vous avez besoin au lieu de renvoyer tous les attributs. Les listes d'attributs ciblés réduisent la taille des réponses et ressemblent davantage à des requêtes LDAP d'application légitimes. Utilisez la portée onelevel lorsque cela est possible au lieu de subtree.