
Décode et désigne les cookies de session vulnérables des frameworks Django, Flask, Laravel, Express et JWT. Prend en charge les décodeurs basés sur HMAC, les listes de mots en base64 et les pipelines d'automatisation pour une découverte rapide des vulnérabilités.
CookieMonster est un outil en ligne de commande et une API pour décoder et modifier les cookies de session vulnérables de plusieurs frameworks différents. Il est conçu pour fonctionner dans des pipelines d'automatisation qui doivent être capables de traiter efficacement un grand nombre de ces cookies afin de découvrir rapidement des vulnérabilités. De plus, CookieMonster est extensible et peut facilement prendre en charge de nouveaux formats de cookies.
Il est important de souligner que CookieMonster trouve des vulnérabilités chez les utilisateurs des frameworks, généralement pas dans les frameworks eux-mêmes. Ces utilisateurs peuvent résoudre les vulnérabilités découvertes via CookieMonster en configurant le framework pour utiliser une clé secrète forte.
| Framework | Prise en charge | Notes |
|---|---|---|
| Jetons Web JSON | ✅ | HS256, HS384, HS512 |
| Django | ✅ | Algorithmes courants |
| Flask | ✅ | Algorithmes courants |
| Rack | ✅ | Algorithmes courants |
| Express (cookie-signer) | ✅ | Algorithmes courants |
| Laravel | ✅ | AES-CBC-128/256 (GCM pas encore pris en charge) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer (sel par défaut) |
| Autres | ❌ | Pas encore ! |
Pour installer CookieMonster, installez Go puis installez le CLI :
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonster n'a besoin que de deux éléments essentiels : un cookie à essayer de désigner et une liste de mots à utiliser. Si vous n'avez pas de liste de mots, CookieMonster est livré avec une liste de mots par défaut provenant du projet Flask-Unsign. Les listes de mots de CookieMonster sont un peu différentes ; chaque ligne doit être encodée en base64. Cela est dû au fait que les projets Python sont particulièrement permissifs quant à l'insertion d'octets indésirables dans ces clés, et nous devons être capables de les gérer correctement.
Un exemple d'utilisation du CLI avec un cookie statique, ou avec une 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 est capable de prendre en charge les cookies signés avec cookie-session, ce qui est courant avec Express. Cependant, il fait plusieurs choses étranges qui nécessitent de la prudence pour utiliser cet outil. Une réponse typique d'une application cookie-session ressemble à ceci :
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
Pour passer cela dans CookieMonster, vous devez inclure à la fois le nom du cookie et le cookie de signature. Dans cet exemple, vous appelleriez CookieMonster comme ceci : cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI (notez le délimiteur ^ et le nom du cookie préfixé). L'API accepte ce même format dans monster.NewCookie.
CookieMonster prend en charge de manière limitée la re-signature d'un cookie une fois qu'il a été désigné, avec le flag -resign. Cela implique de modifier le corps du cookie pour correspondre à votre entrée, puis de recalculer la signature avec la clé que nous avons découverte. Actuellement, vous pouvez le faire pour les cookies décodés par Django ; assurez-vous de passer le cookie original à -cookie, et passez à -resign une chaîne de texte non encodée que vous souhaitez voir à l'intérieur du cookie. CookieMonster encodera correctement votre entrée puis resignera le cookie.
CookieMonster expose pkg/monster, ce qui permet à d'autres applications d'en tirer facilement parti. C'est beaucoup plus performant que de démarrer le CLI si vous testez de nombreux cookies. Un exemple d'utilisation est ci-dessous.
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 construit avec l'inspiration de plusieurs sources, et est livré avec les excellentes listes de mots Flask-Unsign.