16/12/24
FalsificacióJWKibypassOTP
Trencant banc | HTB University CTF 2024
Thanks for sharing!
بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

I know your browser history
Hola! Avui us explicaré la resolució del repte Breaking Bank de HTB University CTF 2024.
Abans de començar, si voleu provar el repte, el podeu trobar aquí.
Contingut
- Visió general del repte
- Reconeixement inicial
- Revisió del codi font
- Anàlisi de la funció de verificació
- Aconseguint la bandera
Submergem-nos!
Visió general del repte

Reconeixement inicial
El primer que vaig fer va ser mirar el lloc web. Tenim un formulari d'inici de sessió i registre:

He fet el meu compte i he iniciat sessió. Tenim una plataforma de criptomoneda amb una visió general del mercat i una cartera en la qual el meu saldo està ajustat a zero:


També tenim altres 2 pestanyes interessants: amics i Transaccions.
Revisió del codi font
El codi font era bastant gran, així que el vaig prendre al revés: com puc arribar a la bandera?
S'ha cercat
flag.txt al codi VS i ha trobat això:Veiem que podem obtenir la bandera si hem drenat la moneda
CLCR (establir-la a 0) de l'usuari amb aquest correu electrònic: financial-controller@frontier-board.htbLlavors, com ho podem fer?
Recordeu que tenim una pàgina de transacció, així que simplement podem transferir tota l'import d'aquesta moneda a un altre usuari, i l'aconseguim
A
/src/pages/Transaction.tsx, heu trobat aquest punt final: /api/crypto/transactionObserveu que necessita un testimoni JWT? Comprovem el nostre testimoni a localStorage:

Passant-lo a jwt.io, tenim:
Capçalera:
Cos:
Observem aquest fitxer:
http://127.0.0.1:1337/.well-known/jwks.json
que ens porta això:Nota ràpida: JWKS (conjunts de claus web JSON) és un conjunt de claus que conté les claus públiques utilitzades per verificar qualsevol JWT emès per un servidor d'autorització. El paràmetre de capçalerajku(JWK Set URL) s'utilitza per recuperar aquestes claus.
Deixem-ho per a més tard i primer entenem la lògica
Anàlisi de la funció de verificació
(where the good stuff begins)
cercant a vscode per ZZMDX0ZZZ, tenim la funció Z
verifyToken a Z/challenge/server/services/jwksService.jsLa funció és bastant bàsica, però aquí hi ha algunes parts que apareixen:
aquí comprova si la capçalera
jku comença amb http://127.0.0.1:1337/El
kid ha de coincidir amb el KEY_ID del servidor, que podem obtenir fàcilment des del nostre propi testimoniAra per la part interessant:
rep algunes dades de l'enllaç de la capçalera
jku, que al nostre testimoni era: http://127.0.0.1:1337/.well-known/jwks.jsonA continuació, la funció recupera el
jwk el kid del qual coincideix amb el del servidor, després el passa a la funció jwkToPem per convertir-lo en una clau pública format PEM:La funció
jwkToPem garanteix que la clau sigui del tipus RSA, converteix els seus components (n i e) a base64url i crea una clau pública PEM mitjançant el mòdul crypto del Node.Aquest pas és important perquè utilitzarem un enfocament similar per elaborar la nostra pròpia clau més endavant.
ara estivem el que tenim fins ara:
- Objectiu: transferir tots els
CLCRdefinancial-controller@frontier-board.htbper obtenir la bandera. - Validació JWT: el servidor comprova l'URL
jkui obté una clau (jwk) per verificar els testimonis. - Planifica: allotja una clau falsa en un servidor controlat, fes que el servidor hi recuperi i forja un testimoni
Primer fem la nostra clau falsa allotjada
Vaig fer el següent guió, Anem-ho a poc a poc
- Generació de claus:
- Genera un parell de claus RSA (
privateKeyipublicKey) per signar i verificar fitxes. KEY_IDés un identificador únic per a la clau (l'obté del vostre testimoni)
- Genera un parell de claus RSA (
- JWKS (conjunt de claus web JSON):
- Converteix el
publicKeya un format JWK (clau web JSON). - Afegeix metadades (
alg,use, Zkid)
- Converteix el
- JWT (Token web JSON):
- Crea un testimoni amb una càrrega útil (
emailiiat).
- Crea un testimoni amb una càrrega útil (
headerpersonalitzat inclou:kid: coincideix amb l'identificador de la clau (KEY_ID) (assegureu-vos de posar la vostra)jku: URL que apunta al fitxer JWKS fals.- Signa el testimoni amb la clau privada.
- Sortida:
- Registra el JWT i el JWKS falsificats per utilitzar-los en l'atac.
Si ho has provat... no funcionarà, saps per què?
Recordeu el
ha de començar per
http://127.0.0.1:1337/però com podem fer-lo recuperar del nostre servidor, ha de començar amb això???
La resposta és una redirecció oberta
Així que una mica de cerca (també aquests comentaris
// TODO van facilitar la localització de les coses correctes) trobem un fitxer analytics.js amb això dinsAquesta és una redirecció directa
Així és com farem que el servidor recuperi la nostra clau allotjada
Podeu utilitzar ngrok, però he allotjat el meu al meu lloc web:
https://h4ck.run/jwks.json
L'URL final tindrà aquest aspecte:http://127.0.0.1:1337/api/analytics/redirect?url=https://h4ck.run/jwks.json/&ref=dummy
Tingueu en compte que el maniquí
ref és necessari per redirigirNota: aquest script genera les seves claus de forma dinàmica a cada execució, així que assegureu-vos d'utilitzar el testimoni adequat amb la seva clau allotjada correcta
Ara, com que finalment hem aconseguit el nostre testimoni, provem-lo
Aconseguint accés
Ara amb el nostre testimoni falsificat, comprovem si va funcionar:

Bonic! El valor de la nostra cartera ja no és zero, la qual cosa vol dir que hi vam entrar!
Aconseguint la bandera
Va fer un altre compte i l'ha afegit com a amic per transferir les monedes. Però quan intenteu transferir...

Encara cal obviar l'OTP. Mirant
otpMiddleware.js:Està utilitzant Z
includes()!Si envieu un otp simulat i veieu la sol·licitud en burp, podreu veure que l'otp s'envia en una matriu

Així que simplement feu i arregleu amb totes les opcions possibles i ho teniu
["0001","0002","0003","0004","0005"..."9999"]
L'ordre per generar-lo:
Per copiar-lo feu servir:
Nota: poseu-lo a ruc suprimint la matriu existent i posant la vostra. No el poseu directament a l'entrada perquè es tractarà com una cadena en aquesta matriu, ja que podeu veure que l'otp es va passar com una cadena


I aquí tenim la nostra bandera!
Bandera:HTB{rugg3d_pu11ed_c0nqu3r3d_d14m0nd_h4nd5_789dfb9e1ce0f5ca7741ba640da6ce29}
Assoliment
Estic orgullós de compartir que el nostre equip es va classificar entre els 200 millors d'aquest CTF! Aquí teniu el certificat d'assoliment:

Punts clau per emportar
Aquest repte tenia una mica de tot:
- Coses de JWT i JWKS
- Vulnerabilitat de redirecció oberta
- Eludir OTP mitjançant trucs de matriu
Em va agradar molt resoldre aquest! Espero que us hagi agradat l'escrit. Ens veiem a la propera!
psst.. pots donar-me suport a Ko-fi aquí 👀. gràcies!
Etiquetes:

