
C में लिखा गया JWT brute force cracker
C में लिखा गया एक मल्टी-थ्रेडेड JWT ब्रूट-फोर्स क्रैकर। यदि आप बहुत भाग्यशाली हैं या आपके पास विशाल कंप्यूटिंग शक्ति है, तो यह प्रोग्राम JWT टोकन की गुप्त कुंजी खोजने में सक्षम होना चाहिए, जिससे आप वैध टोकन बना सकें। यह केवल परीक्षण उद्देश्यों के लिए है, अपने आप को मुसीबत में न डालें :)
मैंने Apple Base64 कार्यान्वयन का उपयोग किया है जिसे मैंने थोड़ा संशोधित किया।
docker build . -t jwtcrack
docker run -it --rm jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
सुनिश्चित करें कि आपके पास openssl के हेडर इंस्टॉल हैं। Ubuntu पर आप इन्हें apt-get install libssl-dev से इंस्टॉल कर सकते हैं।
make
यदि आप Mac का उपयोग करते हैं, तो आप brew install openssl से OpenSSL इंस्टॉल कर सकते हैं, लेकिन हेडर एक अलग स्थान पर संग्रहीत होंगे:
make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
HMAC के लिए निम्नलिखित हैश फ़ंक्शन समर्थित हैं, अर्थात कीड-हैश्ड मैसेज ऑथेंटिकेशन कोड उत्पन्न करने के लिए: JSON HS256 (HMAC का उपयोग करके SHA-256) के लिए "sha256", HS384 के लिए "sha384" और HS512 के लिए "sha512", क्रमशः। आप किसी भी अन्य हैश फ़ंक्शन का नाम बिल्कुल वैसे ही निर्दिष्ट कर सकते हैं जैसा कि OpenSSL में नामित है। यदि OpenSSL इस हैश फ़ंक्शन को HMAC के लिए उपयोग करने की अनुमति देता है, तो jwtcrack गुप्त कुंजी को डिकोड करने का प्रयास करेगा। हालाँकि, चूँकि jwtcrack केवल एक डिकोडर है, इसलिए इस बात की कोई गारंटी नहीं है कि इस एल्गोरिथ्म का वास्तव में एन्कोडिंग के लिए उपयोग किया गया था, अकेले "JSON वेब एल्गोरिदम" RFC के लिए अनुमत एल्गोरिदम की सूची में से। अधिक जानकारी के लिए RFC 7518 का खंड 3.1 देखें।
निम्नलिखित उदाहरण में, हम एक sha256 हैश फ़ंक्शन का उपयोग करते हैं जो JSON HS256 (HMAC-SHA256) से मेल खाता है, अंतिम कमांड लाइन पैरामीटर के रूप में "sha256" देखें। साथ ही, इस उदाहरण में हम अधिकतम गुप्त लंबाई 5 वर्ण निर्दिष्ट करते हैं, और वर्णमाला को निम्नलिखित वर्णों तक सीमित करते हैं: ABCSNFabcsnf1234
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE ABCSNFabcsnf1234 5 sha256
उपरोक्त उदाहरण में, कुंजी Sn1f है, और इसे 2019 के आसपास निर्मित एक औसत नोटबुक (जैसे Ice Lake माइक्रोआर्किटेक्चर पर आधारित Intel CPU के साथ) पर एक सेकंड से भी कम समय लगता है। jwtcrack प्रोग्राम को संकलित करने के लिए GCC संस्करण 9.3.0 का "-O3" के साथ उपयोग किया गया था। इसे Linux Ubuntu 20.04.1 LTS के तहत OpenSSL लाइब्रेरी संस्करण 1.1.1f से लिंक किया गया था।
यहाँ, अगले उदाहरण में, हम HS512 (HMAC-SHA512) निर्दिष्ट करने के लिए अंतिम कमांड लाइन पैरामीटर के रूप में "sha512" का उपयोग करते हैं, हम अधिकतम गुप्त लंबाई 9 वर्ण भी निर्दिष्ट करते हैं, और वर्णमाला को निम्नलिखित सात लोअरकेस लैटिन वर्णों तक सीमित करते हैं: "adimnps"।
$ > ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.RnWtv7Rjggm8LdMU3yLnz4ejgGAkIxoZwsCMuJlHMwTh7CJODDZWR8sVuNvo2ws25cbH9HWcp2n5WxpIZ9_v0g adimnps 9 sha512
उपरोक्त उदाहरण में, कुंजी adminpass है, और Intel Core i7 1065G7 CPU (Ice Lake माइक्रोआर्किटेक्चर, 2019), बेस फ्रीक्वेंसी 1.30 GHz, अधिकतम टर्बो 3.90 GHz वाले नोटबुक पर डिकोड करने में औसतन लगभग 15 सेकंड लगते हैं। मल्टीथ्रेडिंग के कारण यूज़र मोड में प्रत्येक कोर से उपभोग किए गए CPU-सेकंड की कुल संख्या उस गुप्त कुंजी को डिकोड करने में औसतन लगभग 100 है।
"sha384" का उपयोग करने का उदाहरण:
$ > ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJyb2xlIjoiYWRtaW4ifQ.31xCH3k8VRqB8l5qBy7RyqI2htyCskBy_4cIWpk3o43UkIMW-IcjTUEL_NyFXUWJ 0123456789 6 sha384
/usr/bin/time -f "Total number of CPU-seconds consumed directly from each of the CPU cores: %U\nElapsed real wall clock time used by the process: %E" ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.RnWtv7Rjggm8LdMU3yLnz4ejgGAkIxoZwsCMuJlHMwTh7CJODDZWR8sVuNvo2ws25cbH9HWcp2n5WxpIZ9_v0g adimnps 9 sha512
मेरे द्वारा उपयोग किया गया Base64 कार्यान्वयन (Apple से) कभी-कभी बगी होता है क्योंकि सभी Base64 कार्यान्वयन समान नहीं होते हैं। इसलिए कभी-कभी, आपके Base64 टोकन को डिक्रिप्ट करना केवल आंशिक रूप से काम करेगा और इस प्रकार आप अपने टोकन के लिए एक ऐसी गुप्त कुंजी ढूंढ पाएंगे जो सही नहीं है।
यदि कोई अधिक मजबूत Base64 कार्यान्वयन लागू करने को तैयार है, तो यह बहुत अच्छा होगा :)