mercoledì 27 marzo 2019

PowerShell: Disabilitare il risparmio energetico sulle schede di rete

Quando il PC entra in modalità sospensione/ibernazione, Windows disabilita tutte le periferiche non necessarie per risparmiare energia comprese le schede di rete. Tale comportamento può causare malfunzionamenti quando si riprende la sessione di lavoro: ad es. la scheda di rete potrebbe non riattivarsi.
Una soluzione a questo tipo di problemi consiste nell'impedire al sistema operativo di spegnere le schede di rete per risparmiare energia. 


Disabilitare il risparmio energetico sulla scheda di rete tramite GUI

  • Premere la combinazione di tasti WIN+R per aprire la finestra di dialogo Esegui e digitare devmgmt.msc seguito da invio per avviare Gestione dispositivi;

    Gestione dispositivi
    FIG 1 - Gestione dispositivi
  • Espandere la sezione Schede di rete ed eseguire un doppio click sulla scheda di rete su cui si intende disabilitare il risparmio energetico;
  • Nella finestra delle Proprietà, selezionare la scheda Risparmio energia quindi rimuovere la spunta alla voce Consenti al computer di spegnere il dispositivo per risparmiare energia e confermare cliccando sul pulsante OK.
    Proprietà scheda di rete
    FIG 2 - Proprietà scheda di rete



Disabilitare il risparmio energetico sulle schede di rete tramite PowerShell


Nello script PowerShell andremo a verificare le proprietà delle schede di rete presenti nel registro di sistema al seguente percorso
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
All'interno delle sottochiavi del registro andremo a verificare la proprietà *ifType per individuare le schede di rete Wi-Fi (con *ifType=6) e le schede di rete Ethernet (con *ifType=71). Per tali schede il risparmio energetico verrà disattivato valorizzando la proprietà PnPCapabilities a 18 in esadecimale (24 in decimale).
Lo script, oltre a visualizzare l'output a video, genera un file di log DisablePowerSavingNIC.log che è possibile consultare successivamente anche dopo aver chiuso la finestra di PowerShell.
Script DisablePowerSavingNIC.ps1
FIG 3 - Script DisablePowerSavingNIC.ps1
Lo script può essere scaricato dal seguente link
DOWNLOAD

Terminata l'esecuzione, l'output sarà simile a quello mostrato in FIG 4 ed è necessario procedere al riavvio del sistema affinché le modifiche siano applicate.
Output script PowerShell DisablePowerSavingNIC.ps1
FIG 4 - Output script PowerShell DisablePowerSavingNIC.ps1




domenica 24 marzo 2019

MS Office 365 for Business: Riparare Office da riga di comando tramite OfficeClickToRun

Per riparare l'installazione di MS Office 365 è possibile procedere tramite Programmi e funzionalità (appwiz.cpl) di Windows oppure tramite riga di comando utilizzando OfficeClickToRun.


Ripristino Office 365
FIG 1 - Ripristino Office 365

Il percorso di OfficeClickToRun.exe può variare in base alla versione di Office 365/Windows utilizzata e il comando da lanciare per procedere ad una riparazione rapida sarà simile al seguente:
"%ProgramFiles%\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" scenario=Repair platform=x86 culture=it-it forceappshutdown=True RepairType=QuickRepair DisplayLevel=False

Ovviamente i parametri da passare a OfficeClickToRun vanno personalizzati in base alle proprie esigenze e configurazione. Di seguito un dettaglio sui parametri utilizzabili e i possibili valori:

Parametro Valori Note
scenario Repair Indica che si intende procedere alla riparazione di Office.
Parametro Necessario
platform x86
x64
Specifica la versione di Office che si intende riparare.
x86 per la versione a 32 bit
x64 per la versione a 64 bit
Parametro Necessario
culture ll-cc Specifica la lingua della versione di Office installata. Se sono installate più lingue basta specificarne solo una.
Per la versione inglese di Office il valore sarà en-us per quella in italiano il valore da indicare è it-it.
Parametro Necessario
forceappshutdown True
False
Se impostato su True verranno chiuse tutte le applicazioni Office prima che venga avviata la riparazione. Se le applicazioni Office sono aperte e il parametro non è specificato o settato su False, allora la riparazione fallirà.
Parametro Opzionale
RepairType QuickRepair
FullRepair
Permette di specificare se si intende procedere con un Ripristino Rapido (QuickRepair) o con il Ripristino online (FullRepair).
Con il Ripristino online tutte le applicazioni Office saranno reinstallate e verranno sovrascritte tutte le impostazioni fatte nel file configuration.xml.
Parametro Opzionale
DisplayLevel True
False
Se impostato su True verranno visualizzate le finestre relative al ripristino. Impostando tale parametro su False il ripristino avverrà in maniera silente .
Parametro Opzionale





