[Articolo] Facciamo un tuffo nel dark-web: cosa c’è oltre il tunnel?

Parliamo oggi di dark-web, quella parte poco conosciuta e usata del web, che spesso viene citata in articoli, trasmissioni televisive e libri, e negli ultimi anni è sempre più in voga. Ne sono esempio serie come Mr. Robot e CSI Cyber, dove si sprecano citazioni e riferimenti più o meno veritieri.

Difficoltà articolo (0->10): 4

Requisiti: conoscenza e utilizzo di Tor.

Parliamo oggi di dark-web, quella parte poco conosciuta e usata del web, che spesso viene citata in articoli, trasmissioni televisive e libri, e negli ultimi anni è sempre più in voga. Ne sono esempio serie come Mr. Robot e CSI Cyber, dove si sprecano citazioni e riferimenti più o meno veritieri.

In questo articolo non prenderemo in analisi come ci possiamo collegare al dark-web, che cos’è Tor, quali sono le configurazioni corrette e cosa è possibile fare, ma piuttosto vedremo cosa c’è oltre questo famoso tunnel oscuro, quali informazioni possiamo trovare e come, e soprattutto se è un luogo veramente oscuro come viene descritto.

Se non siete pratici con il software Tor, rimando ad infiniti articoli presenti in rete, altrimenti ci dilunghiamo troppo ;-), ad esempio potete consultare uno dei seguenti link per approfondire l’argomento:

Detto ciò, passiamo subito all’azione, e colleghiamoci a Tor usando il relativo browser integrato. Bastano pochi secondi per stabilire la connessione, et voilà, siamo già all’interno del tunnel e ci viene dato anche il benvenuto!

Dunque, tutto carino per ora, tutto figo, ok, ma adesso cosa possiamo fare? Che cosa posso trovare davvero nel dark-web e come? Dove andiamo? Queste infatti sono le domande cruciali che tipicamente si pone chi per la prima volta si affaccia a questo nuovo mondo, perché a differenza del web classico, qui le informazioni non sono tipicamente indicizzate e la difficoltà più grande è riuscire a capire come muoversi. Sul web in chiaro, basta aprire la pagina di un motore di ricerca per sbizzarrirsi, e cercare tutto quello che desideriamo, ma qui è ben diverso.

Prima di iniziare ricordo che tutti i siti/servizi all’interno del dark-web riportano l’estensione .onion, a differenza delle canoniche it, com, …, del web classico. Ricordiamoci sempre che questi servizi (.onion appunto) non saranno visibili dal web classico (con qualche eccezione che poi vedremo :-)), mentre al contrario dall’interno di Tor sarà sempre possibile accedere al web classico.

Un buon punto di inizio all’interno della rete Tor sono i seguenti servizi (i link sono tutti attivi nel momento della stesura dell’articolo, ma cercherò di mantenere aggiornata la lista):

Passando alla pratica, prendiamo uno tra i più grandi black market, traderoute, e colleghiamoci al sito dopo esserci registrati. Facciamo attenzione che praticamente ogni black market, così come moltissimi altri servizi su Tor (forum, …), richiede una registrazione, la quale è spesso articolata in più fasi: la scelta di una password e/o di un PIN, captcha, fino ad arrivare alla richiesta di presentazione da parte di uno dei membri già attivi del servizio (in genere per siti contenenti materiale illegale, o forum di hacking). In questo modo, viene concesso l’accesso ad un servizio solo ad un utente realmente interessato a quell’argomento, o che ha dimostrato di avere un amico nella community (appunto forum).

Una volta collegati a traderoute, possiamo vedere la schermata del market, come fossimo tranquillamente su amazon o su ebay, e ogni oggetto in vendita ha associato un relativo venditore con tanto di feedback degli altri acquirenti.

Come possiamo vedere, la maggior parte del materiale è illegale, ad esempio possiamo acquistare account falsi o rubati, che con pochi euro ci restituiscono credenziali di accesso a servizi ben più costosi (es. Netflix):

Sul dark-web ogni forma di acquisto e pagamento viene fatta tramite monete virtuali (bitcoin, etherum, …) che permettono di mantenere la transazione completamente anonima.

Oltre ai black market, possiamo trovare “servizi” professionali di vario tipo, e di dubbia legalità, come ad esempio servizio hacking:

Una nota importante, e da non dimenticarsi mai, è che sul dark-web le frodi sono all’ordine del giorno, e sono molto più frequenti che sul web in chiaro, dunque dobbiamo prestare la massima attenzione a qualunque cosa facciamo. La motivazione è semplice: il grado di anonimità è tale che frodi e inganni di piccola entità resteranno con buona probabilità impuniti, e questo permette il dilagare di piccoli hacker in erba. Il motto “fidarsi è bene, ma non fidarsi è meglio” è più che azzeccato in questo caso :-).

Oltre a quello che abbiamo appena visto, non è troppo difficile reperire materiale che dovrebbe senza ombra di dubbio essere censurato, di tutto e di più. Se sul web classico padroneggia la pornografia, con numeri da capogiro in quanto a guadagni, sul dark-web troviamo la sua controparte del lato oscuro, la pedo-pornografia. A quest’ultima si affiancano siti, foto, e video di violenze, di gruppi estremisti, e tutto ciò che non può trovare posto sul web in chiaro. Cambiate canale prima di finire su pagine che “voi umani non potreste nemmeno immaginare”!

Volete un piccolo assaggio che posso pubblicare qui? Eccolo, un semplice forum Q&A, dove viene chiesto come potersi suicidare, con risposte serie e precise, come se si parlasse di argomenti scientifici e assolutamente normali. Da restare senza parole…

In definitiva cosa offre il dark-web e cosa non offre? Vediamo di trarre le nostre conclusioni:

  • per l’utente alle prime armi: niente, tranne la curiosità iniziale. Se sei in questa categoria, fatti pure un giro nel “tunnel” ma poi chiudi tutto e dimenticati della sua esistenza. Potresti finire in siti veramente pericolosi, o che non avresti voluto vedere. Potresti perdere il sonno per giorni, o potresti molto più facilmente perdere soldi con la speranza di fare qualche affare.
  • per l’utente medio: puoi trovare qualcosa di interessante, ma devi imparare a conoscere bene tutta la rete, come funzionano le criptovalute (Bitcoin, …), e come/dove è possibile fare qualche affare. Serve tempo da dedicarci, e voglia.
  • per l’utente esperto: avrai già voltato pagina e chiuso l’articolo, perché saprai già dove reperire le informazioni, e come muoverti. Sai già cosa cerchi ;-).

In definitiva, non usate Tor, a meno che non vi troviate in nazioni dove la libertà di navigazione è bloccata, e dove il dark-web può costituire non una rete dove reperire materiale illegale, ma una nuova frontiera per poter accedere al web classico, altrimenti bloccato senza l’uso di strumenti come Tor.

Il mio punto di vista…

roghan

[Articolo] La guida definitiva per verificare se un server Linux è stato violato e metterlo in sicurezza

Sospettiamo che il nostro server Linux sia stato violato? Abbiamo notato processi o attività strane? Vediamo in questo primo articolo come identificare un server Linux che è stato compromesso, e come cercare di ripristinare la situazione e chiudere fuori gli intrusi.

Difficoltà articolo (0->10): 8

Requisiti: conoscenza intermedia della shell di Linux, e hardening di un sistema.

Sospettiamo che il nostro server Linux sia stato violato? Abbiamo notato processi o attività strane? Vediamo in questo primo articolo come identificare un server Linux che è stato compromesso, e come cercare di ripristinare la situazione e chiudere fuori gli intrusi.

Partiamo dal presupposto che ad essere esposti a questo problema sono soprattutto i server che pubblicano servizi e applicazioni all’esterno (server web, ftp, …), e ancora più presi di mira sono i server messi a disposizioni dai principali provider del settore (Aruba, Register, OVH, …). I server di questi provider sono infatti presi di mira in modo massivo, e quotidianamente sono soggetti a tentativi di attacco su tutti i servizi e porte standard (ssh, http, …). Il motivo è semplice: ogni provider ha a disposizione determinati range di IP, dunque per un attaccante, chiunque esso sia (persona fisica o bot) è sufficiente eseguire degli scan e attacchi su questi range selezionati. Ad esempio, questi sono alcuni range che appartengono al noto OVH:

  • 142.4.192.0/19
  • 149.56.0.0/16
  • 158.69.0.0/16

Inoltre, preciso che buona norma per un server compromesso, sarebbe quello di radere tutto al suolo, reinstallato da zero sistema operativo e servizi. Questa pratica non è tuttavia sempre praticabile, poiché spesso sul server sono eseguiti applicativi fondamentali aziendali o per clienti, e la prima soluzione è invece quella di cercare di ripristinare il sistema ad uno stato consistente e sicuro.

Dunque, veniamo in dettaglio ai controlli da effettuare su un server che ipotizziamo essere stato compromesso.


1. Servizi in ascolto e porte aperte

Controlliamo i servizi attivi e le porte sui quali sono in ascolto:

# netstat -tulpn
# ss -nap

Devono indurre sospetto servizi in ascolto su porte non standard e soprattutto porte alte, tipicamente dalla 40000 in su, ad esempio:

# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
[...]
tcp 0 0 100.100.100.100:51553 0.0.0.0:* LISTEN 410/theerhd
[...]

Per controllare che non ci siano eventuali servizi nascosti usare poi il seguente tool:

# unhide-tcp
Unhide-tcp 20121229
Copyright © 2012 Yago Jesus & Patrick Gouin
License GPLv3+ : GNU GPL version 3 or later
http://www.unhide-forensics.info
Used options: use_fuser
[*]Starting TCP checking
[*]Starting UDP checking

Nel caso sopra, l’output è normale, nel senso che non sono stati rilevati servizi nascosti in ascolto, quindi possiamo stare tranquilli.


2. Processi attivi

Controlliamo tutti i processi in esecuzione:

# ps -ef

e l’albero dei processi attivi con relativi pid:

# pstree -pa

Il comando seguente, come nel punto precedente, può rilevare eventuali processi malevoli nascosti:

# unhide proc
# unhide sys
# unhide brute

Devono indurre sospetto eventuali processi con nomi strani (thweih43, lpevntw, 6oetheq, …), processi di cui non riconosciamo l’origine, o processi nascosti, come:

# unhide sys
[...]
Found HIDDEN PID: 256 Wchan: "[34ljyjil]"

3. Scansioni alla ricerca di malware

Installiamo il software rkhunter, per trovare eventuali trojan o malware in esecuzione.

Possiamo trovare una guida completa e ben fatta a questo link, perché la spiegazione di utilizzo del tool richiederebbe un intero articolo…


4. Ultimi accessi al sistema e utenti collegati

Facciamo un controllo sugli ultimi utenti che si sono collegati al sistema:

# last

e quali sono gli utenti attualmente collegati:

# who

Ovviamente, in questo caso dovrebbero far pensare eventuali connessioni di utenti non riconosciuti, oppure connessioni che sappiamo per certo non essere state fatte da noi.


5. Utenti attivi nel sistema

Controlliamo tutti gli utenti definiti all’interno del sistema:

# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
admin:x:1000:1000:,,,:/home/admin/:/bin/bash
[...]

Indice di sospetto dovrebbe essere la presenza di utenti nuovi non noti, o con nomi sospetti (come ad esempio l’utente admin nell’output precedente). Facciamo attenzione però, perché l’output del comando precedente può essere più o meno lungo, e può contenere anche molti utenti che potrebbero destare sospetti ma che in realtà sono utenti di sistema! Tipicamente, gli ultimi utenti ad essere stati creati sono aggiunti alla fine del file, quindi dobbiamo concentrarci su quelli.


6. Ultimi reboot del sistema

Controlliamo da quanto tempo è in esecuzione il server:

# uptime
 15:47:02 up 143 days, 12:07, 1 user, load average: 0,00, 0,00, 0,00

quando è stato fatto l’ultimo reboot:

# who -b
 system boot 2016-12-15 02:40

e il momento esatto di tutti gli ultimi reboot:

# last reboot
reboot system boot 2.6.15.4 Sun Apr 30 15:08 - 16:22 (01:13)
[...]

7. File modificati recentemente

Verifichiamo quali file sono stati modificati negli ultimi giorni (7-10 giorni):

find / -mtime -7

Facciamo attenzione che l’output del comando seguente potrebbe essere lungo e potrebbe impiegare tempo a essere visualizzato interamente. Eventualmente possiamo diminuire il numero di giorni, se si sospetta che l’attacco sia stato fatto da pochi giorni.


8. Analisi dei file di log

Esaminiamo i principali file di log (come sempre importantissimi), e in particolare i messaggi del kernel:

# dmesg

e gli ultimi log di sistema:

# cat /var/log/syslog

Controlliamo gli accessi falliti su SSH, soprattutto nel caso in cui il server sia esposto direttamente su Internet, verificando il file /var/log/auth.log in Debian e derivate, e /var/log/secure in Red Hat e derivate.

(Debian e derivate)
# cat /var/log/auth.log

(Red Hat e derivate)
# cat /var/log/secure

Potrebbe essere importante esaminare anche i log di eventuali servizi in ascolto, qualora presenti, tipo quelli dei server web (/var/log/apache/error.log e /var/log/apache/access.log per Apache, …).


9. Tool di auditing

Lanciamo un tool completo di auditing, come sysdig, seguendo le istruzioni di una delle seguenti guide:


10. Dump della memoria e analisi approfondita del sistema

Qualora nei punti precedenti avessimo rilevato la presenza reale di una minaccia, o di qualche intrusione, è bene approfondire l’analisi con tool specifici, come ad esempio volatility.

Possiamo trovare una guida ben fatta al seguente link:


11. Controllare cron e crontab

E’ importante controllare che non siano presenti script o comandi non noti schedulati all’interno del sistema tramite il servizio crond. Pertanto, è necessario verificare sia il file crontab, per tutti gli utenti di sistema, non solo per root, con il seguente comando:

# crontab -l

Il comando mostrerà eventuali comandi o script schedulati a giorni oppure ore particolari. Prestare dunque attenzione alla presenza di tutto ciò che non abbiamo apertamente configurato.

Analogamente, sarà necessario controllare all’interno di tutti gli altri percorsi usati dal demone crond, tra cui:

  • /etc/cron.d
  • /etc/cron.daily
  • /etc/cron.weekly
  • /etc/cron.monthly
  • /etc/cron.hourly

roghan

[aggiornamento 16/09/2020]

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

[News] CVE-2015-0235 – esecuzione di codice remoto con glibc in Linux

Difficoltà articolo (0->10): 6

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.

roghan

GPG parte 1 – Generare una chiave

In questo articolo verrà presentato il software GPG/PGP, verrà spiegato come generare una chiave in un ambiente Linux e come registrarla su un key server. Questo è la prima parte di una serie di articoli che spiegano il funzionamento di GPG.

Parte 2: Criptare e decriptare un messaggio con GPG

Parte 3: Importare/esportare chiavi in GPG

Innanzitutto GPG è un software che implementa lo standard OpenPGP, e dunque utilizza un sistema di crittografia a chiave pubblica, anche detta crittografia asimmetrica. E’ possibile trovare una spiegazione dettagliata della crittografia asimmetrica su wikipedia:

http://it.wikipedia.org/wiki/Crittografia_asimmetrica

Fondamentalmente con questa tipologia di algoritmi entrambe le persone coinvolte nella comunicazione devono disporre di 2 chiavi, una pubblica e una privata. La chiave pubblica, come dice il nome, deve essere distribuita pubblicamente, mentre deve restare assolutamente segreta la chiave privata. Lo schema di funzionamento di un algoritmo asimmetrico è quello mostrato nella figura seguente.

Crittografia_asimmetrica_schema
Funzionamento di un algoritmo di crittografia asimmetrica.

GPG inoltre permette anche di firmare i messaggi, e il funzionamento può essere visto nella figura sotto.

digitalsignatures
Funzionamento di firma digitale unita alla cifratura del messaggio.

Dunque per poter inviare un messaggio questo deve essere firmato con la propria chiave privata e criptato con la chiave pubblica del destinatario. In generale, per poter usare correttamente GPG dobbiamo tenere sempre a mente questi schemi, altrimenti presto o tardi probabilmente faremo confusione con le chiavi.

Dopo aver installato il software nella propria distribuzione e aver visto come funziona un algoritmo di cifratura asimmetrico, è possibile passare alla creazione della chiave.

Generare una chiave GPG

Da shell dobbiamo digitare:

# gpg --gen-key

Dunque ci viene richiesto quale algoritmo di cifratura deve essere usato per la generazione della chiave:

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1

Possiamo scegliere tranquillamente l’opzione default.

Poi ci viene richiesta la dimensione della chiave:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

Direi che la dimensione base (2048) è più che sufficiente.

Poi ci viene richiesto il periodo di validità della chiave:

Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

In questo caso se la chiave verrà usata per lo scambio di informazioni personali, possiamo tranquillamente non farla scadere mai, mentre se verrà usata per lo scambio di informazioni sensibili e/o professionali allora è bene impostare un intervallo temporale adeguato (1 anno, 6 mesi, 1 mese, …).

Poi sono richieste alcune informazioni personali:

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

—————————————
Real name: Paolino Paperino
Email address: paolino.paperino@paperopoli.com
Comment: My GPG key

quindi ci viene mostrato il riepilogo con le informazioni immesse:

You selected this USER-ID:
"Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

Se i dati inseriti sono corretti possiamo digitare “O” per proseguire.

Adesso ci verrà richiesta la passphrase, che dovrà essere sufficientemente robusta:

You need a Passphrase to protect your secret key.
Enter passphrase:

E’ importante, anzi fondamentale, scegliere la passphrase attentamente, perché da essa dipende la sicurezza della chiave GPG! Nel caso in cui dovessimo dimenticarcela non potremo più leggere/inviare messaggi cifrati, mentre se dovesse essere crackata lo scambio di testi cifrati con GPG non sarebbe più sicuro.

Dunque verrà generata la chiave GPG unica:

gpg: key 257BAFD8 marked as ultimately trusted
public and secret key created and signed.

————————————–
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u

————————————–
pub 2048R/257BAFD8 2012-09-05
Key fingerprint = A197 6014 A02F 6AFD 4007 5C02 FCB1 2276 257B AFD8
uid Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>
sub 2048R/D156C60B 2012-09-05

Controllare la chiave

Dopo aver generato una nuova chiave, è buona cosa controllarne i dati:

# gpg --list-key
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/257BAFD8 2012-09-05
uid Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>
sub 2048R/D156C60B 2012-09-05

dove possiamo vedere i dati fondamentali:

  • Key ID: 257BAFD8
  • Real Name: Paolino Paperino
  • E-mail: paolino.paperino@paperopoli.com
  • Expiration date: 2012-09-05

Generare una chiave pubblica

Il prossimo step è quello di salvare la chiave pubblica GPG per poi poterla inviare ad amici o colleghi, in modo che loro possano inviarci messaggi cifrati. Per esportare la chiave pubblica in un file la sintassi da usare è la seguente:

# gpg --armor --output GPG_public_key --export Real Name

oppure

# gpg --armor --output GPG_public_key --export E-mail

oppure

# gpg --armor --output GPG_public_key --export Key ID

E’ da notare che il risultato dei 3 comandi precedenti è identico.

Nel nostro esempio i comandi precedenti diventeranno:

# gpg --armor --output GPG_public_key --export Paolino Paperino
# gpg --armor --output GPG_public_key --export paolino.paperino@paperopoli.com
# gpg --armor --output GPG_public_key --export 257BAFD8

Inviare la chiave ad un key server

Infine, l’ultimo passo (facoltativo) è di inviare la chiave pubblica ad un key server, un server che raccoglie le chiavi pubbliche. Inserendo la chiave in un key server, chiunque voglia inviarci un messaggio cifrato non avrà il bisogno di chiedere a noi la chiave, ma potrà semplicemente cercarla sul server. Il comando da eseguire è questo:

# gpg --send-keys --keyserver url_server Key ID

Per il nostro esempio abbiamo:

# gpg --send-keys --keyserver hkp://subkeys.pgp.net 257BAFD8

Le altre parti sono disponibili a questi link:

Parte 2: Criptare e decriptare un messaggio con GPG

Parte 3: Importare/esportare chiavi in GPG

roghan

Proteggere le applicazioni dall’uso non autorizzato in Java

Oggi affrontiamo il problema che sorge dopo aver sviluppato un’applicazione e nel momento in cui questa deve essere distribuita. Il problema è tanto più sentito quando l’applicazione è a pagamento, e magari deve essere venduta a clienti. E’ lecito aspettarsi che il programmatore voglia proteggere il suo lavoro, o almeno cercare di scoraggiare potenziali abusi e malintenzionati. Vediamo in questo articolo quali sono le azioni da intraprendere per proteggere la nostra applicazione, supponendo che questa sia stata sviluppata con il linguaggio Java. […]

Oggi affrontiamo il problema che sorge dopo aver sviluppato un’applicazione e nel momento in cui questa deve essere distribuita. Il problema è tanto più sentito quando l’applicazione è a pagamento, e magari deve essere venduta a clienti. E’ lecito aspettarsi che il programmatore voglia proteggere il suo lavoro, o almeno cercare di scoraggiare potenziali abusi e malintenzionati. Vediamo in questo articolo quali sono le azioni da intraprendere per proteggere la nostra applicazione, supponendo che questa sia stata sviluppata con il linguaggio Java.

Le operazioni da eseguire sono le seguenti:

  1. proteggere il codice in modo tale che non possa essere modificato o letto da persone non autorizzate (software chiuso);
  2. evitare che il software venga distribuito a chiunque;
  3. permettere di usare il software in versione demo/trial, e bloccarne eventualmente il funzionamento dopo n giorni.

In generale oggi esistono svariate tecniche più o meno efficaci per proteggere un’applicazione, e queste possono essere generalizzate in 2 categorie: le protezioni più sicure (siamo sicuri che siano le più sicure?!) che possono essere costose in termini di soldi e di tempo per implementarle, o le protezioni più deboli ma spesso di più semplice utilizzo e a basso costo. Il mio consiglio è di optare per la seconda categoria, perché tanto non esiste una protezione sicura al 100% e qualunque venga adottata presto o tardi finirà probabilmente per essere crackkata. Consiglio di scegliere una tecnica di protezione elevata solamente nel caso in cui l’applicazione sviluppata sia di notevoli dimensioni e laddove la quantità di soldi investiti sia stata ingente.

Analizziamo dettagliatamente i 3 punti precedenti, per studiare le tecniche in grado di proteggere un’applicazione.

1. Bloccare lettura/modifica del codice. Per impedire a qualcuno la lettura e la modifica del codice, e dunque di un file, è possibile agire solamente tramite i permessi all’interno di un sistema operativo. Su Linux ad esempio possiamo agire tramite gli sticky bit, assegnando ai vari utenti/gruppi i permessi che riteniamo più adeguati. Questo però non ci aiuta se l’applicazione è distribuita a persone (ad esempio tramite Internet) delle quali non possiamo gestire i sistemi locali.
A questo punto dobbiamo agire diversamente per rendere difficile la vita a chi vuole leggere il  codice e magari appropriarsi degli algoritmi usati. Dal momento che la nostra applicazione è sviluppata in Java, ciò che dobbiamo proteggere sono le classi prodotte dal processo di compilazione (il codice sorgente può semplicemente essere omesso nel software finale, in quando non è necessario). La soluzione in questo caso è di usare un offuscatore di codice, ossia un particolare software che agisce sulle classi compilate, modificandole in modo tale da renderne ardua la lettura in caso di reverse engineering. Per fare ciò un buon software free e aggiornato è ProGuard 4.8 (ultima versione in questo momento):

http://proguard.sourceforge.net/

e qui c’è una guida ben fatta su come utilizzarlo:

http://dellabate.wordpress.com/2010/11/22/java-bytecode-obfuscator-con-proguard/

Offuscatori di codice alternativi a ProGuard sono reperibili in questa lista:

http://proguard.sourceforge.net/alternatives.html

Nella lista precedente io escluderei i software un po’ datati, mentre consiglio yGuard o JBCO.

2. Bloccare la distribuzione non autorizzata del software. In questo caso la soluzione ideale è di utilizzare un sistema di licenziamento del tipo “per installare o avviare il programma deve essere inserita la chiave corretta”, come avviene per i software commerciali più noti (ad esempio Office o Windows stesso). Una possibilità è quella di usare il software TrueLicense:

http://truelicense.java.net/

Sul sito ufficiale potete trovare ampia documentazione in modo da usare correttamente il software e le licenze.

Qui c’è una lettura interessante su come proteggere un’applicazione Java facendo uso di chiavi/licenze:

http://stackoverflow.com/questions/10896596/protect-java-application-by-licence-or-key

Avendo un po’ di tempo a disposizione, potrebbe valere la pena implementare un proprio algoritmo per la generazione di una chiave. Ad esempio, una chiave univoca potrebbe essere generata a partire dall’indirizzo MAC della scheda di rete, essendo l’indirizzo stessa per sua natura univoco (a meno di manomissioni hardware). Di semplice utilizzo sono anche le funzioni hash, come SHA1, sufficientemente robuste, e possono essere sufficienti per le applicazioni più piccole.

