
Decodifica y desfirma cookies de sesión vulnerables de los frameworks Django, Flask, Laravel, Express y JWT. Admite decodificadores basados en HMAC, listas de palabras base64 y pipelines de automatización para un descubrimiento rápido de vulnerabilidades.
CookieMonster es una herramienta de línea de comandos y API para decodificar y modificar cookies de sesión vulnerables de varios frameworks diferentes. Está diseñada para ejecutarse en tuberías de automatización que deben ser capaces de procesar de manera eficiente una gran cantidad de estas cookies para descubrir rápidamente vulnerabilidades. Además, CookieMonster es extensible y puede soportar fácilmente nuevos formatos de cookies.
Vale la pena enfatizar que CookieMonster encuentra vulnerabilidades en los usuarios de los frameworks, generalmente no en los frameworks mismos. Estos usuarios pueden resolver las vulnerabilidades encontradas mediante CookieMonster configurando el framework para que use una clave secreta fuerte.
| Framework | Soportado | Notas |
|---|
| JSON Web Tokens | ✅ | HS256, HS384, HS512 |
| Django | ✅ | Algoritmos comunes |
| Flask | ✅ | Algoritmos comunes |
| Rack | ✅ | Algoritmos comunes |
| Express (cookie-signer) | ✅ | Algoritmos comunes |
| Laravel | ✅ | AES-CBC-128/256 (GCM aún no soportado) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer (sal predeterminada) |
| Otros | ❌ | ¡Todavía no! |
Para instalar CookieMonster, instala Go y luego instala la CLI:
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonster solo necesita dos elementos esenciales: una cookie para intentar anular su firma y una lista de palabras para usar. Si no tienes una lista de palabras, CookieMonster incluye una lista predeterminada del proyecto Flask-Unsign. Las listas de palabras de CookieMonster son un poco diferentes; cada línea debe estar codificada en base64. Esto se debe a que los proyectos de Python son especialmente liberales al insertar bytes basura en estas claves, y necesitamos poder manejarlas correctamente.
Un ejemplo de uso de la CLI con una cookie estática o con una URL:
% ./cookiemonster -cookie "gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
ℹ️ CookieMonster loaded the default wordlist; it has 38919 entries.
✅ Success! I discovered the key for this cookie with the django decoder; it is "changeme".
% ./cookiemonster -url "https://httpbingo.org/cookies/set?abc=gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
⚠️ I got a non-200 status code from this URL; it was 302.
ℹ️ CookieMonster loaded the default wordlist; it has 38919 entries.
✅ Success! I discovered the key for this cookie with the django decoder; it is "changeme".
CookieMonster es capaz de soportar cookies firmadas con cookie-session, que es común con Express. Sin embargo, hace varias cosas extrañas que requieren cuidado para usar esta herramienta. Una respuesta común de una aplicación cookie-session se ve así:
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
Para pasar esto a CookieMonster, debes incluir tanto el nombre de la cookie como la cookie de firma. En este ejemplo, llamarías a CookieMonster así: cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI (nota el delimitador ^ y el nombre de la cookie prefijado). La API acepta este mismo formato en monster.NewCookie.
CookieMonster tiene soporte limitado para refirmar una cookie una vez que se ha anulado su firma, con la bandera -resign. Esto implica modificar el cuerpo de la cookie para que coincida con tu entrada y luego recalcular la firma con la clave que descubrimos. Actualmente, puedes hacer esto para cookies decodificadas de Django; asegúrate de pasar la cookie original a -cookie y pasar a -resign una cadena de texto sin codificar que te gustaría que estuviera dentro de la cookie. CookieMonster codificará correctamente tu entrada y luego refirmará la cookie.
CookieMonster expone pkg/monster, lo que permite que otras aplicaciones lo aprovechen fácilmente. Esto es mucho más eficiente que iniciar la CLI si estás probando muchas cookies. Un ejemplo de uso se muestra a continuación.
import (
"github.com/iangcarroll/cookiemonster/pkg/monster"
"errors"
)
var (
//go:embed wordlists/my-wordlist.txt
monsterWordlist string
wl = monster.NewWordlist()
)
func init() {
if err := wl.LoadFromString(monsterWordlist); err != nil {
panic(err)
}
}
func MonsterRun(cookie string) (success bool, err error) {
c := monster.NewCookie(cookie)
if !c.Decode() {
return false, errors.New("could not decode")
}
if _, success := c.Unsign(wl, 100); !success {
return false, errors.New("could not unsign")
}
return true, nil
}
CookieMonster está construido con inspiración de varias fuentes, e incluye las excelentes listas de palabras de Flask-Unsign.