Gabriele “Charlie” Guizzardi

26 Jan, 2010

PSPAD come IDE per Python 2.6

Posted by: Gabriele Guizzardi In: Pillole di Saggezza| Programmazione| Python| Software

Python è sicuramente un linguaggio ormai maturo e potente per eseguire molti tipi di codice, soprattutto script rapidi e di test su innumerevoli aspetti della programmazione. Purtroppo però ho notato una certa difficoltà, ancora oggi, a definirsi un preciso ambiente di sviluppo. Per esempio, provando IronPython non mi sono trovato estremamente bene, la gestione dei progetti non è molto “chiara” ma ovviamente, come per le automobili, anche gli ambienti di sviluppo sono relativi alle proprie sensazioni.

Ecco quindi che ho voluto trovare una alternativa rapida e alla portata di tutti, anche a chi inizia a programmare, per potersi avvicinare a Python. Si tratta dell’editor gratuito PsPad che uso regolarmente. Ironia della sorte, anche sul forum di PsPad la sua configurazione per supportare Python non è chiarissima e ha inoltre un piccolo errore su una variabile d’ambiente.

Gli attori in gioco sono:

- PsPad ver. 4.5.4

- Python ver. 2.6

Il tutto su Windows XP SP3 italiano.

Installate entrambi lasciando i valori di default e poi aprite PsPad e andate in Configurazione –> Evidenziazione Sintassi. Scegliete Python dall’elenco ed inserite i seguenti parametri nella sezione “Compilatore”:

Compilatore:

C:\Python26\python.exe

Parametri:

“%File%”

Mettete il segno di spunta sul parametro “Finestra messaggio di uscita del programma” ed inserite la seguente stringa nella casella “Analizza sintassi Log:”

*file %F *line %L*

Uscite da PsPad e riapritelo, alcune volte non si accorge delle modifiche applicate. Siamo ora pronti a scrivere il nostro primo programma in Python, il classico “Hello World”. Per far questo aggiungete questa riga nell’editor di testo:

print “Hello, World!”

Dal menù “File” selezionate “Compila” (oppure la combinazione di tasti: CTRL + F9) e nella finestra di Log in basso avrete il risultato del programma con visualizzata la stringa di benvenuto.

NOTA: fate attenzione se usate il copia-incolla per i parametri e la linea di codice poiché il carattere virgolette potrebbe non essere quello corretto da usare. Se avete errori nella compilazione ridigitate le virgolette usando SHIFT + 2.

Invia l'articolo in formato PDF a Word PDF

06 Jan, 2010

htaccess e il reindirizzamento invisibile

Posted by: Gabriele Guizzardi In: Apache| Programmazione| Sicurezza| Vulnerabilità

Alcune volte anche le soluzioni e i comandi realizzati per aiutare nella creazione di siti Intenet possono ritorcersi contro gli utenti e gli sviluppatori stessi. Un caso che mi viene in mente è quello dei files di configurazione distribuita .htaccess usati in Apache. Questi files di testo possono contenere direttive eseguite dal server web ed applicate a directory e sotto-directory.

All’interno possono essere inseriti comanti e direttive per far fare al server svariati lavori che risolvono immediatamente anche grandi problematiche di gestione come per esempio gli reindirizzamenti. Supponiamo di voler reindirizzare l’utente alla classica pagina d’errore nel caso la pagina che lui cerca non esista. L’errore è il 404. Per far questo basta scrivere nel file .htaccess questo comando:

ErrorDocument 404 /errore404.html

Ecco che gli utenti verranno reindirizzati alla pagina di errore specifica. Con questa soluzione potete realizzare pagine di errore ad hoc per ogni codice oppure rimandare tutti gli errori alla home page.

Ma le direttive fornite da Apache sono tante e potenti e un codice come quello qui riportato mette in evidenza possibili vulnerabilità:

RewriteEngine On
RewriteCond %{HTTP_REFERER} .*google.*$ [NC,OR]
RewriteCond .* http://79.123.1.1/index.php?d=malware [R,L]

Noterete che tutte le richieste provenienti da Google saranno reindirizzate ad un certo host che potrebbe contenere codice malevole. Se, un possibile attacco al sito riuscisse ad inserire tali istruzioni nel file .htaccess oppure inserisse il file per intero (tecnica del “file inclusion”) ecco che tutti i visitatori provenienti da Google sarebbero reindirizzati. Potreste addirittura non accorgervene subito poiché se digitate l’indirizzo del sito direttamente questo si aprirà senza problemi quindi, per voi, tutto funziona.

Se aggiungiamo una riga per ogni motore di ricerca (per esempio .*yahoo.*) conosciuto e magari da altri popolari siti Internet ecco che produrremmo un reindirizzamento di massa non indifferente, soprattutto se il sito che lo subisce è un sito altamente trafficato.

Il consiglio è quindi quello di controllare saltuariamente la corretta visualizzazione del vostro sito usando percorsi differenti, cioè raggiungendolo anche da ricerche, link da altre pagine, ecc.

Invia l'articolo in formato PDF a PDF Creator

29 Dec, 2009

Honeypot e Mail trappola anti-spam in PHP

Posted by: Gabriele Guizzardi In: PHP| Programmazione| Sicurezza| Spamming

Se fosse per me ci sarebbe già da parecchi anni, in Italia, una Legge severissima sugli spammer, con pene simili allo stalking e paragonabili a quelli sulla violenza e l’abuso. Chi invia sistematicamente (non parliamo delle offerte di mercato che un’azienda invia un paio di volte l’anno solo ai propri clienti) mail e messaggi senza esplicita richiesta del destinatario e per pubblicizzare materiale assolutamente fuori luogo sempre per il destinatario (mi riferisco per esempio a messaggi in inglese riguardanti la vendita di viagra indirizzati a casalinghe o minorenni che ritengo difficile abbiamo asplicitamente richiesto tali informazioni) dovrebbe essere interdetto dall’uso di Internet. E’ molto complesso ovviamente mettere in pratica questo ma qualche sforzo in più si potrebbe fare.

Lo spam, per chi non lo sapesse, genera, inoltre, traffico di rete e conseguente rallentamento delle operazioni, potrebbe capitare, per esempio, che un vostro mail di lavoro (penso a chi lavora con titoli di borsa o con banche) raggiunga il destinatario ormai troppo tardi a causa del rallentamento dei server di gestione della posta elettronica. Rallentamento dovuto alla mole di messaggi di spam da processare.

Come fanno i programmi che scandagliano la rete a trovare il vostro indirizzo mail e a scrivervi il tutto automaticamente? Per fare questo sono stati realizzati software che si collegano ai siti Internet e leggono il contenuto delle pagine web alla ricerca di indirizzi di posta o di siti.

Per divertirsi a combattere gli spammer con le loro stesse armi possiamo realizzare diversi sistemi-trappola, ne descrivo un paio qui di seguito.

Honeypot eMail

Un honeypot email (esistono anche gli honeypot server) è sostanzialmente un email trappola (mail fake), cioè un indirizzo mail realizzato appositamente per farsi catturare dagli spammer e raccogliere informazioni su di loro. Un software che raccoglie indirizzi mail navigando in rete difficilmente è programmato per riconoscere honeypot (barattoli di miele) quindi tende a registrare tutti gli indirizzi che trova.

L’honeypot viene quindi strutturato per riportare alcune informazioni basilari sullo spammer come per esempio l’indirizzo IP e il momento della cattura, ecco un esempio:

<?php
// Esempio di Honeypot in PHP
// Scritto da Gabriele Guizzardi, Brain & Bytes, 2009.
echo '<a href="mailto:ipspam-'.$REMOTE_ADDR.'-'.
date('l-d-M-y-H-i-s-T').
'@dominio.it">Scrivimi</a>';
?>

che crea sul vostro sito un link al seguente indirizzo:

ipspam-79.123.1.1-Tuesday-29-Dec-09-01-02-54-GMT@dominio.it

Noterete la particolare formattazione della data che riporta informazioni sufficienti a comprendere quando è stato catturato l’indirizzo da parte dello spammer. Il dominio invece deve essere reale così che i futuri mail di spam siano correttamente inviati e ricevuti. Potete ovviamente modificare tale sintassi aggiungendo altre informazioni oppure, nel caso della data, aiutandovi con quanto messo a disposizione dalle classi del PHP:

http://www.php.net/manual/en/class.datetime.php

Ricordate ovviemente di sostituire la punteggiatura non supportata dagli indirizzi email che per esempio non digeriscono gli slash.

Bene, a questo punto abbiamo sulla pagina del nostro sito un email fasullo generato ad ogni visualizzazione con i dati del momento. Passiamo ora a realizzare un server di posta elettronica. Per far questo potete configurare un computer con Microsoft Exchange Server oppure con IceWarp oppure ancora Kerio MailServer.

Fake eMail

Un secondo metodo, se non vi interessa analizzare le attività di spamming o creare dati statistici sulla posta-spazzatura generata visitando le vostre pagine web, può essere la creazione di email fasulli da riempire i database degli spammer e creargli un flusso dati di ritorno da posta inevasa che possa quanto meno disturbarne l’operato.

Il codice qui sotto riportato genera 10 indirizzi email falsi ma sintatticamente corretti per i motori di raccolta dati degli spammer, i cosidetti spambot:

<?php
// Esempio di FakeMail in PHP
// Scritto da Gabriele Guizzardi, Brain & Bytes, 2009.
$n_mail = 10; //numero di email da visualizzare
//calcolo casualità
function mailfake()
 {
 $seed = (integer) md5(microtime());
 mt_srand($seed);
 $word = mt_rand(1,99999999);
 $word = substr(md5($word), mt_rand(0, 19), mt_rand(6, 12));
 return $word;
 }
$dominio = mailfake();
$id = mailfake();
//compone l'indirizzo mail casualmente
for($i = 0;$i <= $n_mail; $i++)
 {
  {
  $nome = array( "nome1",
                 "nome2",
                 "nome3",
                 "nome4",
                 "nome5",
                 "nome6",
                 "nome7",
                 "nome8",
                 "nome9",
                 "nome10" );
  $n = $nome[(int)rand(0, 9)];
  }
  {
  $cognome = array( "cognome1",
                    "cognome2",
                    "cognome3",
                    "cognome4",
                    "cognome5",
                    "cognome6",
                    "cognome7",
                    "cognome8",
                    "cognome9",
                    "cognome10" );
  $c = $cognome[(int)rand(0, 9)];
  }
  {
  $estensione = array( "com",
                       "net",
                       "it",
                       "org" );
  $est = $estensione[(int)rand(0, 3)];
  }
  ?>
  <table>
   <tr>
    <td>
     <? echo "<a href=\"mailto:$n$c@$dominio.$est\">
                               $n$c@$dominio.$est</a>"; ?>
    </td>
   </tr>
  </table>
 <?
 }
 ?>

Potete variare il numero di email generate e i dati in esso contenuti cambiando gli array dai quale attinge la funzione per comporre l’indirizzo.

Se posizionate lo script per esempio in fondo ad una pagina web e cambiando magari il colore degli indirizzi con lo stesso colore di fondo per renderli “invisibili” agli utenti ma non agli spambot avrete una serie di indirizzi email intercettabili dagli spammer ma che non disturberanno i navigatori umani della pagina. Il risultato sarà quello di riempire i database degli spammer con email inesistenti e conseguente traffico di ritorno di email inevase.

Invia l'articolo in formato PDF a PDF Creator

17 Dec, 2009

Facebook, successo immeritato!

Posted by: Gabriele Guizzardi In: Altro

Lo so, lo so, avevo detto a tutti che non mi sarei iscritto a Facebook ma per capire qualcosa spesso bisogna provarla. E poi in televisione ci hanno talmente massacrato i cosiddetti anche i telegiornali che alla fine uno si incuriosisce. Adesso che l’ho provato faccio una grande fatica a comprendere perché abbia avuto tutto sto successo. Mi spiace, ma a me non piace, sotto diversi punti di vista anche se ovviamente, per le mie conoscenze, mi permetto di analizzarlo solo da un punto di vista tecnico/informatico.

Vediamone alcuni:

1) Da quando ho pubblicato informazioni sul mio blog di programmazione, postando i link di alcuni articoli, ho ricevuto (e ricevo tutt’ora) una media di circa 5 commenti di puro spam al giorno, tutti stranamenti in lingua russa (con IP 188.92.nn.nn) prontamente bloccati dall’anti-spammer di Wordpress Akismet (un plauso all’autore). Sono abbastanza certo sia colpa della pubblicazione si Facebook poiché ricevono spam solo gli articoli con il corrispondente link sul Social Network, gli altri articoli no.

E’ chiaro che un social network che conta 350 milioni di utenti è soggetto ad attacchi e scan delle proprie pagine in modo massiccio, ma è altrettanto vero che questo nei forum normali non avviene o comunque è molto più contenuto.

2) Volendo testare un po tutto Facebook ho dovuto mio malgrado giocare anche a tutti i giochetti Flash messi a disposizione (le cose vanno fatte bene :D ). Ho fatto un record al giochino Biotronic e la finestrella di pubblicazione del punteggio mi ha dato un errore non permettendomi di documentarlo (succede spesso). Al di la del punteggio del gioco, penso che Facebook abbia parecchi problemi di gestione degli eventi, probabilmente dovuti al traffico congestionato.

Ho fatto l’esempio del gioco per metterla sul piano della simpatia ma è anche vero che ho riscontarto questo genere di … chiamiamola “disfunzione” … anche per altre operazione di iterazione. Ogni tanto compare il messaggio “Si è verificato un problema, ecc. ecc.”.

fb-agg-privacy-10dic

Guardate per esempio l’immagine che allego qui sopra, è la risposta che ho avuto alla presa visione delle nuove norme sulla privacy che Facebook ha inviato a tutti gli utenti il 10 dicembre 2009.

3. Per iscrivermi ci è voluto 10 minuti per un errore di connessione network inesistente e ogni tanto il tempo di passaggio tra una attività ed un’altra è abissale.

Ora, come dicevo, sono sicuro che il traffico di rete sviluppato da così tanti utenti crei agli autori di Facebook non pochi problemi ma mi indica anche che il lavoro svolto è costantemente un inseguimento delle prestazioni del servizio, non mi pare si faccia nulla per anticiparne le esigenze.

Sapendo, per esempio, che il trand di aumento dell’utenza è stimato in un certo numero la settimana (i dati sono costantemente monitorati) si dovrebbe pensare ad una programmazione degli aggiornamenti seria e più performante. Google, non ha gli stessi ritardi, eppure gestisce molti più dati, basti pensare che oltre al motore di ricerca esistono almeno altre decine di servizi.

E’ chiaro che questo è un punto alquanto delicato e difficile da risolvere pienamente, se calcoliamo infatti che basta avere una trentina di “amici” che ogni giorno “postano” anche solo 5 o 6 messaggi a testa ecco che moltiplicato per centinaia di migliaia di utenti ci troviamo a gestire database dalle grandezze spropositate che necessariamente devono essere potenti ed equilibrati nella gestione per fornire risposte in tempi accettabili.

Credo anche che, oltre ad essere stati un po colti impreparati (chi avrebbe mai pensato ad un successo simile?) si stia anche pensando ad un possibile crollo o ridimensionamento dell’utenza, che, seguendo le mode, potrebbe spostarsi su altri siti e novità di settore.

4) La pubblicazione di una informazione può essere condivisa con il resto della comunità anche 24h dopo la pubblicazione. Evidentemente il numero di messaggi e pensieri è talmente alto da generare code di pubblicazione smaltibili solo dopo parecchie ore. Questo, oltre alla lentezza e pesantezza del sistema, lo vedo soprattutto come una inutilità del servizio, si pubblicano infatti messaggi che probabilemente non saranno mai letti poiché fagocitati dalla mole di altri messaggi e dal fatto che saranno “persi” in base all’orario di presentazione. Dopo 24h una informazione potrebbe addirittura essere obsoleta per il resto della comunità.

Per ultima, una nota non tecnica. Facebook è proprio il catino e l’apoteosi dell’ignoranza. Mai così tanti imbecilli hanno mai scritto in un sito (dovrebbero metterlo nel Guinness) contemporaneamente. Esistono i “gruppi” più incredibili (dove addirittura si augura la morte di altri), dove le persone si spacciano per quello che non sono, consigliando il prossimo ed elargendo perle di ignoranza devastanti.

Qui, la mia formazione scientifica, si scontra con l’oppurtunità di libertà data al genere umano di confrontarsi. Un conto è la possibilità di esprimersi, un conto è sparare cazzate al prossimo spacciandole per verità assolute.

Basta, mi fermo qua, mi riservo di esprimermi ancora più tecnicamente quando deciderò di scrivere un’applicazione per Facebook.

Invia l'articolo in formato PDF a PDF

Iniziamo subito col dire che non ce l’ho con Avira ne mi diverto a far fare “brutte figure” agli anti-virus. Studiare certe tecniche di programmazione aiuta a comprendere come funzionano i Malware e a cosa si può andare incontro nella realizzazione di software.

TR/VB.Downloader.Gen - Trojan

Veniamo al nostro falso positivo che, come vedrete, è di una semplicità disarmante e se eseguito non produce alcun risultato ne funzionamento utile o dannoso, come fosse un programma morto pertanto totalmente innocuo.

Aprite VB6 e create un progetto. In Form1 mettete un controllo WebBrowser1 e nel codice copiate questo:

Private Declare Function SendMessage Lib "user32" _
   Alias "SendMessageA" (ByVal hWnd As Long, _
   ByVal wMsg As Long, ByVal wParam As Long, _
   lParam As Any) As Long

Private Sub Form_Load()
'
End Sub

Per i più pigri trovate il progetto nella pagina Download.

Tutto qua. La combinazione del controllo web di VB6 e dell’API SendMessage per Avira Antivir è sufficiente a visualizzare un messaggio di Malware. In altri casi è sufficiente abbassare il livello di aggressività della funzione euristica del programma, ma non in questo caso poiché per Avira si tratta semplicemente di un tentativo di trasmettere all’esterno dati della macchina.

falso positivo allarme

Cosa ci dice tutto questo? Innanzitutto un anti-virus non è un programma infallibile e chi li spaccia per tali vende fumo. Non date retta soprattutto a chi si schiera per l’uno o l’altro produttore, non è possibile avere una cultura aggiornata e totale su tutti i prodotti in commercio. Secondo, essere primo o decimo nella classifica dei migliori anti-virus per riconoscimento potrebbe non essere il massimo se poi il programma vi disturba per ogni legittimo tentativo di un certo tipo di connessione e controllo di Windows. Il miglior anti-virus spesso è un compromesso di tutto questo, buon livello di riconoscimento e basso profilo.

