Verificare le patch di vulnerabilità per Meltdown e Spectre (c.d. Speculation Control)

MeltdonSpectreVerify Microsoft ha messo a disposizione un modulo PowerShell per verificare le compatibilità delle patch di vulnerabilità: il c.d. Speculation Control. Ecco come installarlo

Il 3 gennaio 2018, Microsoft ha iniziato a pubblicare il suo Security Bulletin mensile in anticipo per alcune piattaforme a causa dei nuovi difetti di sicurezza della CPU, comunemente denominati “Meltdown” e “Spectre”. Nella KB4072699 Microsoft ha pubblicato le patch per la sicurezza e per la compatibilità col software anti-malware.

Microsoft ha riscontrato un problema di compatibilità con alcuni prodotti software antivirus. Il problema di compatibilità si verifica quando le applicazioni antivirus effettuano chiamate non supportate nella memoria del kernel di Windows.

Lo script powershell che segue abilita il comando  Get-SpeculationControlSettings che consente di verificare se sono stati applicate le patch per la vulnerabilita suddetta.

Ecco lo script:

$DownloadLink="https://gallery.technet.microsoft.com/scriptcenter/Speculation-Control-e36f0050/file/185444/1/SpeculationControl.zip"
$Filezip=$env:temp+"\SpeculationControl.zip"
$ModuliPS=$PSHome+"\Modules\"
$SCpath=$PSHome+"\Modules\SpeculationControl\"
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($DownloadLink,$Filezip)
$shell = New-Object -COM Shell.Application
$target = $shell.NameSpace($ModuliPS)
$zip = $shell.NameSpace($Filezip)
$target.CopyHere($zip.Items(), 16)
cd $SCpath
$StatoIniziale=get-ExecutionPolicy
set-executionpolicy unrestricted -Force
import-module $SCpath\SpeculationControl.psm1
set-executionpolicy $StatoIniziale -Force
Get-SpeculationControlSettings

Questo il risultato quando nessuna patch è stata applicata:

Speculation control settings for CVE-2017-5715 [branch target injection]
For more information about the output below, please refer to https://support.mic
rosoft.com/en-in/help/4074629

Hardware support for branch target injection mitigation is present: False
Windows OS support for branch target injection mitigation is present: False
Windows OS support for branch target injection mitigation is enabled: False

Speculation control settings for CVE-2017-5754 [rogue data cache load]

Hardware requires kernel VA shadowing: True
Windows OS support for kernel VA shadow is present: False
Windows OS support for kernel VA shadow is enabled: False

Suggested actions

 * Install BIOS/firmware update provided by your device OEM that enables hardwar
e support for the branch target injection mitigation.
 * Install the latest available updates for Windows with support for speculation
 control mitigations.
 * Follow the guidance for enabling Windows Server support for speculation contr
ol mitigations described in https://support.microsoft.com/help/4072698


BTIHardwarePresent             : False
BTIWindowsSupportPresent       : False
BTIWindowsSupportEnabled       : False
BTIDisabledBySystemPolicy      : False
BTIDisabledByNoHardwareSupport : False
KVAShadowRequired              : True
KVAShadowWindowsSupportPresent : False
KVAShadowWindowsSupportEnabled : False
KVAShadowPcidEnabled           : False

Ulteriori informazioni sull’output potranno essere reperite qui

Informazioni sulle patch da applicare potranno essere reperite anche sul sito di OVH Francia o sul sito di Achab (che ringraziamo entrambi pubblicamente).

Annunci

Inventario programmi installati sui PC di un dominio

Find username Vorreste conoscere tutti i programmi installati su ogni PC del vostro dominio ma non sapete fare?

Ecco come realizzare un file txt/csv leggibile da Excel per analizzare i programmi installati.

Ecco come fare:
Create il seguente file con estensione ps1:

$IPconnectedcomputers=Get-WmiObject -class Win32_ServerConnection -computername localhost -namespace root\CIMV2| where-object {$_.computername -like "*.*.*.*"} | 
select-object computername -unique

