Come posso dimostrare che questo sito ha un enorme punto debole di sicurezza?

37

Dichiarazione di non responsabilità: sono un programmatore di computer, non un analista della sicurezza o nulla a che fare con la sicurezza. Non ho esperienza nel mondo della crittografia, quindi abbi pazienza con me per favore.

Situazione: mi è stato assegnato il compito di integrare il sito di un cliente con un sito di hosting dei dati. Mentre ci lavoravo, mi sono imbattuto in una query che scarica tutti i dati degli utenti. Per fare questa query, l'utente deve "autenticarsi" per ottenere una sessione e usare quel codice di sessione per fare questa query, che poi controlla che l'utente abbia i privilegi di amministratore prima di completare la query e di rispondere.

Ma comunque ... sembra una cosa orribile per me. Soprattutto perché si tratta di alcuni dei dati che vengono rinviati se la query viene eseguita correttamente:

"username": "[email protected]",
"firstname": "Test",
"lastname": "Name",
"userpassword": "$1$te000000$qMpAriadAHuRyDkK58YKS0"

Ci sono più dati restituiti che è orribile da esporre, ma non è la mia preoccupazione principale.

Chiaramente nessuno è mai stato nominato "Nome test" e "testemail.blerg" non è un dominio registrato, per non parlare del fatto che "blerg" è un possibile dominio di primo livello. Anche se lo fosse, quell'account è stato cancellato dal sito di hosting dei dati e non può accedere. La password che è stata utilizzata è debole, test-case e non è in uso da nessuno.

E 'possibile per me brute-force / rainbow-table (mentre non ho esperienza, conosco alcune parole flash: P) o qualcosa da cui ottenere la password? Quel poco (penso) che io sappia è che la prima parte di userpassword è il sale MD5, ma non conosco altro.

Se qualcuno può spiegare quanto sia facile, posso dimostrare al mio capo che questo sito è completamente orribile e convincere il nostro cliente a migrare da questo sito di hosting dei dati.

C'è ancora qualcosa che so sulla salatura (cioè come ottiene il sale, quale lingua / funzione sta usando, ecc.), ma mi piacerebbe vedere con quanta facilità qualcuno che non ha accesso a tali informazioni può capirlo. Un'altra cosa per me è andare al mio capo con, si spera.

EDIT: Sembra esserci un po 'di confusione riguardo al fatto che nella descrizione sia intenzionalmente vaga, in parte allo scopo di impedire qualsiasi indicazione su quale CRM sia, per motivi legali / ecc. Mi rendo anche conto che la mia chiamata "data hosting" era potenzialmente fuorviante, quindi la mia cattiva notizia. Spero che questo chiarisca:

Il lavoro svolto dal nostro team è la creazione di un sito Web di base per un'azienda che mostri i loro prodotti. L'unica interazione che ho con il CRM è:

  1. Quando una persona compila il modulo Contattaci, noi POST al CRM a Contacts oggetto con le informazioni dell'utente.
  2. Esegui un GET in un elenco di Dealers che vendono i loro prodotti da visualizzare.

Ho iniziato con # 2, la chiamata API GET , in cui ho scoperto che posso eseguire query sulla tabella Users . Non ho creato l'API, ne ho solo richiesto le richieste.

La chiamata GET richiede un parametro query= in cui il valore è un'istruzione SELECT nel linguaggio di query del sistema, che viene quindi tradotto in SQL (presumibilmente prevenendo attacchi SQLI, ma non so come interpreti / si traduce in SQL, quindi non lo sto toccando con un palo da 10 piedi). Modificando SELECT * FROM Dealers; in SELECT * FROM Users; nella query sono riuscito a visualizzare i dati di ogni utente.

Il modo in cui il CRM gestisce gli utenti è con un portale sul loro sito. Un utente viene creato nel portale, dove è presente una casella di controllo "Is Admin". Questo può essere modificato in qualsiasi momento attraverso il portale. Questo è il processo per effettuare richieste API:

  1. Un utente fa una richiesta al CRM, contenente il nome utente, per un token.

  2. Il token è concatenato con la chiave di accesso "segreta" per quell'utente, la stringa risultante è MD5 hash e quindi inviata indietro per richiedere un token di sessione.

  3. Questo token di sessione è incluso in ogni richiesta, come parametro querystring, per "verificare" che la richiesta sia "autorizzata".

Uno dei problemi è che se un utente "admin" effettua una richiesta della tabella Users , la risposta è una lista di ogni utente con le informazioni che ho elencato sopra così come token di accesso "segreto" dell'utente (e altre informazioni). Quindi è anche peggio che esporre una password, significa praticamente concedere l'accesso a chiunque impersonando qualcuno.

    
posta Daevin 02.06.2017 - 17:42
fonte

5 risposte

45

Il formato della password nell'attributo userpassword è simile al formato standard utilizzato da vari servizi unix, come il servizio password di sistema predefinito che memorizza le password con hash in /etc/shadow . Il formato è fondamentalmente:

$ type $ salt $ hash

Nel tuo esempio, il tipo è 1, che designa un hash MD5. Esistono altri tipi ben noti, come varie dimensioni delle funzioni hash della famiglia sha.

Rompere un hash MD5 è quasi banale oggi, anche quando è salato, perché MD5 è così veloce. Non è una funzione di hash che è sicura da usare per le password di hashing; hashcat e altri password cracker possono letteralmente hash milioni o addirittura miliardi di password per candidati al secondo.

Quindi questo servizio di archiviazione dati non è solo orribile perché invia indietro gli hash delle password degli utenti, è ancora più orribile perché utilizza effettivamente gli hash md5 per memorizzare le password.

Per dimostrare al tuo capo che questo non è sicuro, puoi scaricare hashcat e alcuni elenchi di password (puoi trovarli facilmente online), quindi eseguire hashcat su un computer con una GPU molto potente su tutte le password ottieni dal servizio. Prendi nota di quante password possono craccare hashcat (senza guardare le password stesse - potrebbero rivelare informazioni private sulle persone che le hanno scelte, e non vuoi conoscere realmente le loro password), e informare le persone le cui password sono state compromesso che hanno bisogno di scegliere una nuova password. Probabilmente avrai bisogno di ottenere il permesso di fare tutto questo prima, perché a seconda di dove vivi e lavori, questo potrebbe effettivamente essere considerato un attacco dannoso o addirittura illegale.

A parte : se ti fossi fermato a utilizzare questo servizio anche dopo aver espresso i tuoi dubbi, ti suggerirei di impostare un cracker automatico delle password che funzioni senza intervento umano e informa le persone (inviando loro un e-mail) quando riesce a decifrare la propria password sarebbe un modo per proteggere i propri utenti da questo tipo di cattiva progettazione. Sarebbe utile eliminare le password deboli e aumentare la quantità di tempo necessaria a un vero aggressore per violare le password.

Modifica : Zach ha sottolineato che la parte non è una pratica comune e non dovrebbe essere tentata da qualcuno che non è in grado di valutare i rischi. Sono pienamente d'accordo con questo. Per lo meno, se hai fatto qualcosa del genere, dovresti avere la gestione okay.

Tuttavia, NON farlo non rende il sistema risultante più sicuro. È l'equivalente di infilare la testa nella sabbia per timore che se effettivamente si facesse qualcosa per migliorare la sicurezza della password, potrebbe ritorcersi contro di te. sappiamo che le persone scelgono password sbagliate e sappiamo che md5 non è un buon modo per accedere alle password hash. Se non possiamo cambiare questi due fatti, e noi siamo in grado di eliminare le password deboli, allora dovremmo probabilmente farlo per rendere i nostri utenti più sicuri.

Un motivo importante per cui questo non è visto molto, o anche considerato molto, è che di solito non siamo in grado di implementarlo. I buoni sistemi non utilizzano le funzioni hash veloci per le password hash e di solito non si accede all'intero database delle password con hash.

    
risposta data 02.06.2017 - 18:03
fonte
30

Questo hash della password sembra utilizzare il formato crypt() (che, nonostante il suo nome e quello che dicono alcune documentazioni, inclusa quella stessa pagina man, non ha assolutamente nulla a che fare con la crittografia: è hashing ). Quando inizia con $1$ , significa che è una funzione di hashing della password basata su MD5. La sua specifica esatta è "qualunque cosa gli faccia". Uno sguardo a codice sorgente mostra alcuni passaggi illuminanti:

 201   /* The original implementation now does something weird: for every 1
 202      bit in the key the first 0 is added to the buffer, for every 0
 203      bit the first character of the key.  This does not seem to be
 204      what was intended but we have to follow this to be compatible.  */
 205   for (cnt = key_len; cnt > 0; cnt >>= 1)
 206     md5_process_bytes ((cnt & 1) != 0
 207                        ? (const void *) alt_result : (const void *) key, 1,
 208                        &ctx, nss_ctx);
 209 
 210   /* Create intermediate result.  */
 211   md5_finish_ctx (&ctx, nss_ctx, alt_result);
 212 
 213   /* Now comes another weirdness.  In fear of password crackers here
 214      comes a quite long loop which just processes the output of the
 215      previous round again.  We cannot ignore this here.  */
 216   for (cnt = 0; cnt < 1000; ++cnt)
 217     {

Da ciò possiamo concludere che questa funzione di hashing non è molto ben documentata.

In ogni caso , poiché le funzioni di hashing della password vanno, non è molto buona. Utilizza un sale , ed è buono, perché dovrebbe impedire l'uso da parte di aggressori di tabelle precalcolate (incluse le tabelle arcobaleno). Include anche un ciclo con molte (1000) iterazioni, come tentativo di rendere più lento l'hashing delle password, rendendo così più difficile per gli attaccanti provare molte potenziali password fino a quando non viene trovata una corrispondenza (un processo noto come "forza bruta" o "attacco dizionario") ").

Sfortunatamente, non è neanche molto buono. MD5 è veloce e un migliaio di MD5 annidato, pur essendo ancora 1000x più lento, è ancora veloce. Un PC off-the-shelf con una GPU basica orientata al gaming può calcolare milioni di hash al secondo; una password utente media non durerà a lungo; e con questo intendo che un attaccante che spende un minuto di calcolo per ogni hash password ne creerà comunque la metà.

Oltre alla password con hash, rivelare semplicemente gli indirizzi e-mail degli utenti è già un'offesa piuttosto dannata, intendo legalmente parlando. Ad esempio, in Canada, questo è noto come "informazioni personali" e tutti gli utenti avrebbero il diritto di denunciarvi.

    
risposta data 02.06.2017 - 18:15
fonte
22

Stop. Non andare oltre Non fare più test, dimostrazioni, ecc. Fino a quando non ti è stato chiesto esplicitamente di farlo per iscritto, e anche in questo caso supplica e suggerisci che ci sono molte più persone qualificate di te per fare un audit / pentest / etc .

Conosco 2 persone che hanno fatto lo stesso con meno informazioni (nessuna password, solo dettagli a cui non avevano bisogno di accedere e non avrebbero avuto accesso) solo pochi mesi fa e stanno ancora attraversando il processo di trattare con le accuse di crimine .

    
risposta data 04.06.2017 - 03:54
fonte
5

Questo formato sembra un hash della password in stile unix standard. I campi sono separati da segni di dollaro, prima è l'algoritmo, quindi il sale, quindi l'hash effettivo. Supponendo che sia un sistema Linux, $ 1 $ indica l'algoritmo della password md5 (che è un po 'più complesso del puro md5). Le lunghezze dei campi sono anche coerenti con l'algoritmo di hashing della password MD5.

Ci sono molti strumenti là fuori per attaccare gli hash delle password di Linux. Se hai successo con questi strumenti dipenderà in gran parte dalla forza delle password.

Ho anche notato che il tuo sale contiene molti zeri. Se hai un intervallo di sali statico o relativamente piccolo (rispetto al numero di utenti), questo potrebbe aprire opzioni per gli attacchi precomputi.

Infine vorrei sottolineare che attaccare le password reali può portare a problemi legali.

    
risposta data 02.06.2017 - 18:04
fonte
4

Tutte queste informazioni sono disponibili per un utente admin su un tipico sistema Linux in /etc/passwd (leggibile da chiunque) e /etc/shadow (leggibile da root). È difficile con Linux standard impedire a un utente root di accedere a /etc/shadow . Poiché la query richiede privilegi di amministratore, non sembra che esponga molto dato che un account amministratore è stato compromesso. Come hanno già detto altre risposte, se il sistema utilizza realmente gli hash md5, questo è un problema, ma non correlato alla domanda.

    
risposta data 02.06.2017 - 23:54
fonte

Leggi altre domande sui tag