BloodHound. Натаскиваем ищейку на поиск NTLM Relay

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

  • Описание проблемы
  • Анализ существующих решений
  • Добавляем атрибуты
  • Пишем запросы
  • Выводы

Преж­де чем при­менять тех­нику NTLM Relay, необ­ходимо соб­рать информа­цию об иссле­дуемом объ­екте и выб­рать пер­вооче­ред­ные цели. Но как это сде­лать, если ата­куемая сеть нас­читыва­ет мно­гие десят­ки или сот­ни узлов? На помощь при­дет очень полез­ный и удоб­ный инс­тру­мент — BloodHound!

info

Ре­комен­дуем начать зна­комс­тво с ата­ками NTLM Relay со ста­тей «Гид по NTLM Relay. Зах­ватыва­ем NTLM-аутен­тифика­цию для Relay-ата­ки» и «Гид по NTLM Relay, часть 2. Про­водим Relay-ата­ки».

 

Описание проблемы

С исполь­зовани­ем ата­ки NTLM Relay мож­но зах­ватить зачас­тую не одну машину, а иног­да даже весь домен. Такая ата­ка может быть край­не эффектив­ной, но сна­чала нуж­но качес­твен­но про­ана­лизи­ровать информа­цию об инте­ресу­ющей нас цели. Это нес­ложно, ког­да мы находим­ся в отно­ситель­но неболь­шом домене, но чем обширнее сетевая инфраструк­тура, тем труд­нее ста­новит­ся изу­чать вза­имос­вязи объ­ектов и выис­кивать пути повыше­ния при­виле­гий. Поп­робу­ем разоб­рать­ся, как про­водить качес­твен­ный ана­лиз в подоб­ных слу­чаях.

Для ана­лиза вза­имос­вязей был при­думан инс­тру­мент BloodHound. Со сво­ей работой он справ­ляет­ся неп­лохо, пред­став­ляет архи­тек­туру домена в виде гра­фа, ищет пути для повыше­ния при­виле­гий и про­чее. Но «из короб­ки» у него не очень мно­го прик­ладных воз­можнос­тей. Поэто­му полез­но будет научить­ся искать с помощью BloodHound необыч­ные век­торы, нап­ример для Relay-атак.

BloodHound наибо­лее эффекти­вен для ана­лиза сетей и доменов, нас­читыва­ющих сот­ни тысяч объ­ектов, десят­ки тысяч машин. С таким доменом край­не тяжело вза­имо­дей­ство­вать, некото­рые методы ана­лиза вооб­ще перес­тают работать.

Бы­вает, что ты можешь зах­ватить мно­го машин с помощью релея, но не зна­ешь, какую выб­рать для ата­ки. В этом слу­чае мож­но вос­поль­зовать­ся гра­фами для поис­ка самой инте­рес­ной цели.

Оче­вид­но, что так или ина­че тех­нику Relay-ата­ки мож­но наложить на теорию гра­фов, где машины — это вер­шины, а реб­ра — это воз­можные релеи, но вот с деталя­ми надо разоб­рать­ся.

 

Анализ существующих решений

Для начала заг­лянем в Google и поп­робу­ем най­ти готовые решения. При поис­ке кас­томных зап­росов для BloodHound мож­но нат­кнуть­ся на некото­рые наработ­ки, нап­ример:

  • ly4k/Certipy;
  • CompassSecurity/BloodHoundQueries;
  • hausec/BloodHound-Custom-Queries.

Имен­но для Relay-атак сущес­тву­ет нес­коль­ко кру­тых зап­росов, в час­тнос­ти для ESC8. С ним все дос­таточ­но прос­то: он выводит цен­тры сер­тифика­ции с вклю­чен­ным WebEnroll. На эти цен­тры сер­тифика­ции мож­но выпол­нить Relay-ата­ку, далее дело тех­ники.

Вто­рой зап­рос от CompassSecurity, более наворо­чен­ный, пред­назна­чен для поис­ка в сети компь­юте­ров, вхо­дящих в груп­пу локаль­ных адми­нис­тра­торов дру­гих машин. Выг­лядит он так:

{ "name": "Computers Local Admin to Another Computer", "category": "Relay", "queryList": [ { "final": false, "title": "Select a Domain...", "query": "MATCH (n:Domain) RETURN n.name ORDER BY n.name DESC" }, { "final": true, "query": "MATCH p = (c1:Computer {domain: $result})-[r1:AdminTo]->(c2:Computer) RETURN p UNION ALL MATCH p = (c3:Computer {domain: $result})-[r2:MemberOf|HasSIDHistory*1..]->(g:Group)-[r3:AdminTo]->(c4:Computer) RETURN p" } ] }

Вот какие резуль­таты мож­но получить, исполь­зуя этот зап­рос.

Ре­зуль­тат выпол­нения зап­роса на поиск машин в локаль­ных адми­нах машин

Очень мно­го машин неяв­но находит­ся друг у дру­га в груп­пе локаль­ных адми­нис­тра­торов, что соз­дает мно­жес­тво век­торов для их зах­вата. На рисун­ке выше показа­на общая кар­тина, а если ее приб­лизить и рас­смот­реть вни­матель­нее, мы уви­дим сле­дующее.

