استفاده از 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، می توانید پارامترهای خروجی اضافی را اضافه کنید، در مورد ما، این پارامترها عبارتند از: والدپروسسید (شناسه پردازش والد 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 چیزی به نام جریان های داده جایگزین (Alternate Data Streams، ADS) وجود دارد. این بدان معنی است که یک فایل در NTFS می تواند بیشتر با جریان های داده های متعدد با اندازه دلخواه مرتبط شود. با ADS، می توانید داده هایی را که با بررسی های استاندارد سیستم قابل مشاهده نیستند، پنهان کنید. این می تواند کد مخرب را تزریق کند و/یا داده ها را پنهان کند.

برای نمایش جریان‌های داده جایگزین در PowerShell، از cmdlet get-item و ابزار جریان داخلی ویندوز با نماد * برای مشاهده تمام جریان‌های ممکن استفاده می‌کنیم، برای این کار متغیر $ADS را ایجاد می‌کنیم.

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

دانستن لیست کاربران وارد شده به سیستم مفید خواهد بود، برای این کار یک متغیر $user ایجاد می کنیم و اجرای برنامه quser را به آن اختصاص می دهیم.

$user = quser

به منظور به دست آوردن جای پایی در سیستم، مهاجمان می توانند تغییراتی را در autorun ایجاد کنند. می توانید از cmdlet Get-ItemProperty برای مشاهده موارد در پخش خودکار استفاده کنید.
بیایید دو متغیر ایجاد کنیم: $runUser - برای مشاهده autoload از طرف کاربر و $runMachine - برای مشاهده autoload از طرف کامپیوتر.

$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

اضافه کردن نظر