Взлом удаленного хоста через Git и привилегии с GTFOBins

Git взлом безопасность

В этой статье рассмотрим прохождение уязвимой машины OpenSource Hack The Box, в рамках которой будем взламывать удаленных хост через Git и поднимать привилегии используя одну из техник GTFOBins.

Еще по теме: Как взломать сайт WordPress

Лучше подключаться к машине HTB с помощью VPN. И желательно не делать это со своего личного компа, на котором хранится чувствительная информация. Читай «Как подключиться и использовать Hack The Box».

Взлом удаленного хоста через Git и привилегии с GTFOBins

Для начала до­бав­им IP-адрес машины в /etc/hosts:

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

Для этого отлично подходит популярный сканер Nmap. Следующий скрипт улучшит резуль­таты сканирования:

Он дей­ству­ет в два эта­па. Пер­вый про­изво­дит­ просто быс­трое ска­ниро­вание, вто­рой — глубокое ска­ниро­вание, используя име­ющиеся скрип­ты (опция A)

Результат скрипта
Результат работы скрипта

Сканер смог найти только два откры­тых пор­та:

  • 22 — служ­ба OpenSSH 7.6p1
  • 80 — веб‑сер­вер Python Werkzeug 2.1.2; а

Так­же филь­тру­ющийся порт 3000. Взглянем на веб-сервер.

Глав­ная стра­ница HTB
Глав­ная стра­ница HTB

Находим ссыл­ку на фай­л. Исходя из названия можно догадаться, что это какой-то исходный код.

Ска­чивание архива
Ска­чивание архива

В архи­ве лежит каталог .git, который стоит изучить.

Со­дер­жимое скаченного архи­ва
Со­дер­жимое скаченного архи­ва

Рас­паковываем его и заходим в директорию, содер­жащую репози­торий Git. Пос­ле чего рассмотрим сущес­тву­ющие вет­ки.

Вет­ки Git-репози­тория
Вет­ки Git-репози­тория

Далее получаем исто­рию ком­митов. Рассмотрим ее получше.

Ис­тория ком­митов
Ис­тория ком­митов Git

Те­перь прос­матри­ваем каж­дый ком­мит в надеж­де най­ти важ­ные дан­ные. И в одном из них обна­ружи­ваем URL прок­си‑сер­вера с ука­зан­ными учет­ными дан­ными.

Ком­мит с учет­ными дан­ными
Ком­мит с учет­ными дан­ными

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

Со­дер­жимое фай­ла static/views.py
Со­дер­жимое фай­ла static/views.py

Как видите, мы можем заг­ружать фай­лы с любым рас­ширени­ем. Сра­зу бро­сает­ся в гла­за фун­кция os.path.join — стро­ка 14. Пос­ледова­тель­ность ../ филь­тру­ется, что не поз­волит записать свой SSH-ключ поль­зовате­лю, даже если мы узна­ем путь. Одна­ко файл сох­раня­ется с тем же име­нем без вся­ких вре­мен­ных меток, что дает нам воз­можность переза­писы­вать сущес­тву­ющие фай­лы.

Да­вайте поп­робу­ем переза­писать текущий файл, добавив в его конец свой обра­бот­чик, к при­меру /ralf.

Ссыл­ку на стра­ницу для заг­рузки фай­ла най­дем чуть ниже кноп­ки ска­чива­ния репози­тория.

Фор­ма заг­рузки исходных кодов

Фор­ма для заг­рузки фай­лов
Фор­ма для заг­рузки фай­лов

Заг­рузим наш новый файл view.py и перех­ватим зап­рос на заг­рузку в Burp Intercept.

Пе­рех­вачен­ный зап­рос на заг­рузку фай­ла
Пе­рех­вачен­ный зап­рос на заг­рузку фай­ла

Для переза­писи фай­ла изме­ним filename и вмес­то views.py запишем пол­ный путь к это­му фай­лу:

Из­менен­ный зап­рос на заг­рузку фай­ла
Из­менен­ный зап­рос на заг­рузку фай­ла

Ког­да все будет готово, отпра­вим зап­рос даль­ше на сер­вер.

На стра­нице получим сооб­щение, что заг­рузка прош­ла успешно.

Со­обще­ние об успешной заг­рузке фай­лов
Со­обще­ние об успешной заг­рузке фай­лов

Те­перь мы можем выпол­нять коман­ды и сра­зу поп­робу­ем запус­тить реверс‑шелл:

Я выпол­нял зап­рос через curl, поэто­му мне нуж­но было закоди­ровать реверс‑шелл в кодиров­ку URL. Burp Encoder закоди­рует абсо­лют­но все сим­волы, а не толь­ко спе­циаль­ные. Это не очень удоб­но, поэто­му я прос­то встав­ляю текст в Burp Repeater и кодирую ком­бинаци­ей кла­виш Ctrl-U. Одна­ко сго­дит­ся и любой дру­гой метод.

Ис­ходная коман­да curl
Ис­ходная коман­да curl

За­коди­рован­ная коман­да curl
За­коди­рован­ная коман­да curl

Ос­талось коман­дой rlwrap -cAr nc -lnvp 4321 запус­тить лис­тенер и выпол­нить коман­ду для запус­ка реверс‑шел­ла.

Сес­сия поль­зовате­ля
Сес­сия поль­зовате­ля