3. Versione trial del software. Un’altra tecnica, che può essere usata per proteggere un’applicazione, è quella di crearne una versione demo/trial, o alternativamente di permetterne l’utilizzo solo per un periodo di prova limitato (10 giorni, 30, …).

Il software TrueLicense visto al punto precedente permette di creare anche licenze temporanee, che sono dunque valide per un periodo limitato di tempo, oltre il quale il software non può più essere adoperato. Per questa funzionalità potete vedere la documentazione ufficiale:

http://truelicense.java.net/tutorial.html#Using_the_Free_Trial_Period_FTP_Package

Al seguente link viene suggerita una soluzione “manuale” che permette di creare un’applicazione in versione trial:

http://stackoverflow.com/questions/2021088/implementing-a-30-day-time-trial/2022237#2022237

Buon codice a tutti ;-)…

Matteo

GPG parte 3 – Importare/esportare chiavi

Ho in mente di scrivere una serie di articoli sul funzionamento di GPG (GNU Privacy Guard), per poi raccoglierli all’interno di una guida (magari anche in inglese). Sul web si trovano facilmente guide e howto su GPG e su come usarlo da shell, ma ho la necessità di creare la mia propria documentazione, da usare come punto di riferimento anche in futuro.

Per ora vediamo come fare il backup e il ripristino di una chiave GPG . Tale necessità può esserci se vogliamo usare GPG su sistemi diversi usando ovviamente le stesse chiavi di cifratura, come ad esempio se cifriamo un messaggio con il pc dell’ufficio e dobbiamo decifrarlo con il pc di casa. […]

Ho in mente di scrivere una serie di articoli sul funzionamento di GPG (GNU Privacy Guard), per poi raccoglierli all’interno di una guida (magari anche in inglese). Sul web si trovano facilmente guide e howto su GPG e su come usarlo da shell, ma ho la necessità di creare la mia propria documentazione, da usare come punto di riferimento anche in futuro.

Per ora vediamo come fare il backup e il ripristino di una chiave GPG . Tale necessità può esserci se vogliamo usare GPG su sistemi diversi usando ovviamente le stesse chiavi di cifratura, come ad esempio se cifriamo un messaggio con il pc dell’ufficio e dobbiamo decifrarlo con il pc di casa.

Backup/esportazione di una chiave GPG

Per prima cosa controlliamo le chiavi installate all’interno del sistema:

# gpg --list-keys
/root/.gnupg/pubring.gpg
-------------------------------
pub 2048R/9F508959 2012-07-03
uid Paolino Paperino <paolino.paperino@paperopoli.com>
sub 2048R/2C98FA15 2012-07-03
-------------------------------
pub 2048R/AB2C995F 2012-07-03
uid Zio Paperone <zio.paperone@paperopoli.com>
sub 2048R/D643E356 2012-07-03

Dunque dobbiamo scegliere la chiave di cui vogliamo fare il backup, per poi fare la copia della chiave pubblica e di quella privata. Nell’esempio le chiavi installate sono due: 9F508959 e DC2C775F. Per fare la copia rispettivamente della chiave pubblica e di quella privata la sintassi è la seguente (per maggior chiarezza userò i nomi completi delle opzioni, almeno dove possibile):

# gpg --armor --output <filename> --export <keyname>
# gpg --armor --output <filename> --export-secret-keys <keyname>

L’opzione armor permette di creare un output in caratteri ASCII, simile a questo

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)mQENBE/1likBCACUfcgaiMfznrEQKXV4x0rPpixqEW+m8vXBF5I2BPuzeKUrB9Ot
YZhuZujuheLjj+Quh5rBFntGoPW3rO430Voq5/PJew54P5Smx6K09paB6pGbzmgk
...
INmtEZwlEvYMrINVOKbKXRk=
=8NiR
-----END PGP PUBLIC KEY BLOCK-----

Se l’opzione armor viene invece omessa, l’output prodotto sarà binario.

Supponendo di voler fare il backup della chiave 9F508959 dell’esempio, i comandi sono:

# gpg --armor --output GPG_public_key --export 9F508959
# gpg --armor --output GPG_secret_key --export-secret-keys 9F508959

Infine, per completare la fase di backup è consigliabile generare anche una chiave di revoca con questo comando:

# gpg --output <filename> --gen-revoke <keyname>

Nel caso dell’esempio, il comando precedente diventerebbe:

# gpg --output GPG_revoke_key --gen-revoke 9F508959

Dopo che le chiavi sono state salvate memorizziamo i relativi file in un supporto sicuro, e possibilmente mobile (CD, DVD, …) anziché all’interno dello stesso sistema in cui è installato GPG!

Ripristino/importazione di una chiave GPG

Se vogliamo ripristinare una chiave GPG, o ad esempio importarla su un nuovo sistema (dal pc dell’ufficio a quello di casa), il comando è il seguente:

# gpg --import <filename>

dove <filename> rappresenta il file contenente la chiave (pubblica o privata) precedentemente esportata. Riprendendo l’esempio precedente, i comandi necessari per importare le chiavi sono questi:

# gpg --import GPG_public_key
# gpg --import GPG_secret_key

roghan

[Articolo] Nella tua rete Tor è bloccato? Bypassiamo il blocco!

Vediamo oggi come usare Tor in presenza di sistemi/reti/ISP che ne bloccano il suo funzionamento.

Difficoltà articolo (0->10): 5

Vediamo oggi come usare Tor in presenza di sistemi/reti/ISP che ne bloccano il suo funzionamento. Innanzitutto Tor è un software appartenente alla categoria PET (Privacy Enhaced Technology), che permette di navigare in modo anonimo sul web e di “anonimizzare” una grande quantità di servizi distribuiti (chat, torrent, …).
Il suo utilizzo principale è quello di permettere la consultazione di pagine web e la fruizione di Internet senza vincoli in quei luoghi in cui sono in vigore restrizioni politiche o censure di vario genere. Tuttavia, Tor viene usato piuttosto comunemente anche per bypassare le restrizioni aziendali e poter così navigare su siti “proibiti” perché bloccati dal proxy e/o firewall aziendale. Non è raro, purtroppo, che venga usato esclusivamente per navigare su Facebook o su altri social network durante l’orario di lavoro. Per carità, Tor può essere usato anche per navigare su Facebook, ma i suoi intenti sono ben più nobili!

