
Dekodiert und entfernt die Signatur von anfälligen Sitzungscookies aus Django, Flask, Laravel, Express und JWT-Frameworks. Unterstützt HMAC-basierte Decoder, Base64-Wortlisten und Automatisierungspipelines für schnelle Schwachstellenerkennung.
CookieMonster ist ein Kommandozeilen-Tool und eine API zum Dekodieren und Modifizieren von unsicheren Session-Cookies aus verschiedenen Frameworks. Es ist für den Einsatz in Automatisierungs-Pipelines konzipiert, die eine große Anzahl dieser Cookies effizient verarbeiten müssen, um schnell Schwachstellen zu finden. Darüber hinaus ist CookieMonster erweiterbar und kann einfach neue Cookie-Formate unterstützen.
Es ist wichtig zu betonen, dass CookieMonster Schwachstellen in den Nutzern der Frameworks findet, normalerweise nicht in den Frameworks selbst. Diese Nutzer können die von CookieMonster gefundenen Schwachstellen beheben, indem sie das Framework so konfigurieren, dass es einen sicheren geheimen Schlüssel verwendet.
| Framework | Unterstützt | Anmerkungen |
|---|---|---|
| JSON Web Tokens | ✅ | HS256, HS384, HS512 |
| Django | ✅ | Gängige Algorithmen |
| Flask | ✅ | Gängige Algorithmen |
| Rack | ✅ | Gängige Algorithmen |
| Express (cookie-signer) | ✅ | Gängige Algorithmen |
| Laravel | ✅ | AES-CBC-128/256 (GCM noch nicht unterstützt) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer (Standard-Salt) |
| Andere | ❌ | Noch nicht! |
Um CookieMonster zu installieren, installieren Sie Go und dann die CLI:
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonster benötigt nur zwei grundlegende Dinge: ein Cookie zum Entschlüsseln und ein Wörterbuch. Falls Sie kein Wörterbuch haben, wird CookieMonster mit einem Standard-Wörterbuch aus dem Flask-Unsign Projekt ausgeliefert. CookieMonster-Wörterbücher sind etwas anders; jede Zeile muss mit base64 kodiert sein. Das liegt daran, dass Python-Projekte besonders großzügig mit dem Einfügen von nutzlosen Bytes in diese Schlüssel sind und wir diese ordnungsgemäß behandeln müssen.
Ein Beispiel für die Verwendung der CLI mit einem statischen Cookie oder mit einer 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 kann Cookies unterstützen, die mit cookie-session signiert wurden, was bei Express üblich ist. Allerdings tut dies einige seltsame Dinge, die bei der Verwendung dieses Tools Vorsicht erfordern. Eine typische Antwort einer cookie-session-Anwendung sieht so aus:
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
Um dies an CookieMonster zu übergeben, müssen Sie sowohl den Cookie-Namen als auch den Signatur-Cookie angeben. In diesem Beispiel würden Sie CookieMonster so aufrufen: cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI (beachten Sie das Trennzeichen ^ und den vorangestellten Cookie-Namen). Die API akzeptiert dasselbe Format in monster.NewCookie.
CookieMonster bietet begrenzte Unterstützung zum Neusignieren eines Cookies, nachdem er entschlüsselt wurde, mit dem Flag -resign. Dabei wird der Inhalt des Cookies entsprechend Ihrer Eingabe modifiziert und dann die Signatur mit dem gefundenen Schlüssel neu berechnet. Derzeit ist dies für Django-dekodierte Cookies möglich; stellen Sie sicher, dass Sie das Original-Cookie an -cookie übergeben, und übergeben Sie -resign einen unkodierten Text, der im Cookie enthalten sein soll. CookieMonster kodiert Ihre Eingabe korrekt und signiert den Cookie dann neu.
CookieMonster stellt pkg/monster bereit, das es anderen Anwendungen ermöglicht, es einfach zu nutzen. Dies ist viel leistungsfähiger als das Starten der CLI, wenn Sie viele Cookies testen. Ein Beispiel für die Verwendung finden Sie unten.
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 wurde mit Inspiration aus mehreren Quellen entwickelt und wird mit den exzellenten Flask-Unsign-Wörterbüchern ausgeliefert.