[Hacking/sicurezza] Facciamo qualche esercizio di pen testing su www.hackthissite.org – parte 1

Difficoltà articolo (0->10): 4

Girovagando in rete si possono trovare numerosi siti che permettono di mettere alla prova le proprie capacità e intuito di hacker. Alcuni esempi dei più famosi siti che possiamo trovare sono questi:

Ognuno contiene un certo numero di esercizi pratici di penetration testing, ma non solo, ci sono anche casi simil-reali, articoli, forum, curiosità… Nello specifico, ho scelto uno dei siti sopra elencati per studiarlo più a fondo, e in questo e nei prossimi articoli mostrerò come risolvere alcuni esercizi e casi di pen testing.

hacking

Il sito da me scelto è www.hackthissite.org, ma lo definirei più un portale che un sito web, perché al suo interno è possibile accedere ad una grande quantità di informazioni nonché è possibile parlare sul forum con appassionati dell’argomento.

Solo dopo essersi registrati (fornendo una password di accesso sufficientemente robusta, mi raccomando!!!) ed essersi autenticati, possiamo accedere al portale e a tutte le sue sezioni. Molte sono interessanti, ma non lasciamoci distrarre e concentriamo la nostra attenzione sulla sezione “Challanges”, e quindi “Basic missions”. Queste “missioni” sono semplici casi costruiti ad hoc in cui siamo messi difronte ad una pagina web con un form e contenente una o più vulnerabilità da trovare. Solo dopo aver trovato la vulnerabilità e la password nascosta, è possibile sbloccare il livello successivo.

Esaminiamo insieme i primi 5 livelli e le loro vulnerabilità. ATTENZIONE: di seguito mostrerò come risolvere ogni singolo caso, e dove/come trovare indizi e password per il livello successivo ma non indicherò mai le singole password (se proprio non riuscite ad accedere al livello successivo neanche ora scrivetemi pure in privato ;-)).

 

Livello 1

Descrizione: This level is what we call “The Idiot Test”, if you can’t complete it, don’t give up on learning all you can, but, don’t go begging to someone else for the answer, thats one way to get you hated/made fun of. Enter the password and you can continue.

Requisiti: HTML.

Questo è il livello base, e come indicato tra i requisiti è sufficiente avere una conoscenze davvero minima di HTML. Dunque basta visualizzare i sorgenti della pagina spostandosi al form di richiesta password, et voilà, il commento in verde conterrà la password in chiaro:

Level

Inseriamo perciò la password nel form reale della pagina e proseguiamo al secondo livello.

 

Livello 2

Descrizione: Network Security Sam set up a password protection script. He made it load the real password from an unencrypted text file and compare it to the password the user enters. However, he neglected to upload the password file…

Requisiti: buon senso.

Questo livello direi che è banale, e forse addirittura più semplice del precedente. Leggendo attentamente la descrizione è facile intuire quale sia la password, vedendo che il responsabile Sam si è dimenticato di inserire il file, con la password reale, utilizzato per fare il confronto. Se lo script della pagina dunque effettua il confronto con un file vuoto, la password sarà?!

 

Livello 3

Descrizione: This time Network Security Sam remembered to upload the password file, but there were deeper problems than that.

Requisiti: conoscenze base di HTML.

Ancora un livello molto facile, infatti basta leggere la descrizione per capire che anche questa volta la password è racchiusa in un file che viene utilizzato per fare il confronto nel form. Dunque, analizziamo il codice sorgente della pagina:

level3

Intuitivamente possiamo notare un campo input nascosto del form, che punta ad un file chiamato “password.php”. Puntiamo subito al file, per ottenere ciò che vogliamo e proseguire al livello dopo.

 

Livello 4

Descrizione: This time Sam hardcoded the password into the script. However, the password is long and complex, and Sam is often forgetful. So he wrote a script that would email his password to him automatically in case he forgot.

Requisiti: conoscenze di HTML e un indirizzo mail.

Siamo ancora nella fascia entry level per la difficoltà. Leggendo la descrizione, capiamo che ancora una volta la password è scritta all’interno dello script del sito, ma questa volta è codificata con qualche tipo di algoritmo. Quello che ci interessa è che la dichiarazione ci dice che esiste anche uno script che invia una mail all’amministratore Sam con la password, probabilmente in chiaro, e lo script viene richiamato dal pulsante analogo.

level4.1

Passando al codice sorgente:

level4

Possiamo vedere chiaramente che lo script utilizza un campo del form per l’invio della mail, e difatti il campo value contiene l’indirizzo di Sam a cui viene inviata la password. A questo punto per ottenere la password è sufficiente scaricare la pagina in locale, modificare il campo value con quello della propria mail, ricaricare la pagina locale, e richiedere l’invio della password con il pulsante ;-).

Riceveremo presto la mail con la password per proseguire di livello…

 

Livello 5

Descrizione: Sam has gotten wise to all the people who wrote their own forms to get the password. Rather than actually learn the password, he decided to make his email program a little more secure.

Requisiti: conoscenze di HTML, Javascript, e un indirizzo mail.

Da ora inizia a salire leggermente la difficoltà, perché Sam ha inserito nel proprio codice un controllo ulteriore per il form di richiesta password, similmente al caso precedente.

level5

Il codice sorgente della pagina è questo:

level5.1

In particolare non è sufficiente, come nel livello 4, la modifica dell’indirizzo mail manualmente ma bisogna ricorrere allo scripting lato client, cioè  Javascript. La tecnica che permette questo è chiamata Javascript Injection con la quale è possibile iniettare codice arbitrario lato client in una pagina in modo tale da indurre la pagina stessa a fare quello che desideriamo senza impattare direttamente il codice del server. L’inserimento di codice in una pagina può essere fatto istantaneamente dall’URL del browser.

In questo caso, poiché non possiamo appunto modificare l’indirizzo mail “a mano”, facciamo uso di JS Injection con questo comando:

javascript:void(document.forms[0].to.value="mail_address");

A ritroso, il comando permette di modificare il campo value, del form zero (il primo, appunto zero, è quello che ci interessa), del documento attuale. Dopo aver quindi dato il comando, premiamo il pulsante per la richiesta della password via mail… e abbiamo terminato anche questo livello e la prima parte della guida :-)!

Matteo

[GNU/Linux] CVE-2015-0235 – esecuzione di codice remoto con glibc

L’ultimo bug uscito in ambiente Linux riguarda la libreria GNU C (glibc), che permette ad un attaccante di eseguire codice remoto sfruttando un buffer overflow delle funzioni gethostbyname o gethostbyname2 della libreria di sistema. Un attaccante potrebbe essere in grado di eseguire codice da remoto o eseguire un blocco dell’applicazione (DoS).

Sono affette tutte le distribuzioni che hanno una versione della libreria precedente alla glibc-2.18, come dichiarato:

https://www.us-cert.gov/ncas/current-activity/2015/01/27/Linux-Ghost-Remote-Code-Execution-Vulnerability

http://www.openwall.com/lists/oss-security/2015/01/27/9

Per verificare la versione della libreria presente nel sistema i comandi da eseguire sono i seguenti:

  • per le distribuzioni RedHat like:
# rpm -q glibc
  • per quelle Debian like:
# dpkg -l libc6
  • in alternativa è possibile controllare direttamente la libreria (potrebbe essere posizionata in un path differente come /lib/x86_64-linux-gnu):
# /lib/libc<tab><invio>

Ad esempio il seguente sistema risulta vulnerabile:

# dpkg -l libc6
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Nome Versione Descrizione
+++-==========================================================================
ii libc6 2.15-0ubuntu10.3 Embedded GNU C Library: Shared libraries

Dunque è necessario aggiornare la libreria libc6 secondo le istruzioni della propria distribuzione, qualora sia precedente alla versione 2.18.

Matteo

[Windows] Errore: “A system shutdown is in progress”

Mi è capitato qualche giorno fa di dover riavviare un server da remoto, ma per qualche motivo il processo di reboot non è andato a buon fine e il sistema operativo è rimasto in esecuzione e in stallo. Questo è successo molto probabilmente perché il sistema operativo non è stato in grado di chiudere una delle tante applicazioni in esecuzione rendendo di fatto impossibile il processo di riavvio.

Error

Come consuetudine avevo lanciato il riavvio da command line in questo modo:

shutdown /r /t 60

ho atteso un bel po’, pensando che la chiusura di qualche applicazione avesse richiesto più tempo del dovuto. Invece il sistema operativo non si è riavviato, restando con tutti i servizi/applicazioni in esecuzione. Provando a lanciare nuovamente il comando di riavvio ho ricevuto questo errore:

A system shutdown is in progress.(1115)

Questo messaggio di errore indica che il sistema operativo ha ricevuto correttamente il comando di reboot ma è impossibilitato ad eseguirlo nonostante il processo sia iniziato. Inoltre in questo stato non c’è garanzia che tutti i servizi siano attivi e funzionanti correttamente perché il processo di reboot potrebbe aver già stoppato alcune applicazioni. Dunque è bene prestare attenzione in questo caso se il server è in produzione, e potremmo voler tentare un riavvio forzato.

Per risolvere la situazione di stallo è necessario chiudere l’applicazione winlogon, e questo può essere fatto facilmente usando l’utility PsKill della Sysinternals in questo modo:

pskill -t \\computername winlogon

Incrociate le dita… et voilà, il sistema verrà sbloccato e si riavvierà all’istante!

Per il download dell’applicazione PsKill possiamo usare il seguente link:

Matteo

[Virtualizzazione] Connettere una macchina virtuale attraverso un proxy

Vediamo oggi come configurare una VM, ospitata all’interno di un sistema operativo host Windows, in modo da poterla collegare ad Internet passando attraverso un proxy. Ad esempio questo è necessario in alcuni ambienti dove la navigazione su Internet è possibile solo attraverso un proxy, per motivi di policy interne di sicurezza (aziendale per esempio…). Ecco un’immagine della nostra semplice infrastruttura:

Test infrastructure

Infrastruttura

Innanzitutto il nostro test è stato eseguito facendo uso di VMware Player, anche se può essere applicato bene anche nel caso di altri software di virtualizzazione lato desktop (Oracle VirtualBox …). Importante è anche bene conoscere come funziona la parte della connettività con un ambiente virtuale, e questo è un requisito fondamentale per poter poi andare a configurare i parametri corretti. E’ un argomento lungo, e necessiterebbe di un articolo a parte, ma in rete si trovano decine di post dettagliati come questo:

http://www.carbonwind.net/Virtualization/VMware-Player-Networking-Options/VMware-Player-Networking-Options.htm

Dunque, dobbiamo identificare qual’è la scheda di rete connessa ad Internet, se già non lo sappiamo, e per far ciò possiamo utilizzare il comando ipconfig come in figura.

Comando ipconfig

Comando ipconfig

In questo caso ci sono 3 schede di rete, e quella connessa ad Internet è quella con label “Local Area Connection”. Da notare che l’installazione di VMware Player\Workstation comporta la creazione di almeno due nuove schede di rete virtuali, come visibile sempre in figura. La creazione di questi 2 adapter virtuali è necessaria per il corretto funzionamento delle connessioni virtuali della VM, come è spiegato in dettaglio al link sopra indicato. In breve, la scheda di rete VMnet1 è usata dalla VM nel caso in cui sia selezionata l’opzione “Bridged” (vedere più sotto), mentre la VMnet8 nel caso venga usata l’opzione “NAT”.

Dunque, andiamo alla sezione di configurazione delle connessioni di rete di Windows, come in figura.

Network connections

Network connections di Windows

Selezioniamo le proprietà della schede di rete connessa ad Internet (“Local Area Connection”).

All’interno della finestra delle proprietà spostiamoci nel tab “Sharing“, e mettiamo una spunta alla proprietà “Allow other network users to connect through this computer’s Internet connection” controllando che sotto “Home networking connection” sia specificata la scheda di rete VMnet8 (la scheda di rete usata dalla VM). In questo modo i pacchetti inviati dalla VM potranno essere inoltrati verso il proxy e la rete esterna passando dalla scheda di rete specificata (qui appunto la “Local Area Connection”).

Internet Connection Sharing

Internet Connection Sharing

Adesso dobbiamo configurare la scheda di rete della VM. Apriamo VMware Player e la configurazione della nostra VM, e posizioniamoci all’interno delle proprietà alla voce “Network Adapter“. Qui selezioniamo le voci come nella figura sottostante, abilitando “Connect at power on” (praticamente è l’analogo del collegamento del cavo di rete alla scheda di rete, virtuale in questo caso) e scegliendo “NAT“.
VMware networking configuration

L’ultimo step è quello di avviare la VM e di configurare il sistema operativo della VM (Windows, XP, 7, 8, Linux, …) per l’utilizzo del proxy (ovviamente dobbiamo conoscere indirizzo IP e porta del proxy da usare):

oppure possiamo configurare le singole applicazioni all’interno della VM (browser, chat, …) per l’accesso tramite proxy.

Matteo

[Excel] VBA e problemi di visualizzazione dei numeri decimali

Spesso ho necessità di utilizzare piccoli script VBA per eseguire determinate operazioni su Excel, a volte operazioni anche su numeri. Purtroppo è facile con Excel fare confusione quando si lavora con i numeri, difatti un numero può essere rappresentato in modo differente a seconda delle proprie impostazioni. Facciamo un po’ di chiarezza :-).

Innanzitutto uno stesso numero può essere rappresentato con varie notazioni:

  • 1000,123
  • 1000.123
  • 1.000,123

supponendo che il numero effettivo sia 1000 con parte decimale 123. In questo caso le varie notazioni internazionali possono rappresentarlo in vari modi come ad esempio 1.000,123 dove il punto indica le migliaia e la virgola la parte decimale.

Il problema può essere gestito in due modi usando Excel:

  1. nel caso in cui si lavori unicamente con Excel (senza usare VBA), è sufficiente configurare correttamente le opzioni di Excel.
  2. nel caso in cui utilizziamo script VBA o macro, che esportano ad esempio i dati su file ed effettuano manipolazione sui numeri, bisogna controllare invece le impostazioni del sistema operativo.

Vediamo il primo caso. Come ho scritto, nel caso in cui si lavori unicamente con un foglio Excel e NON ci sia la necessità di esportare dati tramite VBA, gli unici parametri importanti per la configurazione di punto/virgola si trovano all’interno delle opzioni di Excel.

excel_options

Opzioni avanzate di Excel.

A seconda delle proprie necessità possiamo configurare punto o virgola come separatore per i numeri decimali, così come per le migliaia.

Nel secondo caso, in cui usiamo VBA per esportare i dati (ad esempio elaborare/esportare i dati di uno sheet Excel in un file txt) entrano in gioco le impostazioni del sistema operativo. Questo vuol dire che i numeri esportati all’esterno di Excel potrebbero avere una notazione diversa da quella configurati in Excel stesso. Ad esempio:

  1. in Excel abbiamo il numero 1000,123
  2. VBA esporta il numero prelevato da una cella Excel come 1000.123

Potrebbe avvenire una “conversione” di questo tipo se sono configurate male le impostazioni di “Region and Language” di Windows. Dunque controlliamo la nostra configurazione all’interno del pannello di controllo, come visibile in figura.

region_and_language

region_and_language_window

Dunque apriamo “Additional settings“, controlliamo i separatori configurati per decimali e migliaia (Digit grouping), ed eventualmente modifichiamoli.

Region_and_language_additional_settings

Matteo