Χρήση του PowerShell για τη συλλογή πληροφοριών συμβάντων

Το PowerShell είναι ένα αρκετά κοινό εργαλείο αυτοματισμού που χρησιμοποιείται συχνά τόσο από προγραμματιστές κακόβουλου λογισμικού όσο και από ειδικούς σε θέματα ασφάλειας πληροφοριών.
Αυτό το άρθρο θα εξετάσει τη χρήση του PowerShell για απομακρυσμένη συλλογή δεδομένων από τελικές συσκευές κατά την απόκριση σε συμβάντα ασφάλειας πληροφοριών. Για να το κάνετε αυτό, πρέπει να γράψετε ένα σενάριο που θα εκτελείται στην τελική συσκευή και, στη συνέχεια, θα υπάρχει μια λεπτομερής περιγραφή αυτού του σεναρίου.

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
		}

	}

}

Για να ξεκινήσετε, δημιουργήστε μια συνάρτηση Επέκταση CSIRT, το οποίο θα λάβει ένα όρισμα - τη διαδρομή για την αποθήκευση των ληφθέντων δεδομένων. Λόγω του γεγονότος ότι τα περισσότερα cmdlet λειτουργούν στο Powershell v5, έχει γίνει έλεγχος της έκδοσης PowerShell για σωστή λειτουργία.

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

Για ευκολία πλοήγησης στα αρχεία που δημιουργούνται, αρχικοποιούνται δύο μεταβλητές: $date και $Computer, στις οποίες θα εκχωρηθεί το όνομα του υπολογιστή και η τρέχουσα ημερομηνία.

$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 εκχωρώντας της το cmdlet get-ciminstance με την κλάση win32_process. Χρησιμοποιώντας το cmdlet Select-Object, μπορείτε να προσθέσετε πρόσθετες παραμέτρους εξόδου, στην περίπτωσή μας, αυτές θα είναι parentprocessid (γονικό αναγνωριστικό διαδικασίας PPID), ημερομηνία δημιουργίας (ημερομηνία δημιουργίας διαδικασίας), επεξεργασία (αναγνωριστικό διαδικασίας PID), όνομα διαδικασίας (όνομα διεργασίας), γραμμή εντολών (εντολή έναρξης).

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

Για να λάβετε μια λίστα με όλες τις συνδέσεις TCP και UDP, δημιουργήστε τις μεταβλητές $netTCP και $netUDP εκχωρώντας τους τα cmdlet Get-NetTCPConnection και Get-NetTCPConnection, αντίστοιχα.

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

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

Θα είναι σημαντικό να γνωρίζετε τη λίστα των προγραμματισμένων εργασιών και εργασιών. Για να το κάνουμε αυτό, χρησιμοποιούμε τα cmdlet get-ScheduledTask και Get-ScheduledJob. Ας τους εκχωρήσουμε τις μεταβλητές $task και $job, γιατί Αρχικά, υπάρχουν πολλές προγραμματισμένες εργασίες στο σύστημα, στη συνέχεια, προκειμένου να εντοπιστεί κακόβουλη δραστηριότητα, αξίζει να φιλτράρετε τις νόμιμες προγραμματισμένες εργασίες. Το cmdlet Select-Object θα μας βοηθήσει σε αυτό.

$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

Στο σύστημα αρχείων NTFS, υπάρχει κάτι όπως εναλλακτικές ροές δεδομένων (Εναλλακτικές ροές δεδομένων, ADS). Αυτό σημαίνει ότι ένα αρχείο σε NTFS μπορεί να συσχετιστεί περαιτέρω με πολλαπλές ροές δεδομένων αυθαίρετου μεγέθους. Με το ADS, μπορείτε να αποκρύψετε δεδομένα που δεν θα είναι ορατά από τυπικούς ελέγχους συστήματος. Αυτό μπορεί να εισάγει κακόβουλο κώδικα ή/και να αποκρύψει δεδομένα.

Για να εμφανίσουμε εναλλακτικές ροές δεδομένων στο PowerShell, θα χρησιμοποιήσουμε το get-item cmdlet και το ενσωματωμένο εργαλείο ροής των Windows με το σύμβολο * για να προβάλουμε όλες τις πιθανές ροές, για αυτό θα δημιουργήσουμε τη μεταβλητή $ADS.

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

Θα είναι χρήσιμο να γνωρίζετε τη λίστα των χρηστών που είναι συνδεδεμένοι στο σύστημα, για αυτό θα δημιουργήσουμε μια μεταβλητή $user και θα της αναθέσουμε την εκτέλεση του προγράμματος quser.

$user = quser

Προκειμένου να αποκτήσουν θέση στο σύστημα, οι εισβολείς μπορούν να κάνουν αλλαγές στο autorun. Μπορείτε να χρησιμοποιήσετε το cmdlet Get-ItemProperty για να προβάλετε τα στοιχεία σε αυτόματη αναπαραγωγή.
Ας δημιουργήσουμε δύο μεταβλητές: $runUser - για προβολή αυτόματης φόρτωσης εκ μέρους του χρήστη και $runMachine - για προβολή αυτόματης φόρτωσης για λογαριασμό του υπολογιστή.

$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", "Alternative Data Stream"

Και, χρησιμοποιώντας έναν βρόχο for, τα δεδομένα που προκύπτουν θα εγγραφούν σε αρχεία.

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

Μετά την εκτέλεση του σεναρίου, θα δημιουργηθούν 9 αρχεία κειμένου που περιέχουν τις απαραίτητες πληροφορίες.

Σήμερα, οι επαγγελματίες της κυβερνοασφάλειας μπορούν να χρησιμοποιήσουν το PowerShell για να εμπλουτίσουν τις πληροφορίες που χρειάζονται για να λύσουν μια ποικιλία εργασιών στην εργασία τους. Προσθέτοντας ένα σενάριο στην αυτόματη φόρτωση, μπορείτε να λάβετε κάποιες πληροφορίες χωρίς ντάμπινγκ, εικόνες κ.λπ.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο