π Introduction
JWT(JSON Web Token)μ μ μ μλͺ μ ν¬ν¨ν JSON ννμ νμ€ ν¬λ§·μ λλ€. RFC7519μ μ μλμ΄ μμΌλ©° μ΄λ₯Ό ν΅ν΄ μλ², ν΄λΌμ΄μΈνΈ λ± μνΈκ°μ ν΅μ μ μκ·Έλμ²λ₯Ό κ²μ¦νμ¬ μλ³μ‘° μ¬λΆλ₯Ό 체ν¬ν μ μκ³ expire κ°μ ν΅ν΄ λ§λ£ μ¬λΆλ 체ν¬ν μ μμ΅λλ€.
λ³Έλ μΈμ¦ λͺ©μ μΌλ‘ ꡬμ±λ νμ€μ μλμ§λ§, SPA(Single Page Application)μμ μ½κ² μΈμ¦μ ꡬννκΈ° μν΄ JWTλ₯Ό μΈμ ν ν°μ²λΌ μ¬μ©νλ κ²½μ°λ λ§μ΅λλ€.
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
Struct of JWT
JWTλ HEADER
/PAYLOAD
/SIGNATURE
μ΄λ κ² 3κ°μ§μ νλλ‘ λλμ΄μ Έ μμ΅λλ€. λͺ¨λ νλλ JSONμΌλ‘ ννλλ©° μ΄λ¬ν JSON νλλ€μ κ°κ° Base64 μΈμ½λ©νκ² νμ¬ νλμ κ°μΌλ‘ ν©μΉ κ²μ΄ JWT μ
λλ€.
HEADER
HEADERλ JWTμ μ λ°μ μΈ μ 보λ₯Ό λ΄λ νλμ
λλ€. λ³΄ν΅ alg
κ°μΌλ‘ μλͺ
μκ³ λ¦¬μ¦(e.g HS256)μ μ μ μμ΅λλ€.
List of Algorithms
- None
- hs256
- hs384
- hs512
- rs256
- rs384
- rs512
- es256
- es384
- es512
- ps256
- ps384
- ps512
PAYLOAD PAYLOADλ μ¬μ©μκ° μΆκ°ν λ°μ΄ν° μμμ λλ€.
SIGNATURE JWT κ°μ 무결μ±μ μ μ§νκΈ° μν΄ μλͺ λ κ°μ΄ ν¬ν¨λλ νλμ λλ€. μΌλ°μ μΌλ‘ μ¬κΈ°μ λ€μ΄κ°λ κ°μ HEADERμμ algλ‘ μλͺ μκ³ λ¦¬μ¦μ λͺ μν΄μ£Όλ©°, μ΄ Signature κ°μ ν΅ν΄ JWTλ₯Ό μμ±ν μ΄νμ λ°μ΄ν°μ λν λ³μ‘°κ° μμλμ§ μ μ μκ² λ©λλ€.
μ΄ λ μλͺ
μ HEADER
+ .
+ PAYLOAD
μ κ°μ κΈ°λ°μΌλ‘ μμ±ν©λλ€.
π‘ Offensive techniques
JWT λ΄ μ€μμ 보 ν¬ν¨
JWTλ Base64λ JSON κ°μ λλ€. κ³§ Base64λ₯Ό Decodeνλ©΄ λꡬλ λ΄μ©μ λ³Ό μ μκΈ° λλ¬Έμ JWT μμλ μ€μν μ 보λ₯Ό νλ¬ΈμΌλ‘ λ΄μ§ μλκ² μ’μ΅λλ€.
JWT Token
|
|
Decoded
|
|
JWT Signature Secret Crack
JWTλ λΆλ¬Έμ λν μλ³μ‘° λ°©μ§λ₯Ό μν μλͺ μ JWT λ°μ΄ν°μ ν¬ν¨νμ¬ μ μ‘ν©λλ€. μ΄ μλͺ κ°μ μ ν΄μ§ Secret κ°μΌλ‘ κ²μ¦ν μ μμ΄ λ°μ΄ν°μ λν 무결μ±μ κ²μ¦ν μ μμ΅λλ€. λ€λ§ Secretμ΄ λ ΈμΆλκ±°λ λ¨μν ν¨ν΄μ μ¬μ©νλ κ²½μ° μ¬λ¬κ°μ§ λꡬλ€μ μ΄μ©ν΄μ Crackμ μλνκ³ λ§μ½ 곡격μκ° Crackμ ν΅ν΄ Secret κ°μ μ»μ΄λΈλ€λ©΄ μμλ‘ JWT ν ν°μ μμ±/μμ ν μ μμ΄ JWTλ₯Ό κΈ°λ°μΌλ‘ ν λΉμ¦λμ€ λ‘μ§μ ν¬κ² 무결μ±μ ν΄μΉ μ μμ΅λλ€.
|
|
https://github.com/hahwul/jwt-hack
jwt κ΄λ ¨ λꡬλ€μ λλ€μκ° cracking κ΄λ ¨ λꡬμ΄λ©°, μλ tools λΆλΆ μ°Έκ³ νμκΈΈ λ°λλλ€.
None Algorithm attack
JWTμ λνμ μΈ κ³΅κ²© λ°©λ² μ€ νλμΈ None Algorithmμ λλ€. JWTλ HEADER μμμ alg κ°μ ν΅ν΄ μκ³ λ¦¬μ¦μ λͺ μν μ μλλ°, JWT ν ν° μμ± μ alg κ°μ NoneμΌλ‘ λͺ μνκ±°λ, μΌλΆ JWT λΌμ΄λΈλ¬λ¦¬λ€μ alg κ°μ none λ± λΉ μλͺ μ²λ¦¬ μ μλͺ κ²μ¦μ νμ§ μκ³ λμ΄κ° μ μλ μ·¨μ½μ±μ κ°μ§κ³ μμ΅λλ€. μ΄λ₯Ό μ΄μ©νλ©΄ 곡격μκ° Secret κ°μ λͺ°λΌλ μ΄λ₯Ό ν΅ν΄μ JWTλ₯Ό μμλ‘ μμ±νκ±°λ μμ ν μ μμ΅λλ€.
|
|
|
|
JKU and X5U
jku, x5uλ JWS(Json Web Signature)μμ μ¬μ©λλ νλΌλ―Έν°λ‘ ν€ κΈ°λ° μλͺ μ μν μ¬λ£μ λλ€. jkuμ x5u νλλ₯Ό ν΅ν΄ ν€ κ²μ¦μ μν μλ²λ₯Ό μ§μ ν μ μμΌλ©° μ΄ κ°λ€μ HEADER νλμ λͺ μν©λλ€.
e.g
|
|
jkuμ x5uμ λͺ μλ λλ©μΈμ μ΄λ₯Ό μλͺ κ²μ¦νλ Applicationμμ μ κ·Όν΄μ κ²μ¦ν Trusted μλ²μ΄κΈ° λλ¬Έμ λ§μ½ μ΄ κ°μ΄ λ³μ‘°λμλ€λ©΄ μλ²λ λ³μ‘°λ μλ²λ‘ μλͺ κ²μ¦μ νλ €κ³ μμ²νκ² λ©λλ€.
μ΄ λ jkuμ x5u λλ©μΈμ λν κ²μ¦μ΄ κ³Όμ μ΄ μμ κ°λ₯μ±μ΄ μ‘΄μ¬νμ§λ§, SSRFμ μ μ¬νκ² λλ©μΈ κ²μ¬ λ‘μ§μ μ°ννλ ννλ‘ κ³΅κ²© νμ΄λ‘λ ꡬμ±μ΄ κ°λ₯ν©λλ€.
|
|
jwt-hackμμλ μ΄λ₯Ό μν payload κΈ°λ₯μ μ 곡νκ³ μμ΅λλ€.
|
|
|
|
π‘ Defensive techniques
μ§§μ λ§λ£μκ°
JWT μμ²΄κ° ν ν° λ΄λΆμ λ§λ£ μκ°μ μ μ₯νκ³ μλ²κ° λ§λ£ μ¬λΆλ§ 체ν¬νκΈ° λλ¬Έμ λͺ μμ λ‘κ·Έμμμ΄λ λΈλΌμ°μ§ μ’ λ£μ λν΄μ μλ²κ° μλ³ν μ μμ΅λλ€. κ·Έλμ μ€μν μλΉμ€μΈ κ²½μ° JWT μ체μ λ§λ£ μκ°μ μ§§κ² κ°μ Έκ°μ νΉμλΌλ λ€λ₯Έ μ·¨μ½μ μΌλ‘ μΈν΄ ν ν°μ΄ λ ΈμΆλμ΄λ μΆκ°μ μΈ κ³΅κ²©μΌλ‘ μ΄λ£¨μ΄μ§κΈ° μ΄λ ΅λλ‘ ν μ μμ΅λλ€.
None Algorithm
JWTμ Signatureμ μ¬μ©λλ μκ³ λ¦¬μ¦μ νΉμ ν μκ³ λ¦¬μ¦(μλ₯Όλ€λ©΄ HS256)μ΄ μ§μ λμ΄μΌ ν©λλ€. λ§μ½ none μνλ‘ μ¬μ©λλ€λ©΄ μ½κ² ν¬λν μ μμ΅λλ€.
Signature Secretμ 볡μ‘λ
JWTλ λ΄λΆ κ°κ³Ό μ ν¨κΈ°κ°λ±μ΄ ν¬ν¨λ λ°μ΄ν°μ λν μλͺ μ ν¬ν¨νκ³ μμ΅λλ€. μ΄λ μλ²μμ λ°κΈ μ μ§μ ν μκ³ λ¦¬μ¦μ λ°λΌμ μλͺ ν JWT ν ν°μ ν¬ν¨λλ©° μλ²μμ μ ν¨κΈ°κ°κ³Ό ν¨κ» μλͺ μ μ μ μ¬λΆλ₯Ό κ²μ¦νκ² λ©λλ€.
λ³΄ν΅ Secretμ μ§μ νμ§ μκ³ μλͺ νλ κ²½μ°, Secretμ λν ν¬λ μ λμ 리μ€ν¬κ° μμ΅λλ€. μ κ° μμ μ JWT ν μ€ν μ μν΄μ jwt-hackμ λ§λ€κ³ μ¬λ¬λ² ν μ€νΈ νμλλ JWT μμ²΄κ° λ€νΈμν¬ νΈλν½μ΄ λ°μνμ§ μκ³ λ Signatureμ Secretμ λ§€ν μ¬λΆλ₯Ό 체ν¬ν μ μλμ§λΌ λ§μ μμ workdlistλ₯Ό λΉ λ₯΄κ² crack ν΄λ³Ό μ μμλ κ² κ°μ΅λλ€.
μλ¬΄νΌ νλ² κΉ¨μ§ secretμ μλΉμ€ μ 체μ JWT ν ν°λ€μ μν₯μ λΌμΉ μ μκΈ° λλ¬Έμ κ΅μ₯ν μ κ΄λ¦¬λμ΄μΌ ν©λλ€.
λ΄λΆμ μ€μμ 보λ₯Ό μ μ₯νμ§ μμ
JWTλ Base64λ‘ μΈμ½λ©λ JSON ννμ κ°μ λλ€. Base64κΈ° λλ¬Έμ μ½κ² λμ½λ©ν΄μ λ³Ό μ μκ³ λΉμ°ν μ€μν μ 보λ JWTμ λ΄μ§ μλ κ²μ΄ μμΉμ λλ€.
Sliding sessions
μ¬λΌμ΄λ© μΈμ μ μ΄λ¬ν Stateless μλΉμ€μμμ 보μμ±μ μν΄ λ²λ €μ§λ νΈμμ±μ μ‘κΈ° μν μΈμ μ λ΅μ λλ€. μλΉμ€λ₯Ό κ³μ μ¬μ©νλ μ μ μκ²λ λ§λ£λκΈ° μ μ μλμΌλ‘ λ§λ£ κΈ°νμ μ°μ₯μμΌμ£Όλ λ°©λ²μ λλ€. μ¬μ©μκ° μΉ νμ΄μ§μμ νλνλ건 JSλ¨μμ μ½κ² μ΄λ²€νΈ νΈλ€λ¬λ‘ κ°μ§ν μ μκΈ° λλ¬Έμ μ΄λ¬ν μ½λλ€μ ν΅ν΄ μ¬μ©μμ νμ¬ μ‘μ μ¬λΆλ₯Ό μ§μμ μΌλ‘ 체ν¬νκ³ νλ μ€μ΄λΌκ³ νλ¨λλ©΄ μΈμ μ΄ λ§λ£ μκ°μ΄ λκΈ° μ μ λ§λ£μκ°μ κ°±μ ν ν ν°μ λ€μ λ°μμ€λ ννλ‘ λ§λ£ μκ°μ μ°μ₯ν μ μμ΅λλ€.
e.g
|
|
πΉ Tools
- https://github.com/hahwul/jwt-hack
- https://github.com/brendan-rius/c-jwt-cracker
- https://github.com/lmammino/jwt-cracker
- https://github.com/hashcat/hashcat/
π Articles
- https://www.hahwul.com/2021/05/05/sliding-sessions/
- https://www.hahwul.com/2019/10/11/jwt-cracker-secret-key-crack/
- https://www.hahwul.com/2016/01/20/web-hacking-jwtjson-web-token-jwt-test/