Saltar al contenido principal

Lab 7.1: Enumeración de los Servicios de Windows

Objetivos de Aprendizaje​

Al final de este laboratorio, usted será capaz de:

  • Enumerar todos los servicios de un sistema Windows
  • Identificar los servicios vulnerables
  • Comprender los riesgos de seguridad asociados a los servicios
  • Crear informes de auditoría de servicios

Duración Estimada​

40 minutos

Prerrequisitos​

  • VM Windows 10/11
  • Derechos de administrador
  • Conocimientos básicos de PowerShell

Contexto Profesional​

La enumeración de servicios es esencial para:

  • Auditorías de seguridad
  • Detección de malware persistente
  • Optimización del rendimiento
  • Cumplimiento regulatorio

Parte 1: Enumeración Básica​

Paso 1.1: Usar services.msc​

  1. Abra services.msc
  2. Observe la lista de servicios
  3. Ordene por "Estado" para ver los servicios activos

Pregunta 1: ¿Cuántos servicios están en ejecución?

Paso 1.2: Enumeración PowerShell​

# Todos los servicios
Get-Service | Measure-Object

# Servicios en ejecución
Get-Service | Where-Object {$_.Status -eq "Running"} | Measure-Object

# Servicios detenidos
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Measure-Object

Pregunta 2: ¿Cuántos servicios están detenidos?

Paso 1.3: Detalles de los servicios​

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

Parte 2: Enumeración Avanzada con WMI​

Paso 2.1: Información detallada​

WMI proporciona más información que Get-Service:

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

Paso 2.2: Servicios por cuenta de ejecución​

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

Pregunta 3: ¿Qué cuenta ejecuta la mayor cantidad de servicios?

Paso 2.3: Servicios LocalSystem (alto privilegio)​

# Servicios que se ejecutan como LocalSystem
Get-WmiObject Win32_Service |
Where-Object {$_.StartName -eq "LocalSystem"} |
Select-Object Name, DisplayName, State, PathName |
Format-Table -AutoSize

Pregunta 4: ¿Cuántos servicios se ejecutan como LocalSystem?


Parte 3: Detección de Vulnerabilidades​

Paso 3.1: Rutas sin comillas (Unquoted Service Paths)​

Las rutas con espacios sin comillas son vulnerables:

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

Explicación: Si un servicio tiene la ruta C:\Program Files\App\service.exe, Windows buscará en el siguiente orden:

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

Un atacante puede colocar C:\Program.exe para desviar la ejecución.

Paso 3.2: Permisos sobre los ejecutables​

# Verificar los permisos de los binarios de servicio
Get-WmiObject Win32_Service | ForEach-Object {
$serviceName = $_.Name
$path = $_.PathName

# Extraer la ruta del ejecutable
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 si usuarios no administradores tienen derecho de escritura
$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

Paso 3.3: Servicios con rutas sospechosas​

# Servicios en rutas inusuales
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

Pregunta 5: ¿Hay servicios en rutas sospechosas?


Parte 4: Análisis de Dependencias​

Paso 4.1: Servicios críticos​

# Servicios de los que dependen otros
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

Paso 4.2: Cadena de dependencias​

# Ver las dependencias de un servicio específico
$serviceName = "Dnscache"

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

Write-Host "`nServicios dependientes:" -ForegroundColor Yellow
Get-Service $serviceName -DependentServices | Select-Object DisplayName, Status

Parte 5: Informe de Auditoría​

Paso 5.1: Script de auditoría completo​

# Script de auditoría de servicios
$reportPath = "$env:USERPROFILE\Desktop\audit_services.txt"

$report = @"
================================================================================
INFORME DE AUDITORÍA DE SERVICIOS WINDOWS
$(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
================================================================================

RESUMEN
-------
"@

# Estadí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 servicios: $($allServices.Count)
En ejecución: $running
Detenidos: $stopped
Inicio automático: $auto

SERVICIOS POR CUENTA DE EJECUCIÓN
---------------------------------
"@

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

# Rutas sin comillas
$unquoted = $allServices | Where-Object {
$_.PathName -notmatch '^"' -and
$_.PathName -match ' ' -and
$_.PathName -notmatch '^[A-Za-z]:\\Windows'
}

$report += @"

VULNERABILIDADES POTENCIALES
---------------------------
Rutas sin comillas: $($unquoted.Count)
"@

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

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

$report += "`n`nServicios en rutas sospechosas: $($suspect.Count)"
if ($suspect) {
foreach ($svc in $suspect) {
$report += "`n - $($svc.Name): $($svc.PathName)"
}
}

$report += @"

================================================================================
FIN DEL INFORME
================================================================================
"@

# Guardar
$report | Out-File $reportPath -Encoding UTF8
Write-Host "Informe guardado: $reportPath" -ForegroundColor Green

# Mostrar
$report

Paso 5.2: Ejecutar la auditoría​

# Ejecutar el script
.\audit_services.ps1

Entregables​

  1. Respuestas a las 5 preguntas

  2. Informe de auditoría generado por el script

  3. Capturas de pantalla:

    • services.msc
    • Resultado de la enumeración PowerShell
    • Servicios potencialmente vulnerables
  4. Análisis (1 página):

    • Observaciones principales
    • Riesgos identificados
    • Recomendaciones

Criterios de Evaluación​

CriterioPuntos
Enumeración básica20%
Enumeración WMI20%
Detección de vulnerabilidades30%
Informe de auditoría30%

Comandos de Referencia​

# Servicios
Get-Service
Get-WmiObject Win32_Service

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

# Selección
Select-Object Name, DisplayName, Status

# Agrupamiento
Group-Object StartName

# ACL
Get-Acl camino

Lab desarrollado en el marco del curso Sistemas Operativos - MÓDULO 7