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)、creationdate(進程建立日期)、processed(進程ID PID)、processname(進程名稱) 、commandline(執行指令)。
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid
若要取得所有 TCP 和 UDP 連線的列表,請透過分別為 $netTCP 和 $netUDP 變數指派 Get-NetTCPConnection 和 Get-NetTCPConnection cmdlet 來建立它們。
$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 來豐富他們解決工作中的各種任務所需的資訊。 透過在啟動中新增腳本,您可以在不刪除轉儲、影像等的情況下取得一些資訊。
來源: www.habr.com