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

A PowerShell egy meglehetősen gyakori automatizálási eszköz, amelyet gyakran használnak mind a rosszindulatú programok fejlesztői, mind az információbiztonsági szakemberek.
Ez a cikk azt a lehetőséget tárgyalja, hogy a PowerShell segítségével távolról gyűjtsön adatokat a végeszközökről az információbiztonsági incidensekre való reagálás során. Ehhez meg kell írnia egy szkriptet, amely futni fog a végeszközön, majd ennek a szkriptnek a részletes leírása lesz.

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
		}

	}

}

A kezdéshez hozzon létre egy függvényt CSIRT bővítmény, amely egy argumentumot vesz fel - a kapott adatok mentésének elérési útja. Mivel a legtöbb parancsmag a Powershell v5-ben működik, a PowerShell verzió megfelelő működését ellenőriztük.

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

A létrehozott fájlok közötti navigáció megkönnyítése érdekében két változó inicializálódik: $date és $Computer, amelyekhez a számítógép neve és az aktuális dátum kerül hozzárendelve.

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

Az aktuális felhasználó nevében futó folyamatok listáját a következőképpen kapjuk meg: hozzunk létre egy $process változót, hozzárendeljük a get-ciminstance parancsmagot a win32_process osztállyal. A Select-Object parancsmag segítségével további kimeneti paramétereket adhatunk hozzá, esetünkben ezek a következők lesznek: parentprocessid (szülő folyamatazonosító PPID), createdate (folyamat létrehozásának dátuma), feldolgozott (folyamatazonosító PID), folyamatnév (folyamat neve), parancssor ( parancs futtatása).

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

Az összes TCP- és UDP-kapcsolatok listájának megtekintéséhez hozza létre a $netTCP és $netUDP változókat a Get-NetTCPConnection és a Get-NetTCPConnection parancsmagok hozzárendelésével.

$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 lesz megismerni a tervezett feladatok és feladatok listáját. Ehhez a get-ScheduledTask és a Get-ScheduledJob parancsmagokat használjuk. Rendeljük hozzájuk a $task és a $job változókat, mert Kezdetben sok ütemezett feladat van a rendszerben, majd a rosszindulatú tevékenység azonosítása érdekében érdemes kiszűrni a jogos ütemezett feladatokat. Ebben segít nekünk a Select-Object parancsmag.

$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

Az NTFS fájlrendszerben létezik olyan dolog, mint alternatív adatfolyamok (ADS). Ez azt jelenti, hogy egy NTFS-fájl opcionálisan több, tetszőleges méretű adatfolyamhoz társítható. Az ADS használatával elrejtheti azokat az adatokat, amelyek nem lennének láthatóak a szokásos rendszerellenőrzésekkel. Ez lehetővé teszi rosszindulatú kódok beszúrását és/vagy adatok elrejtését.

Az alternatív adatfolyamok PowerShellben való megjelenítéséhez a get-item parancsmagot és a beépített Windows stream eszközt használjuk * szimbólummal az összes lehetséges adatfolyam megtekintéséhez, ehhez létrehozzuk a $ADS változót.

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

Hasznos lesz kideríteni a rendszerbe bejelentkezett felhasználók listáját, ehhez létrehozunk egy $user változót és hozzárendeljük a quser program végrehajtásához.

$user = quser

A támadók módosíthatják az automatikus futtatást, hogy megvegyék a lábukat a rendszerben. Az indítási objektumok megtekintéséhez használja a Get-ItemProperty parancsmagot.
Hozzon létre két változót: $runUser - az indítás megtekintése a felhasználó nevében és $runMachine - az indítás megtekintése a számítógép nevében.

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

Annak érdekében, hogy minden információ más-más fájlba kerüljön, létrehozunk egy változókat és egy fájlneveket tartalmazó tömböt.


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

A for ciklus használatával a kapott adatok fájlba kerülnek.

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, amelyek tartalmazzák a szükséges információkat.

Ma a kiberbiztonsági szakemberek a PowerShell segítségével gazdagíthatják a munkájuk során felmerülő különféle feladatok megoldásához szükséges információkat. Ha egy szkriptet ad hozzá az indításhoz, akkor bizonyos információkhoz juthat anélkül, hogy eltávolítaná a dumpokat, képeket stb.

Forrás: will.com

Hozzászólás