rilevazione e risposta ad attacchi contro servizi...
TRANSCRIPT
Pattern Recognition and Applications Lab
University of Cagliari, Italy
Department of Electrical and Electronic
Engineering
Rilevazione e risposta ad attacchi contro servizi web
Dott. Ing. Igino Corona igino.corona (at) diee.unica.it
Corso Sicurezza Informatica 2015/2016
http://pralab.diee.unica.it
• Oggigiorno la maggior parte dei servizi su Internet sono offerti attraverso il World Wide Web. • Facilità di accesso ai servizi tramite web browser
• Problemi legati alla sicurezza • applicazioni complesse • ampia esposizione dei servizi • tempi di sviluppo molto ristretti - time to market • sviluppatori con poca sensibilità/conoscenza delle
vulnerabilità più comuni • eterogeneità degli input, dei framework, delle librerie, degli
standard di sviluppo
Servizi Web
2
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web
1. I dati in transito devono sempre viaggiare cifrati (HTTPS con certificato valido/verificato da Certificate Authority), specie durante e dopo l’autenticazione utente
• altrimenti ci si espone a User impersonation/session spoofing attacks
3
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/sqli/index.php
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,”last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
• cosa dovremmo fare per rendere “sicuro” questo codice vulnerabile a SQL Injection?
4
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/sqli/index.php
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET[‘id'];
// add validation: id MUST BE a (string representing an) integer with min/max value
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,”last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
1. Aggiungere codice per verificare che id sia un intero (con valore minimo e massimo fissati) prima di eseguire la query
5
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/sqli/index.php
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,”last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
2. Fornire messaggi di errore generici o non fornirne affatto (es. restituendo la pagina iniziale)
6
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/sqli/index.php
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,”last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
3. Occorre fare l’escape (HTML in questo caso) dei valori provenienti dal DB, es. usando librerie ben assodate
•in maniera che i valori inseriti non vengano mai interpretati dal browser come codice compromettano la visualizzazione/interpretazione corretta della pagina/contenuto lato client
7
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/sqli/index.php
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,”last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
3. Occorre fare l’escape (HTML in questo caso) dei valori provenienti dal DB, es. usando librerie ben assodate
•in maniera che i valori inseriti non vengano mai interpretati dal browser come codice compromettano la visualizzazione/interpretazione corretta della pagina/contenuto lato client
7
Esempi di escape HTML: < diventa < > diventa > “ diventa "
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/xss_s/index.php
<?php
if(isset($_POST['btnSign']))
{
$message = trim($_POST['mtxMessage']);
$name = trim($_POST[‘txtName']);
// Sanitize message input
$message = stripslashes($message);
$message = mysql_real_escape_string($message);
// Sanitize name input
$name = mysql_real_escape_string($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
•cosa dovremmo fare per rendere “sicuro” questo codice vulnerabile a XSS?
8
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/xss_s/index.php
<?php
if(isset($_POST['btnSign']))
{
$message = trim($_POST['mtxMessage']);
$name = trim($_POST[‘txtName']);
// Add code to interpret inputs in a given encoding/character set… es. UTF-8
// Sanitize message input
$message = stripslashes($message);
$message = mysql_real_escape_string($message);
// Sanitize name input
$name = mysql_real_escape_string($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
1. Nei casi (come questo) in cui l’input puo’ variare significativamente conviene avere fissare un unica rappresentazione delle stringhe comune (es. UTF-8) per acquisizione, memorizzazione e output dei dati. Vedi ad es. https://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql
9
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/xss_s/index.php
<?php
if(isset($_POST['btnSign']))
{
$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
// Sanitize message input
$message = stripslashes($message);
$message = mysql_real_escape_string($message);
// Sanitize name input
$name = mysql_real_escape_string($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
2. Nei casi (come questo) in cui l’input puo’ variare in maniera significativa, meglio usare dei prepared statements http://www.w3schools.com/php/php_mysql_prepared_statements.asp
$stmt = $conn->prepare("INSERT INTO guestbook (comment,name) VALUES (?, ?)"); $stmt->bind_param($message,$name);
10
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• /dvwa/vulnerabilities/xss_s/index.php
<?php
output dei dati provenienti da DB
?>
3. Durante l’output occorre sempre far l’escape dei caratteri (in questo caso HTML)
• https://www.w3.org/MarkUp/html-spec/html-spec_13.html
• Nel caso in cui la web app faccia output di contenuti in altro formato (es. XML, JSON), occorre gestire in maniera analoga l’escape
11
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• La natura delle applicazioni web è spesso eterogenea
• diverse architetture, linguaggi di programmazione, librerie, ambienti di sviluppo
• funzionalità molto variegate • interazione con altri sistemi: es. database, sensori, servizi web
di terze parti, etc. • gestione di informazioni di vario tipo e confidenzialità • diverse necessità in termini di disponibilità e qualità del
servizio, anche in funzione del numero e tipologia di utenze • difficile affrontare il problema in maniera generale • esistono tuttavia delle metodiche di sviluppo sicuro del codice
per prevenire le vulnerabilità piu’ comuni e pericolose • importante riferimento è OWASP https://www.owasp.org/
images/0/08/OWASP_SCP_Quick_Reference_Guide_v2.pdf
12
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• Le best practice di sviluppo previste dall’ingegneria del software
sono un punto di partenza • La sicurezza è implementabile attraverso dei vincoli addizionali
(funzionali e non) che devono prendere parte nel progetto stesso • es. crittografia, meccanismi di verifica del funzionamento
dell’applicazione, profiling delle azioni compiute dagli utenti/host client
• in genere è molto meno costoso che correggere il software in corso d’opera o addirittura dopo il rilascio
• tradeoff con usabilità • Alcune linee guida:
• validazione dell’input: gestire tutte le situazioni in cui l’input non è quello atteso. L’input è di default NON FIDATO
• rispetto della logica applicativa: assicurarsi che non esistano (sequenze di) richieste, o condizioni relative ai sistemi con cui l’applicazione interagisce, che possano portare l’applicazione web in stati non previsti
13
http://pralab.diee.unica.it
Prevenzione attacchi a servizi Web• In generale, meglio affidarsi a framework ben assodati • Studiati in maniera da eliminare (se usati correttamente) alla fonte i
problemi di sicurezza più comuni • Ad esempio,
• django (linguaggio Python) https://docs.djangoproject.com/es/1.9/topics/security/
• ruby on rails (linguaggio Ruby) http://guides.rubyonrails.org/security.html
14
http://pralab.diee.unica.it
Prevenzione… OK ma non basta• Come in tutte le problematiche di sicurezza, la prevenzione è solo
una parte della soluzione • Occorre utilizzare meccanismi di rilevazione e risposta contro
attacchi a servizi web • Ad esempio, contro
• attacchi automatizzati di password guessing, • information gathering, • utilizzo del servizio in maniera anomala
15
http://pralab.diee.unica.it
Esperimenti su sistemi reali• Per tastare con mano le problematiche di protezione dei servizi
web, andremo ad operare con la macchina virtuale • La macchina virtuale
• contiene anche HMM-web, sistema di rilevazione di intrusioni su applicazioni web da me pubblicato nel 2009 • http://pralab.diee.unica.it/sites/default/files/
Corona_ICC2009.pdf • disponibile in versione open-source: http://
sourceforge.net/projects/hmm-web-attacks/
16
http://pralab.diee.unica.it
Information Gathering and Bruteforce• tipicamente i server web sono soggetti a richieste automatiche
da parte di computer infetti appartenenti a botnet
• tali richieste verificano, per esempio, • se il server può funzionare da proxy oppure • se sono presenti applicazioni web con vulnerabilità note e
facilmente sfruttabili • applicazioni web open-source (e non) per Content
Management Systems (CMS), come forum, gallerie fotografiche, sono obiettivo tipico
• se è possibile ottenere le credenziali di accesso effettuando dei tentativi automatici
17
http://pralab.diee.unica.it
Automatizzazione degli attacchi• Per approfondire accedete alla VM via ssh
• Shell remota (password: owaspbwa): ssh -p2222 [email protected] -v
• Oppure dall’interno della VM: ssh [email protected] -v
• Utile per approfondire come i criminali possano realizzare degli attacchi in maniera totalmente automatica
18
root@owaspbwa:~# nano crawl.py
Simula il traffico su alcune applicazioni di DVWA
http://pralab.diee.unica.it
Information Gathering and Bruteforce>> ssh [email protected] -p 2222 The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established. RSA key fingerprint is 3a:94:d8:3f:e0:a2:7a:b8:c3:94:d7:5e:00:55:0c:a7. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts. [email protected]'s password: You have new mail. Last login: Mon Mar 30 11:29:15 2015
Welcome to the OWASP Broken Web Apps VM
!!! This VM has many serious security issues. We strongly recommend that you run it only on the "host only" or "NAT" network in the VM settings !!!
You can access the web apps at http://10.0.2.15/
You can administer / configure this machine through the console here, by SSHing to 10.0.2.15, via Samba at \\10.0.2.15\, or via phpmyadmin at http://10.0.2.15/phpmyadmin.
In all these cases, you can use username "root" and password "owaspbwa".
root@owaspbwa:~# nano crawl.py
19
http://pralab.diee.unica.it
Installate plugin su browser Firefox• Live HTTP Headers
• Utile per catturare l’header cookie e simulare l’accesso alle applicazioni
• https://addons.mozilla.org/it/firefox/addon/live-http-headers/
20
http://pralab.diee.unica.it
Information Gathering and Bruteforce
21
root@owaspbwa:~# nano crawl.py
root@owaspbwa:~# python crawl.py
Simula il traffico su alcune applicazioni di DVWA
Sostituite con quello catturato in Live HTTP Headers
http://pralab.diee.unica.it
fail2ban
• E’ uno dei metodi piu’ semplici per proteggere un’applicazione web contro attacchi bruteforce e information gathering • Tentativi di user/password guessing • Scansione dei servizi web alla ricerca di vulnerabilità note
• Monitora i log del web server alla ricerca di particolari richieste • tramite espressioni regolari
• es. server error 404 • accesso ad una particolare URI (es. associata ad una
pagina di login) • Al verificarsi di eventi sospetti, può eseguire un comando
• di default, imposta una regola sul firewall che blocca richieste provenienti dall’ indirizzo IP incriminato (per un certo intervallo di tempo)
22
http://pralab.diee.unica.it
fail2ban
• Su distribuzioni debian-based (es. Ubuntu): • sudo apt-get install fail2ban
• Configurazione: • nano /etc/fail2ban/jail.conf
[apache-noscript]
enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log maxretry = 6
• service fail2ban restart23
http://pralab.diee.unica.it
fail2ban
• Simulate tentativi di accesso ad applicazioni vulnerabili inesistenti • … e verrete bloccati!
24
root@owaspbwa:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh fail2ban-apache-noscript tcp -- anywhere anywhere multiport dports www,https
Chain FORWARD (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination
Chain fail2ban-apache-noscript (1 references) target prot opt source destination DROP all -- 10.0.2.2 anywhere RETURN all -- anywhere anywhere
Chain fail2ban-ssh (1 references) target prot opt source destination RETURN all -- anywhere anywhere
http://pralab.diee.unica.it
Web Application Firewall (WAF)
25
Web ServerWeb Application Firewall (Layer 7)
Internet
Vantaggi • Può proteggere un intera gamma di applicazioni web contro
attacchi comuni • Virtual Patching
• Molto utile: non sempre e’ immediato/possibile modificare il codice di app web per correggere bug (es. presenti in librerie di terze parti)
http://pralab.diee.unica.it
Modsecurity WAF
• Si integra facilmente con il diffusissimo web server Apache • Basato su regole. Può essere usato con le quelle OWASP
• https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
• Violations of the HTTP protocol and a locally defined usage policy • Real-time Blacklist Lookups - utilizes 3rd Party IP Reputation • HTTP Denial of Service Protections • Common Web Attacks Protection • Automation Detection • Integration with AV Scanning for File Uploads • Tracking Sensitive Data • Trojan Protection - Detecting access to Trojans horses. • Identification of Application Defect • Error Detection and Hiding
• Vediamolo piu in dettaglio… nella nostra VM26
https://www.modsecurity.org
http://pralab.diee.unica.it
Web Application Firewall
27
Web ServerWeb Application Firewall (Layer 7)
Internet
Problema • Impostazione delle regole di filtraggio dispendiosa
• sintassi delle regole di filtraggio • input e logica delle applicazioni monitorate
Vantaggi • Può proteggere un intera gamma di applicazioni web contro
attacchi comuni • Virtual Patching
• Molto utile: non sempre e’ immediato/possibile modificare il codice di app web per correggere bug (es. presenti in librerie di terze parti)
http://pralab.diee.unica.it
Web Application Firewall
28
Web ServerWeb Application Firewall (Layer 7)
Internet
Problema • Impostazione delle regole di filtraggio dispendiosa
• sintassi delle regole di filtraggio • input e logica delle applicazioni monitorate
Soluzione (in ambito di ricerca) • La maggior parte del traffico è tipicamente legittima • Attraverso tecniche di machine learning è possibile:
• estrarre un modello statistico del traffico legittimo • rilevare gli attacchi sotto forma di traffico anomalo
• L’intera procedura può essere automatizzata • Vediamo una dimostrazione sulla nostra VM
http://pralab.diee.unica.it
HMM Web
30
root@owaspbwa:~# cd hmm_web/ root@owaspbwa:~/hmm_web# python label_dataset.py
MAIN --> Web Application: /dvwa/vulnerabilities/fi/
0. Query: page=http://www.diee.unica.it& (prob: 9.80262657636e-12) 1. Query: page=http://www.google.it& (prob: 1.21921208482e-10) 2. Query: page=http://www.google.it& (prob: 1.21921208482e-10) 3. Query: page=http://www.google.it& (prob: 1.21921208482e-10) 4. Query: page=www.diee.unica.it& (prob: 9.80320853403e-05) 5. Query: page=include.php& (prob: 0.01135299214) 6. Query: page=include.php& (prob: 0.01135299214) 7. Query: page=include.php& (prob: 0.01135299214) 8. Query: page=include.php& (prob: 0.01135299214) 9. Query: page=include.php& (prob: 0.01135299214) 10. Query: page=include.php& (prob: 0.01135299214)
Remote File Include attack
http://pralab.diee.unica.it
HMM Web
31
MAIN --> Web Application: /dvwa/vulnerabilities/sqli/
0. Query: id='/**/or/**/1='1&submit=submit& (prob: 7.76457056744e-17) 1. Query: id='/**/or/**/1='1&submit=submit& (prob: 7.76457056744e-17) 2. Query: id=4&submit=submit& (prob: 0.729166666667) 3. Query: id=6&submit=submit& (prob: 0.729166666667) 4. Query: id=6&submit=submit& (prob: 0.729166666667) 5. Query: id=4&submit=submit& (prob: 0.729166666667) 6. Query: id=3&submit=submit& (prob: 0.729166666667) 7. Query: id=3&submit=submit& (prob: 0.729166666667) 8. Query: id=6&submit=submit& (prob: 0.729166666667) 9. Query: id=4&submit=submit& (prob: 0.729166666667) 10. Query: id=2&submit=submit& (prob: 0.729166666667)
SQL Injection
http://pralab.diee.unica.it
Il successore di HMM Web
• Si integra con modsecurity • Permette di stabilire regole di alto livello (anomaly templates) per
proteggere i servizi web
32
https://comsec.diee.unica.it/sustorid/
http://pralab.diee.unica.it
Servizi Web - strumenti di protezione
33
Web Server (redundant instances)
Load Balancer (Multiple Layers)
Internet
Vantaggi • Può distribuire il traffico su più istanze dello stesso servizio web e
proteggere da Denial of Service (DoS) • A diversi livelli. Esempi:
• a livello di rete (es. Content Delivery Networks) • a livello applicazione (es. server dedicato per le immagini/
video)
Problemi • Impostazione delle regole di bilanciamento spesso non banale
• regole di instradamento • tipologia dei contenuti relativi ai servizi offerti