Всем привет ! Сегодня я разберу машину Jason на площадке TryHackMe. Уровень Easy, но это правильная тачка, с правильной багой, которая много чему научит.
Сканирование.
У нас есть два порта на которых висят ssh и веб сервер.
Посетив нашу цель нас встречает сайт, с формой отправки email. Как только мы отправляем его , мы получаем ответ как на картинке.
Так же мы наблюдаем что сайт построен с помощью Nodejs.
Попробуем перехватить запрос в Burp и посмотреть какие ответы мы получаем:
При вводе в email мы получаем закодированный сеанс в base64.
Если мы кинем это в декодер , то увидим следующее.
Точка опоры.
Мои запросы по типу node.js deserialization exploit , привели меня к CVE-2017-5941.
Уязвимость позволяет злоумышленнику создать цепочку, используя механизм сериализации для исполнения
произвольного кода при десериализации. Если приложение использует функции serialize и deserialize из node-serialize
без должной проверки и фильтрации данных, злоумышленник может произвести инъекцию кода через специально подготовленные данные.
Немого ликбеза:
Сериализация — это процесс преобразования объекта (например, данных или структуры) в формат,
который можно сохранить (например, в файл) или передать по сети.
Десериализация — это обратный процесс, когда данные восстанавливаются из сохраненного
или переданного формата обратно в объект.
Эти процессы используются для передачи объектов между разными системами или сохранения их состояния.
Вот пример node.js приложение для имитации кода:
Значение cookie, полученное из запроса, было передано в unserialize() функцию, предоставляемую модулем.
JavaScript:
var express = require('express');
var cookieParser = require('cookie-parser');
var escape = require('escape-html');
var serialize = require('node-serialize');
var app = express();
app.use(cookieParser())
app.get('/', function(req, res) {
if (req.cookies.profile) {
var str = new Buffer(req.cookies.profile, 'base64').toString();
var obj = serialize.unserialize(str);
if (obj.username) {
res.send("Hello " + escape(obj.username));
}
} else {
res.cookie('session', "eyJ1c2VybmFtZSI6ImFqaW4iLCJjb3VudHJ5IjoiaW5kaWEiLCJjaXR5IjoiYmFuZ2Fsb3JlIn0=", {
maxAge: 900000,
httpOnly: true
});
}
res.send("Hello World");
});
app.listen(3000);
Для этого я использовал node-serialize. Так же я создал объект js, с таким кодом который я передал в serialize() функцию.
Передача ее в unserialize() функцию приведет к выполнению кода.
JavaScript:
var y = {
rce : function(){
require('child_process').exec('ping -c 1 10.10.61.233', function(error, stdout, stderr) { console.log(stdout) });
}(),
}
var serialize = require('node-serialize');
console.log("Serialized: \n" + serialize.serialize(y));
Мы можем проверить это, просто отправив ICMP пакеты:
И получив их на выходе :
Теперь мы знаем, что можем использовать unserialize() функцию в модуле node-serialize, если в него передаются
ненадежные данные. Давайте воспользуемся уязвимостью в веб-приложении, чтобы создать обратную оболочку.
Создание полезной нагрузки
Теперь осталось закодировать нашу нагрузку в base64:
После обновляем страницу и просто меняем текущий сеанс на свой, который мы закодировали. Так же прослушиваем порт
который мы указали в полезной нагрузке:
Мы получили наш первый флаг.
Privilege escalation.
Проверяем наши возможности:
Вообщем dylan может запускать npm от sudo без ввода пароля.
Обратимся к Gitfobins. Это действительно что нам нужно.
Таким образом, эта команда создает временный каталог, так же она создает в нем файл package.json, а затем выполняет
npm install с правами суперпользователя. При этом используется флаг --unsafe-perm, который позволяет выполнять
установочные скрипты с повышенными правами. В итоге это может привести к запуску оболочки /bin/sh, от суперпользователя.
Заключение:
Важно тщательно проверять и фильтровать входящие данные перед их десериализацией.
Небезопасная десериализация может привести к выполнению произвольного кода, а также к утечке
конфиденциальной информации и другим критическим последствиям.
Итоги:
В целом машина мне понравилась, в жизни такое редко встретишь, но понимание как работает данная уязвимость
дает только плюс в копилку для пентестера.
Спасибо всем за внимание. Я надеюсь предоставленный материал был полезен и интересен для вас.
Если у вас возникли вопросы или предложения не стесняйтесь делиться ими в комментариях. Ваши мысли и идеи всегда приветствуются.