본문 바로가기

WriteUp/기타

2024 LINE CTF(jalyboy-baby)

0. 문제

 

LINECTF2024 | jalyboy-baby

 

34.84.28.50:10000

 

1. JWT 구조

Header.Payload.Signature

 

Header: 사용된 보안 알고리즘에 대한 정보

Payload: 전달할 정보

Signature: Header의 알고리즘으로 암호화된 문자열

 

 

ex) eyJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJndWVzdCJ9.XdxV7J2Q6mkgJTIWE6T-Mms_M858I36ZYaO1jtgsh-O6rK0r1IhET_xu2LJ2gKAW3iMbKBxBrKzT2wwS_MMWAQ

 

Header: eyJhbGciOiJFUzI1NiJ9

Payload: eyJzdWIiOiJndWVzdCJ9

Signature: XdxV7J2Q6mkgJTIWE6T-Mms_M858I36ZYaO1jtgsh-O6rK0r1IhET_xu2LJ2gKAW3iMbKBxBrKzT2wwS_MMWAQ

 

※ 각 정보들을 .으로 구분

 

Burp Suite의 Extensions - JSON Web Token Attacker(JOSEPH), JWT.io를 이용

 

 

Decoder 항목을 이용해 ex 값을 디코딩하면 다음과 같았다.

Header: {"alg":"ES256"}

Payload: {"sub":"guest"}

Signature: ]�U읐�i %2��2k?3�|#~�a����,�㺬�+ԈDO�nزv���#(A���� ��

 

# 해시 암호라 복호화가 매우 힘들기 때문에 깨진다.

Header, Payload는 Base64로 인코딩되며 Signature는 Header + Payload + secret 값을 alg으로 암호화된다.

생성된 Header, Payload, Signature로 JWT 토큰을 만들어 보내고 서버와 통신 시 유효성 검증에 사용된다.

 

Decoder

 

2. JWT 취약점 - None 알고리즘

: Header의 alg 부분을 none으로 변조한 후 시그니처를 제거하면 Payload를 변조해도 인증이 되는 문제

 

ex) eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJndWVzdCJ9.rUKzvxAwpuro6UF6KETwbMPCLBsPGUScjSEZtQGjfX4

Header: {"alg":"HS256"} → {"alg":"none"}

Payload: {"sub":"guest"} → {"sub":"admin"}

Signature: ]�B��0����Az(D�l��,D��!��}~ → 삭제

 

서버에서 none 알고리즘을 지원함. → 서명 검증을 우회할 수 있기 때문에 주의

* HS256 = HMAC + SHA256

 

3. 문제와 코드

페이지 접속 시 나오는 화면

 

문제의 페이지에 접속하면 다음과 같은 화면이 나오며, "login as guest" 버튼과 "login as admin" 버튼이 있다.

단, login as guest 버튼만 클릭이 가능하다.

 

login as guest를 누르기 전 후

 

login as guest 버튼을 누르면 j=에 jwt값들이 url에 기록된다.

 

 

JwtController.java

 

코드를 보면 sub 값이 ADMIN(admin)과 같을 때 FLAG를 화면에 출력한다.

 

4. exploit

1. login as guest 버튼을 눌러 jwt 값을 받아온다.

2. alg 값을 none, sub 값을 admin으로 변경하고 시그니처를 제거한다.

3. j=에 변조한 값을 붙여넣는다.

 

Burp suite - JSON Web Token Attacker

 

Decoder에서 시그니처 값을 제거, sub 값을 admin 변조했고 Manual에서 Header 값을 none으로 바꿔주었다.

 

 

url j=에 변조한 값 붙여넣기

 

변조한 값을 붙여넣으면 플래그가 나온다.

 

flag is LINECTF{337e737f9f2594a02c5c752373212ef7}