PowerShell gebruiken om incidentinformatie te verzamelen

PowerShell is een vrij veel voorkomende automatiseringstool die vaak wordt gebruikt door zowel malware-ontwikkelaars als informatiebeveiligingsspecialisten.
In dit artikel wordt de mogelijkheid besproken om PowerShell te gebruiken om op afstand gegevens van eindapparaten te verzamelen bij het reageren op informatiebeveiligingsincidenten. Om dit te doen, moet u een script schrijven dat op het eindapparaat wordt uitgevoerd en dan zal er een gedetailleerde beschrijving van dit script zijn.

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 '*Майкрософт*' | 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
		}

	}

}

Maak een functie om aan de slag te gaan CSIRT-extensie, waarvoor een argument nodig is: het pad om de ontvangen gegevens op te slaan. Omdat de meeste cmdlets in Powershell v5 werken, is de PowerShell-versie gecontroleerd op juiste werking.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Om de navigatie door de aangemaakte bestanden te vergemakkelijken, worden twee variabelen geïnitialiseerd: $date en $Computer, waaraan de computernaam en de huidige datum zullen 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"

We krijgen de lijst met actieve processen namens de huidige gebruiker als volgt: maak een variabele $process en wijs hieraan de cmdlet get-ciminstance toe met de klasse win32_process. Met behulp van de Select-Object cmdlet kunt u extra uitvoerparameters toevoegen. In ons geval zijn dit parentprocessid (bovenliggende proces-ID PPID), creationdate (procesaanmaakdatum), verwerkt (proces-ID PID), procesnaam (procesnaam), commandline ( opdracht uitvoeren).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

Om een ​​lijst met alle TCP- en UDP-verbindingen op te halen, maakt u de variabelen $netTCP en $netUDP door ze respectievelijk de cmdlets Get-NetTCPConnection en Get-NetTCPConnection toe te wijzen.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

Het zal belangrijk zijn om de lijst met geplande taken en opdrachten te achterhalen. Hiervoor gebruiken we de cmdlets get-ScheduledTask en Get-ScheduledJob. Laten we ze de variabelen $task en $job toewijzen, omdat In eerste instantie zijn er veel geplande taken in het systeem, maar om kwaadaardige activiteiten te identificeren is het de moeite waard om legitieme geplande taken uit te filteren. De Select-Object-cmdlet helpt ons hierbij.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

In het NTFS-bestandssysteem bestaat er zoiets als alternatieve datastromen (ADS). Dit betekent dat een bestand in NTFS optioneel kan worden gekoppeld aan meerdere datastromen van willekeurige grootte. Met ADS kunt u gegevens verbergen die niet zichtbaar zouden zijn via standaard systeemcontroles. Hierdoor is het mogelijk om kwaadaardige code te injecteren en/of gegevens te verbergen.

Om alternatieve datastromen in PowerShell weer te geven zullen we de get-item cmdlet en de ingebouwde Windows stream tool met het * symbool gebruiken om alle mogelijke streams te bekijken, hiervoor maken we de $ADS variabele aan.

$ADS = get-item * -stream * | where stream –ne ':$Data' 

Het zal handig zijn om de lijst met gebruikers te vinden die op het systeem zijn ingelogd; hiervoor zullen we een $user-variabele maken en deze toewijzen aan de uitvoering van het quser-programma.

$user = quser

Aanvallers kunnen wijzigingen aanbrengen in autorun om voet aan de grond te krijgen in het systeem. Als u opstartobjecten wilt bekijken, kunt u de cmdlet Get-ItemProperty gebruiken.
Laten we twee variabelen maken: $runUser - om het opstarten namens de gebruiker te bekijken en $runMachine - om het opstarten namens de computer te bekijken.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

Om ervoor te zorgen dat alle informatie naar verschillende bestanden wordt geschreven, maken we een array met variabelen en een array met bestandsnamen.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

En met behulp van een for-lus worden de ontvangen gegevens naar bestanden geschreven.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

Na het uitvoeren van het script worden er 9 tekstbestanden aangemaakt met daarin de benodigde informatie.

Tegenwoordig kunnen cybersecurityprofessionals PowerShell gebruiken om de informatie te verrijken die ze nodig hebben om verschillende taken in hun werk op te lossen. Door een script toe te voegen aan het opstarten, kunt u wat informatie verkrijgen zonder dumps, afbeeldingen, enz. te verwijderen.

Bron: www.habr.com

Voeg een reactie