По име­ни поль­зовате­ля понима­ем, что находим­ся внут­ри кон­тей­нера Docker. Даль­нейший путь прод­вижения дол­го искать не при­ходит­ся: вспо­мина­ем про филь­тра­цию под­клю­чений к пор­ту 3000.

Сна­чала про­верим адрес докер‑машины, а потом уже поп­робу­ем под­клю­чить­ся к пор­ту 3000 хос­товой.

Ре­зуль­тат выпол­нения коман­ды ifconfig
Ре­зуль­тат выпол­нения коман­ды ifconfig
lОб­ращение к пор­ту 3000 с помощью curl
lОб­ращение к пор­ту 3000 с помощью curl

Для удоб­ной работы через бра­узер нам нуж­но тун­нелиро­вать тра­фик. Я буду исполь­зовать chisel, который нуж­но запус­тить как на локаль­ном хос­те, в качес­тве сер­вера, так и на уда­лен­ном — как кли­ент.

В парамет­ре сер­верной час­ти ука­зыва­ем, что ожи­даем под­клю­чения (парамет­ры --reverse), а так­же порт для соз­дания тун­неля.

Ло­ги сер­верной час­ти
Ло­ги сер­верной час­ти

Те­перь на уда­лен­ной машине ини­циали­зиру­ем кли­ент­скую часть. В парамет­рах ука­зыва­ем адрес сер­вера chisel и порт для под­клю­чения, а так­же нас­трой­ки прок­сирова­ния.

Ло­ги кли­ент­ской час­ти
Ло­ги кли­ент­ской час­ти

В логах сер­вера дол­жны уви­деть сооб­щение о соз­дании сес­сии.

Ло­ги сер­верной час­ти
Ло­ги сер­верной час­ти

Та­ким обра­зом, весь тра­фик, который мы пош­лем на локаль­ный порт 3000, будет тун­нелиро­ван на порт 3000 ука­зан­ного хос­та (в дан­ном слу­чае 172.17.0.1) через докер‑машину.

Теперь откро­ем сайт в бра­узе­ре и уви­дим Git.

Глав­ная стра­ница сай­та на пор­те 3000
Глав­ная стра­ница сай­та на пор­те 3000

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

Глав­ная стра­ница сай­та пос­ле авто­риза­ции
Глав­ная стра­ница сай­та пос­ле авто­риза­ции

Пе­рехо­дим к единс­твен­ному дос­тупно­му репози­торию и видим бэкап домаш­него катало­га поль­зовате­ля.

Со­дер­жимое Git-репози­тория
Со­дер­жимое Git-репози­тория

Ко­неч­но же, нас инте­ресу­ет при­ват­ный ключ SSH.

Со­дер­жимое катало­га .ssh
Со­дер­жимое катало­га .ssh
SSH-ключ поль­зовате­ля dev01
SSH-ключ поль­зовате­ля dev01

Ко­пиру­ем его на локаль­ный хост, коман­до:

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

Флаг поль­зовате­ля
Флаг поль­зовате­ля

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

Сле­дующий шаг — монито­ринг запус­каемых при­ложе­ний. Что­бы най­ти запус­каемые в сис­теме про­цес­сы, будем исполь­зовать ути­литу pspy64. Заг­рузим ее на хост при помощи wget, а потом выпол­ним.

В выводе отме­чаем исполь­зование коман­ды git, при­чем от име­ни при­виле­гиро­ван­ного поль­зовате­ля (нулевой UID — это root).

Вы­вод ути­литы pspy64
Вы­вод ути­литы pspy64

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

В час­тнос­ти, есть тех­ника исполь­зования Git, которая поз­воля­ет получить ста­биль­ную обо­лоч­ку в при­виле­гиро­ван­ном кон­тек­сте. Нам она под­ходит, толь­ко вмес­то кон­тек­ста sudo у нас будет кон­текст поль­зовате­ля root.

Опи­сание тех­ники sudo GTFOBins для Git
Опи­сание тех­ники sudo GTFOBins для Git

Здесь исполь­зует­ся перех­ватчик Git, который свя­зан с pre-commit. То есть мы можем записать свой скрипт в файл:

И код выпол­нится при выпол­нении коман­ды git commit. В качес­тве метода пер­систен­тнос­ти будем уста­нав­ливать S-бит фай­лу коман­дной обо­лоч­ки /bin/bash.

Со­дер­жимое фай­ла pre-commit
Со­дер­жимое фай­ла pre-commit

Справка: бит SUID

Ког­да у фай­ла уста­нов­лен атри­бут setuid ( S-атри­бут), обыч­ный поль­зователь, запус­кающий этот файл, получа­ет повыше­ние прав до поль­зовате­ля — вла­дель­ца фай­ла в рам­ках запущен­ного про­цес­са.

Пос­ле получе­ния повышен­ных прав при­ложе­ние может выпол­нять задачи, которые недос­тупны обыч­ному поль­зовате­лю. Из‑за воз­можнос­ти сос­тояния гон­ки мно­гие опе­раци­онные сис­темы игно­риру­ют S-атри­бут, уста­нов­ленный shell-скрип­там.

 

Пра­ва фай­ла /bin/bash
Пра­ва фай­ла /bin/bash

Как видите, S-бит уста­нов­лен, поэто­му повыша­ем кон­текст и забира­ем флаг.

Взлом удаленного хоста через Git и привилегии с GTFOBins
Флаг рута

Мы взломали удаленный хост через Git и подняли привилегии с GTFOBins.

РЕКОМЕНДУЕМ:

Дима (Kozhuh)

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

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