
Decodifica e rimuove la firma dai cookie di sessione vulnerabili dei framework Django, Flask, Laravel, Express e JWT. Supporta decoder basati su HMAC, wordlist in base64 e pipeline di automazione per la rapida scoperta di vulnerabilità.
CookieMonster è uno strumento da riga di comando e un'API per decodificare e modificare cookie di sessione vulnerabili provenienti da diversi framework. È progettato per essere eseguito in pipeline di automazione che devono essere in grado di elaborare efficientemente un gran numero di tali cookie per scoprire rapidamente vulnerabilità. Inoltre, CookieMonster è estensibile e può supportare facilmente nuovi formati di cookie.
Vale la pena sottolineare che CookieMonster trova vulnerabilità negli utenti dei framework, di solito non nei framework stessi. Questi utenti possono risolvere le vulnerabilità trovate tramite CookieMonster configurando il framework per utilizzare una chiave segreta forte.
| Framework | Supportato | Note |
|---|---|---|
| JSON Web Tokens | ✅ | HS256, HS384, HS512 |
| Django | ✅ | Algoritmi comuni |
| Flask | ✅ | Algoritmi comuni |
| Rack | ✅ | Algoritmi comuni |
| Express (cookie-signer) | ✅ | Algoritmi comuni |
| Laravel | ✅ | AES-CBC-128/256 (GCM non ancora supportato) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer (salt predefinito) |
| Altri | ❌ | Non ancora! |
Per installare CookieMonster, installa Go e poi installa il CLI:
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonster ha bisogno solo di due elementi essenziali: un cookie da provare a rimuovere la firma e una wordlist da utilizzare. Se non hai una wordlist, CookieMonster viene fornito con una wordlist predefinita dal progetto Flask-Unsign. Le wordlist di CookieMonster sono leggermente diverse; ogni riga deve essere codificata in base64. Questo perché i progetti Python sono particolarmente liberali nell'inserire byte spuri in queste chiavi, e dobbiamo essere in grado di gestirli correttamente.
Un esempio di utilizzo del CLI con un cookie statico o con un URL:
% ./cookiemonster -cookie "gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
ℹ️ CookieMonster ha caricato la wordlist predefinita; ha 38919 voci.
✅ Successo! Ho scoperto la chiave per questo cookie con il decodificatore django; è "changeme".
% ./cookiemonster -url "https://httpbingo.org/cookies/set?abc=gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
⚠️ Ho ottenuto un codice di stato non 200 da questo URL; era 302.
ℹ️ CookieMonster ha caricato la wordlist predefinita; ha 38919 voci.
✅ Successo! Ho scoperto la chiave per questo cookie con il decodificatore django; è "changeme".
CookieMonster è in grado di supportare cookie firmati con cookie-session, comune con Express. Tuttavia, fa diverse cose strane che richiedono attenzione per utilizzare questo strumento. Una risposta comune da un'applicazione cookie-session assomiglia a questa:
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
Per passare questo a CookieMonster, devi includere sia il nome del cookie che il cookie della firma. In questo esempio, chiameresti CookieMonster così: cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI (nota il delimitatore ^ e il nome del cookie prefisso). L'API accetta lo stesso formato in monster.NewCookie.
CookieMonster ha un supporto limitato per rifirmare un cookie una volta che è stato privato della firma, con il flag -resign. Ciò comporta la modifica del corpo del cookie per corrispondere al tuo input, e poi il ricalcolo della firma con la chiave scoperta. Attualmente, puoi farlo per i cookie decodificati da Django; assicurati di passare il cookie originale a -cookie, e passa a -resign una stringa di testo non codificata che desideri all'interno del cookie. CookieMonster codificherà correttamente il tuo input e poi rifirmerà il cookie.
CookieMonster espone pkg/monster, che consente ad altre applicazioni di sfruttarlo facilmente. Questo è molto più performante che avviare il CLI se stai testando molti cookie. Un esempio di utilizzo è riportato di seguito.
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 è costruito con ispirazione da diverse fonti e viene fornito con le eccellenti wordlist di Flask-Unsign.