rilevazione e risposta ad attacchi contro servizi...

34
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

Upload: hoangnguyet

Post on 15-Feb-2019

236 views

Category:

Documents


0 download

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 &lt; > diventa &gt; “ diventa &quot;

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

29

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