Parafrasando qualcuno che fa questo per vivere: "Sfruttare le vulnerabilità è un mestiere. La ricerca di vulnerabilità è un'arte nera. "
Un modo comune di cercare vulnerabilità nel software (o nell'hardware o in una combinazione) è fuzzing . Guarda un'interfaccia e getta tutti i tipi di spazzatura su di esso. Se continua a funzionare correttamente ("accesso negato", "errore di sintassi", ...), prova alcuni rifiuti inutili. Se fa qualcosa di interessante (nessuna risposta, "errore di segmentazione", ...), hai colpito qualcosa che non funziona come previsto, quindi indagare ulteriormente per vedere se hai trovato un problema reale. Non appena trovi che l'obiettivo non funziona come previsto, e la differenza di comportamento ha un impatto sulla sicurezza, hai trovato una vulnerabilità e il prossimo passo è lo sfruttamento (sfruttando la vulnerabilità per ottenere qualche risultato utile che viola la politica di sicurezza).
Sebbene sia possibile eseguire il fuzz con spazzatura casuale, è più produttivo cercare condizioni al contorno. Prova a inviare alcuni byte nulli o un unicode non valido o un nome contenente una virgoletta singola o una lunghezza appena sopra o appena sotto limite di dimensioni.
Se si dispone del codice sorgente, è possibile eseguire alcune analisi statiche su di esso e cercare problemi comuni (accessi di array non selezionati, stringhe in formato libero concatenate per formare una query di database, ...). Puoi anche eseguire analisi statiche su un binario ma tende ad essere molto più difficile.
Per cercare vulnerabilità nei protocolli, è possibile sfogliare il protocollo in un'implementazione di test. Un altro approccio è tentare di dimostrare alcune proprietà desiderate del protocollo. Se rimani bloccato nella dimostrazione, forse è perché la proprietà di sicurezza desiderata in realtà non regge.
A volte puoi trovare le vulnerabilità per caso, perché ti capita di colpire un caso d'angolo e non si comporta come previsto e scopri che questo ha un impatto sulla sicurezza. Ma è molto più produttivo avere una conoscenza approfondita di ciò che stai attaccando. Hai bisogno di sapere quali componenti guardare, come regolare il tuo fuzzer per ottenere risultati interessanti in questo secolo, che la tua dimostrazione non è solo fallita perché non riesci a trovare gli argomenti giusti ...