OWAReaper
Cómo un buzón corporativo expuesto filtra la superficie de ataque completa de una empresa.
Resumen
OWAReaper es el nombre que le puse a una cadena de reconocimiento sobre portales Outlook Web Access expuestos a internet. No es un exploit mágico: es la suma de metadatos públicos, mensajes de error demasiado habladores y usuarios que reciclan contraseñas.
En el reel se ve el resultado final en treinta segundos. Aquí está el desglose completo, con las fuentes y los límites legales de cada paso.
La técnica
El punto de partida es la enumeración pasiva: certificados TLS, registros DNS históricos y cabeceras HTTP que revelan la versión del servidor. Con eso se construye una lista de dominios y subdominios candidatos.
El segundo paso es la diferencia de tiempos de respuesta entre un usuario válido y uno inexistente. Esa diferencia, medible, convierte un formulario de login en un directorio de empleados.
Reconocimiento pasivo
# 1. Certificados TLS históricos
curl -s 'https://crt.sh/?q=%25.empresa.mx&output=json' \
| jq -r '.[].name_value' | sort -u
# 2. Cabeceras del portal OWA
curl -sI https://mail.empresa.mx/owa/ | grep -iE 'server|x-owa'
# 3. Diferencia de tiempos (user-enum)
for u in $(cat empleados.txt); do
t=$(curl -s -o /dev/null -w '%{time_total}' \
-d "username=$u&password=x" https://mail.empresa.mx/owa/auth.owa)
echo "$u $t"
doneImpacto / privacidad
Un OWA expuesto no solo permite intentar contraseñas: filtra nombres reales, jerarquías internas, versiones de software y, con frecuencia, calendarios compartidos por error.
Para el empleado promedio esto significa que su nombre, cargo y horario pueden reconstruirse desde fuera sin tocar redes sociales.
AUDIT · ¿quién es Default en tu Exchange?
Si llegaste aquí por el comentario AUDIT del reel, esto es lo tuyo. El permiso al usuario Default es el punto ciego: Default = cualquier usuario autenticado.
Un grant Owner o Editor sobre carpetas deja leer/escribir el buzón aunque rotes contraseñas, porque vive del lado del servidor.
Auditar permisos Default
# audit-default.ps1 — ¿quién es "Default" en tu Exchange?
# Requiere Exchange Online: Connect-ExchangeOnline
$hits = foreach ($mbx in Get-Mailbox -ResultSize Unlimited) {
Get-MailboxFolderPermission -Identity $mbx.PrimarySmtpAddress -User Default -ErrorAction SilentlyContinue |
Where-Object { $_.AccessRights -notmatch 'None|AvailabilityOnly' } |
Select-Object @{n='Buzon';e={$mbx.PrimarySmtpAddress}}, FolderName,
@{n='Permiso';e={$_.AccessRights -join ','}}
}
$hits | Sort-Object Buzon | Format-Table -Auto
# Remediar un caso (descomenta y ajusta):
# Set-MailboxFolderPermission -Identity "user@dominio.com:\Bandeja de entrada" -User Default -AccessRights NoneAUDIT (one-liner)
Get-Mailbox -ResultSize Unlimited | % { Get-MailboxFolderPermission $_.PrimarySmtpAddress -User Default -EA SilentlyContinue | ? { $_.AccessRights -notmatch 'None|AvailabilityOnly' } | Select @{n='Buzon';e={$_.Identity}},AccessRights }Cómo protegerte
- [x]Exige MFA obligatorio en cualquier portal expuesto a internet.
- [x]Homogeniza los mensajes y tiempos de respuesta en el login.
- [x]Bloquea el acceso a /owa/ desde geografías donde no operas.
- [x]Revisa periódicamente crt.sh y Shodan buscando tu propio dominio.
- [x]Rota contraseñas y revisa reutilización con Have I Been Pwned.
- [x]Audita periódicamente las ACL de carpetas otorgadas a Default (corre audit-default.ps1).
- [x]Alerta ante cualquier grant Owner/Editor a Default o a Anonymous.
Referencias
- [1] crt.sh — Certificate Search — https://crt.sh
- [2] Shodan — https://www.shodan.io
- [3] Have I Been Pwned — https://haveibeenpwned.com
- [4] MITRE ATT&CK — Valid Accounts — https://attack.mitre.org/techniques/T1078/
- [5] Microsoft Learn — Get-MailboxFolderPermission — https://learn.microsoft.com/powershell/module/exchange/get-mailboxfolderpermission
- [6] Microsoft Learn — Set-MailboxFolderPermission — https://learn.microsoft.com/powershell/module/exchange/set-mailboxfolderpermission
¿Viste esto en Instagram?
Comenta el post, comparte con quien lo necesite y sígueme para el próximo módulo.
instagram.com/reel/DbhTw0aRhTh/