Laboratori di hacking
Perché usare NotHoly per CTF e laboratori
Un modello che scrive l'exploit del tuo challenge e spiega perché funziona, triage statico del binario, e un solve che gira nel tuo lab, non nel nostro.
Dai una struttura a un report di pentest e scrivi un finding che altri possano riprodurre, con prove, impatto, un vettore CVSS v4.0 e una correzione.
Un report di penetration test è il documento scritto di un test di sicurezza fatto con il permesso del proprietario. Dice cosa è stato testato, cosa è stato trovato, come un lettore può confermare ogni finding e cosa cambiare. Il test finisce quando il tester smette di inviare richieste. Il report è ciò che il proprietario conserva, condivide con gli sviluppatori e usa per dimostrare che il lavoro è rimasto dentro il perimetro concordato.
NIST SP 800-115, la guida tecnica ai test e alle valutazioni di sicurezza delle informazioni, copre l'intero processo, compresa l'analisi dei finding e lo sviluppo delle strategie di mitigazione. L'OWASP Web Security Testing Guide ha un capitolo Reporting che parte da una struttura del report e da uno schema di denominazione dei finding. Leggili entrambi quando puoi. Questo articolo si concentra sulla parte che scriverai per prima: un report chiaro con un finding che qualcun altro può riprodurre.
Un bug reale che nessuno riesce a riprodurre raramente viene corretto. Gli sviluppatori hanno bisogno di passi da eseguire partendo da uno stato pulito. I manager devono sapere cosa significa il rischio per l'azienda. Gli auditor hanno bisogno della prova che il lavoro ha rispettato il permesso ricevuto. Un solo documento deve servire tutti e tre.
Il report protegge anche il tester. Un perimetro scritto e una registrazione datata di cosa è stato testato mostrano che ogni azione è rimasta dentro il perimetro concordato. Senza quella registrazione, un tester che ha trovato una falla reale può ritrovarsi a discutere se il test fosse consentito.
Una struttura pratica ha sei parti:
Ogni finding risponde alle stesse domande, nello stesso ordine.
curl -i, con i segreti rimossi. Numera ogni prova così i passi possono rimandarvi.Un finding che il lettore non può riprodurre dalla sola pagina non è finito, per quanto bello sia il titolo.
L'impatto segue le prove. Se hai dimostrato che uno script è stato eseguito nel browser di un account di prova nel tuo laboratorio, scrivi esattamente questo. Una frase come "un attaccante può prendere il controllo di ogni account" senza una dimostrazione è un'esagerazione, e uno sviluppatore se ne accorgerà. Ti costa anche credibilità sul finding successivo. Quando non hai verificato qualcosa, dillo e indica il test che lo confermerebbe.
Il risultato di uno scanner ti dice dove guardare. Prima che entri nel report, riproducilo a mano, registra la richiesta e la risposta e conferma tu il comportamento. Puoi citare lo scanner come origine della pista. Non incollare il suo output grezzo come prova. Può essere sbagliato, e il lettore non può sapere quali parti ha controllato qualcuno.
La specifica CVSS v4.0 definisce un gruppo di metriche Base con due lati. Le metriche di sfruttabilità sono attack vector (AV), attack complexity (AC), attack requirements (AT), privileges required (PR) e user interaction (UI). Le metriche di impatto riguardano il sistema vulnerabile (VC, VI, VA) e i sistemi successivi (SC, SI, SA). Una stringa vettoriale inizia con CVSS:4.0 ed elenca ogni metrica base.
Le fasce qualitative di gravità sono None a 0.0, Low da 0.1 a 3.9, Medium da 4.0 a 6.9, High da 7.0 a 8.9 e Critical da 9.0 a 10.0.
I punteggi sono di quattro tipi a seconda dei gruppi di metriche usati: CVSS-B solo per Base, CVSS-BT per Base e Threat, CVSS-BE per Base ed Environmental, CVSS-BTE per tutti e tre. Un primo report di solito ha un punteggio Base, quindi etichettalo CVSS-B e non presentarlo come una valutazione completa del rischio.
Usa il calcolatore ufficiale su https://www.first.org/cvss/calculator/4.0 per costruire il vettore e ottenere il punteggio. Metti nel report il vettore, non solo il numero, così il lettore vede quali ipotesi hai fatto. La stringa qui sotto mostra solo il formato. Non è il punteggio di nessun finding del tuo laboratorio:
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:NAssegna il punteggio a ciò che hai verificato. Se l'attacco dipende da una condizione che non sei riuscito a riprodurre, la metrica deve rifletterlo.
Le prove contengono spesso cookie di sessione, bearer token, password e dati personali. Toglili prima che il file lasci la tua macchina. Conserva il nome dell'header e la forma del valore, così il lettore può ancora seguire la richiesta:
Cookie: session=<REDACTED>
Authorization: Bearer <REDACTED>Non incollare un token attivo in una chat, in un ticket o in un repository pubblico, e non fare il commit di un file che ne contiene ancora uno. Se un segreto è stato esposto nel tuo laboratorio, ruotalo comunque e annota la rotazione nel report.
Ti serve il container OWASP Juice Shop del tuo laboratorio, in esecuzione sulla tua macchina. Questo esercizio tocca solo quell'istanza locale su 127.0.0.1. Non eseguire nessuno di questi passi su un sito che non è tuo o che non hai il permesso scritto di testare.
Esegui:
docker psGuarda la colonna delle porte. La mappatura dovrebbe iniziare con 127.0.0.1, il che significa che solo la tua macchina può raggiungere il servizio. Se vedi 0.0.0.0 o nessun indirizzo, ferma il container e riavvialo con l'indirizzo di loopback nel flag di pubblicazione.
docker run -d -p 127.0.0.1:3000:3000 bkimminich/juice-shopPoi controlla che il laboratorio risponda:
curl -i http://127.0.0.1:3000La riga di stato dovrebbe mostrare un codice di risposta di successo. Conserva l'output. Va nella sezione Scope, come prova del target che hai testato.
Scegli un comportamento che hai testato nel browser o con una singola richiesta e che puoi descrivere in pochi passi. Tieni il perimetro piccolo. Un finding ben documentato è più utile di otto non verificati.
Ripeti la richiesta con curl -i per rendere visibili gli header. Sostituisci il percorso con quello del tuo finding e salva l'output in un file:
curl -i "http://127.0.0.1:3000/<path-you-tested>" > evidence-01.txtIl flag -i stampa gli header della risposta prima del corpo. Leggi la riga di stato, l'header Content-Type e ogni header da cui dipende il tuo finding. Poi oscura token e cookie nel file prima di farne il commit.
Crea report.md nel repository del laboratorio e usa questo template. Sostituisci ogni segnaposto con ciò che hai osservato davvero:
## Scope
- Target: http://127.0.0.1:3000, my own OWASP Juice Shop container
- Permission: I run this lab on a machine I own
- Dates: <start date> to <end date>
- Out of scope: everything else
## Finding title
<Flaw> in <exact location>
## Steps to reproduce
1. <Start from a clean browser session at http://127.0.0.1:3000>
2. <Exact action or request>
3. <What you see>
## Evidence
<Screenshot file name, or the redacted curl -i output file, matched to the steps>
## Impact
<What you verified. What you did not verify, and the test that would check it.>
## CVSS vector
<CVSS:4.0 vector from the calculator, and its rating>
## Remediation
<The specific fix, and how to check that it works>Controlla cosa registrerà Git prima del commit, così non scappa un file non oscurato:
git add report.md
git status
git commit -m 'First lab finding'Conferma il commit con git log --oneline -1. La riga dovrebbe mostrare il tuo messaggio. Quando hai finito, ferma il container del laboratorio con docker stop <container-name>, poi esegui docker ps per confermare che non è più in elenco.
Laboratori di hacking
Un modello che scrive l'exploit del tuo challenge e spiega perché funziona, triage statico del binario, e un solve che gira nel tuo lab, non nel nostro.
Laboratori di hacking
Crea una rete Docker senza accesso a internet, avvia OWASP Juice Shop al suo interno e pubblica una copia per il browser solo su 127.0.0.1. Verifica ogni passo.
Laboratori di hacking
Costruisci un home lab che hai il diritto di attaccare: un file di perimetro, porte Docker legate al loopback, una rete isolata, un quaderno di appunti e uno smontaggio pulito.