Содержание статьи
- Разведка
- Сканирование портов
- Сканирование веб-контента
- Точка входа
- Точка опоры
- Продвижение
- Сбор учетных данных
- Получение доступа к Docker
- Выход из Docker
- Локальное повышение привилегий
- Подключаемые модули аутентификации Linux
Сегодня мы с тобой разберем прохождение «безумной» по сложности машины с площадки Hack The Box. Посмотрим, как работает бэкдор для WordPress, и используем его, чтобы получить доступ к хосту. Затем проникнем в Docker, перехватим пароль пользователя при подключении к базе данных и секретный ключ при подключении к SSH. А в конце поищем, разберем и используем бэкдор в механизме аутентификации Linux.
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.121 toby.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Нашли четыре открытых порта:
- 22 — служба OpenSSH 8.2p1;
- 80 — веб‑сервер Nginx 1.18.0;
- 10022 — служба OpenSSH 8.1;
- 10080 — пока неизвестный HTTP-сервер.
Как обычно, начнем с веб‑сервера, тем более Nmap сам нашел для нас файл robots.txt.
Этот файл используется для того, чтобы попросить краулеры (например, Google или Яндекс) не трогать какие‑то определенные каталоги. Например, никто не хочет, чтобы в поисковой выдаче появлялись страницы авторизации администраторов сайта, файлы или персональная информация со страниц пользователей и прочие вещи в таком духе. Однако и злоумышленники первым делом просматривают этот файл, чтобы узнать о файлах и каталогах, которые хочет спрятать администратор сайта.
Сканирование веб-контента
В robots.txt записана директория wp-admin, говорящая нам о том, что сайт работает на WordPress. Если взглянуть в историю запросов Burp, то найдем и новый поддомен, который добавляем в /etc/hosts.
10.10.11.121 toby.htb wordpress.toby.htb
История запросов Burp
А на самом сайте находим сообщение о недавней атаке.
Главная страница сайта
Больше ничего любопытного найти не удалось, сканирование с помощью WPScan ничего интересного тоже не показало. А так как на сайте уже есть один поддомен, можем попытаться найти еще. Сканировать будем с помощью ffuf, а в качестве места для перебора указываем HTTP-заголовок Host.
ffuf -u http://toby.htb -H "Host: FUZZ.toby.htb" -w subdomains-top1million-110000.txt -t 256 -fs 10837
Результат сканирования поддоменов
Находим новый поддомен backup, который сразу добавляем в /etc/hosts. А на сайте нас встречает Gogs — легковесный сервис Git, написанный на Go.
10.10.11.121 toby.htb wordpress.toby.htb backup.toby.htb
Главная страница сайта
Точка входа
В Git находим одного пользователя toby-admin, чьи репозитории не отображаются.
Активные пользователи Gogs
Но попробуем просканировать репозитории как каталоги с помощью того же ffuf.
ffuf -u http://backup.toby.htb/toby-admin -w directory_2.3_medium_lowercase.txt -t 256
Сканирование каталогов
В итоге находим два каталога, один из которых не возвращает никакого контента (starts). А вот репозиторий backup очень интересен, так как это исходные коды сайта wordpress.toby.htb.
Содержимое репозитория backup
Скачиваем репозиторий (git clone http://backup.toby.htb/toby-admin/backup.git) и для удобства открываем в каком‑нибудь редакторе для программирования. Я буду использовать VSCode. Так как сайт построен на WordPress, первым делом получим учетные данные для подключения к базе данных. Они содержатся в файле wp-config.php.
Содержимое файла wp-config.php
Обратим внимание на хост mysql.toby.htb, о котором мы пока ничего не знаем. Пароль для подключения к базе данных по SSH подключиться не помог, поэтому будем анализировать исходные коды. Сообщение об атаке было оставлено не просто так, скорее всего, нам нужно найти бэкдор. Так как это PHP-файлы, я попробовал поискать в них «опасные» функции. И находим интересное применение функции eval, которая нужна для выполнения передаваемого в нее кода на PHP.
Переходим к файлу comment.php, где в функцию eval после нескольких операций по преобразованию передается закодированная последовательность.
Содержимое файла comment.php
Это не обычный код WordPress, поэтому остановимся именно на нем. Посмотрим, где вызывается функция wp_handle_comment_submission.
И видим вызов из файла wp-comments-post.php. То есть мы можем получить доступ к бэкдору при отправке комментариев к посту. Давай разбираться с самим бэкдором.
Точка опоры
Я скопировал код бэкдора и обернул его в теги PHP, чтобы получить декодированный код. Но там оказался точно такой же вложенный код!
Модернизирование кода
Декодированный бэкдор
Похоже, таких уровней вложенности будет много. Я решил воспользоваться онлайновым сервисом для деобфускации кода.
Деобфусцированный код бэкдора
Отправка комментария под постом
Но на листенер ничего не пришло. Тогда откроем Wireshark, отбросим весть трафик, связанный с 80-м портом, и повторим наш коммент. И увидим попытку бэкконнекта на порт 20053!
Перезапустим листенер с указанием нового порта и снова получим бэкконнект. В итоге вместо реверс‑шелла нам приходит какая‑то строка. Вероятно, придется программировать самим. Давай автоматизируем отправку запроса и прием бэкконнекта.
Еще я заметил, что при каждом новом запросе первая часть строки ответа (GUID) изменяется, а вторая часть остается такой же за исключением двух символов.
Это натолкнуло на мысль о том, что строка закодирована в hex. И предположение оказалось верным. Если у тебя установлен пакет pwntools, можешь использовать команду unhex.
Декодирование шестнадцатеричных значений
Также получаем новую пометку: xor_key. Я попытался снова декодировать уже новое шестнадцатеричное значение, но получил какие‑то непонятные символы. Про XOR упоминается неспроста, поэтому нужно попробовать проксорить полученные данные, но с каким ключом? Из всех используемых данных мы не нашли применения только отправленному параметру sec. Я использовал это значение в качестве ключа для XOR и получил внятную строку!
Декодирование значения xor_key