Мно­жес­тво машин явля­ются адми­нами на нес­коль­ких дру­гих машинах

Од­на машина явля­ется адми­ном на мно­жес­тве машин

Вот такой кра­сивый «цве­точек» из сер­веров Exchange встре­чает­ся очень час­то.

«Цве­точек» из сер­веров Exchange

По­лучил­ся резуль­татив­ный ана­лиз вза­имос­вязей компь­юте­ров — с помощью этой информа­ции мож­но под­нять при­виле­гии в домене. Ког­да вывод BloodHound содер­жит боль­шое количес­тво машин, про­верить все вруч­ную ста­новит­ся проб­лематич­но. Если наз­вания компь­юте­ров ни о чем тебе не говорят, непонят­но, какую сле­дует зах­ватывать в пер­вую оче­редь. А что самое важ­ное — на хос­те может быть вклю­чен SMB signing, и тог­да у нас вооб­ще ничего не получит­ся.

info

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

Бы­вает, что мы не можем получить информа­цию о локаль­ных адми­нах на кон­крет­ной машине. Но зато можем пред­положить по наз­вани­ям групп или их опи­сани­ям, зачем они были соз­даны. Нап­ример, имя ADM_Servers_backups говорит само за себя. Так­же зачас­тую машины и поль­зовате­ли вклю­чены в одну груп­пу. Если вдруг два этих усло­вия будут соб­людены, мы можем про­бовать повысить при­виле­гии с помощью релея. Для поис­ка сме­шан­ного членс­тва в груп­пах мож­но исполь­зовать зап­рос от Hausec:

{ "name": "Find groups that contain both users and computers", "queryList": [ { "final": true, "query": "MATCH (c:Computer)-[r:MemberOf*1..]->(groupsWithComps:Group) WITH groupsWithComps MATCH (u:User)-[r:MemberOf*1..]->(groupsWithComps) RETURN DISTINCT(groupsWithComps) as groupsWithCompsAndUsers" } ] }

Обез­личен­ный при­мер выпол­нения зап­роса 

Добавляем атрибуты

Стан­дар­тных атри­бутов, которые собира­ются с помощью SharpHound.exe или BloodHound.py, нам будет малова­то. Поэто­му надо добавить свои. Ребята из CompassSecurity написа­ли скрипт для добав­ления новых атри­бутов, а так­же пред­ложили спе­циаль­ный атри­бут nosigning. Одна­ко пред­варитель­но нам надо соб­рать информа­цию о машинах без SMB signing.

warning

Даль­нейшие дей­ствия пред­полага­ют обра­бот­ку зна­чений DNSHostName, а не IP-адре­сов.

Для сбо­ра информа­ции о наличии SMB signing исполь­зуем CrackMapExec. О том, как это сде­лать, под­робно написа­но в стать­ях «Гид по NTLM Relay. Зах­ватыва­ем NTLM-аутен­тифика­цию для Relay-ата­ки» и «Гид по NTLM Relay, часть 2. Про­водим Relay-ата­ки».

Ког­да у нас есть спи­сок машин без SMB signing, добав­ляем новый атри­бут с помощью сле­дующе­го скрип­та:

python3 BloodHoundLoader.py t.txt -m s

Пос­ле это­го мы можем задей­ство­вать зап­росы, исполь­зующие новый атри­бут. Все у того же CompassSecurity име­ется пара зап­росов, которые ука­жут нам путь от машин без SMB signing до домена и до при­виле­гиро­ван­ных объ­ектов. Выг­лядит это при­мер­но так:

{ "name": "Shortest Paths from no Signing to High Value Targets", "category": "Shortest Paths", "queryList": [ { "final": true, "query": "MATCH p = allShortestPaths((c:Computer)-[r:{}*1..]->(h)) WHERE NOT c = h AND c.hassigning = false AND h.highvalue = true RETURN p" } ] }{ "name": "Shortest Paths from no Signing to Domain", "category": "Shortest Paths", "queryList": [ { "final": false, "title": "Select a Domain...", "query": "MATCH (d:Domain) RETURN d.name ORDER BY d.name ASC" }, { "final": true, "query": "MATCH p = allShortestPaths((c:Computer)-[r:{}*1..]->(d:Domain)) WHERE c.hassigning = false AND d.name = $result RETURN p", "endNode": "{}" } ] }

Пу­ти повыше­ния до при­виле­гиро­ван­ных целей

Пу­ти повыше­ния до домена от машин без SMB signing

Кру­то, но есть нюанс. Эти зап­росы помога­ют лишь понять, какую машину было бы полез­но зах­ватить, но не каж­дая машина без SMB signing уяз­вима для атак. Ког­да мы не зна­ем, чей хеш нам при­летит, луч­ше выпол­нять релей на машину, от которой име­ется путь до зах­вата домена. При­мера­ми таких слу­чаев слу­жат спу­финг‑ата­ки или исполь­зование ярлы­ков.

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

Ответить

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