Usando o PowerShell para coletar informações sobre incidentes

PowerShell é uma ferramenta de automação bastante comum, frequentemente usada por desenvolvedores de malware e especialistas em segurança da informação.
Este artigo discutirá a opção de usar o PowerShell para coletar remotamente dados de dispositivos finais ao responder a incidentes de segurança da informação. Para fazer isso, você precisará escrever um script que será executado no dispositivo final e, em seguida, haverá 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 '*Майкрософт*' | 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 começar, crie uma função CSIRT, que receberá um argumento - o caminho para salvar os dados recebidos. Devido ao fato de a maioria dos cmdlets funcionarem no Powershell v5, a versão do PowerShell foi verificada quanto ao funcionamento correto.

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

Para facilitar a navegação pelos arquivos criados, são inicializadas duas variáveis: $data e $Computador, às quais será atribuído 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"

Obtemos a lista de processos em execução em nome do usuário atual da seguinte maneira: crie uma variável $process, atribuindo a ela o cmdlet get-ciminstance com a classe win32_process. Usando o cmdlet Select-Object, você pode adicionar parâmetros de saída adicionais, no nosso caso, serão parentprocessid (ID do processo pai PPID), data de criação (data de criação do processo), processado (ID do processo PID), nome do processo (nome do processo), linha de comando ( comando de execução).

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

Para obter uma lista de todas as conexões TCP e UDP, crie as variáveis ​​$netTCP e $netUDP atribuindo a elas os cmdlets Get-NetTCPConnection e Get-NetTCPConnection, 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

Será importante descobrir a lista de tarefas e atribuições planejadas. Para fazer isso, usamos os cmdlets get-ScheduledTask e Get-ScheduledJob. Vamos atribuir a eles as variáveis ​​$task e $job, pois Inicialmente, há muitas tarefas agendadas no sistema, então, para identificar atividades maliciosas, vale a pena 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 '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

No sistema de arquivos NTFS existem fluxos de dados alternativos (ADS). Isso significa que um arquivo em NTFS pode ser opcionalmente associado a vários fluxos de dados de tamanho arbitrário. Usando ADS, você pode ocultar dados que não seriam visíveis por meio de verificações padrão do sistema. Isso torna possível injetar código malicioso e/ou ocultar dados.

Para exibir fluxos de dados alternativos no PowerShell, usaremos o cmdlet get-item e a ferramenta de fluxo integrada do Windows 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' 

Será útil conhecer a lista de usuários logados no sistema, para isso criaremos uma variável $user e a atribuiremos à execução do programa quser.

$user = quser

Os invasores podem fazer alterações na execução automática para obter uma posição segura no sistema. Para visualizar objetos de inicialização, você pode usar o cmdlet Get-ItemProperty.
Vamos criar duas variáveis: $runUser - para visualizar a inicialização em nome do usuário e $runMachine - para visualizar a inicialização em nome do computador.

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

Para que todas as informações sejam gravadas em arquivos diferentes, criamos um array com variáveis ​​e um array com nomes de 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 recebidos 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, serão criados 9 arquivos de texto contendo as informações necessárias.

Hoje, os profissionais de segurança cibernética podem usar o PowerShell para enriquecer as informações necessárias para resolver uma variedade de tarefas em seu trabalho. Ao adicionar um script na inicialização, você pode obter algumas informações sem remover dumps, imagens, etc.

Fonte: habr.com

Adicionar um comentário