martedì 2 agosto 2016

PowerShell: Verificare la presenza e raggiungibilità di un host in rete tramite Test-Connection

Chi lavora nel campo IT spesso utilizza l'utility Ping per verificare la presenza e raggiungibilità di un Host all'interno della rete. Il ping consiste nell'invio di un pacchetto ICMP (Internet Control Message Protocol) di tipo echo request e attendere in risposta un pacchetto ICMP di tipo echo reply.

Una funzione analoga in PowerShell può essere eseguita tramite il cmdlet Test-Connection. La sintassi del cmdlet è la seguente:

Test-Connection [-ComputerName] <String[]> [-AsJob] [-Authentication <AuthenticationLevel> {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged} ] [-BufferSize <Int32> ] [-Count <Int32> ] [-Delay <Int32> ] [-Impersonation <ImpersonationLevel> {Default | Anonymous | Identify | Impersonate | Delegate} ] [-InformationAction <System.Management.Automation.ActionPreference> {SilentlyContinue | Stop | Continue | Inquire | Ignore | Suspend} ] [-InformationVariable <System.String> ] [-ThrottleLimit <Int32> ] [-TimeToLive <Int32> ] [ <CommonParameters>]


Parametri principali


-AsJob
Il parametro esegue il comando in background. Per poter utilizzare tale parametro è necessario eseguire PowerShell come amministratore

-Authentication<AuthenticationLevel>
Specifica il livello di autenticazione della connessione WMI (Test-Connection usa WMI). I valori accettati sono: UnchangedDefaultNoneConnectCallPacketPacketIntegrityPacketPrivacy

-BufferSize
Specifica la dimensione, in byte, del pacchetto inviato. Di default la dimensione è 32 byte.

-ComputerName
Si tratta di un parametro obbligatorio e consente di specificare il nome del computer da pingare o il suo indirizzo IP (in formato IPv4 o IPv6).

-Count
Specifica il numero di pacchetti/richieste da inviare. Di default vengono inviati 4 pacchetti.

-Credential
Specifica le credenziali dell'utente autorizzato ad inviare il ping dal computer specificato da -Source.

-Delay
Specifica l'intervallo, in secondi, tra i ping.

-Quiet
Specificando tale parametro verrà restituivo $true se l'host ha risposto al ping, $false in caso contrario. Tutti gli altri messaggi di risposta vengono soppressi.

-Source
Permette di specificare il nome del computer da cui parte il ping. Se non specificato il ping ha origine dal computer locale. É possibile indicare anche più origini del ping separandole tramite virgola.

-TimeToLive
Il parametro TimeToLive (TTL) permette di specificare il tempo di vita, in secondi, del pacchetto ICMP. Il parametro accetta valori interi compresi tra 1 e 255.



Esempi


Esempio 1
Test-Connection Server01
Test-Connection -ComputerName 192.168.0.1
Questi due comandi eseguono il ping rispettivamente verso il computer con nome Server01 e verso l'indirizzo 192.168.0.1. Nel primo comando il parametro -ComputerName viene omesso e indicato direttamente il nome del computer.
Test-Connection -ComputeName
FIG 1 - Test-Connection -ComputeName

Esempio 2
Test-Conntection -ComputerName Server01, Server02
É possibile passare a Test-Connection più host a cui inviare il pacchetto ICMP separandoli tramite virgola.

Esempio 3
Test-Connection -ComputerName 192.168.0.1 -Quiet
Con il parametro Quiet si riceve in output True o False a seconda se si riceve risposta o meno dal computer remoto. Questa caratteristica ci consente di utilizzarlo per verificare la raggiungibilità di un determinato host prima di tentare una qualsiasi operazione. Ad es. 
if (Test-Connection -ComputerName Server01 -Quiet) {New-PSSession Server01}
Test-Connection, parametro -Quiet
FIG 2 - Test-Connection, parametro -Quiet

Esempio 4
Test-Connection -Source Server02, Server03 -ComputerName Server01 -Credential Dominio\Utente
Questo comando invia ping da diversi mittenti/host ad un singolo computer Server01. Il parametro Credential viene utilizzato per specificare le credenziali di un utente che è abilitato all'invio di ping da Server02 e Server03. Questo comando può essere utile per verificare la latenza delle connessioni da diversi punti.




lunedì 1 agosto 2016

PowerShell: Mettere in pausa l'attività in PowerShell tramite Start-Sleep

Il cmdlet Start-Sleep viene utilizzato generalmente all'interno degli script al fine di mettere in pausa l'attività per un periodo specificato. La sintassi del cmdlet è la seguente:
Start-Sleep [-Seconds] <Int32> 
oppure
Start-Sleep -Milliseconds <Int32>


Parametri

-Seconds
Può essere abbreviato in -s e specifica il tempo di attesa espresso in secondi prima di proseguire con l'esecuzione dell'attività.

-Milliseconds
Specifica il tempo di attesa espresso in millisecondi e può essere abbreviato in -m.


Per mettere in pausa per 10 secondi l'attività
Start-Sleep -s 10
oppure
Start-Sleep -m 10000

giovedì 28 luglio 2016

Ransomware Bart : Come recuperare i dati

Il ransomware Bart è stato scoperto da ProofPoint e dietro la sua distribuzione c'è lo stesso gruppo che distribuisce i ransomware Locky e Dridex. Il ransomware prende in ostaggio i dati della vittima comprimendoli in file .zip protetti da password. A differenza degli altri ransomware, Bart non usa una chiave pubblica per cifrare i dati ma gli sviluppatori sfruttano il fatto che il formato ZIP supporta in modo nativo la cifratura AES. Proprio per questo modo di operare non ha bisogno di comunicare con i server di comando e controllo e può agire anche se non connesso ad Internet. Terminata la sua opera, Bart visualizza un messaggio all'utente in cui viene richiesto un riscatto di 3 bitcoin per rilasciare la password dei file .zip contenti i dati.


Come viene distribuito il ransomware

Bart viene distribuito, come la maggior parte dei ransomware, tramite un email con in allegato un file .zip. Il file zip contiente un file JS (Javascript) che ha un nome simile a PDF_[10 cifre random].js, FILE-[10 cifre random].js o DOC-[10 cifre random].js. Il codice JavaScript presente all'interno del file è offuscato al fine di rendere difficile, a chi lo analizza, scoprire le operazioni che esegue. Se la vittima apre l'allegato .zip, Windows Script Host (wscript.exe) lancia il JavaScript che avvia il download del malware eseguibile RocketLoader all'interno della cartella %temp% e poi lo esegue. Il malware provvede poi al download e all'esecuzione del ransomware Bart.

La prima operazione che effettua il ransomware è quella di verificare la lingua del sistema operativo. Se la lingua rilevata è russo, bielorusso o lingua ucraina il ransomware termina senza effettuare alcuna operazione, in caso contrario verifica le lettere dei dischi/partizioni e inizia a zippare con password, aggiungendo l'estensione .Bart.zip, i file che hanno le seguente etensioni:

.n64, .m3u, .m4u, .mid, .wma, .flv, .3g2, .mkv, .3gp, .mp4, .mov, .avi, .asf, .mpeg, .vob, .mpg, .wmv, .fla, .swf, .wav, .mp3, .qcow2, .vdi, .vmdk, .vmx, .gpg, .aes, .ARC, .PAQ, .tar.bz2, .tbk, .bak, .tar, .tgz, .gz, .7z, .rar, .zip, .djv, .djvu, .svg, .bmp, .png, .gif, .raw, .cgm, .jpeg, .jpg, .tif, .tiff, .NEF, .psd, .cmd, .bat, .sh, .class, .jar, .java, .rb, .asp, .cs, .brd, .sch, .dch, .dip, .vbs, .vb, .js, .asm, .pas, .cpp, .php, .ldf, .mdf, .ibd, .MYI, .MYD, .frm, .odb, .dbf, .db, .mdb, .sq, .SQLITEDB, .SQLITE3, .asc, .lay6, .lay, .ms11(Security copy), .ms11, .sldm, .sldx, .ppsm, .ppsx, .ppam, .docb, .mm, .sxm, .otg, .odg, .uop, .potx, .potm, .pptx, .pptm, .std, .sxd, .pot, .pps, .sti, .sxi, .otp, .odp, .wb2, .123, .wks, .wk1, .xltx, .xltm, .xlsx, .xlsm, .xlsb, .slk, .xlw, .xlt, .xlm, .xlc, .dif, .stc, .sxc, .ots, .ods, .hwp, .602, .dotm, .dotx, .docm, .docx, .DOT, .3dm, .max, .3ds, .xm, .txt, .CSV, .uot, .RTF, .pdf, .XLS, .PPT, .stw, .sxw, .ott, .odt, .DOC, .pem, .p12, .csr, .crt, .key

Non tutti i file vengono zippati, il ransomware risparmia i file che, all'interno del percorso, contengono le seguenti stringhe:
tmp, winnt, Application Data, AppData, PerfLogs, Program Files (x86), Program Files, ProgramData, temp, Recovery, $Recycle.Bin, System Volume Information, Boot, Windows.

Al termine dell'operazione, Bart crea sul desktop dell'utente i file recover.txt e recover.bmp: mentre il file con estensione .bmp viene impostato come wallpaper di Windows il file .txt viene aperto automaticamente da blocco note. All'interno del messaggio troviamo l'ID univoco assegnato al computer della vittima e il sito TOR a cui bisogna collegarsi per ulteriori informazioni su come procurarsi i bitcoin, l'ammontare del riscatto e l'indirizzo a cui pagare.


Recupero dei dati

AVG, azienda nota nel campo della sicurezza informatica, ha rilasciato un tool (AVG Decryption Tool for Bart) per recuperare i dati presi in ostaggio dal ransomware Bart. Al fine di recuperare la password dei file zip, il tool richiede che l'utente disponga della versione cifrata e non di uno stesso file (la password è uguale per tutti i file). Una volta trovata la password è possibile recuperare i restanti file presi in ostaggio dal ransomware.

Passo 1
Procurarsi ed eseguire AVG Decryption Tool for Bart. Il tool può essere scaricato da QUI

Passo 2
Avviato il tool ci si trova dinanzi alla schermata di benvenuto mostrata in FIG 1. Cliccare sul pulsante Avanti per proseguire.
AVG Decryption Tool for Bart, (1/5) Welcome
FIG 1 - AVG Decryption Tool for Bart, (1/5) Welcome
Passo 3
Nella schermata successiva viene chiesto di specificare il disco/partizione o una cartella (cliccando su Add Folder) dove risiedono i nostri dati cifrati dal ransomware. Una volta specificato il disco/partizione, cliccare su Avanti.

FIG 2 - AVG Decryption Tool for Bart, (2/5) Select a location to decrypt

Passo 4
In questo passo dobbiamo passare la programma la versione cifrata (nella prima casella) e quella originale (nella seconda casella) di uno stesso file quindi verrà abilitato il pulsante Avanti su cui dobbiamo cliccare con il mouse per proseguire.
AVG Decryption Tool for Bart, (3/5) Add an example file
FIG 3 - AVG Decryption Tool for Bart, (3/5) Add an example file
Passo 5
Per avviare il processo di recupero password del file zip bisogna cliccare su Start (FIG 4).
AVG Decryption Tool for Bart, (4/5) Crack the password
FIG 4 - AVG Decryption Tool for Bart, (4/5) Crack the password
Passo 6
Trovata la password basterà cliccare ancora su Avanti per procedere al recupero di tutti i dati. Non resta che attendere il termine dell'operazione.

AVG Decryption Tool for Bart, (4/5) Crack the password, password trovata
FIG 5 - AVG Decryption Tool for Bart, (4/5) Crack the password, password trovata



Programmazione Batch: Verificare se lo script è stato eseguito come Amministratore (privilegi elevati)

In alcuni casi può essere utile verificare se lo script batch da noi realizzato è stato eseguito come amministratore (con privilegi elevati). Un modo veloce per effettuare la verifica all'interno dello script è attraverso una particolare variabile d'ambiente: %errorlevel%. Questa variabile contiene un valore relativo all'esito di gran parte dei comandi/programmi: quando un comando viene portato a termine correttamente il valore di %errorlevel% sarà uguale a 0.

Alcuni comandi, come openfiles, NET SESSION, ecc. richiedono privilegi elevati per essere eseguiti e questo li rende adatti al nostro scopo infatti, tentando di eseguire questi comandi normalmente (senza privilegi elevati), verranno terminati con errore e alla variabile %errorlevel% verrà assegnato un valore diverso da 0 (FIG 1).


Variabile d'ambiente %errorlevel%
FIG 1 - Variabile d'ambiente %errorlevel%


Nello script batch che è possibile scaricare dal link DOWNLOAD la verifica viene effettuata proprio con il comando openfiles. L'output del comando viene scartato dirottandolo su NUL (>nul 2>&1) e viene verificata la variabile d'ambiente %errorlevel%: se la variabile ha valore 0 allora il nostro script è stato eseguito con privilegi elevati e possiamo proseguire con le altre istruzioni, in caso contrario lo script termina senza eseguire altre operazioni. Le istruzioni principali del nostro script sono dunque le seguenti:


openfiles>nul 2>&1
if %errorlevel%==0 goto AdminOK






mercoledì 27 luglio 2016

PowerShell: Visualizzare le informazioni sulla scheda audio utilizzando Get-Wmiobject

Windows Management Instrumentation (WMI) è una tecnologia integrata in tutti i sistemi operativi Microsoft, a partire da Windows ME, fondamentale per l'amministrazione dei sistemi Windows (sia in locale che da remoto). WMI consente di visualizzare e gestire un'ampia gamma di informazioni in maniera uniforme. Per accedere alle potenzialità di tale tecnologia tramite PowerShell è necessario utilizzare il cmdlet Get-WmiObject. La tecnologia WMI fa uso di classi per descrivere le risorse che possono essere gestite. Il primo problema da affrontare è proprio quello di conoscere cosa si può fare con WMI e quali sono le classi utilizzate:  sono disponibili centinaia di classi WMI ciascuna delle quali contiene decine di proprietà relative ad una specifica risorsa. Per visualizzare l'elenco delle classi WMI in PowerShell è possibile utilizzare il seguente comando
Get-WmiObject -List

Per visualizzare le informazioni sulla scheda audio installata nel sistema utilizzeremo la classe Win32_SoundDevice con il seguente comando
Get-WmiObject -Class "Win32_SoundDevice" | Fl * -Force



Get-WmiObject proprietà scheda audio
FIG 1 - Get-WmiObject proprietà scheda audio

martedì 26 luglio 2016

MS Exchange: Elencare i Distribution Groups tramite EMS

Per elencare i gruppi di distribuzione (Distribution Group) definiti sull'infrastruttura di posta MS Exchange è possibile utilizzare il cmdlet Get-DistributionGroup tramite EMS (Exchange Management Shell).
Per default vengono visualizzati solo i primi 1000 item pertanto, se nell'infrastruttura sono presenti più di 1000 gruppi di distribuzione, è necessario utilizzare il parametro -ResultSize così come indicato di seguito.

Get-DistributionGroup -ResultSize Unlimited

Con il cmdlet  Get-DistributionGroup possiamo anche verificare se esiste un determinato gruppo di distribuzione passando il nome al cmdlet: Get-DistributionGroup <nome_gruppo_distribuzione>

Ad es. per visualizzare informazioni sul gruppo di distribuzione denominato "supporto"
Get-DistributionGroup supporto
oppure
Get-DistributionGroup -Identity supporto




Il cmdlet accetta anche caratteri wildcard
Get-DistributionGroup suppor*

Utilizzando il parametro -Anr, è possibile utilizzare una stringa parziale che verrà ricercata tra diversi attributi del gruppo di distribuzione in particolare in CommonName (CN)DisplayNameFirstNameLastName e Alias.
Il seguente comando restituisce tutti i gruppi di distribuzione in cui all'interno di uno degli attributi indicati precedentemente compare la stringa "supporto"
Get-DistributionGroup -Anr supporto 

Per visualizzare maggiori dettagli relativamente ad un gruppo di distribuzione è possibile utilizzare un cmdlet Format come ad es. Format-List
Get-DistributionGroup -Identity supporto | Format-List

lunedì 25 luglio 2016

PowerShell: Verificare l'esistenza di un oggetto con Test-Path

Il cmdlet Test-Path viene generalmente utilizzato per verificare l'esistenza di un percorso specifico, tuttavia può essere utilizzato per verificare anche altri tipi di oggetti. La sua sintassi è la seguente:

Test-Path [-Path] <String[]> [-Credential <PSCredential> ] [-Exclude <String[]> ] [-Filter <String> ] [-Include <String[]> ] [-InformationAction <System.Management.Automation.ActionPreference> {SilentlyContinue | Stop | Continue | Inquire | Ignore | Suspend} ] [-InformationVariable <System.String> ] [-IsValid] [-NewerThan <Nullable [System.DateTime]> ] [-OlderThan <Nullable [System.DateTime]> ] [-PathType <TestPathType> {Any | Container | Leaf} ] [-UseTransaction] [ <CommonParameters>]

oppure


Test-Path -LiteralPath <String[]> [-Credential <PSCredential> ] [-Exclude <String[]> ] [-Filter <String> ] [-Include <String[]> ] [-InformationAction <System.Management.Automation.ActionPreference> {SilentlyContinue | Stop | Continue | Inquire | Ignore | Suspend} ] [-InformationVariable <System.String> ] [-IsValid] [-NewerThan <Nullable [System.DateTime]> ] [-OlderThan <Nullable [System.DateTime]> ] [-PathType <TestPathType> {Any | Container | Leaf} ] [-UseTransaction] [ <CommonParameters>]

Parametri principali

-Credential
Permette di specificare le credenziali con cui eseguire il comando. É possibile indicare il nome utente (come ad es. "utente1"), il nome utente e il dominio (ad es. "Contoso\utente1") oppure passare un oggetto generato da Get-Credential contenente le credenziali.

-Exclude
Esclude un elemento dalla verifica. Ad es. se si intende escludere i file di testo inclusi in una cartella possiamo utilizzare il parametro -Exclude "*.txt".

-Filter
Permettere si specificare un filtro relativo al parametro -Path.

-Include
L'opposto di Exclude, consente di includere elementi da verificare.

-IsValid
Indipendentemente se il percorso esista o meno, con il parametro IsValid si va a verificare se la sintassi del path specificato è corretta. Restituisce True se la sintassi è corretta e False in caso contrario.

-LiteralPath
Specifica il percorso che si intende verificare. A differenza del parametro Path, il valore di LiteralPath è utilizzato esattamente come digitato: non sono supportati caratteri wildcard e i caratteri di escape vanno racchiusi tra apici singoli.

-Path
Specifica il percorso da testare. Accetta caratteri wildcard. I percorsi che contengono spazi vanno racchiusi tra apici.

-PathType
Permette di specificare se l'oggetto indicato dal parametro Path è di un particolare tipo:
Container. Un elemento che contiene altri elementi come ad es. una directory.
Leaf. Un elemento singolo che non contiene altri elementi come ad es. un file.
Any.  Qualsiasi tipo.

PowerShell, Test-Path
FIG 1 - PowerShell, Test-Path


Vediamo qualche esempio.



Esempio 1
Test-Path -Path "C:\Users\Virtual\Desktop\Cartella Archivio"
Verifica se la cartella C:\Users\Virtual\Desktop\Cartella Archivio esiste in tal caso restituisce True in caso contrario False.

Esempio 2
Test-Path -Path "C:\Progetti\c#\*" -exclude *.cpp
Verifica se la cartella C:\Progetti\c#\ contiene file ad esclusione dei file con estensione .cpp.

Esempio 3
Test-Path -Path HKLM:\Software\Microsoft\PowerShell\
Il cmdlet Test-Path può essere utilizzato anche per verificare la presenza di chiavi di registro. In questo esempio Test-Path verifica se esiste la chiave di registro HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell.

Esempio 4
Test-Path Env:\OS
Verifica se è definita la variabile d'ambiente OS.

Esempio 5
Test-Path Alias:\cls
Verifica la presenza dell'Alias cls (Clear-Host) in PowerShell.

Esempio 6
Test-Path -Path C:\Temp -PathType Container
Verifica se l'oggetto indicato da Path è un Container, cioè se può contenere altri oggetti come ad es. una directory che contiene altri file e sottodirectory. In questo specifico caso la directory C:\Temp è di tipo Container pertanto verrà restituito True

Esempio 7
Test-Path -Path C:\Temp -PathType Leaf
il tipo Leaf verifica che l'oggetto indicato dal parametro Path non sia in grado contenere altri oggetti.