O PowerShell é uma ferramenta de automação bastante comum, frequentemente utilizada tanto por desenvolvedores de malware quanto por especialistas em segurança da informação.
Neste artigo, abordaremos uma forma de utilizar o PowerShell para a coleta remota de dados de endpoints durante a resposta a incidentes de segurança da informação. Para isso, será necessário escrever um script que será executado no endpoint, e a seguir apresentaremos uma descrição detalhada desse script.
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
}
}
}Para iniciar, uma função é criada CSIRT, que receberá um argumento - o caminho para salvar os dados coletados. Dado que a maioria dos cmdlets funciona no PowerShell v5, foi feita uma verificação da versão do PowerShell para garantir o funcionamento adequado.
function CSIRT{
param($path)# Ao executar o script, é necessário especificar o diretório para salvamento
if ($psversiontable.psversion.major -ge 5)Para facilitar a navegação pelos arquivos criados, duas variáveis foram inicializadas: $date e $Computer, que receberão o nome do computador e a data atual.
$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 lista de processos em execução sob o nome do usuário atual pode ser obtida da seguinte forma: criamos uma variável $process e atribuímos a ela o cmdlet get-ciminstance com a classe win32_process. Usando o cmdlet Select-Object, podemos adicionar parâmetros de saída adicionais; neste caso, eles serão parentprocessid (ID do processo pai PPID), creationdate (data de criação do processo), processed (ID do processo PID), processname (nome do processo) e commandline (linha de comando).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidPara obter uma lista de todas as conexões TCP e UDP, criaremos as variáveis $netTCP e $netUDP, atribuindo a elas os cmdlets Get-NetTCPConnection e Get-NetUDPEndpoint, respectivamente.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateÉ importante conhecer a lista de tarefas e trabalhos agendados. Para isso, utilizamos os cmdlets get-ScheduledTask e Get-ScheduledJob. Atribuiremos a eles as variáveis $task e $job; como existem várias tarefas agendadas no sistema, para identificar atividades maliciosas, devemos filtrar as tarefas agendadas legítimas. O cmdlet Select-Object nos ajudará com isso.
$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 exclui autores contendo “Microsoft”, “*@%systemroot%*” e autores “vazios”.
$job = Get-ScheduledJobNo sistema de arquivos NTFS, existe o conceito de fluxos de dados alternativos (Alternate Data Streams, ADS). Isso significa que um arquivo em NTFS pode estar vinculado a vários fluxos de dados de tamanho arbitrário. Com o ADS, é possível ocultar dados que não serão visíveis em verificações padrão do sistema. Isso permite a injeção de código malicioso e/ou a ocultação de dados.
Para exibir fluxos de dados alternativos no PowerShell, usaremos o cmdlet get-item e a ferramenta interna do Windows stream com o símbolo * para visualizar todos os fluxos possíveis; para isso, criaremos a variável $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' Também será útil conhecer a lista de usuários que fizeram login no sistema; para isso, criaremos a variável $user e atribuíremos a ela a execução do programa quser.
$user = quser Os invasores, para se estabelecerem no sistema, podem fazer alterações na inicialização automática. Para visualizar os itens na inicialização automática, pode-se usar o cmdlet Get-ItemProperty.
Vamos criar duas variáveis: $runUser – para visualizar a inicialização automática sob o nome do usuário e $runMachine – para visualizar a inicialização automática sob o nome do computador.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Para gravar todas as informações em arquivos diferentes, criamos um array com variáveis e um array com os nomes dos arquivos.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"E, usando um loop for, os dados obtidos serão gravados em arquivos.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Após a execução do script, 9 arquivos de texto serão criados, contendo as informações necessárias.
Atualmente, especialistas em cibersegurança podem usar PowerShell para enriquecer as informações necessárias na resolução de diversas tarefas em seu trabalho. Ao adicionar o script à inicialização automática, é possível obter algumas informações sem a necessidade de capturas de memória, imagens, etc.
Fonte: habr.com
