Party Cat0%

16/12/24

FalsificacióJWKibypassOTP

Trencant banc | HTB University CTF 2024

Thanks for sharing!

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

Falsificació JWK i bypass OTP
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

Submergem-nos!

Visió general del repte

Challenge Overview

Reconeixement inicial

El primer que vaig fer va ser mirar el lloc web. Tenim un formulari d'inici de sessió i registre:
Login Page
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:
Dashboard Overview
Portfolio View
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.htb
Llavors, 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/transaction
Observeu que necessita un testimoni JWT? Comprovem el nostre testimoni a localStorage:
JWT Token in 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çalera jku (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ó ZverifyToken a Z/challenge/server/services/jwksService.js
La 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 testimoni
Ara 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.json
A 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:
  1. Objectiu: transferir tots els CLCR de financial-controller@frontier-board.htb per obtenir la bandera.
  2. Validació JWT: el servidor comprova l'URL jku i obté una clau (jwk) per verificar els testimonis.
  3. 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
  1. Generació de claus:
    • Genera un parell de claus RSA (privateKey i publicKey) per signar i verificar fitxes.
    • KEY_ID és un identificador únic per a la clau (l'obté del vostre testimoni)
  2. JWKS (conjunt de claus web JSON):
    • Converteix el publicKey a un format JWK (clau web JSON).
    • Afegeix metadades (alg, use, Zkid)
  3. JWT (Token web JSON):
    • Crea un testimoni amb una càrrega útil (email i iat).
  • header personalitzat 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.
  1. 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ò dins
Aquesta é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 redirigir
Nota: 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:
Portfolio After Token
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...
Burp Request
Encara cal obviar l'OTP. Mirant otpMiddleware.js:
Està utilitzant Zincludes()!
Si envieu un otp simulat i veieu la sol·licitud en burp, podreu veure que l'otp s'envia en una matriu
burp
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
success
flag
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:
HTB University CTF 2024 Certificate

Punts clau per emportar

Aquest repte tenia una mica de tot:
  1. Coses de JWT i JWKS
  2. Vulnerabilitat de redirecció oberta
  3. 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!

També et pot interessar