In ogni caso molte aziende, enti, e organizzazioni, stanno cercando da tempo meccanismi per intercettare e bloccare l’utilizzo di Tor, configurando ACL sui firewall e filtri sui proxy. Inoltre, in alcuni casi ad essere bloccato è anche l’accesso al sito di Tor, in modo da impedire il download del software e la ricerca di documentazione. Bloccare la connessione alla rete Tor non è impossibile, perché viene resa pubblica una lista dei nodi della rete Tor, aggiornata costantemente. La lista è reperibile a questi link:

Tale lista potrebbe essere usata per configurare un proxy (squid ad esempio) in modo da bloccare tutte le connessioni uscenti dirette ad uno degli IP delle lista. Il risultato di un tale blocco (vedere lo screenshot sotto) è che l’utente con il client Tor sarà impossibilitato a collegarsi alla rete Tor, e pertanto al resto della Rete.

tor_blocked
Tor bloccato dalla rete/ISP

Veniamo adesso al reale argomento del post :-): come possiamo fare se la nostra rete/ISP blocca la connessione a Tor? Quello che possiamo fare è ricorrere ad alcune contromisure in grado di bypassare il blocco imposto, garantendo anonimato e privacy, e accesso a tutte le funzionalità di Tor. Può capitare anche che venga bloccata la visualizzazione del sito del progetto Tor, ma in questo caso è possibile facilmente usare un proxy web gratuito per poter visitare il sito (esempi di proxy gratuiti sono www.hidemyass.com e zendproxy.com).

Dunque, se non ci è possibile usare Tor poiché la connessione si blocca dopo aver avviato il software, è possibile agire in 2 modi:

  1. usare obfsproxy;
  2. agire sulla configurazione di Tor.

OPZIONE 1 

Per la prima opzione, è necessario scaricare il software obfsproxy al seguente link:

obfsproxy è un software basato su Tor (è praticamente Tor a tutti gli effetti), ma in via sperimentale e con i bundle al momento non più aggiornati. Il software permette di mascherare i pacchetti inviati alla rete Tor, facendoli sembrare pacchetti “innocenti” (ad esempio semplice pacchetti HTTP) come è visibile in figura.

obfsproxy_diagram
Diagramma di funzionamento di obfsproxy

L’interfaccia e l’utilizzo di obfsproxy sono gli stessi di Tor, mentre a cambiare è la configurazione del software, come si vede in figura.

tor_obfsproxy
obfsproxy

OPZIONE 2 

In questo caso non sono necessari software aggiuntivi ma dobbiamo agire su alcuni parametri di Tor per poter aggirare i blocchi imposti da rete/ISP. I parametri da configurare sono modificabili direttamente dall’interfaccia Vidalia, e si trovano in Settings->Network come visibile in figura.

tor_settings_network
Parametri configurabili di Tor per aggirare i blocchi

Fra questi, il metodo più efficace e affidabile è quello di usare un bridge Tor, ossia la terza possibilità “My ISP blocks connections to the Tor network”. Vediamo comunque in dettaglio le 3 possibilità.

Opzione – “My ISP blocks connections to the Tor network”

Con questa opzione possono essere configurati i bridge Tor. Un bridge Tor è fondamentalmente un nodo della rete Tor che agisce da ponte (similmente a un proxy) per il collegamento tra client/utente e rete Tor. I bridge hanno la particolarità di non essere elencati nelle liste pubbliche di nodi Tor (come visto precedentemente), e pertanto difficilmente saranno rilevati e bloccati dagli amministratori di rete. Per conoscere i bridge disponibili in ogni momento, dobbiamo visitare il seguente link:

Dopo aver trovato i bridge Tor disponibili, è necessario configurarli in Setting->Network, come visibile nella figura seguente.

Add_bridge_to_Tor
Aggiunta di un bridge Tor.

In alternativa, è possibile creare un proprio bridge privato, se abbiamo a disposizione un server o un pc con connessione flat (ad esempio nella propria abitazione), e collegarsi ad esso quando siamo fuori e in una rete in cui Tor è bloccato. Per creare un bridge privato è sufficiente avviare Tor sulla macchina che fungerà da bridge, e selezionare in Settings->Sharing la voce “Help censored users reach the Tor network“, come visibile in figura.

Tor_setting_bridge
Configurazione di un bridge Tor privato.

Opzione – “I use a proxy to access the Internet”

Nel caso in cui la propria rete o il proprio ISP blocchi anche i bridge Tor, è possibile ricorrere all’uso di un proxy. Tramite un proxy i pacchetti uscenti dal proprio sistema, e quindi dal client Tor, sono indirizzati al proxy stesso e non alla rete Tor, e in questo modo viene oltrepassato il blocco imposto dalla rete/ISP. Nella figura sottostante è mostrato il collegamento attraverso un proxy.

tor.e.proxy.visio
Connessione a Tor attraverso un proxy.

Per questa soluzione il punto cruciale è la scelta di un proxy adeguato, che dovrà essere sicuro e affidabile, e supportare inoltre sia il protocollo HTTP che il quello HTTPS. Per ricercare un proxy possiamo usare questa lista (oppure cercare altre liste di proxy semplicemente con google), controllando che il proxy supporti HTTPS, sia di tipo anonymous, e abbia una buona affidabilità. Dopo aver scelto un proxy, dobbiamo controllare che sia attivo e supporti realmente sia HTTP che HTTPS. Quindi configuriamo Tor con le impostazioni del proxy, come visibile nella figura sotto.

Tor_setting_proxy
Configurazione di un proxy in Tor.

Per configurare il proxy sono necessari:

  1. indirizzo IP o hostname del proxy;
  2. porta utilizzata dal proxy;
  3. eventuali username/password se il proxy richiede l’autenticazione.

Questa soluzione è più tediosa rispetto all’utilizzo di un bridge, poiché i proxy open non offrono solitamente grandi garanzie e spesso le performance non sono eccelse. Difatti un proxy potrebbe non essere più attivo nel giro di poche ore o giorni, costringendoci a cercarne e configurarne un altro.

Opzione – “My firewall only lets me connect to certain ports”

L’ultima opzione configurabile deve essere utilizzata solo quando abbiamo la certezza che il firewall della nostra rete blocchi verso l’esterno alcune porte (in genere ad essere bloccate solo le porte esterno per connessioni verso l’interno). In questo caso è possibile selezionare la voce e specificare le porte che sono aperte sul firewall. La connessione alla rete Tor passerà dunque per le porte specificate.

Riepilogando, in questa piccola guida abbiamo visto come sia possibile usare Tor praticamente in ogni situazione, anche quando sono stati creati filtri ad hoc dagli amministratori/provider nel vano tentativo di limitare la libertà e la privacy personale.

“Per ogni blocco esiste sempre una contromisura, basta trovarla o idearla!”

roghan

Script per modificare MAC address in Linux

Ho scritto uno script bash che permette in Linux di manipolare l’indirizzo MAC di una scheda di rete, la cui operazione in gergo viene detta spoofing. Lo script può essere usato su tutte le principali distribuzioni e permette di cambiare l’indirizzo MAC con uno generato casualmente oppure con uno indicato dall’utente. Le istruzioni per eseguire lo script sono le seguenti: […]

Ho scritto uno script bash che permette in Linux di manipolare l’indirizzo MAC di una scheda di rete, la cui operazione in gergo viene detta spoofing. Lo script può essere usato su tutte le principali distribuzioni e permette di cambiare l’indirizzo MAC con uno generato casualmente oppure con uno indicato dall’utente. Le istruzioni per eseguire lo script sono le seguenti:

Usage: macs.sh [OPTIONS]
Spoof your wired or wireless network adapter with a new MAC address.
Options:
-r <interface>: spoof an interface with a random MAC address
-s <interface> <address>: spoof an interface with a new MAC address
-o <interface>: restore an interface with the original MAC address
-v <interface>: show the MAC address and the vendor of an interface
-p <vendor>: show the MAC prefix of a vendor
-a: show the MAC address of every network interface
-h: show this help

—————————————————————-
Examples:
sh macs.sh -r eth0
sh macs.sh -s wlan1 001122334455
sh macs.sh -s eth3 00:1C:39:FB:6C:88
sh macs.sh -o eth0
sh macs.sh -p IBM
sh macs.sh -p Microsoft

Tra le funzionalità vi è anche quella di visualizzare il vendor della scheda di rete, e tutti i prefissi MAC proprietari di uno specifico vendor.

Si tratta di uno script bash, dunque deve essere lanciato con l’interprete sh e con i privilegi di root. Vediamo alcuni esempi:

# sh macs.sh -r eth1 modifica l’indirizzo dell’interfaccia eth1 con uno random
# sh macs.sh -s eth1 00:0C:29:FB:6C:4B modifica l’indirizzo di eth1 con 00:0C:29:FB:6C:4B
# sh macs.sh -o eth3 ripristina l’indirizzo MAC reale di eth3
# sh macs.sh -v eth2 visualizza l’indirizzo MAC e vendor di eth2
# sh macs.sh -a visualizza gli indirizzi MAC e vendor di tutte
# sh macs.sh -p Microsoft visualizza i prefissi MAC proprietari Microsoft

Lo script è rilasciato con licenza GNU GPL v3, ed è scaricabile a questi link:

roghan

GPG parte 2 – Criptare e decriptare un messaggio

Vediamo in questo articolo come criptare e decriptare un messaggio con GPG tramite shell.

GPG è un software che implementa lo standard OpenPGP, e dunque utilizza un sistema di crittografia a chiave pubblica, anche detto crittografia asimmetrica. E’ possibile trovare una spiegazione dettagliata della crittografia asimmetrica su wikipedia:

http://it.wikipedia.org/wiki/Crittografia_asimmetrica

Fondamentalmente con questa tipologia di algoritmi entrambe le persone coinvolte nella comunicazione devono disporre di 2 chiavi, una pubblica e una privata. La chiave pubblica, come dice il nome, deve essere distribuita pubblicamente, mentre deve restare assolutamente segreta la chiave privata. Lo schema di funzionamento di un algoritmo asimmetrico è questo […]

Vediamo in questo articolo come criptare e decriptare un messaggio con GPG tramite shell.

Se vogliamo inviare un messaggio criptato a Paolino Paperino tramite GPG, i passi da effettuare sono:

  1. chiedere a Paolino Paperino la sua chiave pubblica, o cercarla su un key server;
  2. importare la chiave pubblica di Paolino Paperino in GPG;
  3. criptare il messaggio;
  4. inviare il messaggio a Paolino Paperino.

Nel caso opposto, in cui vogliamo decriptare un messaggio ricevuto da Paolino Paperino, i passi sono:

  1. chiedere a Paolino Paperino la sua chiave pubblica, o cercarla su un key server;
  2. importare la chiave pubblica di Paolino Paperino in GPG;
  3. ricevere il messaggio da Paolino Paperino;
  4. decriptare il messaggio.

Vediamo adesso prima i passi per criptare e inviare un messaggio, e poi quelli per decriptare un messaggio.

Criptare e inviare un messaggio

1 – Ottenere la chiave pubblica di una persona

Per ottenere la chiave pubblica di qualcuno, la soluzione migliore è chiederla al diretto interessato, ad esempio tramite mail. La chiave può essere salvata/inviata come un file testuale con una forma simile alla seguente:

-----BEGIN PGP PUBLIC KEY BLOCK-----Version: GnuPG v1.4.10 (GNU/Linux)hQLNYbY1gO6GWuWNqoQsRBACBRP2QTKHM+SOQIqjqJcaGAj/ckLf8/vPseiSuzQtQqBTgHRnRu3qQhS9+rfMlnm3v3nbrJH8+qhdqZAZLklKCsyDfBeevtNRSHyKsxNUlhFlkvu7ZHr/T4OsQZT5weJ4YSsYi7JaHJaNbOu4J6R63FfwCg5kgeyY/8nQmtixlpKdCWSOQIqjqJcaGAj/ckLf8/vPs8wbA//A7JUfFBxMWAR2bEkLI90i+4ZnKBlZ0fx1NZTiISItikUOVSp+oAn24mV3xBLNYbY1gO6GWuWNqoQfDB=a9d8m30Pw—–END PGP PUBLIC KEY BLOCK—–

Alternativamente, se la persona ha pubblicato su un key server la propria chiave, è possibile recuperarla con uno di questi 3 comandi (il risultato è lo stesso):

# gpg --search-keys --keyserver hkp://server Mail_address
# gpg --search-keys --keyserver hkp://server "Person Name"
# gpg --search-keys --keyserver hkp://server key_ID

Ad esempio possiamo cercare la chiave di Paolino Paperino:

# gpg --search-keys --keyserver hkp://subkeys.pgp.net "Paolino Paperino"

————————————————————————————–
gpg: searching for "Paolino Paperino" from hkp server subkeys.pgp.net
(1) Paolino Paperino <paolino.paperino@paperopoli.com>
2048-bit RSA key, ID AC3C885F, created 2012-07-03
Keys 1-1 of 1 for "Paolino Paperino". Enter number(s), N)ext, or Q)uit >

La ricerca della chiave pubblica di una persona deve essere effettuata solo la prima volta, a meno che la persona non cambi la propria chiave.

2 – Importare la chiave pubblica

Adesso dobbiamo importare all’interno di GPG la chiave pubblica della persona. Nel caso in cui la chiave sia stata recuperata tramite un key server, è possibile importarla usando uno di questi 3 comandi (il risultato è lo stesso):

# gpg --recv-keys --keyserver hkp://server Mail_address
# gpg --recv-keys --keyserver hkp://server "Person Name"
# gpg --recv-keys --keyserver hkp://server key_ID

Se invece la chiave pubblica della persona è su un file (ad esempio inviato tramite mail), è possibile importarla con questo comando:

# gpg --import public_key.txt

In entrambi i casi, dopo aver importato la chiave è bene effettuare una verifica delle chiavi importate in GPG con il comando:

# gpg --list-keys

Tornando all’esempio, nel caso in cui vogliamo importare la chiave pubblica di Paolino Paperino che si trova nel file PaolinoPaperino_public_key.txt, i comandi sono:

# gpg --import PaolinoPaperino_public_key.txt
# gpg --list-key/home/xxx/.gnupg/pubring.gpg
-------------------------------
pub 2048R/AC3C885F 2012-07-03
uid Paolino Paperino <paolino.paperino@paperopoli.com>
sub 2048R/C624E359 2012-07-03

oppure, se la chiave è presente su un key server usiamo il comando:

# gpg --recv-keys --keyserver hkp://subkeys.pgp.net "Paolino Paperino"

Come il passo precedente, anche questo deve essere effettuato solo la prima volta. Ogni volta che poi dovremo criptare/decriptare un messaggio, GPG andrà a cercare la chiave corretta tra quelle importate al suo interno.

3 – Criptare un messaggio

Dopo aver importato la chiave pubblica di una persona all’interno di GPG, possiamo procedere a criptare e firmare un messaggio in questo modo:

# gpg --armor --recipient "Person Name" --sign --encrypt messagge.txt

oppure specificando il file in cui verrà salvato il messaggio criptato:

# gpg --output final_message.txt --armor --recipient "Person Name" --sign --encrypt messagge.txt

Analizziamo le opzioni utilizzate:

  • output è opzionale e permette di indicare il file in cui verrà salvato il messaggio criptato;
  • armor è opzionale e serve per produrre un messaggio criptato usando la codifica ASCII, altrimenti senza tale opzione viene prodotto un file binario;
  • recipient è un’opzione obbligatoria e identifica il destinatario del messaggio, dunque chi sarà in grado di decriptare il messaggio;
  • sign è opzionale e firma il messaggio;
  • encrypt è ovviamente obbligatoria e cripta finalmente il messaggio.

Veniamo all’esempio. Se vogliamo inviare un messaggio criptato a Paolino Paperino, il comando necessario sarà:

# gpg --armor --recipient "Paolino Paperino" --sign --encrypt messaggio_da_paperone.txt

Il messaggio che viene prodotto dal comando precedente può poi essere inviato al destinatario.

4 – Inviare un messaggio criptato

Dopo aver criptato il messaggio, possiamo inviarlo alla nostra destinazione.

Nel caso in cui abbiamo scelto l’opzione armor, il testo criptato avrà una forma simile a questa:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.2.10
hQEMAyAXkJC2I+NYAQf/dAPmS9pAawmTsTMxuN3qW4YSjup2E9GZZI8x4ikwAIrh
poPumljoUR5tqsf5+xvtrOpamY3qaTeUGCadtQiqCod2zrfZEA7iLUtcO2i47yuK
VCT7yY1SKWhtAvElrkd48k0CY8HMMRpGWMdXlvfnZNxl3lEo2F1oIH45xsUo9HJ8
9z0e0Jlm5oe3KCMSOPDqIQRvAeWHSruyeLtyUuaCWsdu9JaSEd1j886wxCbbCzrp
r2H6MPmd35gpthoIR8QjbAF7bzpnltXRZrs4Aex31o4YrjW4Ns/S2w==
=Yxjk
-----END PGP MESSAGE-----

Per trasmettere il testo criptato al destinatario è sufficiente copiarlo all’interno della mail da inviare.

Ricevere e decriptare un messaggio

1 – Ottenere la chiave pubblica di una persona

Il procedimento è lo stesso del punto 1 precedente, e deve essere effettuato solo la prima volta.

2 – Importare la chiave pubblica

Il procedimento è lo stesso del punto 2 precedente, e deve essere effettuato solo la prima volta.

3 – Ricevere un messaggio criptato

Un messaggio criptato può essere ricevuto tramite gli stessi mezzi dei messaggi in chiaro tradizionali, ad esempio tramite mail. Ricordo che un messaggio criptato ha solitamente una forma di questo tipo:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.2.10
hQEMAyAXkJC2I+NYAQf/dAPmS9pAawmTsTMxuN3qW4YSjup2E9GZZI8x4ikwAIrh
poPumljoUR5tqsf5+xvtrOpamY3qaTeUGCadtQiqCod2zrfZEA7iLUtcO2i47yuK
VCT7yY1SKWhtAvElrkd48k0CY8HMMRpGWMdXlvfnZNxl3lEo2F1oIH45xsUo9HJ8
9z0e0Jlm5oe3KCMSOPDqIQRvAeWHSruyeLtyUuaCWsdu9JaSEd1j886wxCbbCzrp
r2H6MPmd35gpthoIR8QjbAF7bzpnltXRZrs4Aex31o4YrjW4Ns/S2w==
=Yxjk
-----END PGP MESSAGE-----

4 – Decriptare un messaggio

Nell’ultimo passo dobbiamo decriptare il messaggio ricevuto, e il comando è questo:

# gpg --output message.txt --decrypt encrypted_message.txt

Il comando è piuttosto esplicativo in quando devono essere specificati solamente il file di output, in cui verrà memorizzato il file decriptato, e il messaggio criptato ricevuto.

Con il nostro esempio, se vogliamo decriptare un messaggio dobbiamo eseguire:

# gpg --output message_from_Paperino.txt --decrypt encrypted_message_from_Paperino.txt
---------------------------------------------
You need a passphrase to unlock the secret key for
user: "Paolino Paperino <paolino.paperino@paperopoli.com>"
2048-bit RSA key, ID AC3C885F, created 2012-07-03
Enter passphrase:

roghan