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
- Abra
services.msc - Observe a lista de serviços
- 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:
C:\Program.exeC:\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
-
Respostas às 5 perguntas
-
Relatório de auditoria gerado pelo script
-
Capturas de tela:
- services.msc
- Resultado da enumeração PowerShell
- Serviços potencialmente vulneráveis
-
Análise (1 página):
- Principais observações
- Riscos identificados
- Recomendações
Critérios de Avaliação
| Critério | Pontos |
|---|---|
| Enumeração básica | 20% |
| Enumeração WMI | 20% |
| Detecção de vulnerabilidades | 30% |
| Relatório de auditoria | 30% |
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