Aller au contenu

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 :

{
  "task_id": "d4f8e2a1-...",
  "beacon_id": "BEACON_UUID",
  "status": "queued"
}

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.

curl -s https://stentor.app/api/v1/cockpit/ldap/templates \
  -H "Authorization: Bearer $TOKEN"

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.