lunedì 18 marzo 2019

PowerShell: Montare\Smontare un'immagine ISO

Per immagine ISO si intende una copia bit-per-bit del file system di un disco ottico. Il nome deriva da ISO 9660, il file system standard dei CD-ROM tuttavia un'immagine ISO può contenere anche il file system UDF (ISO/IEC 13346) comunemente utilizzato nei dischi DVD e Blu-Ray.
Windows 10 facilita enormemente la gestione dei file ISO senza l'utilizzo di tool esterni. Per aprire un file ISO basta fare un doppio clic sul file oppure, in alternativa, cliccarci su con il tasto destro del mouse e selezionare Monta dal menu contestuale: Windows creerà un'unità ottica virtuale assegnandole la prima lettera di unità libera e permettendo la navigazione del contenuto dell'immagine ISO tramite Esplora file.
Windows 10, Montare un'immagine ISO
FIG 1 - Windows 10, Montare un'immagine ISO
Per eliminare l'unità virtuale e smontare l'immagine basta cliccare con il tasto destro del mouse sull'unità in Esplora file e selezionare Espelli dal menu contestuale.


In PowerShell è possibile montare\smontare un'immagine ISO utilizzando i cmdlet Mount-DiskImageDismount-DiskImage.
Per montare un'immagine ISO tramite PowerShell
Mount-DiskImage -ImagePath "C:\kali-linux-2019.1a-amd64.iso"
PowerShell, Montare un'immagine ISO
FIG 2 - PowerShell, Montare un'immagine ISO

Per smontare un'immagine ISO da PowerShell
Dismount-DiskImage -ImagePath "C:\kali-linux-2019.1a-amd64.iso"
PowerShell, Smontare un'immagine ISO
FIG 3 - PowerShell, Smontare un'immagine ISO
oppure, utilizzando il device path
Dismount-DiskImage -DevicePath \\.\CDROM1





giovedì 14 marzo 2019

PowerShell: Creare un documento MS Excel contenente i risultati dei ping ad un elenco di postazioni

Potremmo trovarci nella situazione in cui ci viene richiesto di controllare se diverse postazioni siano connesse in rete. Il modo più semplice per eseguire tale controllo consiste nel verificare se le postazioni rispondono al ping. In questo articolo mostrerò come raggiungere tale obiettivo con uno script PowerShell che, dato un elenco di postazioni contenuto in un file di testo, provvede ad eseguire il ping e a memorizzare i risultati all'interno di un documento MS Excel.
Lo script può essere scaricato dal seguente link
DOWNLOAD
Script PowerShell PingHost2Excel
FIG 1 - Script PowerShell PingHost2Excel

La prima istruzione consiste nell'assegnare alla variabile $path il nome del file, comprensivo di percorso, contenente l'elenco delle workstation da verificare. Il contenuto del file sarà simile a quello mostrato in FIG 2: ogni riga contiene il nome della postazione da verificare.
Elenco Workstation da verificare
FIG 2 - Elenco Workstation da verificare

Successivamente con Test-Path verifichiamo se il file è presente, in caso contrario terminiamo lo script visualizzando il messaggio di file non trovato
$path = ".\ElencoWKS.txt"
if (Test-Path $path) 

Se il file contenente l'elenco delle workstation viene trovato procediamo alla creazione di un nuovo documento MS Excel e a posizionarci sul primo foglio di lavoro. 
$objExcel = new-object -comobject excel.application 

$objWorkbook = $objExcel.Workbooks.Add() 
$objWorksheet = $objWorkbook.Worksheets.Item(1)

