Pular para o conteúdo principal

Lab 7.1: Enumeração dos Serviços Windows

Objetivos de Aprendizagem​

Ao final deste laboratório, você será capaz de:

  • Enumerar todos os serviços de um sistema Windows
  • Identificar serviços vulneráveis
  • Compreender os riscos de segurança relacionados aos serviços
  • Criar relatórios de auditoria de serviços

Duração Estimada​

40 minutos

Pré-requisitos​

  • VM Windows 10/11
  • Direitos de administrador
  • Conhecimentos básicos de PowerShell

Contexto Profissional​

A enumeração de serviços é essencial para:

  • Auditorias de segurança
  • Detecção de malwares persistentes
  • Otimização de desempenho
  • Conformidade regulatória

Parte 1: Enumeração Básica​

Etapa 1.1: Usar services.msc​

  1. Abra services.msc
  2. Observe a lista de serviços
  3. Classifique por "Estado" para ver os serviços ativos

Pergunta 1: Quantos serviços estão em execução?

Etapa 1.2: Enumeração PowerShell​

# Todos os serviços
Get-Service | Measure-Object

# Serviços em execução
Get-Service | Where-Object {$_.Status -eq "Running"} | Measure-Object

# Serviços parados
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Measure-Object

Pergunta 2: Quantos serviços estão parados?

Etapa 1.3: Detalhes dos serviços​

# Ver detalhes
Get-Service | Select-Object Name, DisplayName, Status, StartType |
Sort-Object Status -Descending |
Format-Table -AutoSize

Parte 2: Enumeração Avançada com WMI​

Etapa 2.1: Informações detalhadas​

WMI fornece mais informações do que Get-Service:

Get-WmiObject Win32_Service | Select-Object `
Name,
DisplayName,
State,
StartMode,
@{N='Account';E={$_.StartName}},
PathName |
Format-Table -AutoSize

Etapa 2.2: Serviços por conta de execução​

# Agrupar por conta
Get-WmiObject Win32_Service |
Group-Object StartName |
Select-Object Count, Name |
Sort-Object Count -Descending

Pergunta 3: Qual conta executa mais serviços?

Etapa 2.3: Serviços LocalSystem (alto privilégio)​

# Serviços executando como LocalSystem
Get-WmiObject Win32_Service |
Where-Object {$_.StartName -eq "LocalSystem"} |
Select-Object Name, DisplayName, State, PathName |
Format-Table -AutoSize

Pergunta 4: Quantos serviços estão sendo executados como LocalSystem?


Parte 3: Detecção de Vulnerabilidades​

Etapa 3.1: Caminhos não citados (Unquoted Service Paths)​

Caminhos com espaços sem aspas são vulneráveis:

# Detectar caminhos não citados
Get-WmiObject Win32_Service | Where-Object {
$_.PathName -notmatch '^"' -and
$_.PathName -match ' ' -and
$_.PathName -notmatch '^[A-Za-z]:\\Windows'
} | Select-Object Name, PathName

Explicação: Se um serviço tem o caminho C:\Program Files\App\service.exe, o Windows procurará na ordem:

  1. C:\Program.exe
  2. C:\Program Files\App\service.exe

Um atacante pode colocar C:\Program.exe para desviar a execução.

Etapa 3.2: Permissões nos executáveis​

# Verificar permissões dos binários de serviço
Get-WmiObject Win32_Service | ForEach-Object {
$serviceName = $_.Name
$path = $_.PathName

# Extrair o caminho do executável
if ($path -match '^"([^"]+)"') {
$exePath = $matches[1]
} elseif ($path -match '^(\S+)') {
$exePath = $matches[1]
} else {
$exePath = $path
}

if (Test-Path $exePath -ErrorAction SilentlyContinue) {
$acl = Get-Acl $exePath -ErrorAction SilentlyContinue

# Verificar se usuários não-admin têm direito de escrita
$vulnerable = $acl.Access | Where-Object {
($_.IdentityReference -match "Users|Everyone|Authenticated") -and
($_.FileSystemRights -match "Write|Modify|FullControl")
}

if ($vulnerable) {
[PSCustomObject]@{
Service = $serviceName
Path = $exePath
VulnerableACL = $true
}
}
}
} | Format-Table -AutoSize

Etapa 3.3: Serviços com caminhos suspeitos​

# Serviços em caminhos incomuns
Get-WmiObject Win32_Service | Where-Object {
$_.PathName -match "\\Temp\\" -or
$_.PathName -match "\\AppData\\" -or
$_.PathName -match "\\Downloads\\" -or
$_.PathName -match "\\Desktop\\"
} | Select-Object Name, DisplayName, PathName

Pergunta 5: Existem serviços em caminhos suspeitos?


Parte 4: Análise de Dependências​

Etapa 4.1: Serviços críticos​

# Serviços dos quais outros dependem
Get-Service | ForEach-Object {
$service = $_
$dependents = Get-Service -DependentServices $service.Name -ErrorAction SilentlyContinue

if ($dependents.Count -gt 0) {
[PSCustomObject]@{
Service = $service.DisplayName
DependentCount = $dependents.Count
Dependents = ($dependents.DisplayName -join ", ")
}
}
} | Where-Object {$_.DependentCount -gt 0} |
Sort-Object DependentCount -Descending |
Select-Object -First 10

Etapa 4.2: Cadeia de dependências​

# Ver dependências de um serviço específico
$serviceName = "Dnscache"

Write-Host "=== $serviceName ===" -ForegroundColor Cyan
Write-Host "`nServiços requeridos:" -ForegroundColor Yellow
Get-Service $serviceName -RequiredServices | Select-Object DisplayName, Status

Write-Host "`nServiços dependentes:" -ForegroundColor Yellow
Get-Service $serviceName -DependentServices | Select-Object DisplayName, Status

Parte 5: Relatório de Auditoria​

Etapa 5.1: Script de auditoria completo​

# Script de auditoria de serviços
$reportPath = "$env:USERPROFILE\Desktop\audit_services.txt"

$report = @"
================================================================================
RELATÓRIO DE AUDITORIA DOS SERVIÇOS WINDOWS
$(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
================================================================================

RESUMO
------
"@

# Estatísticas
$allServices = Get-WmiObject Win32_Service
$running = ($allServices | Where-Object {$_.State -eq "Running"}).Count
$stopped = ($allServices | Where-Object {$_.State -eq "Stopped"}).Count
$auto = ($allServices | Where-Object {$_.StartMode -eq "Auto"}).Count

$report += @"

Total de serviços: $($allServices.Count)
Em execução: $running
Parados: $stopped
Inicialização automática: $auto

SERVIÇOS POR CONTA DE EXECUÇÃO
-------------------------------
"@

$byAccount = $allServices | Group-Object StartName | Sort-Object Count -Descending
foreach ($group in $byAccount) {
$report += "`n$($group.Name): $($group.Count)"
}

# Caminhos não citados
$unquoted = $allServices | Where-Object {
$_.PathName -notmatch '^"' -and
$_.PathName -match ' ' -and
$_.PathName -notmatch '^[A-Za-z]:\\Windows'
}

$report += @"

VULNERABILIDADES POTENCIAIS
---------------------------
Caminhos não citados: $($unquoted.Count)
"@

if ($unquoted) {
foreach ($svc in $unquoted) {
$report += "`n - $($svc.Name): $($svc.PathName)"
}
}

# Caminhos suspeitos
$suspect = $allServices | Where-Object {
$_.PathName -match "\\(Temp|AppData|Downloads|Desktop)\\"
}

$report += "`n`nServiços em caminhos suspeitos: $($suspect.Count)"
if ($suspect) {
foreach ($svc in $suspect) {
$report += "`n - $($svc.Name): $($svc.PathName)"
}
}

$report += @"

================================================================================
FIM DO RELATÓRIO
================================================================================
"@

# Salvar
$report | Out-File $reportPath -Encoding UTF8
Write-Host "Relatório salvo: $reportPath" -ForegroundColor Green

# Exibir
$report

Etapa 5.2: Executar a auditoria​

# Executar o script
.\audit_services.ps1

Entregáveis​

  1. Respostas às 5 perguntas

  2. Relatório de auditoria gerado pelo script

  3. Capturas de tela:

    • services.msc
    • Resultado da enumeração PowerShell
    • Serviços potencialmente vulneráveis
  4. Análise (1 página):

    • Principais observações
    • Riscos identificados
    • Recomendações

Critérios de Avaliação​

CritérioPontos
Enumeração básica20%
Enumeração WMI20%
Detecção de vulnerabilidades30%
Relatório de auditoria30%

Comandos de Referência​

# Serviços
Get-Service
Get-WmiObject Win32_Service

# Filtragem
Where-Object {$_.Status -eq "Running"}

# Seleção
Select-Object Name, DisplayName, Status

# Agrupamento
Group-Object StartName

# ACL
Get-Acl caminho

Lab desenvolvido no âmbito do curso Sistemas Operacionais - MÓDULO 7