Це машина з платформи Hack The Box, яка вже виведена з експлуатації і доступна за моєю VIP підпискою. Оскільки вона більше не доступна для виконання, я можу поділитись описом її вирішення. Ці описи пояснюють мої кроки для досягнення результату, а також інструменти та техніки, які я використав. Машини, які я обрав для вирішення, знаходяться в таблиці TJ NULL і є підготовкою до майбутніх сертифікацій. Під час підготовки до сертифікацій CPTS (HTB Certified Penetration Testing Specialist), PNPT (TCM Practical Network Penetration Tester) та OSCP+ (OFFSEC Offensive Security Certified Professional), я сподіваюсь, що мої напрацювання допоможуть іншим.
Початкове дослідження
Першим кроком після запуску машини є сканування відкритих портів за допомогою Network Mapper (Nmap). Перед тим, як глибоко сканувати порти для визначення сервісів або перевірки за допомогою скриптів, доцільно спочатку знайти лише відкриті порти. Щоб сканувати лише відкриті порти на машині в закритому середовищі, як Hack The Box, я зазвичай використовую команду “sudo nmap -p- -min-rate=10000 -oA allports.txt -v”. Це сканування швидке та агресивне, при цьому результати зберігаються в усіх форматах (-oA) у файл allports.txt. Після того, як ви знайдете відкриті порти, можна сканувати їх конкретно, використовуючи ключ -p. Наприклад, -p 80,22 запустить сканування лише для цих двох портів, а -p- сканує всі 65,535 портів. Я зазвичай використовую sudo для nmap разом з -sC (тестувати прості скрипти) і -sV (визначення версій сервісів). Також застосовую -Pn (пропускати виявлення хостів), і інколи -T4 для прискорення сканування (-T5 може бути нестабільним). Ключ -A дозволяє увімкнути виявлення ОС, сканування скриптів, визначення версій і трасування за допомогою одного ключа, замінюючи інші. Використання ключа всіх портів (-p-) разом зі скануванням скриптів і визначенням сервісів може зайняти більше часу, оскільки воно перевіряє всі 65,535 портів.
sudo nmap -sC -sV -Pn -T4 -p- 10.10.10.115
Результати Nmap показують, що порти 22 (ssh), 80 (http) та 9200 (http) відкриті. Відвідування порту 80 (http) показує лише зображення з голкою, а порт 9200 (http) відображає JSON-вивід. На даний момент я не буду зосереджуватись на порту 22 (ssh), оскільки у мене немає доступу.
Веб-експлуатація
JSON-вивід показує, що ім'я кластера — ElasticSearch, а версія — 6.4.2. Я шукав експлойт для цієї версії, але не знайшов нічого корисного. Під час пошуку інформації про ElasticSearch я знайшов вебсайт, який показує, як взаємодіяти з API https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html.
Використовуючи Curl, я можу взаємодіяти з API. Це дозволить мені переглянути всі дані, які я можу знайти на Elasticsearch. Дивлячись на індекси, я помітив, що на цьому екземплярі ElasticSearch є всього чотири індекси. Також показано кількість записів в кожному індексі (quotes має 253 записи).
curl -s http://10.10.10.115:9200/quotes/_search?size=253 | jq '.hits .hits[] ._source .quote'
Під час перегляду інформації в цитатах, я помітив, що вони написані іспанською мовою. Я наступним кроком знайду всі 253 записи з індексу цитат і відфільтрую лише самі цитати.
Потім я скопіював цитати в блокнот і знайшов онлайн інструмент для перекладу з іспанської на англійську.
Оскільки об'єм цього запису був великим, я міг обробляти лише частини за раз, оскільки всі перекладачі мають обмеження на кількість слів. Під час того, як я розділяв цитати на різні частини, я натрапив на деякі цікаві записи. Я помітив знак рівності в одному з записів і одразу зрозумів, що це повідомлення, закодоване у base64. Далі я шукав більше тексту в base64 або чогось іншого, що могло виділятись. Після того, як я переклав повідомлення, вони дійсно згадують, що це ключі.
Використовуючи декодер base64, я зміг отримати можливе ім'я користувача та пароль.
Я зміг використати ці облікові дані для входу на машину через порт 22 (ssh). Після входу я заберу перший флаг і підготуюсь до ескалації привілеїв.
Ескалація привілеїв
Тепер, коли я отримав доступ до машини, я шукаю версію Python, а потім виконую команди для стабілізації моєї оболонки.
Далі я виконую свої звичні кроки для подальшого дослідження після отримання доступу, щоб знайти шлях до ескалації привілеїв. Існує багато сайтів, які описують стандартні кроки для подібних ситуацій, у мене є комбінований список, який я створив з цих сайтів і використовую для швидкої довідки.
Переглядаючи вивід netstat, я бачу, що порт 5601 працює локально на машині. Дослідження цього порту показує, що він часто використовується для додатку Kibana. Це має сенс, оскільки ми вже знайшли ElasticSearch, який зазвичай є частиною стеку ELK (не вистачає Logstash).
ssh -L 5602:127.0.0.1:5601 [email protected]
Після того, як я налаштував порт-форвардінг за допомогою сесії ssh, я можу перейти до внутрішнього додатку Kibana. Перейшовши в розділ управління, я отримую номер версії 6.4.2. Не знайшовши нічого корисного на вебсайті, я перевіряю, чи є експлойт для цієї версії. І версія має доступний експлойт з CVE-2018–17246. Експлойт, який я буду використовувати, знаходиться тут https://github.com/mpgn/CVE-2018-17246. Ця сторінка містить приклад створення зворотного шеллу, а також інструкції щодо виклику зворотного шеллу.
curl 'http://127.0.0.1:5602/api/console/api_server?sense_version=@@SENSE_VERSION&apis=../../../../../../.../../../../tmp/rev.js'
Експлойт спрацював, і тепер я маю зворотний шелл під обліковим записом користувача kibana. На цьому етапі я почну мої кроки для подальшого дослідження після отримання доступу, щоб продовжити ескалацію привілеїв. Ми знаємо, що Logstash працює з правами root.
Переміщуючись до директорії logstash і перевіривши файли, я бачу, що користувач kibana може їх редагувати. У conf.d є файл filter.conf, який показує, як виконується файл. Інші конфігураційні файли дають більше інформації про те, як працює Logstash. Це показує, що якщо файл має певну назву, він буде виконано. Далі я перейду до /opt/kibana і перевірю, чи можу я створити файл, оскільки конфігураційні файли пояснюють, що будь-який файл у цій директорії буде виконано.
Створивши файл під назвою logstash_test у /opt/kibana (як зазначено у конфігураційних файлах), а потім виконуючи метод, який ми вивчили раніше, я спробую вставити команду touch і зворотний шелл у код. Я також переконаюсь, що маю відкритий слухач за допомогою “nc -nlvp 4444”.
Через деякий час Logstash повинен запустити і виконати цей нещодавно створений файл.
Після того, як я отримав шелл, я став користувачем root. Я заберу останній флаг, і машина буде завершена.
Машина завершена. Сподіваюсь, вам сподобався цей запис, і ви дізналися щось корисне. Якщо є щось, що потребує більш детального пояснення або поради, якими можна поділитись, звертайтесь. Дякую за те, що прочитали та слідкували за моїм шляхом.
Уроки, що були засвоєні
Вивчення сервісів та версій для кращого розуміння
Завжди корисно перевіряти додатки чи сервіси, які ви знаходите. З цією машиною, як тільки я виявив, що це ElasticSearch, я досліджував, як можна взаємодіяти з цим додатком. Це призвело до того, що я знайшов індекси, які вказували на облікові дані на машині.
Перевірка портів, що працюють локально на машинах
Після того, як я виконав команду netstat, я побачив, що порт працює на внутрішній адресі loopback. Перевіривши цей порт, я дійсно побачив, що це Kibana, що підтвердило, що це частина ELK стеку, який був присутній на машині. Після того, як я налаштував порт-форвардинг до машини і перевірив порт, я міг підтвердити, що це дійсно Kibana. Це дозволило мені знайти експлойт, який призвів до латерального переміщення до іншого користувача. Без цього кроку я ніколи не зміг би використати Logstash для підвищення привілеїв.
Перекладено з: Haystack | HTB Writeup | Linux