Con la seguente istruzione facciamo in modo che il documento MS Excel sia visibile a video durante la compilazione.
$objExcel.Visible = $True

La prima riga del foglio di lavoro la utilizziamo come intestazione assegnando un nome a ciascuna colonna in base al contenuto che andremo successivamente ad inserire.
$objWorksheet.Cells.Item(1, 1) = "Nome Host"
$objWorksheet.Cells.Item(1, 2) = "Ping"
$objWorksheet.Cells.Item(1, 3) = "Indirizzo IP"


Nella variabile $wks andiamo a caricare l'elenco delle postazioni da analizzare. La variabile $row viene inizializzata a 2 (nella prima riga del foglio di lavoro abbiamo inserito l'intestazione) e verrà utilizzata per spostarci alla riga successiva man mano che verranno analizzate/inserite le workstation in elenco.
$wks= gc $path
$row=2

La parte più importante dello script è rappresentata dal ciclo foreach-object: per ogni postazione presente in elenco provvede ad inserire, all'interno del file MS Excel, il nome della postazione, l'esito del ping (OK se andato a buon fine o KO nel caso in cui non si riceve risposta) e l'eventuale indirizzo IP della postazione.
$wks| foreach-object{
 $ping=$null
 $workstation = $_
 $ping = Test-Connection $workstation -Count 1 -ea silentlycontinue
 $objWorksheet.Cells.Item($row,1) = $workstation
 
 if($ping){
  $objWorksheet.Cells.Item($row,2) = "OK"
  $objWorksheet.Cells.Item($row,3) = $ping.IPV4Address.IPAddressToString   
 }
 else {
  $objWorksheet.Cells.Item($row,2) = "KO"
  $objWorksheet.Cells.Item($row,3) = "-"
 }
  
 $row++
}


Foglio MS Excel con i risultati della verifica
FIG 3 - Foglio MS Excel con i risultati della verifica




martedì 12 marzo 2019

PowerShell: Installazione/Disinstallazione di OpenSSH Client/Server in Windows 10

OpenSSH (Open Secure Shell) è un'insieme di strumenti utilizzato per connessioni da remoto cifrate tramite il protocollo SSH. Tutto il traffico viene cifrato consentendo una comunicazione sicura e immune da intercettazioni, dirottamenti e altri tipi di attacchi.

Microsoft ha integrato, come funzionalità facoltative, OpenSSH Client e OpenSSH Server all'interno del proprio sistema operativo. Le due funzionalità possono essere installate separatamente in Windows Server 2019 e Windows 10 1809 sia tramite interfaccia grafica (GUI) sia tramite PowerShell.


Installazione di OpenSSH Client/Server tramite GUI

  • Avviare l'app Impostazioni (WIN+I) quindi cliccare su App;
    Windows 10, Impostazioni
    FIG 1 - Windows 10, Impostazioni
  • Nella sezione App e funzionalità cliccare sul link Gestisci funzionalità facoltative;
    Windows 10, App e funzionalità
    FIG 2 - Windows 10, App e funzionalità
  • Cliccare su Aggiungi una funzionalità;
    Windows 10, Aggiungi una funzionalità
    FIG 3 - Windows 10, Aggiungi una funzionalità
  • Selezionare la funzionalità che si intende installare e cliccare sul pulsante Installa per procedere con l'installazione.
    Windows 10, Installa una nuova funzionalità
    FIG 4 - Windows 10, Installa una nuova funzionalità



Disinstallazione di OpenSSH Client/Server tramite GUI

I passaggi sono analoghi a quanto visto per l'installazione.
  • Avviare l'app Impostazioni (WIN+I) quindi cliccare su App;
  • Nella sezione App e funzionalità cliccare sul link Gestisci funzionalità facoltative;
  • Dall'elenco delle funzionalità installate selezionare quella che si intende disinstallare e cliccare sul pulsante Disinstalla per procedere con la rimozione.

    Windows 10, Disinstallazione funzionalità aggiuntive
    FIG 5 - Windows 10, Disinstallazione funzionalità aggiuntive



Installazione di OpenSSH Client/Server tramite PowerShell

  • Per accertarsi che le funzionalità OpenSSH siano disponibili per l'installazione utilizzare il comando
    Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
    PowerShell, Get-WindowsCapability
    FIG 6 - PowerShell, Get-WindowsCapability
  • Per installare il Client OpenSSH eseguire
    Add-WindowsCapability -Online -Name OpenSSH.Client*
  • Per installare il Server OpenSSH eseguire
    Add-WindowsCapability -Online -Name OpenSSH.Server*
    PowerShell, Add-WindowsCapability per installare nuove funzionalità
    FIG 7 - PowerShell, Add-WindowsCapability per installare nuove funzionalità
Terminata l'installazione sarà possibile utilizzare dal prompt dei comandi o da PowerShell i seguenti comandi SSH:
ssh.exe
scp.exe
sftp.exe
ssh-add.exe
ssh-agent.exe
ssh-keygen.exe
ssh-keyscan.exe

Gli eseguibili sopra riportarti si trovano all'interno della cartella
C:\Windows\System32\OpenSSH\ 
mentre i file di SSH relativi ai nomi host noti, alle chiavi generate ecc. si trovano nel seguente percorso
%USERPROFILE%\.ssh\ 





Disinstallazione OpenSSH Client/Server tramite PowerShell

La disinstallazione di OpenSSH Client/Server può essere eseguita tramite il cmdlet Remove-WindowsCapability 
  • Per disinstallare il client OpenSSH da PowerShell eseguire
    Remove-WindowsCapability -Online -Name OpenSSH.Client*
  • Per disinstallare il server OpenSSH  eseguire
    Remove-WindowsCapability -Online -Name OpenSSH.Server*




Configurazione iniziale di OpenSSH Server

Per eseguire la configurazione iniziale di OpenSSH Server, lanciare una sessione PowerShell come amministratore ed eseguire i seguenti comandi
  • Avviare il servizio sshd con il comando
    Start-Service sshd
  • Impostare l'avvio Automatico del servizio eseguendo
    Set-Service -Name sshd -StartupType 'Automatic'
  • Durante l'installazione di OpenSSH Server viene creata e abilitata una regola sul firewall (OpenSSH-Server-In-TCP) per consentire le connessioni in SSH in ingresso. Verificare la presenza della regola sul firewall con il comando
    Get-NetFirewallRule -Name *ssh*
PowerShell, Configurazione iniziale di OpenSSH Server
FIG 8 - PowerShell, Configurazione iniziale di OpenSSH Server



Connessione al server SSH

Sulle postazioni dove è installato il client OpenSSH è possibile connettersi al server eseguendo il comando
ssh username@servername

Al primo accesso al server verrà mostrato un messaggio come quello in FIG 9.
PowerShell, Connessione al server OpenSSH
FIG 9 - PowerShell, Connessione al server OpenSSH

Rispondendo yes si prosegue con la connessione e verrà richiesto l'inserimento della password di accesso.

A connessione avvenuta il server verrà aggiunto all'elenco locale degli host noti e  verrà mostrato un prompt del tipo
domain\username@SERVERNAME C:\Users\username>





lunedì 11 marzo 2019

PowerShell: Creazione di un documento Excel contenente l'elenco dei processi in esecuzione

Lo script PowerShell presentato in quest'articolo consente di creare un documento MS Excel in cui vengono elencati i processi in esecuzione sulla postazione con relative informazioni su Nome del processo, ID, tempo di CPU ed eventuale percorso del file eseguibile. Un prerequisito per l'esecuzione di tale script è che sulla postazione sia installato MS Excel.
Se eseguendo lo script si riceve errore relativo a restrizioni impostate sulla postazione, eseguire il comando
set-executionpolicy unrestricted

Analizziamo lo script nel dettaglio.
Nella variabile $path andiamo ad inserire il nome, comprensivo di percorso, da assegnare al documento MS Excel una volta creato.
$path = "c:\ElencoProcessi.xlsx"
Con le successive tre istruzioni viene avviato MS Excel, creata una nuova cartella di lavoro e all'interno di quest'ultima ci si posiziona sul foglio di lavoro che andrà a contenere le informazioni sui processi.
$objExcel = new-object -comobject excel.application 
$objWorkbook = $objExcel.Workbooks.Add() 
$objWorksheet = $objWorkbook.Worksheets.Item(1)

