Cookie 탭은 프레임워크가 서명한 세션 쿠키를 위한 워크벤치입니다: Flask(itsdangerous), Rack, Django. 쿠키를 파트로 디코드하고, 후보 서명 secret을 검증하거나 워드리스트로 브루트포스한 뒤, 세션을 편집해 재서명합니다. 파트를 보여주기만 하는 Decoder의 읽기 전용 cookie-decode / flask-decode / rack-decode / django-decode 컨버터보다 한 걸음 더 나아갑니다.
어디서든(예: History 상세 패널, Notes 등) 쿠키를 선택하고 Space → Send to Cookie를 누르면 그 쿠키로 새 워크벤치 서브탭을 채웁니다. 세션은 휘발성이라 디스크에는 아무것도 기록되지 않습니다. 이 탭은 기본적으로 바 밖에 있습니다. **0**을 누르고 "cookie"를 입력하거나, 커맨드 팔레트(Ctrl-P → Go to Cookie)를 쓰거나, Preferences에서 슬롯을 내주세요.
두 개의 렌즈
하나의 세션, 두 개의 뷰이며 Ctrl-T로 전환합니다. 각 렌즈의 최상위 카드 테두리에 전환 칩이 있습니다(INPUT에는 ^T:→FORGE, PAYLOAD에는 ^T:→DECODE). 클릭해도 키와 똑같이 동작합니다:
- Decode: INPUT에 쿠키를 붙여 넣으면 파트가 DECODED에 실시간으로 디코드됩니다. OPTIONS는 읽는 방식을 고정합니다: 포맷(
Ctrl-A로auto/flask/rack/django순환,auto는 문장 부호로 감지), Django HMAC 알고리즘, 서명 salt. SECRET은 후보 키를 담으며, 입력하는 동안 검증 결과(✓ verified/✗ bad key)가 실시간으로 표시됩니다.c를 누르면 크랙합니다(아래 참고). - Forge: PAYLOAD에서 세션을 편집하고(Flask/Django는 JSON 객체, Rack은 불투명한 base64 값), SECRET을 설정하면 재서명된 쿠키가 OUTPUT에 실시간으로 나타납니다.
Space → Load decoded payload는 현재 Decode 쪽에서 디코드된 payload를 Forge 편집기로 불러옵니다. 그래서 값 하나를 손보고 두 동작만으로 재서명할 수 있습니다. 결과는 y로(위조된 쿠키는 Space → Copy forged cookie로) 복사하세요.
디코드는 하지만 검증은 하지 않는 JWT 탭과 달리, Cookie에는 secret 경로가 있습니다. SECRET의
✓는 입력한 키가 실제로 이 쿠키를 서명한다는 뜻입니다. Forge는 지정한 secret, salt, 알고리즘으로 실제로 재서명합니다.
세 가지 포맷
| 포맷 | 형태 | 서명 |
|---|---|---|
| Flask | value.timestamp.signature |
itsdangerous HMAC(값 앞의 .는 zlib 압축 표시). |
| Rack | base64--40자리 hex |
Base64-Marshal 값 + HMAC-SHA1. 값이 불투명한 바이트라 Forge는 JSON이 아니라 base64로 받습니다. |
| Django | value:timestamp:signature |
django.core.signing, salt가 섞인 HMAC. 세션 쿠키는 기본이 아닌 salt로 서명합니다. 아래 참고. |
secret 크랙
SECRET 필드는 c(크랙)의 소스를 겸하므로, 별도 프롬프트가 없습니다:
- 파일 경로는 워드리스트로 읽습니다(한 줄에 후보 하나);
- 콤마로 구분된 목록(
admin,secret,changeme)은 인라인으로 시도합니다; - 단일 secret은 원소가 하나인 목록입니다. 실시간 검증과 같은 검사를 크랙으로 표현한 것입니다.
성공하면 필드가 찾아낸 secret으로 바뀌고 결과가 ✓로 뒤집혀, 그대로 Forge 렌즈로 이어갈 수 있습니다.
Django 세션 쿠키(
django.contrib.sessions)는 기본이 아닌 salt로 서명되므로, 기본 salt로 크랙하면 실패합니다. 포맷이 Django로 해석되면 OPTIONS에salt:signing배지가 나타납니다. 이 배지를 클릭하거나(Space→ Toggle Django salt) salt 필드를django.contrib.sessions.backends.signed_cookies로 뒤집으면 verify·crack·forge가 모두 그 salt로 서명됩니다. 직접 아무 salt나 입력할 수도 있습니다. CLI의--salt도 마찬가지입니다.
헤드리스
gori run cookie eyJ1c2Vy... # 디코드 (자동 감지, 기본)
gori run cookie eyJ1c2Vy... --verify --secret s3cret # 이 secret이 서명하는가?
gori run cookie eyJ1c2Vy... --crack --wordlist words.txt # secret 브루트포스
gori run cookie eyJ1c2Vy... --crack --secrets a,b,s3cret # …또는 인라인 목록
gori run cookie --forge --type flask --payload '{"admin":true}' --secret s3cret
cat cookie.txt | gori run cookie # stdin에서 쿠키
쿠키는 인자나 stdin에서 옵니다. 프로젝트나 캡처는 관여하지 않습니다(순수 로컬 연산). --type은 포맷을 고정하고(기본: 자동 감지), --salt는 Flask/Django 서명 salt를, --algorithm은 Django HMAC 알고리즘(sha256 또는 sha1)을 지정하며, --format은 text 또는 json입니다. --verify/--crack에서는 이 값을 비워 두면 쿠키의 서명 길이로 알고리즘을 자동 판별하므로, SHA-1을 쓰는 구형 앱이 잘못된 키로 오인되지 않습니다(--forge는 sha256 기본). Flask/Django --forge는 --payload JSON을, Rack은 불투명한 --value를 받고, --timestamp UNIX는 위조한 쿠키에 현재 시각 대신 그 초를 찍습니다. CLI 레퍼런스를 참고하세요.
MCP에서는 cookie_decode / cookie_verify / cookie_crack / cookie_forge가 네트워크나 상태를 건드리지 않는 읽기 도구라, --read-only에서도 사용할 수 있습니다.
다음 단계
- JWT: JSON Web Token을 위한 형제 워크벤치
- Decoder: 더 긴 변환 체인 안에서 쿠키 디코드
- Repeater & Fuzzer: 위조한 쿠키를 대상에 발사