
Django、Flask、Laravel、Express、JWTフレームワークからの脆弱なセッションクッキーをデコードおよび署名解除します。HMACベースのデコーダー、base64ワードリスト、迅速な脆弱性発見のための自動化パイプラインに対応しています。
CookieMonsterは、複数のフレームワークの脆弱なセッションCookieをデコードおよび変更するためのコマンドラインツール兼APIです。大量のこれらのCookieを効率的に処理し、脆弱性を迅速に発見する必要がある自動化パイプラインで実行するように設計されています。さらに、CookieMonsterは拡張可能で、新しいCookie形式を簡単にサポートできます。
強調すべき点は、CookieMonsterはフレームワーク自体ではなく、通常はフレームワークのユーザーに脆弱性を発見するということです。これらのユーザーは、フレームワークを強力な秘密鍵を使用するように設定することで、CookieMonsterを介して発見された脆弱性を解決できます。
| Framework | Supported | Notes |
|---|---|---|
| JSON Web Tokens | ✅ | HS256, HS384, HS512 |
| Django | ✅ | 一般的なアルゴリズム |
| Flask | ✅ | 一般的なアルゴリズム |
| Rack | ✅ | 一般的なアルゴリズム |
| Express (cookie-signer) | ✅ | 一般的なアルゴリズム |
| Laravel | ✅ | AES-CBC-128/256(GCMは未サポート) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer(デフォルトのソルト) |
| Others | ❌ | まだです |
CookieMonsterをインストールするには、GoをインストールしてからCLIをインストールしてください:
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonsterに必要なのは、アンサインを試みるCookieと、使用するワードリストの2つだけです。ワードリストがない場合、CookieMonsterにはFlask-Unsignプロジェクトのデフォルトワードリストが同梱されています。CookieMonsterのワードリストは少し異なります。各行はbase64でエンコードされている必要があります。これは、Pythonプロジェクトが特にこれらの鍵にゴミバイトを挿入することに寛大であり、それらを適切に処理できるようにする必要があるためです。
An example of using the CLI with a static cookie, or with a 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は、Expressで一般的なcookie-sessionで署名されたCookieをサポートできます。ただし、このツールを使用するには注意が必要ないくつかの奇妙な動作があります。cookie-sessionアプリケーションからの一般的な応答は次のようになります:
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
これをCookieMonsterに渡すには、Cookie名と署名Cookieの両方を含める必要があります。この例では、次のようにCookieMonsterを呼び出します:cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI(区切り文字^と接頭辞付きのCookie名に注意)。APIはmonster.NewCookieで同じ形式を受け入れます。
CookieMonsterは、-resignフラグを使用して、一度アンサインされたCookieを再署名する限定的なサポートを提供します。これには、Cookieの本文を入力に一致するように変更し、発見した鍵で署名を再計算することが含まれます。現在、DjangoでデコードされたCookieに対してこれを行うことができます。元のCookieを-cookieに渡し、-resignにはCookie内に含めたいエンコードされていないテキスト文字列を渡してください。CookieMonsterは入力を正しくエンコードし、Cookieを再署名します。
CookieMonsterはpkg/monsterを公開しており、他のアプリケーションがそれを簡単に利用できます。多くのCookieをテストする場合、CLIを起動するよりもはるかにパフォーマンスが高いです。以下に使用例を示します。
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はいくつかのソースからインスピレーションを得て構築されており、優れたFlask-Unsignのワードリストが同梱されています。