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

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

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

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

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

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

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

Ad esempio il seguente sistema risulta vulnerabile:

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

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

Matteo

[GNU/Linux] Trucchi per scaricare i video di youtube

L’argomento di oggi è youtube: vedremo come è possibile scaricare i video con Linux, e quali sono le principali opzioni. Il programma di cui abbiamo bisogno per scaricare i video è youtube-dl, il quale è disponibile nei repository delle principali distribuzioni Linux. Questo software funziona unicamente da linea di comando, e il suo utilizzo è semplice se conosciamo le opzioni giuste da usare ;-), anzi secondo me è anche più semplice di altri software con GUI analoghi!

YouTube-Logo

1 – Scaricare un video da youtube

Il primo passo sarà quello di installare youtube-dl, o tramite repository, oppure scaricando il software dal sito ufficiale.

Dopo averlo installato, al primo avvio occupiamoci di aggiornare il programma alla versione più recente con l’opzione U:

# youtube-dl -U
Updating to latest version...
Updated youtube-dl. Restart youtube-dl to use the new version.

Passiamo subito a vedere come è possibile scaricare i video inclusi di audio.

Scelto il video da scaricare, prima di tutto controlliamo con quali formati è disponibile, in modo da scegliere quello riteniamo più adatto:

$ youtube-dl -F video_da_scaricare

Il comando restituisce un elenco dei formati disponibili, con annessa risoluzione grafica. Vediamo un esempio:

$ youtube-dl -F http://www.youtube.com/watch?v=oyauS1x54hM&feature=fvwrel
Setting language
oyauS1x54hM: Downloading video webpage
oyauS1x54hM: Downloading video info webpage
oyauS1x54hM: Extracting video information
Available formats:
37 : mp4 [1080x1920]
45 : webm [720x1280]
22 : mp4 [720x1280]
35 : flv [480x854]
43 : webm [360x640]
34 : flv [360x640]
18 : mp4 [360x640]
5 : flv [240x400]
17 : mp4 [144x176]

E’ possibile osservare sulla sinistra una serie di numeri, mentre sulla destra vengono mostrati il formato (mp4, webm, …) e la risoluzione. La risoluzione e il formato decretano la qualità generale del video. Nella seguente tabella di wikipedia sono messi a confronto i formati:

http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs

Nel caso in cui siano disponibili più formati (come nell’esempio precedente),è possibile scegliere quello più adatto alle proprie necessità. Se dobbiamo scaricare una grande quantità di video, o se la qualità non è l’elemento principale, possiamo scegliere una risoluzione media, tipo 360×640. Se dobbiamo invece scaricare pochi video e ci interessa l’alta definizione, possiamo optare anche per una risoluzione alta, come 1080×1920. Dobbiamo ricordare che ad una maggior qualità audio/video corrisponde in genere un file di dimensioni maggiori. Nel caso dell’esempio la qualità massima è quella del formato mp4 con numero 37. Laddove possibile, personalmente preferisco il formato mp4 per avere una maggiore portabilità, rispetto ad esempio a flv.

Dunque, dopo aver scelto la qualità procediamo a scaricare il video con questo comando:

$ youtube-dl -t -f formato video_da_scaricare

Tornando all’esempio precedente abbiamo:

$ youtube-dl -t -f 37 http://www.youtube.com/watch?v=oyauS1x54hM&feature=fvwrel

Le opzioni usate in questo comando sono t, che imposta il nome del file scaricato uguale a quello del video youtube, e l’opzione f per specificare il formato da scaricare.

2 – Estrarre l’audio di un video come mp3

Una particolare funzionalità di youtube-dl è quella che permette di estrarre da un video solo la componente audio, ed in formato mp3. Per fare ciò, è necessario avere installato nel sistema ffmpeg, aggiornato all’ultima versione disponibile. Per estrarre l’audio in mp3 il comando da dare è il seguente:

# youtube-dl -t -f formato --extract-audio --audio-format mp3 --audio-quality 256k video_di_youtube

Con un esempio, il comando precedente diventerebbe:

# youtube-dl -t --max-quality 37 --extract-audio --audio-format mp3 --audio-quality 256k http://www.youtube.com/watch?v=mqVMZB5KPjY

3 – Ottenere informazioni audio/video di un file

Un software molto utile è Mediainfo, installabile sia con GUI che senza e in grado di fornire dettagliatissime informazioni audio e video di un file. Se il software non dovesse essere presente all’interno dei repository è possibile recuperarlo, per la maggior parte delle distribuzioni (anche per Windows e Mac OS X), a questo link:

http://mediainfo.sourceforge.net/it

Un esempio di utilizzo di Mediainfo è:

$ mediainfo Loca_Shakira-G5Q9vSXoKQ8.mp4
General
Complete name : Loca_Shakira-G5Q9vSXoKQ8.mp4
Format : MPEG-4
Format profile : Base Media / Version 2
Codec ID : mp42
File size : 14.1 MiB
Duration : 3mn 7s
Overall bit rate mode : Variable
Overall bit rate : 634 Kbps
Encoded date : UTC 2011-07-17 07:38:03
Tagged date : UTC 2011-07-17 07:38:03
gsst : 0
gstd : 187120
gssd : BADC202E5HH1342530140109985
gshh : o-o.preferred.mil01s12.v15.nonxt8.c.youtube.com
----------------------------
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L1.3
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 3mn 7s
Bit rate : 534 Kbps
Maximum bit rate : 762 Kbps
Width : 400 pixels
Height : 226 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.236
Stream size : 11.9 MiB (84%)
Tagged date : UTC 2011-07-17 07:38:03
----------------------------
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
...

Buon download a tutti!!

Matteo

[GNU/Linux] Importare/esportare chiavi in GPG

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

Matteo

[GNU/Linux] Come nascondere l’output di un comando nella shell

E’ possibile nascondere l’output di un comando o di un’applicazione della shell in questo modo:

$ command > /dev/null

Ossia l’output del comando non verrà mostrato nella console, ma sarà rediretto a /dev/null e quindi risulterà non visibile. Il comando viene comunque sempre eseguito.

Per nascondere tutto l’output del comando, compresi gli errori, il comando è invece il seguente:

$ command &> /dev/null

 

[GNU/Linux] Configurare un proxy da shell

Oggi vedremo come configurare il sistema per permettere alle applicazioni da linea di comando di utilizzare un proxy. Le applicazioni da linea di comando molto spesso non hanno infatti nativamente l’opzione per veicolare le trasmissioni verso un proxy, diversamente dalle applicazioni grafiche (ad esempio i browser hanno sempre le opzioni per la configurazione di eventuali proxy). Dunque, la soluzione per la linea di comando è quella di configurare i parametri del proxy come variabile d’ambiente, e costringere in questo modo l’applicazione a passare dal proxy. Tramite la shell sono supportati i proxy con protocollo HTTP, HTTPS, e FTP. Vediamo adesso in dettaglio come fare.

Prima di tutto controlliamo tra le variabili d’ambiente che non siano già impostati proxy:

# ENV | grep -i proxy

Se non viene ritornato niente possiamo procedere a configurare il/i proxy:

# export http_proxy=http://<proxy-server-ip>:<port>
# export https_proxy=http://<proxy-server-ip>:<port>
# export ftp_proxy=http://<proxy-server-ip>:<port>

Nel caso in cui ci siano già state definite variabili proxy, è possibile eliminarle e definirle nuovamente:

# unset http_proxy
# export http_proxy=”http://<proxy-server-ip>:<port>”

Ricordo che le variabili d’ambiente definite con i comandi precedenti risultano temporanee, mentre per renderle permanenti è necessario modificare i file .bash_profile o .bashrc, come ho scritto dettagliatamente in questo post:

[GNU/Linux] Come configurare le variabili d’ambiente

Nel caso in cui il proxy richieda l’autenticazione è necessario invece configurare le variabili d’ambiente in questo modo:

# export http_proxy=<username>:<password>@http://<proxy-server-ip>:<port>/

Infine controlliamo di aver correttamente definito le variabili, osservando l’output dei comandi:

# echo $http_proxy
# echo $https_proxy
# echo $ftp_proxy

Ulteriori risorse sui proxy in Linux:

Matteo

[GNU/Linux] Come configurare le variabili d’ambiente

Una variabile è una piccola parte della memoria RAM identificata da un nome e in grado di contenere dei valori (nomi, date, …). Nel momento in cui un utente definisce una nuova variabile, il sistema associa al nome di tale variabile un indirizzo di memoria nel quale viene memorizzato il valore indicato. Per definire una variabile è sufficiente usare la seguente sintassi:

# NOME_VARIABILE=valore

Le variabili d’ambiente sono invece particolari variabili che permettono ad ogni utente di configurare il proprio ambiente di lavoro. Vediamo una lista dei comandi da tenere sempre a portata di mano.

Per vedere una lista delle variabili d’ambiente impostate nel sistema il comando è:

# env

environment_variables

Per settare una nuova variabile d’ambiente (“temporanea”, vedere più avanti per la spiegazione):

# export NOME_VARIABILE="valore della variabile"

Per visualizzare il valore di una variabile d’ambiente:

# echo $NOME_VARIABILE

Per cancellare una variabile d’ambiente:

# unset NOME_VARIABILE

E’ importante notare che per cancellare una variabile non è sufficiente effettuare un’assegnazione con un valore nullo, ma bisogna necessariamente usare unset. Ad esempio il comando VARIABILE="" imposterà semplicemente il valore della variabile con quello della stringa vuota, ma non cancellerà la variabile, dunque fate attenzione!

Le variabili d’ambiente possono essere suddivise in 3 categorie: temporanee, locali (per un singolo utente), o globali (per tutti gli utenti). Una variabile definita semplicemente all’interno della sessione di una shell avrà una durata limitata all’esecuzione della shell stessa. In questo caso:

# VARIABILE_PROVA=/home/pippo/tmp
# export VARIABILE_PROVA

la variabile verrà eliminata nel momento in cui la sessione della shell verrà chiusa (logout, exit, riavvio del sistema, …).

Un altra categoria è quella delle variabili d’ambiente locali, ossia relative ad un singolo utente. Queste possono essere definite in:

  • ~/.bash_profile – file è eseguito una volta al login
  • ~/.bashrc – file eseguito eseguito alla creazione di una nuova shell. La maggior parte delle variabili dovrebbe essere posta al suo interno.

Infine ci sono le variabili globali definite in modo simile alle precedenti:

  • /etc/profile – file letto una volta al login;
  • /etc/bashrc – file letto ogni volta che viene avviata una nuova shell.

Matteo

[Programmazione][Java] Privilegi root per bind di porte 1-1023

Se dobbiamo creare un server in Java per accettare comunicazioni su TCP, è necessario usare la classe ServerSocket, mentre quella Socket è specifica per il lato client. Durante la creazione della componente client, bisogna fare particolare attenzione a quali porte indichiamo se ci troviamo su sistemi Linux/Unix. Ad esempio, il codice per mettere in ascolto un server sulla porta 80 è il seguente:

try
{
     ServerSocket server= new ServerSocket(80);
}catch (IOException iex)
{
     System.err.println(ex);
}

Il codice è corretto, ma potrebbe essere sollevata un’eccezione su sistemi Unix/Linux o anche Windows, in quanto sono necessari i privilegi di root/administrator per poter usare le porte nel range 1-1023.

Matteo