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