Помимо моего пепла, который остался с ресерча винды, я прочитал про интерсные свойства у
child_process.fork() в Node.jschild_process.fork() - предоставляет возможность создавать подпроцессы с помощью child_process.spawn(). Метод fork() принимает объект с именем options, в котором одним из потенциальных параметров является свойство execArgv. Это массив строк, содержащих аргументы командной строки, которые должны быть использованы при порождении дочернего процесса.Т.е конструктор выглядит следующим образом
this.execArgv = options.execArgv;Это позволяет нам напрямую управлять аргументами командной строки, и дает нам возможности для RCE. Особый интерес представляет аргумент
--eval, который позволяет передавать произвольный JavaScript, а он уже будет выполняться дочерним процессом. Т.е мы можем загружать свои собственные модули."execArgv": [
"--eval=require('<moduele_name>')"
]А значит потенциальный пейлоад будет выглядеть так
cat.__proto__.execArgv = ["-c", "touch /tmp/biba"]Или в виде JSON
"__proto__": { "execArgv":[ "--eval=require('child_process').execSync('touch /tmp/biba')" ] }