Come creare una sfida di hacking che utilizza XSS?

15

Le conferenze sulla sicurezza hanno spesso problemi di hacking. I miei colleghi e io abbiamo creato un numero di questi. Non ne abbiamo ancora fatto uno che includa una vulnerabilità di scripting cross-site.

Ho visto sfide che lo fanno. Un approccio era che una determinata pagina (vulnerabile a XSS memorizzato) veniva richiesta da un browser su base periodica (ogni 10s credo). Dopo un attacco riuscito, il tuo payload funzionava con quel browser e la sfida era estrarre il cookie.

Un problema con questo approccio è che quando più persone stanno lavorando simultaneamente alla sfida, interferiscono l'una con l'altra - e puoi rubare le idee di altre persone. Un'idea alternativa era quella di avere solo XSS riflessivo, e una pagina in cui puoi inviare un link al sito, che l'amministratore esaminerà prima che possa essere pubblicato.

Per quanto tempo il browser rimane aperto è una scelta interessante. Se rimane aperto un po '(anni '60 circa), le persone possono usare strumenti come BeEF, il che lo rende un po' più facile. Se è aperto solo per 2 secondi devi scrivere l'attacco.

C'è una serie di dettagli che influenzano il modo in cui la sfida funzionerà nella pratica. Preferirei le risposte di persone con esperienza nell'esecuzione di sfide di hacking XSS che funzionassero bene. Ma in caso contrario, mi accontento di una speculazione informata.

Se aiuta, tendiamo a partecipare a conferenze tecniche nel Regno Unito, ad es. B-Sides Manchester, SteelCon, SecuriTay.

Inoltre, qualsiasi suggerimento su come difendere il browser dagli exploit JavaScript sarebbe benvenuto!

    
posta paj28 22.12.2016 - 15:56
fonte

4 risposte

15

L'approccio più comune che ho visto è di eseguire un bot browser senza testa che ottiene collegamenti vulnerabili attraverso un sistema di invio. Quindi visita ciascuno di questi collegamenti per alcuni secondi con un set di cookie magici.

Un esempio può essere trovato nell'articolo " Come aggiungere un bot compatibile con XSS al tuo CTF " dove il bot è implementato come un'istanza PhantomJS senza headless. Allo stesso modo, il gioco hackxor utilizza HtmlUnit per simulare una vittima di navigazione e questa sfida XSS utilizza un'istanza di Zombie.js .

Ci sono davvero diversi motivi per evitare di memorizzare XSS: non solo i giocatori impareranno i metodi degli altri e alla fine interferiranno con i loro carichi, ma la gente potrebbe iniziare a infastidire gli altri con reindirizzamenti o loop infiniti che ti terranno impegnato a ripulire tutto.

Suggerirei invece una vulnerabilità XSS riflessa con un semplice sistema di invio in cui i giocatori possono fornire collegamenti che vengono poi visitati dal bot. A seconda dello scenario, l'invio può essere inserito nel contesto di un modulo di contatto, un semplice listener di socket, un messaggio IRC privato o, se ti senti di fantasia, un account e-mail in cui vengono estratti e visitati i link dalle e-mail in arrivo.

Eviterei sicuramente un sistema che richiede l'interazione manuale. Altrimenti le persone si informano costantemente se i loro carichi pagati sono già stati eseguiti, se possono essere visitati di nuovo, ecc. A seconda di quanto siano aggressivi i giocatori, dovresti anche pensare a un modo per limitare le iscrizioni. (Un CAPTCHA per il modulo di contatto si adatta bene allo scenario.)

    
risposta data 22.12.2016 - 18:08
fonte
3

Consiglierei singoli ambienti contenitori per separare i conflitti tra i concorrenti.

Per un esempio: controlla il CTF di un'ora di SANS sul link - Il CtF di un'ora utilizza Docker e Guacamole per fornire un snappy condiviso ambiente di apprendimento. Guacamole fornisce l'interfaccia visuale (VNC / RDP / SSH) ai contenitori Docker.

Per un metodo semplice per insegnare le vulnerabilità di scripting cross-site, potresti prendere in considerazione una simulazione istruita dell'attacco con codice personalizzato. Dagli aggressori percettivi è legittimo, ma il back-end simula i risultati visivi.

    
risposta data 22.12.2016 - 17:55
fonte
1

È chiaramente fantastico restringere l'approccio sistematico allo sviluppo delle CTF. Questo potrebbe essere fatto tramite repository di conoscenze che contengono un vettore di attacco simile.

Per un esempio, nei tuoi CTF - intendi concentrarti su code injections - le varianti relative agli attacchi code injection sono assolutamente correlate a exploit scripting lato client . Per ridurlo, usa la funzione ingrediente chiave che è abusato. In questo caso particolare, principalmente JavaScript ed è JS Engines sono vulnerabili. Quindi, il tuo team dovrebbe essere in grado di raccogliere informazioni su questo aspetto JS Vuln DB può recuperare CVE + è POC su inizia da!

Facciamo un altro scenario. Diciamo che devi creare i CTF che sono destinati ai vettori 'File Include', gli esempi potrebbero essere LFI , RFI , SSI , ecc. potrebbe utilizzare l'API fornita da cve-search & quindi probabilmente mappare tutti i CVE verso il basso in modo che sia più facile.

L'idea è centralizzare e amp; ma isolare la pratica correre in un ambiente sicuro se si sta per squadra blu. In secondo luogo, suggerisco che forse, una raffinata melodia o un buffer aggiuntivo di sfruttamento basato sul contesto potrebbe funzionare dopo aver distorto gli originali. Ecco da dove parti. Il primo problema di avere rubato le idee sui cookie, si può facilmente farlo rettificare utilizzando sandbox paralleli diversi. Immagino che ci siano provider che hanno questo tipo di set-up. Controlla CTF365 .

    
risposta data 22.12.2016 - 17:53
fonte
0

Se tutto ciò di cui hai bisogno è che il tuo server visualizzi un determinato URL, invece di fare girare bot e thread ecc. la soluzione più semplice sarebbe quella di fare immediatamente (non appena l'URL è inviato) visitare l'url usando una libreria (come le richieste in python) che consente di analizzare anche la risposta. Come se un amministratore o qualche altro bot l'avesse visitato per davvero, nei propri browser.

UPDATE:

Segue una spiegazione più dettagliata (come richiesto). Non appena l'input dell'utente viene ricevuto (in questo caso, ad es., Un URL), basta passarlo alla seguente funzione:

def simulate_admin_visits(url):
try:
    #initialise with empty cookies
    jar = requests.cookies.RequestsCookieJar()
    #visit the page that allows the admin to login 
    #and collect the cookies from the response
    response = requests.post(LOGIN_URL, data={'uname': ADMIN_UNAME, 'password': ADMIN_PASSWORD}, cookies=jar)
    jar.update(response.cookies)
    #visit the user-submitted content using the just-collected cookies
    #here the exploit/ctf_challenge-solution is allowed to work
    <parse the submitted content>
    #have the admin logout
    requests.get(LOGOUT_URL, cookies=jar)
except ConnectionError:
    print 'Could not connect to ' + url
    
risposta data 07.02.2018 - 14:48
fonte

Leggi altre domande sui tag