Questo test è stato eseguito con la versione 9.0.0.415 (aggiornato alla data di pubblicazione dell’articolo) di Avira in versione gratuita. Questo anti-virus resta comunque attualmente una buona soluzione gratuita sul mercato e la rilevazione di questo falso positivo non ne scredita certo l’ottimo livello di sicurezza.

Chi volesse divertirsi può provare lo stesso codice o soluzioni simili in altri linguaggi con differenti anti-virus.

Invia l'articolo in formato PDF a PDF

24 Oct, 2009

Crack di hash MD5 con PHP

Posted by: Gabriele Guizzardi In: PHP| Programmazione| Sicurezza

Nel titolo uso la parola “crack” ma vorrei chiarire subito che NON SI PUO’ craccare un hash MD5 (ho usato “crack” perché sarebbe stato troppo lungo mettere una cosa simile a “trovare la corrispondente stringa in chiaro di un hash MD5″). Craccare prevede il reverse della funzione e con MD5 questo non è possibile. Ho letto in rete molti articoli di “esperti” informatici che in modo disinvolto usano la parola crack o addirittura indicano come reversibile un hash MD5. Questo è falso!

s

Quello che è possibile fare è usare metodi “forza bruta” per trovare la corrispondente stringa in chiaro già precedentemente calcolata. Questo è possibile facendo un match tra due hash, quando l’hash sconosciuto è uguale all’hash archiviato si va a vedere il corrispondente testo in chiaro. Per far questo è necessario avere un database contenente anche solo due informazioni per record: l’hash e il testo in chiaro.

Partiamo dalla base, consideriamo la parola “password” e calcoliamone l’hash MD5, otterremo la stringa “5f4dcc3b5aa765d61d8327deb882cf99″. Archiviando questa informazione avremi un record che associa la parola all’hash. Se facessimo questa operazione su tutti i vocabolari del mondo e aggiungessimo tutte le combinazioni di lettere e numeri usate principalmente dalle persone quando scrivono una password o uno username ecco che potremmo ragionevolmente dire che avremmo in mano uno strumento potente per recuperare il testo in chiaro di un hash MD5 (questo vale anche per altre codifiche come SHA1).

Ho scritto quindi un programmino a riga di comando in linguaggio PHP per calcolare l’hash delle combinazioni di caratteri ASCII e compararlo con l’hash sconosciuto, oggetto della ricerca. L’utente quindi, lanciando il programma, deve indicare l’hash di cui cerca la corrispondenza in chiaro ed il numero di caratteri di cui pensa sia fatto il testo corrispondente all’hash sconosciuto. Facciamo un esempio pratico:

BruteForce.php <hash> <num.car.combinazione>

Nella pratica:

C:\ForzaBruta.php 098f6bcd4621d373cade4e832627b4f6 4

Notate che come parametri vengono passati l’hash sconosciuto ed il numero di caratteri di cui pensiamo sia lunga la parola corrispondente all’hash sconosciuto (in questo caso la parola è “test”).

crackmd5

E’ bene fare ora alcune pratiche considerazioni. Essendo un sistema a forza bruta, più alto è il numero di caratteri di cui pensiamo sia fatto il testo in chiaro, più aumenta considerevolmente il tempo di calcolo. Per darvi un’idea, su un PC con un Intel Core 2 Duo e 2Gb di RAM per calcolare tutte le combinazioni ASCII fino a 4 caratteri ed arrivare a scoprire che si tratta della parola “test” è stato necessario 1h di tempo circa. Già un testo lungo 5 caratteri necessita di circa 16/17h… e così via.

Il codice del programma potete scaricarlo dalla pagina dei Downloads.

Invia l'articolo in formato PDF a Word PDF

01 Oct, 2009

MySQL.Data in Visual C# 2005

Posted by: Gabriele Guizzardi In: C#.NET| Pillole di Saggezza| Programmazione

Per quanti non comprendano perché non trovano MySQL.Data tra le referenze di Visual C# 2005 sotto Windows XP (cosa che invece avviene senza problemi in VB.NET 2005) fate così:

  • Installate il Connector da questo indirizzo: http://dev.mysql.com/downloads/connector/net/5.0.html
  • Aprite Riferimenti–>Aggiungi Riferimento e usate Sfoglia per cercare il file MySQL.Data.dll che si trova nella cartella C:\Programmi\MySQL\MySQL Connector Net 5.0.9\Binaries\.NET 2.0
  • Curiosamente, aprendo altri progetti, troverete MySQL.Data nella sezione NET, cosa che non avviene nel progetto nel quale mancava.

Inoltre per completezza d’informazione aggiungo un esempio di codice per la connessione:

using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using MySql.Data.Types;

namespace MySqlExample
{
 class Program
 {
 static void Main(string[] args)
 {
 string host = "localhost";
 string database = "nome_database";
 string user = "username";
 string password = "password";
 string strSQL = "SELECT * FROM nome_tabella";

 string strProvider = "Data Source=" + host + ";Database=" +
    database + ";User ID=" +
    user + ";Password=" + password;
 try
 {
 MySqlConnection mysqlCon = new MySqlConnection(strProvider);
 mysqlCon.Open();

 if (mysqlCon.State.ToString() == "Open")
 {
 Console.WriteLine("Connessione al Database:");
 Console.WriteLine("------------------------");

 MySqlCommand mysqlCmd = new MySqlCommand(strSQL,mysqlCon);
 MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();

 Console.WriteLine("Id\tTabella1\tTabella2");
 Console.WriteLine("----------------------");

 while (mysqlReader.Read())
 {
 Console.WriteLine(mysqlReader.GetInt32(0) + "\t" +
   mysqlReader.GetString(1) +
   "\t" + mysqlReader.GetString(2));
 }

 }

 mysqlCon.Close();

 }
 catch (Exception er)
 {
 Console.WriteLine("Si è verificato un errore: " + er.Message);
 }

 Console.ReadKey();
 }
 }
}

PS: Auguri Nonna Elide.

Invia l'articolo in formato PDF a Word PDF

06 Sep, 2009

MD5, sicuro o insicuro?

Posted by: Gabriele Guizzardi In: PHP| Programmazione| Sicurezza

L’acronimo MD5 (Message Digest algorithm 5) indica un algoritmo crittografico di hashing realizzato da Ronald Rivest nel 1991 e standardizzato con la RFC 1321. Questa è la prima riga dell’ottima descrizione di questo algoritmo tratta da Wikipedia.

ps3lab_20090102-500x375Un esempio pratico e banale di utilizzo in una pagina web utilizzando PHP come linguaggio potrebbe essere questo:

<html>
<head>
<title>Test hash di MD5</title>
</head>
<BODY>
<FORM name="password" action="md5.php" method="post">
Digitare un testo:
<input type="text" name="text1">
<input type="submit" name= "submit" value="Crea MD5">
</FORM>
<?php
if (isset($_POST['submit']))
  {
  $password=$_POST['text1'];
  $text = md5($password);
  print "$text";
  }
?>
</html>

Altri linguaggi hanno istruzioni per calcolare l’MD5 oppure esistono classi pronte per inserirlo all’interno dei propri software. Comunque, MD5 è uno dei migliori sistemi per criptare informazioni ed è estremamente difficile se non quasi impossibile riconvertire in chiaro la sequenza di lettere e numeri di un hash.

Se fate una prova con il codice sopra riportato digitando la parola “admin” avrete come risultato il seguente hash:

21232f297a57a5a743894a0e4a801fc3

Attenzione però, avrete sempre il codice sopra riportato, quindi ogni stringa ha la sua corrispondenza MD5. Quando si controlla la password sui siti Internet si controlla proprio la corrispondenza tra quanto inserito dall’utente e il codice hash archiviato nel database. A questo punto è facile immaginare che si può realizzare un archivio contenente tutte le parole possibili immaginabili e maree di combinazioni di lettere e numeri per confrontarli con gli hash generati da MD5. Una volta che si “recuperano” codici hash da altri database si può controllare la corrispondenza e se si è fortunati (o meglio se la password è banale) si troverà la sua corrispondenza in chiaro. Fate una prova su questo sito digitando il codice hash della parola “admin”:

http://md5.rednoize.com/

E fin qui nulla di nuovo… ma è proprio così impossibile decriptare un hash generato da MD5?

Alla fine dell’anno scorso, un gruppo di scienziati hanno usato 200 Playstation 3 collegate in rete (cluster) per generare una coppia identica di certificati hash ricavati però da due differenti chiavi, cosa teoricamente non possibile in base all’algoritmo usato da MD5. Hanno impiegato “solo” due giorni e 200 Playstation 3 perché quest’ultime montano un processore CELL fornendo quindi una potenza di calcolo paragonabile a quella di grossi mainframe.

A questo punto, autenticando presso RapidSSL Certification Authority (uno degli enti certificatori internazionali) un loro sito Internet ne hanno ricevuto la certificazione. Questa certificazione poteva quindi essere usata per un secondo sito Internet poiché i ricercatori avevano un secondo hash identico a quello certificato, chi avrebbe visitato il secondo sito lo avrebbe ritenuto “sicuro” esattamente come quello realmente certificato poichè le parti codificate con MD5 sono identiche e indistinguibili da parte dei software e dei browser in generale. Da qui è comprensibile come poi si possa scaricare sulla macchina dell’utente codice maligno…

Questa tecnica è chiamata “MD5 collision” e ne potete leggere ulteriori dettagli a questi indirizzi:

http://eprint.iacr.org/2009/111.pdf

http://www.win.tue.nl/hashclash/rogue-ca/

E’ chiaro ovviamente che non tutti dispongono della potenza di calcolo di 200 Playstation 3 per trovare due hash identici, ma è altrettanto chiaro che MD5 è destinato a breve ad essere abbandonato, a partire dai server di sicurezza internazionali. La nuova strada indicata è SHA-2.

Invia l'articolo in formato PDF a PDF Download

26 Aug, 2009

Rubare dati di Carte di Credito

Posted by: Gabriele Guizzardi In: Programmazione| Sicurezza

E’ del 17 agosto l’ennesima notizia che negli Stati Uniti dei “geni del computer” sono riusciti ad impossessarsi di ben 130 milioni di codici di Carte di Credito dalla società Heartland Payment Sistems, una delle più grosse società di transazioni elettroniche, e dalla 7-Eleven, una catena di negozi presente oltre che negli Stati Uniti in 18 Paesi. Insomma… dei geni… direi più dei genialoidi se poi li hanno beccati!

carte-di-creditoSegnalo su tutti l’articolo di questo sito: http://www.carte-di-credito-online.com/2009/08/rubati-130-milioni-di-carte-di-credito.html

Rubare o impossessarsi (c’è differenza!) di numeri di carte di credito e dei relativi dati di scadenza e proprietà è una cosa alquanto semplice e, nonostante non possa addrentrarmi nei particolari poichè la mia piccola azienda crea proprio software per le transazioni di pagamento con le carte di credito, posso affermare, con fatti, dati alla mano e più di 10 anni d’esperienza, che, se domani volessi fare altrettanto, potrei impossessarmi di migliaia di codici di carte di credito validi e correntemente in uso (tra i quali molti stranieri), e di molti dati sensibili dei proprietari. Il tutto in pochi click del mouse, senza usare keylogger, phishing, virus o altri software di alcun tipo.

“Grazie” dirà qualcuno, “se scrivi tu i programmi che inviano i dati delle carte agli istituti di credito mi sembra facile pensare che si possano dirottare o altro…”. E’ vero, basterebbe modificare qualche riga di codice per inviarmi o salvare da qualche parte tutti i dati in transito. Però, oltre ad essere facile sarebbe anche molto pericoloso (e stupido), dopo aver scoperto la frode sarebbe elementare per la Polizia Postale (spero!) comprendere da dove è partito il furto.

Credetemi, invece, se vi dico che sarebbe altrettanto semplice intercettare le trasmissioni dei pagamenti con sistemi quali il “man in the middle” o addirittura la forzatura dei siti FTP sui quali, ancora oggi, vengono inviate le transazioni, spesso in modalità Offline, cioè non in tempo reale.

Tutto questo grazie a una somma di fattori quali:

  • utilizzo di file di testo per la raccolta e l’elaborazione dei dati (sembra incredibile ma è così,). Per darvi un’idea si tratta di file simili ai CSV, con o senza punteggiatura di separazione.
  • mancanza di sistemi di criptazione anche elementari (i dati spesso sono inviati perfettamente in chiaro).
  • assenza di procedure di sicurezza atte anche solo a debellare attacchi di ingegneria sociale (ci sono persone che al telefono vi raccontano pure cosa hanno mangiato a colazione).

Se a tutto questo aggiungiamo la mancanza di uno standard di protocollo dei dati e uno standard di trasmissione degli stessi (ogni banca o consorzio ha un proprio sistema trasmissivo) ecco che abbiamo il quadro completo dell’insicurezza (e del caos) dei nostri dati.

Per assurdo, comprare su Internet attraverso siti quali PayPal resta una modalità altamente sicura, sempre che questi siti non si lascino “sfuggire” i dati delle carte registrate in loro possesso.

Per fare un esempio nello specifico, ecco come funziona un collegamento Offline tra una cassa e chi riceve i dati delle transazioni:

1. una apparecchiatura (software + hardware) legge la traccia ISO della carta di credito.

2. il software di gestione (un apposito programma) crea un database o un file con i pagamenti.

3. lo stesso software oppure un altro legge questi dati e inizia la procedura di trasmissione.

4. per prima cosa instaura una connessione RAS componendo numero di telefono del server della banca o dell’azienda preposta, poi si autentica con username e password.

5. a questo punto ci si collega con il server FTP e ci si ri-autentica con un secondo username e un’altra password.

6. ultimo passo, vengono spedite sotto forma di file i dati delle transazioni.

Detto così sembra abbastanza sicuro ma non facciamoci ingannare dalla procedura, ricordiamo che i dati transitano in chiaro, pertanto, un attacco “man in the middle”, soprattutto durante la fase di connessione, la fase più debole della struttura, porterebbe ottimi risultati di successo.

Negli ultimi mesi, alcuni istituti di credito hanno tentato di trovare ulteriori forme di protezione criptando i dati in GPG o passando a  tecnologia SFTP ma siamo ancora lontano dalla vera sicurezza…

Invia l'articolo in formato PDF a PDF

12 Aug, 2009

Attacco Dizionario a Server FTP

Posted by: Gabriele Guizzardi In: Programmazione| Sicurezza

Per studi puramente accademici (giuro!), ho voluto testare le condizioni di sicurezza dei miei server FTP. Uno dei test più semplici è attaccare il server con “forza bruta” e/o altri attacchi simili. In questo articolo scriverò come realizzare un “attacco a dizionario” con una sola riga di comando, senza linguaggi di programmazione o tecnologie particolari.

serverfarmIniziamo ad analizzare il problema. Dobbiamo realizzare uno script che legga un file di testo contenente una serie di username e password che poi andremo a passare ad un comando di connessione FTP. Per risolvere questo passaggio per prima cosa ho preso in considerazione un piccolo linguaggio interpretato chiamato BPL del quale ho trovato anche il sorgente in C++. Pensavo che modificando opportunamente il sorgente del compilatore avrei potuto risolvere tutto in poche istruzioni. Mentre ci lavoravo sopra però mi sono reso conto che alla fine non sarebbe stata una soluzione alla portata di tutti, solo altri programmatori avrebbero potuto camprendere a fondo tale soluzione e così ho cercato meglio tra i comandi di Windows e ho trovato FOR.

Ammetto di aver sempre poco preso in considerazione la linea di comando di Windows e non conoscevo bene il funzionamento di questa utility. Tuttavia, con il solo utilizzo di FOR è possibile risolvere il problema sopra descritto:

C:\>for /f “tokens=1-2″ %%A in (dizionario.txt) do (c:\curl -u %%A:%%B -ftp ftp://111.222.333.444:21)

La illustro rapidamente. FOR è l’istruzione Windows per eseguire un certo compito in base al parametro indicato, in questo caso /f che indica la lettura di un file (parsing). Dopodichè è necessario indicare cosa ci troveremo nel file, due stringhe, quindi l’informazione “token=1-2″ specifica proprio cosa deve essere letto dal file (2 stringhe consecutive) per poi passarle alle variabili %%A e %%B. Il nome del file da leggere è “dizionario.txt”, che dovremo popolare con due stringhe separate da uno spazio per ogni riga, username e password, come l’esempio qui di seguito:

admin admin
admin password
user password
user user
user123 password
user123 user123
demo demo

eccetera eccetera ….

Altro passo necessario è trovare un’utility FTP che permetta la connessione al server con una sola riga di comando. In questo caso, per esempio, l’utility nativa di Windows non è utilizzabile poiché nella sua sintassi accetta username e password da file esterno oppure dopo la connessione al server. Per questo motivo ho cercato e trovato CURL che permette di connettersi specificando tutti i parametri sulla stessa riga di comando. Ecco quindi che possiamo comprendere anche l’ultima parte dello script. Con -u passiamo a curl lo username e la password lette dalle righe del file dizionario (variabili A e B) e con il comando -ftp gli passiamo l’indirizzo del server. La porta 21 che indica la porta di default dell’FTP può essere omessa oppure cambiata a seconda della necessità.

output_attaccoSi può fare di meglio

Come possiamo vedere, a differenza di alcuni anni fà, oggi è possibile affrontare operazioni che richiedevano una base di programmazione con semplici utility e comandi per batch file. E’ chiaro che il mio esempio è ridotto all’osso, si può fare di meglio, sempre comunque usando l’istruzione sopra indicata. Per esempio si potrebbe passare l’indirizzo IP dalla linea che richiama lo script all’interno del parametro -ftp di cURL. Per far questo possiamo usare il passaggio dell’IP come variabile al lancio del batch file:

C:\>attacco.bat 192.168.1.4

e poi leggere l’IP usando la variabile %1. Oppure ancora possiamo intercettare l’output dei tentativi di cURL reindirizzandolo in un file di testo e analizzandolo successivamente con calma.

Related Posts with Thumbnails
Invia l'articolo in formato PDF a PDF Free

Chi Sono

Salve a tutti,
questo blog nasce per studiare WordPress e il mondo dei blog in genere quindi, almeno per il momento non vi aspettate molto. Usero' questo stumento per parlare di cio' che conosco meglio, a partire dalla programmazione dei computer. Su di me posso dire che ho iniziato a programmare agli inizi degli anni '80 con l'uscita dell'Atari 800XL e nel 1989 è uscito un mio videogioco distribuito dalla Lago Software. In tutti questi anni, oltre a lavorare come tecnico o programmatore, ho pubblicato diversi articoli e inseriti per diverse riviste: EG Elettronica Giovane, Elettronica Flash, Computer News, ecc. Dal 2000 ho creato una piccola software house specializzata in software aziendali realizzati ad hoc.

Pubblicit�

Pubblicit