Olay Bilgilerini Toplamak için PowerShell'i Kullanma

PowerShell, hem kötü amaçlı yazılım geliştiricileri hem de bilgi güvenliği uzmanları tarafından sıklıkla kullanılan, oldukça yaygın bir otomasyon aracıdır.
Bu makalede, bilgi güvenliği olaylarına yanıt verirken uç cihazlardan uzaktan veri toplamak için PowerShell kullanma seçeneği tartışılacaktır. Bunu yapmak için, son cihazda çalışacak bir komut dosyası yazmanız gerekecek ve ardından bu komut dosyasının ayrıntılı bir açıklaması olacaktır.

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
		}

	}

}

Başlamak için bir işlev oluşturun CSIRT, bir argüman alacak - alınan verileri kaydetmenin yolu. Çoğu cmdlet'in Powershell v5'te çalışması nedeniyle PowerShell sürümünün doğru çalışıp çalışmadığı kontrol edildi.

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

Oluşturulan dosyalar arasında gezinmeyi kolaylaştırmak için iki değişken başlatılır: $date ve $Computer; bunlara bilgisayar adı ve geçerli tarih atanır.

$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"

Geçerli kullanıcı adına çalışan işlemlerin listesini şu şekilde alırız: bir $process değişkeni oluşturun ve ona win32_process sınıfıyla get-ciminstance cmdlet'ini atayın. Select-Object cmdlet'ini kullanarak ek çıktı parametreleri ekleyebilirsiniz; bizim durumumuzda bunlar ana işlem kimliği (ana işlem kimliği PPID), oluşturma tarihi (işlem oluşturma tarihi), işlenen (işlem kimliği PID), işlem adı (işlem adı), komut satırı ( komutunu çalıştırın).

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

Tüm TCP ve UDP bağlantılarının bir listesini almak için, sırasıyla Get-NetTCPConnection ve Get-NetTCPConnection cmdlet'lerini atayarak $netTCP ve $netUDP değişkenlerini oluşturun.

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

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

Planlanan görevlerin ve ödevlerin listesini bulmak önemli olacaktır. Bunu yapmak için get-ScheduledTask ve Get-ScheduledJob cmdlet'lerini kullanıyoruz. Onlara $task ve $job değişkenlerini atayalım, çünkü Başlangıçta, sistemde çok sayıda zamanlanmış görev vardır, daha sonra kötü amaçlı etkinlikleri tanımlamak için meşru zamanlanmış görevleri filtrelemeye değer. Select-Object cmdlet'i bu konuda bize yardımcı olacaktır.

$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 dosya sisteminde alternatif veri akışları (ADS) diye bir şey vardır. Bu, NTFS'deki bir dosyanın isteğe bağlı olarak isteğe bağlı boyutta birden fazla veri akışıyla ilişkilendirilebileceği anlamına gelir. ADS'yi kullanarak standart sistem kontrollerinde görülemeyecek verileri gizleyebilirsiniz. Bu, kötü amaçlı kod enjekte etmeyi ve/veya verileri gizlemeyi mümkün kılar.

PowerShell'de alternatif veri akışlarını görüntülemek için get-item cmdlet'ini ve * sembollü yerleşik Windows akış aracını kullanarak olası tüm akışları görüntüleyeceğiz, bunun için $ADS değişkenini oluşturacağız.

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

Sisteme giriş yapan kullanıcıların listesini bulmak faydalı olacaktır; bunun için bir $user değişkeni oluşturup onu quser programının çalıştırılmasına atayacağız.

$user = quser

Saldırganlar sistemde yer kazanmak için otomatik çalıştırmada değişiklik yapabilir. Başlangıç ​​nesnelerini görüntülemek için Get-ItemProperty cmdlet'ini kullanabilirsiniz.
İki değişken oluşturalım: $runUser - kullanıcı adına başlangıcı görüntülemek için ve $runMachine - bilgisayar adına başlangıcı görüntülemek için.

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

Tüm bilgilerin farklı dosyalara yazılması için değişkenleri olan bir dizi ve dosya adlarını içeren bir dizi oluşturuyoruz.


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

Ve for döngüsü kullanılarak alınan veriler dosyalara yazılacaktır.

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

Komut dosyasını çalıştırdıktan sonra gerekli bilgileri içeren 9 metin dosyası oluşturulacaktır.

Günümüzde siber güvenlik uzmanları, işlerindeki çeşitli görevleri çözmek için ihtiyaç duydukları bilgileri zenginleştirmek için PowerShell'i kullanabilirler. Başlatmaya bir komut dosyası ekleyerek dökümleri, görüntüleri vb. kaldırmadan bazı bilgileri alabilirsiniz.

Kaynak: habr.com

Yorum ekle