============================================================================== EL PHISHING QUE NO TE PIDE LA CONTRASEñA, Y POR ESO EL MFA NO LO DETIENE ============================================================================== Fuente: https://www.vantis.cl/noticias/device-code-phishing-campana-nacional-microsoft-365-chile Publicado: 2026-08-02 (hora de Chile) Ambito: chile · Criticidad: critica Descargado: 2026-10-12 06:59 (hora de Chile) COMO USAR ESTE ARCHIVO ---------------------- La regla SIGMA es la canonica: es el formato neutral del que se derivan las demas. Si tu SIEM no aparece aca, convierte esa con pySigma. Las traducciones a motores concretos se incluyen por conveniencia y ESTAN SIN VALIDAR CONTRA TU MODELO DE DATOS. Revisa los nombres de tabla, indice y campo antes de ponerlas en produccion. Una regla que no dispara por un campo mal escrito es peor que no tener regla. QUE NECESITAS TENER LOGUEADO ---------------------------- · SigninLogs de Entra ID, con el campo AuthenticationProtocol · AADNonInteractiveUserSignInLogs, donde aparece el uso posterior de los tokens · AuditLogs de Entra ID: registro de dispositivos y consentimientos OAuth · Registros de Exchange Online o CloudAppEvents, para reglas de bandeja de entrada ============================================================================== REGLA 1 de 6 · SIGMA (canonica, neutral) Device Code Flow en Entra ID (regla canonica) ============================================================================== Requiere: SigninLogs de Entra ID. La ruta del campo depende de como llegue el log: 'properties.authenticationProtocol' si se ingesta crudo desde Event Hub, 'AuthenticationProtocol' sin prefijo si ya viene normalizado al esquema de tabla de Sentinel. Ajusta el mapeo del backend antes de convertir. title: Autenticacion por Device Code Flow en Entra ID id: 7c41f0ab-2d95-4e18-b6f3-1a08d5e97c24 status: experimental description: | Detecta inicios de sesion que usan el flujo de codigo de dispositivo (RFC 8628). En la mayoria de los tenants corporativos este flujo no se usa nunca, asi que cualquier aparicion merece revision. La campana AIA26-00268 lo aprovecho para obtener tokens validos sin montar una pagina de login falsa: la victima se autentica en el portal real de Microsoft y entrega el codigo al atacante. author: Vantis Chile SpA date: 2026/09/02 references: - https://www.vantis.cl/noticias/device-code-phishing-campana-nacional-microsoft-365-chile - https://datatracker.ietf.org/doc/html/rfc8628 logsource: product: azure service: signinlogs detection: device_code: properties.authenticationProtocol: deviceCode exitoso: properties.status.errorCode: 0 condition: device_code and exitoso fields: - properties.userPrincipalName - properties.appDisplayName - properties.ipAddress - properties.location.countryOrRegion falsepositives: - Aprovisionamiento de equipos sin teclado, como salas Teams Rooms o senaletica digital - Herramientas de consola que lo usan a proposito, como "az login --use-device-code" - Onboarding masivo de dispositivos por parte del area de TI, acotado en el tiempo level: high tags: - attack.credential_access - attack.t1528 - attack.initial_access - attack.t1566 ============================================================================== REGLA 2 de 6 · MICROSOFT SENTINEL - KQL Inventario de 90 días de inicios de sesión por Device Code ============================================================================== Requiere: SigninLogs de Entra ID conectados a Sentinel. Ejecutar esto primero, antes de bloquear // Inicios de sesion por Device Code Flow: en la mayoria de los tenants deberian ser cero SigninLogs | where TimeGenerated > ago(90d) | where AuthenticationProtocol =~ "deviceCode" | extend Pais = tostring(LocationDetails.countryOrRegion), Ciudad = tostring(LocationDetails.city) | summarize Intentos = count(), Exitosos = countif(ResultType == 0), Apps = make_set(AppDisplayName, 10), Paises = make_set(Pais, 10), IPs = make_set(IPAddress, 10), Primero = min(TimeGenerated), Ultimo = max(TimeGenerated) by UserPrincipalName | order by Exitosos desc ============================================================================== REGLA 3 de 6 · MICROSOFT SENTINEL - KQL Actividad posterior: reglas de correo, Graph y dispositivos ============================================================================== Requiere: AuditLogs, AADNonInteractiveUserSignInLogs y CloudAppEvents o Defender for Cloud Apps // Actividad posterior tipica: reglas de correo, lectura masiva por Graph, dispositivos nuevos let ventana = 90d; union isfuzzy=true (CloudAppEvents | where Timestamp > ago(ventana) | where ActionType in ("New-InboxRule","Set-InboxRule","UpdateInboxRules") | project Timestamp, Usuario = AccountDisplayName, Senal = "regla de correo creada", Detalle = tostring(RawEventData)), (AADNonInteractiveUserSignInLogs | where TimeGenerated > ago(ventana) | where AppDisplayName has_any ("Microsoft Graph","Microsoft Authentication Broker") | where ResultType == 0 | project Timestamp = TimeGenerated, Usuario = UserPrincipalName, Senal = "token usado contra Graph", Detalle = strcat(IPAddress, " / ", AppDisplayName)), (AuditLogs | where TimeGenerated > ago(ventana) | where OperationName has_any ("Add device","Add registered users","Consent to application") | project Timestamp = TimeGenerated, Usuario = tostring(InitiatedBy.user.userPrincipalName), Senal = OperationName, Detalle = tostring(TargetResources)) | order by Timestamp desc ============================================================================== REGLA 4 de 6 · MICROSOFT SENTINEL - KQL Los tres dominios publicados por la ANCI ============================================================================== Requiere: Defender for Office 365 y for Endpoint, o registros DNS del resolver // Los tres dominios publicados por la ANCI en AIA26-00268 let dominios = dynamic(["account.important.vu","sayze.cl","zace0bwdgj.smoothwebexperiences.de"]); union isfuzzy=true (EmailUrlInfo | where Timestamp > ago(120d) | where Url has_any (dominios) | project Timestamp, Origen = "correo", Detalle = Url), (DeviceNetworkEvents | where Timestamp > ago(120d) | where RemoteUrl has_any (dominios) | project Timestamp, Origen = "navegacion", Detalle = RemoteUrl), (DnsEvents | where TimeGenerated > ago(120d) | where Name has_any (dominios) | project Timestamp = TimeGenerated, Origen = "dns", Detalle = Name) | order by Timestamp desc ============================================================================== REGLA 5 de 6 · GOOGLE SECOPS - YARA-L Contacto con los dominios de AIA26-00268 ============================================================================== Requiere: Registros de DNS, proxy o EDR normalizados a UDM. Va contra los dominios y no contra el protocolo de autenticacion a proposito: el mapeo de Device Code a UDM varia segun el parser, un dominio en un log de DNS no. rule vantis_aia26_00268_device_code_dominios { meta: author = "Vantis Chile SpA" description = "Contacto con los tres dominios de la campana de Device Code phishing " \ "publicada por la ANCI en AIA26-00268 (Chile, agosto 2026)" reference = "https://www.vantis.cl/noticias/device-code-phishing-campana-nacional-microsoft-365-chile" severity = "HIGH" priority = "HIGH" rule_version = "1.0" yara_version = "YL2.0" events: ( re.regex($e.network.dns.questions.name, `(^|\.)(account\.important\.vu|sayze\.cl|zace0bwdgj\.smoothwebexperiences\.de)$`) or re.regex($e.target.hostname, `(^|\.)(account\.important\.vu|sayze\.cl|zace0bwdgj\.smoothwebexperiences\.de)$`) or re.regex($e.target.url, `(account\.important\.vu|sayze\.cl|zace0bwdgj\.smoothwebexperiences\.de)`) ) outcome: $usuario = $e.principal.user.userid $equipo = $e.principal.hostname $destino = $e.target.hostname condition: $e } ============================================================================== REGLA 6 de 6 · IBM QRADAR - AQL Busqueda retroactiva de 90 dias sobre los dominios ============================================================================== Requiere: Las propiedades personalizadas 'URL' y 'DNS Query Name' deben existir y estar extraidas en tu DSM de proxy y de DNS. Si tu instalacion las nombra distinto, cambia el nombre entre comillas; una propiedad inexistente hace fallar la consulta. SELECT DATEFORMAT(devicetime, 'yyyy-MM-dd HH:mm:ss') AS fecha, QIDNAME(qid) AS evento, LOGSOURCENAME(logsourceid) AS fuente, username AS usuario, sourceip AS origen, destinationip AS destino, "URL" AS url, "DNS Query Name" AS consulta_dns FROM events WHERE "URL" ILIKE '%account.important.vu%' OR "URL" ILIKE '%sayze.cl%' OR "URL" ILIKE '%zace0bwdgj.smoothwebexperiences.de%' OR "DNS Query Name" ILIKE '%account.important.vu%' OR "DNS Query Name" ILIKE '%sayze.cl%' OR "DNS Query Name" ILIKE '%zace0bwdgj.smoothwebexperiences.de%' ORDER BY devicetime DESC LAST 90 DAYS ============================================================================== FALSOS POSITIVOS ESPERABLES ============================================================================== El inventario de Device Code Flow va a mostrar usos legítimos si tienes dispositivos sin navegador: pantallas de sala, impresoras, algún equipo de laboratorio. Identifícalos antes de bloquear; ese es el punto de correr la consulta primero. La regla de actividad posterior tiene ruido propio: se crean reglas de correo legítimas todos los días. Lo que la vuelve señal es la coincidencia temporal con un inicio de sesión por Device Code. Correlaciona por usuario y ventana de tiempo, no mires las alertas por separado. ============================================================================== Vantis Chile SpA · https://www.vantis.cl/noticias Analisis con fines defensivos. Reutilizable citando la fuente. ==============================================================================