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 ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— win32_process ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” get-ciminstance cmdlet์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. Select-Object cmdlet์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” parentprocessid(์ƒ์œ„ ํ”„๋กœ์„ธ์Šค ID PPID), ์ƒ์„ฑ ๋‚ ์งœ(ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋‚ ์งœ), ์ฒ˜๋ฆฌ๋จ(ํ”„๋กœ์„ธ์Šค ID PID), ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„(ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„), ๋ช…๋ น์ค„( ๋ช…๋ น ์‹คํ–‰).

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

๋ชจ๋“  TCP ๋ฐ UDP ์—ฐ๊ฒฐ ๋ชฉ๋ก์„ ์–ป์œผ๋ ค๋ฉด ๊ฐ๊ฐ Get-NetTCPConnection ๋ฐ Get-NetTCPConnection cmdlet์„ ํ• ๋‹นํ•˜์—ฌ $netTCP ๋ฐ $netUDP ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

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

๊ณ„ํš๋œ ์ž‘์—… ๋ฐ ๊ณผ์ œ ๋ชฉ๋ก์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด get-ScheduledTask ๋ฐ Get-ScheduledJob cmdlet์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ $task ๋ฐ $job์„ ํ• ๋‹นํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์‹œ์Šคํ…œ์— ์˜ˆ์•ฝ๋œ ์ž‘์—…์ด ๋งŽ์ด ์žˆ์œผ๋ฉฐ, ์•…์˜์ ์ธ ํ™œ๋™์„ ์‹๋ณ„ํ•˜๋ ค๋ฉด ํ•ฉ๋ฒ•์ ์ธ ์˜ˆ์•ฝ๋œ ์ž‘์—…์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Select-Object cmdlet์ด ์ด ์ž‘์—…์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

$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

๊ณต๊ฒฉ์ž๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐœํŒ์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ์‹คํ–‰์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ๊ฐœ์ฒด๋ฅผ ๋ณด๋ ค๋ฉด Get-ItemProperty cmdlet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. $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์„ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฌด ์ค‘ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋คํ”„, ์ด๋ฏธ์ง€ ๋“ฑ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ ๋„ ์ผ๋ถ€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€