# o in alternativa se volete controllare solo determinati PC
# $IPconnectedcomputers = @("PC129","PC179","PC120","PC144","PC37","PC182","PC002","PC156","PC20")

$TimestampReport=get-date -Format yyyyMMdd
$ReportSavePath=[environment]::getfolderpath("mydocuments")+"\Report\"+$TimestampReport
new-item $ReportSavePath -type directory -erroraction silentlycontinue

foreach($ip in $IPconnectedcomputers){

if ((test-connection $ip.computername -Count 1 -erroraction silentlycontinue).statuscode -eq 0)
 {
 #$pc=($ip.computername).Insert(0, "\\")
 $pc=[System.Net.Dns]::GetHostEntry($ip.computername).HostName
 write-host Collegamento a $pc
 gwmi win32_product -ComputerName $pc -erroraction silentlycontinue | select-object vendor,caption,version,__SERVER|Export-Csv -NoTypeInformation -force 
"$ReportSavePath\$PC.txt"
 write-host Fine connessione con $pc
 }
else
 {
 write-host Collegamento a $ip IMPOSSIBILE!
 }
}

write-host Elaborazione terminata
write-host premi un tasto per continuare...
read-host

Lanciatelo ed otterete dopo qualche minuto (dipende dal numero dei PC/servers presenti nel dominio) questo risultato:

Report PC da script

 
 
 

 

Saranno elencati tutti i vendors dei programmi ed i relativi programmi e versioni installate.
In un prossimo post spiegherò anche come disinstallare da remoto, con Powershell, i programmi invididuati.

 
N.B.

E’ necessario che gli script Powershell siano resi eseguibili (di default lo sono solo quelli firmati).
Per bypassare il problema e rendere eseguibili anche quelli non firmati lanciate Powershell come amministratore (tenete premuto Ctrl-Shift mentre cliccate sul relativo collegamento) e scrivete:

Set-ExecutionPolicy -ExecutionPolicy bypass

Impostare da remoto IP dinamico sui client di un dominio

Remote enable DHCP client Vorreste impostare da remoto il client DHCP dei PC di un dominio?

Mettetevi sul vostro server e usate questi script!

Spesso mi capitano nuove aziende che adottano sui propri PC gli IP statici, e quindi ho creato questi script per evitare di passare per ogni computer e cambiare la configurazione della scheda di rete.
Ecco come fare…

Nel vostro server create, in una share condivisa raggiungibile da tutti i client di un dominio, il file AbilitaDHCP.vbs.
Lo script sarà eseguito da remoto su ogni PC tramite l’utility PSEXEC (quindi scaricate i e scompattate il file psexec.exe nella cartella c:\windows\system32 del server da cui lancerete gli script).
Ecco lo script VBS da creare e condividere:

strComputer = "."
Set objWMIService = GetObject(_
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration " _
        & "where IPEnabled=TRUE")
 
For Each objNetAdapter In colNetAdapters
    errEnable = objNetAdapter.EnableDHCP()
    errEnable = objNetAdapter.SetDNSServerSearchOrder()
Next

Ora create lo script DHCP-DNS-auto-da-remoto.ps1 come di seguito indicato. Quando lo lancerete vi sarà chiesto di inserire il nome del PC;
lo script quindi verificherà su tutte le schede di rete abilitate del PC se il client DHCP è già attivo e poi chiederà se volete abilitarlo.

$PC = read-host "Inserire il nome del PC da controllare"
$test=Get-WmiObject win32_networkadapterconfiguration -computername $PC -erroraction silentlycontinue | where {($_.IPenabled)}
if ($test) {
	$test|ft ipaddress, dhcpenabled, dhcpserver ,DNSServerSearchOrder -AutoSize
	if ($test.dhcpenabled) {
		write-host "L'host"$PC "ha gia' il DHCP attivo"
	} 
	else {
		$Risposta = read-host "Vuoi abilitare DHCP/DNS automatici su"$PC"? (S/N)"
		if ($Risposta -eq "S") {
			psexec -accepteula \\$PC cscript /B /NoLogo \\server\condivisione\AbilitaDHCP.vbs
			psexec -accepteula \\$PC ipconfig /all
			read-host 
			}
	}
}
else {
	write-host Host $PC non raggiungibile
}

Loggare tutti gli accessi ad un dominio e reperire le informazioni del PC


Trace
Vorreste conoscere indirizzo IP, MAC, nome computer e sistema operativo di ogni PC nella rete?

Con lo script giusto eseguito durante il logon possiamo recuperare tutto ciò che ci serve!

Anzitutto bisognerà creare una nuova cartella in c:\windows\logs chiamata LogonLogs

Mkdir %WINDIR%\logs\LogonLogs

Create un file TraceLogon.bat in una cartella condivisa raggiungibile da qualsiasi PC nel dominio quindi modificate il file dello script di logon (dovrebbe essere nella cartella \\nomedominio\netlogon) ed aggiungete una riga che punti al file .bat.
Il file Tracelogon.bat conterrà i seguenti comandi:

@echo off
set GIORNOMESE=%date:~0,2%
SET FileDiLog=\\server\condivisione\\Logon-giorno%GIORNOMESE%.Log
set TAB=	
echo. >>%FileDiLog%

REM ========= VERIFICA TIPO OS ===============
FOR /F "TOKENS=1 DELIMS=." %%O IN ('wmic path Win32_OperatingSystem get version ^| FIND /i "."') DO SET TipoOS=%%O
FOR /F "TOKENS=1 DELIMS=" %%P IN ('wmic path Win32_OperatingSystem get caption ^| FIND /i "Windows"') DO SET DescrizioneOS=%%P

echo ================================= 
echo ================================= >>%FileDiLog%


REM ========= DATA ORA ===============
for /f "tokens=1-4 delims=/ " %%a in ('date /T') do set day=%%a
for /f "tokens=2 delims=/ " %%b in ('date /T') do set month=%%b
for /f "tokens=3 delims=/ " %%c in ('date /T') do set year=%%c
set TODAY=%day%-%month%-%year%
for /f "tokens=1 delims=: " %%h in ('time /T') do set hour=%%h
for /f "tokens=2 delims=: " %%m in ('time /T') do set minutes=%%m
set NOW=%hour% %minutes%
echo Ora%TAB%%TODAY% %NOW% 
echo Ora%TAB%%TODAY% %NOW%>>%FileDiLog%


REM ========= UTENTE, NOME COMPUTER ===============
echo Utente%TAB%%USERNAME%
echo Utente%TAB%%USERNAME%>>%FileDiLog%
echo PC%TAB%%COMPUTERNAME%
echo PC%TAB%%COMPUTERNAME%>>%FileDiLog%
echo OS%TAB%%DescrizioneOS%
echo OS%TAB%%DescrizioneOS% >>%FileDiLog%

REM ========= INDIRIZZO IP ===============
SET IPADDR=
SET OLDIPADDR=
setlocal ENABLEDELAYEDEXPANSION
if [%TipoOS%]==[5] (set COMANDONETSH1=netsh interface ip show address) ELSE (set COMANDONETSH1=netsh interface ipv4 show addresses) 
FOR /F "TOKENS=2* DELIMS= " %%A IN ('%COMANDONETSH1% ^| FIND /i "IP"') DO call :AggiungiIPADDR %%B
echo IP%TAB%%IPADDR%>>%FileDiLog%
endlocal
goto fine-ipaddr
:AggiungiIPADDR
set IP=%1
echo IP%TAB%!IP!
SET IPADDR=!IPADDR!!IP!%TAB%
goto :eof
:fine-ipaddr



REM ========= INDIRIZZI MAC ===============
setlocal ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN ('ipconfig /all ^| FIND /i "fisico"') DO call :AggiungiMAC "%%A" "%%B"
echo MAC%TAB%%ListaMAC%>>%FileDiLog%
endlocal
goto fine-MAC
:AggiungiMAC
if %2=="" (
set MAC=%1
set MAC=!MAC: =!
set MAC=!MAC:"=!
echo MAC%TAB%!MAC!
SET ListaMAC=!ListaMAC!!MAC!%TAB%
set MAC=
) else (
set MAC=%2
set MAC=!MAC: =!
set MAC=!MAC:"=!
echo MAC%TAB%!MAC!
SET ListaMAC=!ListaMAC!!MAC!%TAB%
set MAC=
)
goto :eof
:fine-MAC


REM ========= INDIRIZZO DNS ===============
SET IPADDR=
SET OLDIPADDR=
if [%TipoOS%]==[5] (set COMANDONETSH2=netsh interface ip show dns) ELSE (set COMANDONETSH2=netsh interface ipv4 show dnsserver) 
setlocal ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN ('%COMANDONETSH2% ^| FIND /i "."') DO call :AggiungiDNS "%%A" "%%B"
echo DNS%TAB%%ListaDNS%>>%FileDiLog%
endlocal
goto fine-DNS
:AggiungiDNS
if %2=="" (
set DNS=%1
set DNS=!DNS: =!
set DNS=!DNS:"=!
echo DNS%TAB%!DNS!
SET ListaDNS=!ListaDNS!!DNS!%TAB%
set DNS=
) else (
set DNS=%2
set DNS=!DNS: =!
set DNS=!DNS:"=!
echo DNS%TAB%!DNS!
SET ListaDNS=!ListaDNS!!DNS!%TAB%
set DNS=
)
goto :eof
:fine-DNS

Ecco un esempio delle informazioni che il batch recupera:

================================= 
Ora	19-03-2015 03 26
Utente	Pippo
PC	PC-20
OS	Microsoft Windows 7 Professional   
IP	192.168.143.48 	127.0.0.1	
MAC	C8-9C-DC-D0-6E-38	
DNS	192.168.143.9	192.168.143.10	

Create poi un file c:\Windows\System32\SpostaLogonLog.bat con il seguente contenuto:

@echo off
set CARTELLAORIGINE=c:\cartellacondivisa
set GIORNOMESE=%date:~0,2%
move /y %CARTELLAORIGINE%\Logon-Giorno*.log %WINDIR%\logs\LogonLogs
echo LOG DEGLI ACCESSI GIORNO %giornomese% > %CARTELLAORIGINE%\Logon-Giorno%giornomese%.log

Pianificate l’avvio del file SpostaLogonLog.bat (come amministratore) alle 0:00 ogni giorno.

Quindi potrete vedere nella cartella %WINDIR%\logs\LogonLogs tutti i files di log dell’ultimo mese.

Cambiare i permessi ai files con Powershell

Find username

Vorreste cambiare i permessi di una serie di files usando Powershell ma non sapete come fare?

Ecco la funzione per voi!

Mi è capitato che un virus cambiasse tutti i permessi dei files EXE nella cartella di Windows, con le conseguenze che potete immaginare.
Quindi ho creato questa funzione per Powershell che modifica i premessi di un file.

La sintassi è questa:

ImpostaAutorizzazioni -Percorso "percorso_del_file" -IdentitaDaAutorizzare "Utente_o_gruppo" -TipoAutorizzazione "Tipo_di_permesso"


Dove il tipo di permesso può essere: FullControl, ReadAndExecute, Read.

Ecco come realizzare la funzione in Powershell:

function ImpostaAutorizzazioni()
{
Param(
   [Parameter(Mandatory=$True,Position=1)]
   [string]$Percorso,
	
   [Parameter(Mandatory=$True,Position=2)]
   [string]$IdentitaDaAutorizzare,

   [Parameter(Mandatory=$True,Position=3)]
   [ValidateSet("FullControl", "ReadAndExecute", "Read")]
   [string]$TipoAutorizzazione

)


    $Acl = (Get-Item $Percorso).GetAccessControl('Access')
    Write-Host "Percorso:" $Percorso "Utente da autorizzare:" $IdentitaDaAutorizzare "Tipo autorizzazione:" $TipoAutorizzazione
    $RegolaAccesso = New-Object system.security.accesscontrol.filesystemaccessrule(
         $IdentitaDaAutorizzare,$TipoAutorizzazione,"Allow"
    )
    $Acl.SetAccessRule($RegolaAccesso)
    Write-Host $Acl
    $Acl | Set-Acl $Percorso
}

Esempi:
Per permettere all’utente TrustedInstaller il controllo completo del file attrib.exe:

ImpostaAutorizzazioni "C:\Windows\System32\attrib.exe" "NT SERVICE\TrustedInstaller" "FullControl"

Per permettere al gruppo di utenti NOMEDOMINIO\Domain Admins il permesso di lettura/scrittura del file attrib.exe:

ImpostaAutorizzazioni "C:\Windows\System32\attrib.exe" "NOMEDOMINIO\Domain Admins" "ReadAndExecute"

Per cambiare il permesso a tutti i files exe presenti nella cartella c:\programmi\adobe e relative sottocartelle ed assegnare a Everyone il controllo di sola lettura:

get-childitem "c:\programmi\adobe" -recurse -include *.exe | % {ImpostaAutorizzazioni $_.fullname "Everyone" "Read"}


P.S.

Per cambiare i permessi potrebbe essere necessario anche assumere la proprietà (ownership) del file.
In questo caso basterà usare il comando takeown /f nomefile

Lanciare un comando da remoto su ogni PC acceso in un dominio

remote command

Volete lanciare un comando remoto su ogni PC collegato al dominio mentre gli utenti sono connessi? Ad esempio volete inviare un messaggio alla console di ognuno o aggiornare le policies?

Powershell ci da una mano.

Ecco come fare:
Anzitutto è necessario scaricare dal sito di Microsoft il tool PSEXEC presente all’interno dei PsTools.
PsExec consente di lanciare un comando su un PC connesso alla rete senza che l’utente connesso alla console se ne renda conto. Una funzionalità veramente eccezionale di cui non possiamo che ringraziare il grande Mark Russinovich.
Dopo aver scaricato i PsTools vi consiglio di copiare il file psexec.exe nella cartella %windir%\system32.
Una volta che avremo a disposizione questo tool bisognerà capire quali PC sono collegati al nostro server; per questo useremo il comando net session.
Questo comando restituisce l’indirizzo IP di ogni PC connesso al nostro server. Il risultato del comando si presenta così:

C:\Users\Administrator>net session

Computer            Nome utente   Tipo client  In pausa da
------------------------------------------------------------------
\\192.168.143.35    utente1                    1 00.08.45
\\192.168.143.41    utente23                   4 00.01.22
\\192.168.143.42    utente12                   3 00.01.54
\\192.168.143.43    utente16                   6 01.46.35
\\192.168.143.44    utente43                   3 00.00.01
\\192.168.143.46    utente3                   63 00.00.03

Questo ci servirà a comprendere bene il comando che utilizzeremo in Powershell.
Esso infatti acquisisce tutti gli IP dal comando net session e li riutilizza per lanciare un comando dal prompt dei comandi in remoto.
Ecco il piccolo script da lanciare in powershell:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c COMANDO}

Di seguito alcuni esempi pratici:

Aggiornare le group policies su tutti i PC:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c echo n ^|gpupdate /force}

Inviare un messaggio alla console di tutti i PC connessi:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c msg * Riavviare i PC}

Creare una determinata cartella in ogni PC connesso:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c mkdir c:\PIPPO}

Script per aggiungere automaticamente una firma ad Outlook su Exchange 2010/2013

Find username

Vorreste creare una firma in Outlook automaticamente acquisendo le informazioni da Active directory?

Si può fare!


Normalmente in Active directory vengono salvate poche informazioni come nome e cognome, ma è possibile salvare molte più informazioni che possono essere utilizzate per creare automaticamente una firma completa senza che l’utente debba inserire alcuna informazione.
Grazie ad uno script vbs si potrà così creare un oggetto ADSystemInfo che raccoglie tutte le informazioni presenti in Active Directory e mostrarle nella firma. Nella figura qui di seguito potrete notare che è possibile estrarre qualsiasi attributo presente nell’utente da includere nella firma.

ADattributes

Nella seguente immagine troverete impostati i principali attributi utili nell’utilizzo della firma:

UserAD

Ecco un esempio già pronto ed il relativo codice:
Signature

On Error Resume Next 
Set objSysInfo = CreateObject("ADSystemInfo") 
strUser = objSysInfo.UserName 
Set objUser = GetObject("LDAP://" & strUser) 
strName = objUser.FullName 

strNome = objUser.Description 
strUfficio = objUser.physicalDeliveryOfficeName
strReparto = objUser.Department
strTitolo = objUser.Title
strSocieta = objUser.company 
strVia = objUser.streetAddress 
strLocalita = objUser.l
strTelefonoFisso = objUser.telephoneNumber 
strFax = objUser.FacsimileTelephoneNumber
strCellulare = objUser.Mobile
strProvincia = objUser.st
strEmail = objUser.mail

Set objWord = CreateObject("Word.Application") 
Set objDoc = objWord.Documents.Add() 
Set objSelection = objWord.Selection 
Set objEmailOptions = objWord.EmailOptions 
Set objSignatureObject = objEmailOptions.EmailSignature 
Set objSignatureEntries = objSignatureObject.EmailSignatureEntries 
Set objShape = objSelection.InLineShapes.AddPicture("\\NOMESERVER\CONDIVISIONE\logofirma.jpg") 

objSelection.TypeParagraph()
'objSelection.TypeText chr(11)
objSelection.Font.Size = "8" 
objSelection.Font.Name = "Verdana" 
objSelection.Font.Bold = true 
objSelection.TypeText strNome   
if not strTitolo="" then 
	objSelection.Font.Size = "6"  
	objSelection.Font.Bold = false 
	objSelection.Font.Italic = true 
	objSelection.TypeText Chr(11) & strTitolo 
end if
if not strUfficio="" then 
	objSelection.Font.Size = "6"  
	objSelection.Font.Bold = false 
	objSelection.Font.Italic = false 
	objSelection.TypeText Chr(11) & strUfficio 
end if
if not strReparto="" then 
	objSelection.Font.Size = "6"  
	objSelection.Font.Bold = false 
	objSelection.Font.Italic = false 
	objSelection.TypeText Chr(11) & strReparto 
end if 

objSelection.TypeParagraph() 


'objSelection.Style = "No Spacing" 
objSelection.Font.Italic = true 
objSelection.Font.Color = RGB(45,129,81)
objSelection.Font.Size = "8"   
objSelection.Font.Name = "Verdana" 
objSelection.Font.Bold = true 
objSelection.TypeText "NOMEAZIENDA" & Chr(11) 
objSelection.Font.Size = "6"  
objSelection.TypeText "INDIRIZZO" & Chr(11)
objSelection.TypeText "CAP LOCALITA (PROV)" & Chr(11)
objSelection.TypeText "Telefono: NUMERODITELEFONO" & Chr(11)
objSelection.TypeText "Fax: NUMERODIFAX"
if not strCellulare="" then objSelection.TypeText Chr(11) & "Mobile: " & strCellulare
objSelection.TypeText Chr(11) & "E-mail: " & strEmail 
objSelection.TypeParagraph() 

Set objSelection = objDoc.Range() 

objSignature = objSignatureEntries.Add("Firma con logo", objSelection) 
objSignatureObject.NewMessageSignature = "Firma con logo" 
objSignatureObject.ReplyMessageSignature = "Firma con logo" 
objDoc.Saved = True 
objWord.Quit