Атака DNS rebinding на примере CrossfitTwo Hack The Box

Атака безопасность

Сегодня, на примере слож­ной машины CrossfitTwo с пло­щад­ки Hack The Box , я покажу вам как на практике работает атака DNS rebinding.

Еще по теме: Взлом веб-сервера на Windows и Apache через SSRF

Атака DNS rebinding

DNS rebinding — ата­ка, при которой вре­донос­ная веб‑стра­ница зас­тавля­ет бра­узер поль­зовате­ля запус­тить скрипт, который обра­щает­ся к дру­гим сай­там и сер­висам. Теоре­тичес­ки пра­вила огра­ниче­ния домена (Same Origin Policy) пре­пятс­тву­ют подоб­ным запус­кам: сце­нарии на сто­роне кли­ента могут получать дос­туп толь­ко к дан­ным с того сай­та, с которо­го был получен скрипт. В про­цес­се при­мене­ния полити­ки бра­узер срав­нива­ет домен­ные име­на, но ата­ка переп­ривяз­ки обхо­дит эту защиту, зло­упот­ребляя воз­можностью DNS быс­тро менять адре­са.

Смысл в том, что зло­умыш­ленник регис­три­рует домен и кон­тро­лиру­ет DNS-сер­вер, который его обслу­жива­ет. DNS-сер­вер нас­тра­ивает­ся так, что­бы его отве­ты содер­жали очень корот­кое вре­мя жиз­ни записей (TTL), что пре­дот­вра­щает кеширо­вание отве­та кли­ентом или резол­вером. Ког­да жер­тва начина­ет переход на вре­донос­ный домен, DNS-сер­вер ата­кующе­го сна­чала воз­вра­щает нас­тоящий IP-адрес веб‑сер­вера, который пре­дос­тавит вре­донос­ный код кли­енту.

Затем вре­донос­ный код на сто­роне кли­ента совер­шает допол­нитель­ные обра­щения к исходно­му име­ни домена. Same Origin Policy раз­реша­ет такие зап­росы. Одна­ко во вре­мя исполне­ния скрип­та в бра­узе­ре жер­твы из‑за уста­рева­ния пре­дыду­щего DNS-отве­та про­изво­дит­ся новый зап­рос DNS для дан­ного домена и зап­рос пос­тупа­ет к DNS-сер­веру ата­кующе­го.

Так как в нас­трой­ках релея ука­зан домен по мас­ке *employees.crossfit.htb, мы можем зарегис­три­ровать свой домен, к при­меру ralfemployees.crossfit.htb. Свой домен тоже добавим в файл /etc/hosts. А теперь ука­зыва­ем редирект DNS на свой хост, что­бы, ког­да на сер­вер при­шел зап­рос к домену ralfemployees.crossfit.htb, он перес­про­сил соот­ветс­тву­ющий адрес с нашего DNS-сер­вера.

Атака DNS rebinding. Настройка Unbound
Атака DNS rebinding. Настройка Unbound

Нас­трой­ки при­мене­ны, оста­лось разоб­рать­ся с локаль­ным DNS-сер­вером. В качес­тве такого мы можем исполь­зовать лег­кую ути­литу dnschef, уже пре­дус­танов­ленную в некото­рых боевых дис­три­бути­вах вро­де Kali Linux. Ука­зыва­ем интерфейс (опция -i), свой домен ( --fakedomains) и адрес, который ему будет соот­ветс­тво­вать ( --fakeip).

Атака DNS rebinding. Зап­рос сме­ны пароля
Атака DNS rebinding. Зап­рос сме­ны пароля

Те­перь все обра­щения на  ralfemployees.crossfit.htb дол­жны при­водить к нашему локаль­ному веб‑сер­веру. Что­бы это про­тес­тировать, запус­тим лис­тенер на пор­те 80:

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

Атака DNS rebinding. Логи dnschef
Атака DNS rebinding. Логи dnschef

Атака DNS rebinding. Зап­рос сме­ны пароля
Атака DNS rebinding. Зап­рос сме­ны пароля

В резуль­тате мы видим, что зап­рос успешно про­ходит, а в окне логов dnschef наб­люда­ем две записи, то есть зап­росов ста­ло два. Теперь выпол­ним ата­ку DNS rebinding. Для это­го напишем скрипт, который пос­ле двух обра­щений переза­пус­тит dnschef, что­бы тот с новыми нас­трой­ками ука­зывал не на локаль­ный адрес, а на наш. При этом пос­ле запус­ка мы выпол­ним зап­рос для сме­ны пароля, что­бы сле­дующий зап­рос от дру­гого поль­зовате­ля при­шел на наш сер­вер.

Ло­ги dnschef
Ло­ги dnschef

Ок­но netcat
Ок­но netcat

Спус­тя минуту к нашему DNS при­шел зап­рос, и dnschef вер­нул наш адрес. В окне netcat сра­зу уви­дим зап­рос на сме­ну пароля от поль­зовате­ля. Ата­ка прош­ла успешно, оста­лось про­экс­плу­ати­ровать эту уяз­вимость.

Для это­го соз­даем на сво­ем сер­вере файл password-reset.php, который содер­жит код на JavaScript. Этот код будет выпол­нять зап­рос к  http://crossfit-club.htb/api/auth, получать от сер­вера токен и выпол­нять еще один зап­рос на соз­дание поль­зовате­ля в чате (нам эта фун­кция была недос­тупна).

За­пус­каем веб‑сер­вер Apache коман­дой:

И помеща­ем скрипт в дирек­торию веб‑сер­вера:

Затем пов­торя­ем нашу ата­ку и пос­ле появ­ления зап­росов в окне dnschef прос­мотрим логи Apache в фай­ле:

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

Фор­ма авто­риза­ции crossfit-club.htb
Фор­ма авто­риза­ции crossfit-club.htb

GET-зап­росы не под­держи­вают­ся, а POST-зап­росы тре­буют ука­зания парамет­ров. При этом через HTTP-метод OPTIONS мы можем спо­кой­но общать­ся с сер­вером и узнать, какие зап­росы он при­нима­ет. В отве­те уви­дим заголо­вок:

То есть нам нуж­но переда­вать заголо­вок Origin, он показы­вает отку­да будет про­изво­дить­ся заг­рузка. В нем нет информа­ции о пути, и он содер­жит толь­ко имя сер­вера. Origin час­то исполь­зует­ся в CORS, что нам и нуж­но про­верить.

ПОЛЕЗНЫЕ ССЫЛКИ:

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

Добавить комментарий