PowerShell is een vrij gangbare automatiseringstool die vaak wordt gebruikt door zowel malware-ontwikkelaars als informatiebeveiligingsspecialisten.
In dit artikel wordt een manier besproken om PowerShell te gebruiken voor het op afstand verzamelen van gegevens van eindpunten bij het reageren op beveiligingsincidenten. Hiervoor moeten we een script schrijven dat op het eindpunt wordt uitgevoerd, en er zal een gedetailleerde beschrijving van dit script volgen.
function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
{
$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
$path = "$path$computer$date"
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
processid, commandline, parentprocessid
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
localport, remoteaddress, remoteport, owningprocess, state
$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
where author -notlike '*Microsoft*' | where author -ne $null |
where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'
$job = Get-ScheduledJob
$ADS = get-item * -stream * | where stream -ne ':$Data'
$user = quser
$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "AlternativeDataStream"
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
}
}
}Om te beginnen wordt er een functie aangemaakt CSIRT, die een argument zal accepteren - een pad voor het opslaan van de verzamelde gegevens. Aangezien de meeste cmdlets in PowerShell v5 werken, is er een versiecontrole gemaakt voor een correcte werking.
function CSIRT{
param($path)# bij het uitvoeren van het script moet de map voor opslag worden opgegeven
if ($psversiontable.psversion.major -ge 5)Voor het gemak van navigatie door de aangemaakte bestanden zijn er twee variabelen geĆÆnitialiseerd: $date en $Computer, waaraan de computernaam en de huidige datum worden toegewezen.
$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date āItemType 'Directory' -Force | Out-Null
$path = "$path$computer$date"Laten we de lijst met actieve processen van de huidige gebruiker als volgt verkrijgen: we creƫren een variabele $process en wijzen deze de cmdlet get-ciminstance toe met de klasse win32_process. Met de cmdlet Select-Object kunnen we extra uitvoerparameters toevoegen, in ons geval zijn dat parentprocessid (de identificatie van het ouderproces PPID), creationdate (de creatiedatum van het proces), processed (de procesidentificatie PID), processname (de naam van het proces), commandline (de opstartopdracht).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidOm een lijst van alle TCP- en UDP-verbindingen te verkrijgen, creƫren we de variabelen $netTCP en $netUDP en wijzen we deze de cmdlets Get-NetTCPConnection en Get-NetUDPEndpoint toe.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateHet is ook belangrijk om de lijst met geplande taken en opdrachten te weten. Hiervoor gebruiken we de cmdlets get-ScheduledTask en Get-ScheduledJob. We wijzen ze de variabelen $task en $job toe, omdat er in het systeem oorspronkelijk veel geplande taken bestaan, is het goed om legitieme geplande taken te filteren om kwaadaardige activiteiten te identificeren. De cmdlet Select-Object kan hierbij helpen.
$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname | where author -notlike '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task sluit auteurs uit die āMicrosoftā, ā*@%systemroot%*ā bevatten, evenals ālegeā auteurs
$job = Get-ScheduledJobIn het NTFS-bestandssysteem bestaat er een concept dat alternatieve datastromen (Alternate Data Streams, ADS) wordt genoemd. Dit betekent dat een bestand in NTFS extra kan worden gekoppeld aan meerdere datastromen van willekeurige grootte. Met ADS kunnen gegevens worden verborgen die niet zichtbaar zijn via standaardcontroles van het systeem. Hierdoor kan kwaadaardige code worden ingevoegd en/of gegevens worden verborgen.
Om alternatieve datastromen in PowerShell weer te geven, gebruiken we de cmdlet get-item en de ingebouwde Windows-tool stream met het symbool * om alle mogelijke stromen te bekijken, hiervoor creƫren we de variabele $ADS.
$ADS = get-item * -stream * | where stream āne ':$Data' Het is ook nuttig om de lijst van gebruikers die zijn ingelogd op het systeem te weten, hiervoor creĆ«ren we de variabele $user en wijzen we deze de uitvoering van het programma quser toe.
$user = quser Aanvallers kunnen wijzigingen aanbrengen in de opstartconfiguratie om zich in het systeem te vestigen. U kunt de opstartobjecten bekijken met de cmdlet Get-ItemProperty.
Laten we twee variabelen maken: $runUser ā om de opstartconfiguratie onder de gebruikersnaam te bekijken en $runMachine ā om de opstartconfiguratie onder de computernamen te bekijken.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Om alle informatie in verschillende bestanden op te slaan, creƫren we een array met variabelen en een array met bestandsnamen.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processen", "TCPVerbinden", "UDPVerbinden", "TaakGepland", "Gebruikers", "RunUser", "RunMachine",
"GeplandeTaak", "Alternatieve Gegevensstroom"En, met behulp van een for-lus, worden de verkregen gegevens in bestanden opgeslagen.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Na het uitvoeren van het script zullen er 9 tekstbestanden worden aangemaakt die de benodigde informatie bevatten.
Tegenwoordig kunnen cyberbeveiligingsspecialisten PowerShell gebruiken om de informatie te verrijken die nodig is voor het oplossen van diverse taken in hun werk. Door het script aan de opstartconfiguratie toe te voegen, kunnen zij bepaalde informatie verzamelen zonder dumps, afbeeldingen, enz. te maken.
Bron: habr.com