Per non visualizzare a video la finestra di MS Excel in fase di creazione del file, nello script viene utilizzata l'istruzione
$objExcel.Visible = $False
All'interno del foglio di lavoro utilizziamo la prima riga come riga di intestazione assegnando un nome a ciascuna colonna in base al contenuto che andremo successivamente ad inserire.
$objWorksheet.Cells.Item(1, 1) = "Process"
$objWorksheet.Cells.Item(1, 2) = "ID"
$objWorksheet.Cells.Item(1, 3) = "CPU"
$objWorksheet.Cells.Item(1, 4) = "Path"
Il cuore dello script è rappresentato dalle seguenti istruzioni. 
$row=2
Get-Process | Sort-Object ProcessName | Select ID, ProcessName,CPU, Path | foreach-object{ 
 $objWorksheet.Cells.Item($row,1) = $_.processname;
 $objWorksheet.Cells.Item($row,2) = $_.id;
 $objWorksheet.Cells.Item($row,3) = $_.cpu;
 $objWorksheet.Cells.Item($row,4) = $_.path;
 $row++
}
La variabile $row viene inizializzata a 2 (nella prima riga del foglio di lavoro abbiamo inserito l'intestazione) e verrà utilizzata per spostarci alla riga successiva man mano che verranno trovati e inseriti i processi all'interno del foglio. Tramite il cmdlet Get-Process otteniamo i processi in esecuzione che vengono ordinati per nome  con Sort-Object ProcessName e inseriti all'interno del foglio di lavoro.
Al termine non resta che salvare il documento creato e chiudere MS Excel. Nel caso in cui il nome del file risulti già presente, apparirà una finestra di dialogo in cui viene richiesto all'utente se intende sovrascriverlo.
$objWorkbook.SaveAs($path)
$objWorkbook.Close()
$objExcel.Quit()
PowerShell, Script ElencoProcessi.ps1
FIG 1 - PowerShell, Script ElencoProcessi.ps1

Lo script può essere scaricato dal seguente link
DOWNLOAD
All'interno dello script è presente la funzione Use-RunAs che forza l'esecuzione con i privilegi amministrativi (PowerShell: Forzare l'esecuzione di uno script con privilegi elevati). L'utilizzo di tale funzione non è strettamente necessaria ma può essere utile se si tenta di salvare il file in path che richiedono privilegi elevati.

MS Excel, Elenco Processi
FIG 2 - MS Excel, Elenco Processi





giovedì 7 marzo 2019

Kali Linux: Utilizzare Sandsifter per il fuzzing dei processori x86

Il fuzzing è una tecnica automatica per testare i software. La tecnica consiste nel fornire dati causali, non validi o imprevisti come input di un programma per computer e analizzarne il suo comportamento al fine di individuare errori o falle di sicurezza. 
Sandsifter applica tale tecnica nella verifica dei processori x86 generando sistematicamente codice macchina attingendo dal set di istruzioni del processore e monitorando l'esecuzione di tale codice alla ricerca di istruzioni nascoste e bug hardware. Grazie a Sandsifter sono state scoperte istruzioni segrete sui processori dei principali produttori inoltre è stato possibile scoprire bug software negli assemblatori/disassemblatori, emulatori, negli hypervisor e persino bug hardware in alcuni modelli di processori x86.

In questo articolo verranno illustrati i passaggi per installare ed eseguire Sandsifter sul proprio sistema utilizzando Kali Linux. Prima di proseguire con l'installazione ed esecuzione di Sandsifter è opportuno aggiornare i pacchetti installati e la propria distribuzione di Kali Linux eseguendo da terminale il seguente comando

apt-get update && apt-get upgrade

Aggiornamento Kali Linux
FIG 1 - Aggiornamento Kali Linux



Installazione Sandsifter

Per poter installare e utilizzare Sandsifter è necessario prima installare Capstone, un Framework necessario per disassemblare. Da terminale digitare i seguenti comandi
apt-get install libcapstone3 libcapstone-dev
pip install capstone
Eseguire il download di Sandsifter con il comando
git clone https://github.com/xoreaxeaxeax/sandsifter.git
Download di sandsifter
FIG 2 - Download di sandsifter

Accedere alla cartella di sandsifter
cd sandsifter
Prima di poter compilare è necessario andare a modificare il file Makefile. Digitare il comando
leafpad Makefile
Bisogna aggiungere la stringa -no-pie in modo che il contenuto del file diventi
all: injector

injector: injector.o
 $(CC) $(CFLAGS) $< -O3 -Wall -no-pie -l:libcapstone.a -o $@ -pthread

%.o: %.c
 $(CC) $(CFLAGS) -c $< -o $@ -Wall

clean:
rm *.o injector
Sandsifter makefile
FIG 3 - Sandsifter makefile

Salvare il file quindi compilare il codice eseguendo il comando
make


Esecuzione di Sandsifter

Per eseguire una verifica di base del proprio processore lanciare il comando
./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sandsifter
FIG 4 - Sandsifter

La schermata della verifica presenta 2 sezioni: in quella superiore viene mostrata l'istruzione che Sandsifter sta verificando mentre in quella inferiore vengono riportati gli errori/bug trovati. La scansione può richiedere da poche ore a più giorni per essere portata a termine a seconda della velocità e della complessità del processore che si sta analizzando è può trovare milioni di istruzioni non documentate.

Quando la scansione è completa sarà possibile riassumere i risultati tramite il comando
./summarize.py data/log

il comando provvede anche ad assegnare una categoria e un livello di importanza al problema trovato. Le categorie principali sono 3:
  • Bug Software
  • Bug Hardware
  • Istruzioni non documentate

Premendo 'Q' si esce dall'applicazione e viene prodotto un resoconto in formato testo della scansione del sistema.
Premendo 'M' durante l'esecuzione di Sandsifter viene modificata la modalità di ricerca (brute force, randomized fuzzing e tunneled fuzzing) mentre premendo il tasto 'P' è possibile mettere in pausa (o riprendere dalla pausa) il processo di ricerca.



Flag utilizzabili in Sandsifter


--len
Cerca le differenze di lunghezza in tutte le istruzioni. Ricerca istruzioni che si comportano in maniera diversa da quanto si aspetta il disassembler o che non esistono.

--dis
Come per il flag --len ma la ricerca viene eseguita solo per le istruzioni valide.

--unk
Ricerca le istruzioni sconosciute, istruzioni che anche se non riconosciute dal disassembler vengono eseguite con successo.

--ill
E' l'opposto del flag --unk. Ricerca istruzioni che non vengono eseguite correttamente ma riconosciute dal disassembler

--tick
Scrive periodicamente l'istruzione corrente sul disco.

--save
Salva i progressi della ricerca in uscita.

--resume
Riprende la ricerca dall'ultimo stato salvato.

--sync
Scrive i risultati della ricerca sul disco man mano che vengono trovati.

--low-mem
Non memorizza i risultati in memoria.




Injector utilizzabili in Sandsifter


-b
Mode: brute force. In tale modalità la ricerca prova le istruzioni in modo incrementale, fino a una lunghezza specificata dall'utente. Generalmente è più lenta ricerca casuale.

-r
Mode: randomized fuzzing.

-t
Mode: tunneled fuzzing.

-d
Mode: externally directed fuzzing.

-R
Raw output mode.

-T
Text output mode.

-x
Scrive periodicamente i progressi su stderr.

-0
Consente dereferenza nulla.

-D
Consente prefissi duplicati.

-N
Non consente nx bit.

-s seed
Nella ricerca random, il valore del seed.

-B brute_depth
Nella modalità brute force specifica la massima profondità della ricerca.

-P max_prefix
Numero massimo di prefissi da ricercare.

-i instruction
Istruzione da cui partire per la ricerca (inclusiva).

-e instruction
Istruzione a cui terminare la ricerca.

-c core
Core su cui eseguire la ricerca.

-X blacklist
Mette in blacklist l'istruzione specificata.

-j jobs
Numero simultaneo di job eseguiti contemporaneamente.

-l range_bytes
Numero di byte di istruzione di base in ogni sottogruppo.