Aanwezigheid patches controleren

Petya/NotPetya heeft ons onder andere geleerd dat het belangrijk is je patches te controleren. Dat kan makkelijk gedaan worden via de Get-Hotfix cmdlet in PowerShell. Laten wij verder bouwen op dit concept om te kijken hoe wij op een quick & dirty manier kunnen zien hoe het ervoor staat met onze patch-situatie.

In dit voorbeeld gebruiken we Get-Hotfix op een enkele computer. Met de -ID parameter en de desbetreffende knowledge base-code kan je zien of de patch aanwezig is om je computer. In dit voorbeeld kijken wij naar de volgende Petya-patches:

• Windows 7 / Windows Server 2008: KB4012212

• Windows 8 / Windows Server 2012: KB4012217, KB4015551, KB4019216

• Windows 10 / Windows Server 2012 R2: KB4012216, KB4015550, KB4019215

• Windows Server 2016: KB4013429, KB4019472, KB4015217, KB4015438, KB4016635

Op een Windows 7-systeem gebruik je bijvoorbeeld de volgende opdracht:

Get-Hotfix -id KB4012212

Als je meerdere hotfixes wilt controleren op bijvoorbeeld een Windows 8-machine typ je:

Get-Hotfix -id KB4012217,KB4015551,KB4019216

Let op dat je geen spaties tussen de verschillende codes plaatst, alleen komma's.

Als je wilt controleren of andere computers gepatcht zijn gebruik je de -ComputerName parameter:

Get-Hotfix -id KB4012212 -computername Jon-Desktop

Je kan een lijst van computernamen in een variabele plaatsen en alle hotfix-rapporten aanroepen door de volgende regels te typen.

$computerstocheck = @("JON-NUC","SERVER")

ForEach ($computer in $computerstocheck) {

Get-Hotfix -id KB4012212 -ComputerName $computer

}

Hieronder zie je een voorbeeld van de resultaten die je krijgt als je zo'n opdracht geeft.

Als je een foutmelding krijgt, weet je dat je deze patches niet hebt geïnstalleerd.

Schakel kwetsbare versies van SMB uit

Draait je systeem nog steeds SMB1? Op Windows 8 en Windows Server 2012-systemen zit een ingebouwde cmdlet die gericht is op aanwezige SMB versies die draaien op je systeem genaamd Set-SMBServerConfiguration. Je zal deze waarschijnlijk niet vaak gebruiken, maar we laten je toch even zien hoe je SMB1 uitschakelt.

Set-SmbServerConfiguration -EnableSMB1Protocol $false

Voor Windows 8.1, Windows 10, Windows Server 2012 R2 en Windows Server 2016-systemen gebruik je het volgende commando:

Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

Na het invoeren van dit commando hoef je niks meer te doen. De wijzigingen worden direct ingevoerd en zegt ervoor dat Wannacrypt en NotPetya je in elk geval niet meer lastig kunnen vallen.

Als je nog op een oudere versie van Windows draait zal je wat meer moeite moeten doen. Windows XP heeft geen Powershell, maar dat is wel het laatste waar je je zorgen om moet maken als je dit besturingssysteem nog steeds draait. Als je Windows Vista, Windows Server 2008 (R2) en Windows 7 draait zal je het register moeten wijzigen met het volgende commando:

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 -Force

Als het register gewijzigd is, moet je je besturingssysteem opnieuw opstarten.

Monitor succesvolle of gefaalde back-up-pogingen

Mocht je nou toch besmet raken door ransomware, dan is het belangrijk een recente back-up bij de hand te hebben. Dat betekent echter wel dat je dus regelmatig back-ups zal moeten maken en het is natuurlijk fijn als je dat proces kan automatiseren.

In inspiratie voor dit script komt van Titus1024 van Spiceworks, we hebben het script gewijzigd om het wat duidelijker over te laten komen. Het script pakt de huidige datum en slaat de output op in een variabele, kijkt naar de datum van de laatste back-up-poging, de laatste succesvolle back-up, alle succesvolle back-ups en de laatste foutmelding van een succesvolle back-up. Deze gegevens worden met elkaar vergeleken en het resultaat wordt verstuurd in een e-mail met de bijbehorende status.

Er zijn wel een paar dingen waarop je moet letten:

  • In Windows Server 2008 R2 moet je niet alleen de Windows Server Backup-rol geïnstalleerd hebben, maar ook de command line tools feature, dan kan je alle commando's uitvoeren die door het script worden aangevraagd. In nieuwere versies van Windows server is het hebben van de Back-up-rol voldoende.
  • Voordat je het script uitrolt in de productie-omgeving, wijzig de placeholder e-mail-adressen en voeg de juiste SMTP-gegevens toe.
  • Vergeet de afsluitende accolades niet, anders werkt het script sowieso niet.

$Date=Get-Date; $Date=$Date.AddDays(-1).ToShortDateString()

$WBSummary=Get-WBSummary

$ResultOfLastBackup=$WBS.LastBackupResultDetailedHR

$TimeOfLastSuccessfulBackup=$WBS.LastSuccessfulBackupTime.ToShortDateString()

$LastBackup=$WBSummary.LastBackupTime

$BackupsAvailable=$WBSummary.NumberOfVersions

$ErrorMessage=Get-WBJob -Previous 1; $ErrorMessage=$ErrorDesc.ErrorDescription

[email protected]"

Date: $TimeOfLastSuccessfulBackup

Backups Available: $BackupsAvailable

"@

[email protected]"

Last Backup: Failed

Date: $LastBackup

Reason: $ErrorMessage

"@

[email protected]"

Last Backup: Failed

Date: $LastBackup

Last Successful Backup: $TimeOfLastSuccessfulBackup

Reason: $ErrorMessage

"@

if($ResultOfLastBackup -eq 0){

Send-MailMessage -To "[email protected]" -From "[email protected]" -Subject "Backup Successful - $ENV:COMPUTERNAME" -Body $SuccessfulBackupEmailMessageBody -SmtpServer smtp.gmail.com

}

elseif($ResultOfLastBackup -ne 0 -or $TimeOfLastSuccessfulBackup -lt $Date){

if($TimeOfLastSuccessfulBackup -lt $Date){

Send-MailMessage -To "[email protected]" -From "[email protected]" -Subject "ALERT to a Failed Backup Attempt - $ENV:COMPUTERNAME" -Body $RecurringFailedBackupEmailMessageBody -SmtpServer smtp.gmail.com

}

else{

Send-MailMessage -To "[email protected]" -From "[email protected]" -Subject "ALERT to a Failed Backup Attempt - $ENV:COMPUTERNAME" -Body $FailedBackupEmailMessageBody -SmtpServer smtp.gmail.com

} }

Monitor je Domain administrators groep

Om te kijken hoe een standaard membership eruit ziet voer je het volgende commando in:

Get-ADGroupMember -Server yourdomain.tld -Identity "Domain Admins"

De login Ids (een property die SAMAccountName heet) willen wij in dit voorbeeld exporteren naar een apart bestand. We zouden deze informatie als platte tekst kunnen exporteren, maar laten we kiezen voor XML voor het geval we dit script later willen uitbreiden.

Get-ADGroupMember -Server yourdomain.tld -Identity "Domain Admins" |

Select-Object -ExpandProperty samaccountname |

Export-Clixml -Path 'C:\powershell\domainadminbaseline.xml'

Tijd om wat variabelen te declareren: de datum van vandaag, het pad naar de baseline XML en diens bestandshash, het pad naar een nieuwe XML-bestand die wordt aangemaakt wanneer het script wordt uitgevoerd en een placeholder variabel:

$HashOfBaselineAdmins = Get-FileHash -Path 'c:\powershell\domainadminbaseline.xml' |

Select-Object -expandProperty Hash

$Date = Get-Date

$PathToCurrentAdmins = 'c:\powershell\domainadmintest.xml'

$Delta = ''

Voer vervolgens het Get-ADGroupMember-commando nogmaals uit om de huidige resultaten van een group membership tevoorschijn te halen:

Get-ADGroupMember -Server yourdomain.tld -Identity 'Domain Admins' |

Select-Object -ExpandProperty samaccountname |

Export-Clixml -Path $PathToCurrentAdmins -Force

Kijk naar de hash van dit nieuwe bestand en sla dit op in een variabele die we kunnen gebruiken als vergelijkingsmateriaal.

$HashOfCurrentAdmins = Get-FileHash -Path $PathToCurrentAdmins | Select-Object -expandProperty Hash

Nu kunnen we beginnen met vergelijken:

If ($HashOfCurrentAdmins -ne $HashOfBaselineAdmins){

$Delta = 'Yes'

$WriteChangesMessage = 'Domain Admins membership change noted on: ' + $date

$WriteChangesMessage | Out-File -FilePath 'C:\powershell\changenoted.txt' -Append -Force

} else {

$Delta = 'No'

$WriteNoChangesMessage = 'Domain Admins membership is the same as it was as of: ' + $Date

$WriteNoChangesMessage | Out-File -FilePath 'C:\powershell\nochange.txt' -Append -Force

}

Ten slotte voeg je wat logica toe: als de delta variabele "Yes" is, stuur dan een e-mail-bericht en stuur die naar jezelf:

If ($Change -eq 'Yes') {

Send-MailMessage -From [email protected] -to [email protected] -Subject 'Domain Admins group membership change detected' -Body 'A change in the membership of the Domain Admins group has been noted.' -Attachments $PathToCurrentAdmins

}

Laat je computer praten

Deze truc is iets minder technisch dan de andere vier tips, maar kan heel goed van pas komen. Je hebt slechts drie regels aan PowerShell-opdrachten nodig om je computer tegen je te laten praten. Voeg eerst de onderdelen toe die je nodig hebt:

Add-Type -AssemblyName System.Speech

Declareer vervolgens een variabele die een .NET object aanmaakt met een functie die je later kan aanroepen. Dit bespaart je wat typwerk en kan gezien worden als een snelkoppeling. Wij noemen deze variabele $talk.

$talk = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer

Tijd om je systeem te laten praten, roep de "Speak"-property van je $talk .NET-object aan door de volgende opdracht in te typen:

$talk.Speak('Hello. Please take me to your leader.')

Het mooie van deze truc is dat je dit aan praktisch aan elk (bestaand) script kan toevoegen waardoor je altijd gewaarschuwd kan worden als er iets belangrijks is uitgeschakeld of mis gaat als je niet met je neus op het scherm zit.

Dit script zou bijvoorbeeld goed van pas kunnen komen als het membership in je domein admins groep is veranderd (zoals in het vorige voorbeeld) of als je een groep computers naar voren wilt halen die een kritieke patch missen. Mogelijkheden en toepassingen genoeg en dat met slechts drie regeltjes PowerShell code.