PowerShell használata incidensinformációk gyűjtésére

A PowerShell egy elterjedt automatizáló eszköz, amelyet a kártékony programok fejlesztői és az információbiztonsági szakemberek egyaránt gyakran használnak.
Ebben a cikkben a PowerShell távoli adatgyűjtésének egy példáját fogjuk megvizsgálni végberendezések esetén, amikor információbiztonsági eseményekre reagálunk. Ehhez egy szkriptet kell írni, amely a végberendezésen fut, és részletes leírást fog adni erről a szkriptről.

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
		}

	}

}

A munka megkezdéséhez létrehozunk egy függvényt CSIRT, amely egy érvet fogad el - az adatgyűjtés helyét. Mivel a legtöbb parancs PowerShell v5-ben működik, ezért annak helyes működéséhez ellenőrzést végeztünk a PowerShell verzióján.

function CSIRT{
		
param($path)# A szkript futtatásakor meg kell adni a mentés helyét
if ($psversiontable.psversion.major -ge 5)

A létrehozott fájlok könnyebb navigálása érdekében két változót inicializáltunk: $date és $Computer, amelyekhez a számítógép neve és a jelenlegi dátum fog társulni.

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

A jelenlegi felhasználó által futtatott folyamatok listáját az alábbiak szerint szerezzük be: létrehozzuk a $process változót, amelyet a get-ciminstance parancsmaggal a win32_process osztállyal töltünk fel. A Select-Object parancsmag segítségével további kimeneti paramétereket adhatunk hozzá, amelyek esetünkben a parentprocessid (szülő folyamat azonosítója - PPID), creationdate (a folyamat létrehozásának dátuma), processed (a folyamat azonosítója - PID), processname (a folyamat neve), commandline (a parancs, amely elindította).

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

A TCP és UDP kapcsolatok teljes listájának megszerzéséhez létrehozzuk a $netTCP és $netUDP változókat, amelyeket a Get-NetTCPConnection és Get-NetUDPEndpoint parancsmagokkal töltünk fel.

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

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

Fontos tudni a megadott ütemezett feladatok és munkák listáját. Ehhez a get-ScheduledTask és Get-ScheduledJob parancsmagokat használjuk. A $task és $job változóknak adjuk, mivel a rendszerben számos ütemezett feladat található, ezért a rosszindulatú tevékenység meghatározásához érdemes kiszűrni a legális ütemezett feladatokat. Ebben segít a Select-Object parancsmag.

$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 kizárja azokat a szerzőket, akik “Microsoft”, “*@%systemroot%*” szavakat tartalmaznak, valamint a „üres” szerzőket
$job = Get-ScheduledJob

Az NTFS fájlrendszerben létezik egy fogalom, az alternatív adatfolyamok (Alternate Data Streams, ADS). Ez azt jelenti, hogy egy fájl az NTFS-ben további, tetszőleges méretű adatfolyamokkal kapcsolódhat. Az ADS segítségével olyan adatokat lehet elrejteni, amelyek a normál rendszerellenőrzések során nem láthatók. Ennek köszönhetően rosszindulatú kódot lehet beilleszteni és/vagy adatokat elrejteni.

Az alternatív adatfolyamok megjelenítéséhez a PowerShell-ben a get-item parancsmagot és a Windows beépített stream eszközét fogjuk használni, * jellel minden lehetséges folyam megtekintésére; ezért létrehozunk egy $ADS változót.

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

Hasznos lesz tudni a bejelentkezett felhasználók listáját is; ehhez létrehozunk egy $user változót és a quser program futtatását rendeljük hozzá.

$user = quser

A támadók, hogy beépüljenek a rendszerbe, módosíthatják az automatikus indítást. Az automatikus indítás objektumainak megtekintéséhez használhatjuk a Get-ItemProperty parancsot.
Hozzunk létre két változót: $runUser – a felhasználó általi automatikus indítás megtekintésére, és $runMachine – a számítógép általi automatikus indítás megtekintésére.

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

Annak érdekében, hogy minden információ külön fájlokba kerüljön, létrehozunk egy tömböt a változókkal és egy tömböt a fájlnevekkel.


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

És egy for ciklus használatával a kapott adatok fájlokba lesznek mentve.

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

A szkript végrehajtása után 9 szöveges fájl jön létre, melyek a szükséges információkat tartalmazzák.

Jelenleg a kiberbiztonsági szakemberek PowerShell-t használhatnak az információk gazdagítására, amelyek szükségesek különböző feladatok elvégzéséhez a munkájuk során. Az automatikus indításhoz való hozzáadás lehetővé teszi bizonyos információk megszerzését a dumpok, képek stb. készítése nélkül.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster