Cuando pensamos en phishing, casi siempre pensamos en bancos o servicios en línea. Pero hoy encontré un caso diferente. No intentaba robar una contraseña ni imitar una plataforma financiera. Parecía una pizzería.
dominos[.]pizzaguate[.]com ofrecía menú, promociones, buscador de tiendas, carrito y checkout. Al final solicitaba número de tarjeta, fecha de vencimiento y código de seguridad. La pizza era solo el pretexto.

Vista del sitio falso dominos[.]pizzaguate[.]com, que reproduce promociones, navegación, carrito y flujo de compra de Domino’s Guatemala.
Infraestructura
| Elemento | Valor |
|---|---|
| IP | 89.163.155.33 |
| ASN | AS24961 MYLOC-AS WIIT AG (Alemania) |
| Red | 89.163.128.0/17 |
| RDNS | 89.163.155.33.bwys.net |
| Servidor | nginx, con x-turbo-charged-by: LiteSpeed |
| Certificado | wildcard *.pizzaguate.com, 2026-06-16 al 2026-09-14 |
| Hash del index | 591e32826e58d02d... |
Hosting compartido alemán con cPanel y LiteSpeed detrás. La IP acumula más de 8,000 escaneos en urlscan y aparece marcada como Bad, o sea proveedor abusado de forma recurrente y no infraestructura dedicada. No hay Cloudflare enfrente, no hay antibot, no hay filtrado geográfico y no hay una sola línea ofuscada.
El certificado se emitió el 16 de junio a las 23:43 y el Home.css tiene Last-Modified del 17 de junio a las 15:53. Diecisiete horas entre sacar el certificado y publicar el sitio. Cuando lo escaneé llevaba un mes vivo.
Que sea wildcard importa, y vuelvo a eso más abajo.
El checkout
El flujo son tres pasos: 1 DE 3 | INFORMACION, 2 DE 3 | NUMERO NIT, 3 DE 3 | PAGO. El segundo paso pide NIT con opción C/F, que es un detalle genuinamente local y no viene de ningún template gringo. Alguien pensó en Guatemala.
El tercer paso pide la tarjeta:
<input type="date" id="order_date" name="order_date" required /> <!-- vencimiento -->
<input type="tel" id="phone1" name="phone1" required /> <!-- tarjeta, 16 dígitos -->
<input type="tel" id="phone2" name="phone2" required /> <!-- CVV, 3 dígitos -->
El número de tarjeta viaja como phone1 y el CVV como phone2. Nadie renombra un CVV a “phone2” sin querer. Es ofuscación deliberada de nombres de campo y sirve para que un POST interceptado, un log de servidor, una extensión de navegador o cualquier regla que busque name="cc", name="card_number" o name="cvv" no levante nada. Un pedido de pizza con dos teléfonos es lo más normal del mundo. Es la única parte del sitio donde el actor demostró saber lo que estaba haciendo, y de paso es un buen argumento contra la detección que depende del nombre del campo: el campo se llama como el atacante quiera.
Del resto del checkout rescato dos cosas. La primera:
<label style="color: #D20000;">* Tus articulos aplican solo pago con tarjeta</label>
<input type="radio" name="payment" value="pay_in_store"> Pagar en tienda
Ofrecen pagar en tienda y en la misma pantalla le avisan que sus artículos no aplican. La opción está ahí para que la página se vea normal, no para que la use. La segunda es que el botón de tarjeta dice CyberSource en azul corporativo, sin un iframe ni una redirección real hacia CyberSource. Es una palabra dentro de un <strong>. El nombre de la pasarela como amuleto, que es más o menos para lo que sirven las marcas de pasarela cuando nadie verifica que estén ahí.
Todo lo demás está mal hecho
El kit no es un producto comercial. Es un template de e-commerce, casi con seguridad un proyecto de práctica tipo “Domino’s clone” bajado de GitHub y parchado encima. El dueño original dejó huellas por todos lados: archivos llamados Manu.css y ShopingCard.js, con los errores de tipeo intactos; un menú que dice PROMOTION y Store junto a un botón que dice MODIFICA TU ORDEN; una validación que le grita Please fill in all fields. al usuario guatemalteco; y un producto fantasma en el resumen llamado “Baitz Cinnamon” que no existe en ningún Domino’s de este país.
La exfiltración está rota. Hay dos rutas de salida, un <form action="submit_order.php"> clásico y un fetch() a /api/forms_action/submit_order_with_products.php con payload JSON. El botón dispara document.getElementById('finalOrderForm').submit() desde un onclick, y llamar .submit() por código no dispara el evento submit, así que el addEventListener("submit", ...) con su preventDefault() nunca corre. El fetch es código muerto y todo se va por el POST nativo. Por si quedaba duda de que nadie probó esto, el payload del fetch referencia una variable total_tax que jamás se declara: si llegara a ejecutarse, revienta con un ReferenceError.
Y los precios están en la moneda de otro país. El resumen del pedido dice:
1.5 Liters Sprite Lemon 1 $10,500
Baitz Cinnamon 4 $59,600
Total: $70,100
Diez mil quinientos por una Sprite, en dólares, con separadores de miles al estilo estadounidense cortesía de un toLocaleString("en-US") que quedó del template. Nadie en Guatemala cree que una pizza cuesta Q70,100, y el sitio ni siquiera usa el quetzal. Los montos sí calzan con pesos colombianos, donde Q70,100 son unos ciento treinta y cinco quetzales, que es el precio verosímil de una pizza y una gaseosa. La lectura que me queda es que el kit viene de una campaña regional previa, colombiana o adaptada de un template colombiano, y que a quien lo tropicalizó le alcanzó la atención para agregar el NIT pero se le olvidó tocar la moneda. Le dejó los precios al dueño anterior.
De yapa, el sitio filtra su propia API key de Google Maps en el cliente, sin restricción de referrer.
El wildcard
Aquí es donde la cosa deja de ser graciosa.
El certificado no es para dominos.pizzaguate.com. Es para *.pizzaguate.com. El actor puede levantar pizzahut.pizzaguate.com o lo que se le antoje sin emitir un certificado nuevo, y Certificate Transparency no me va a avisar de ninguno.
Los que monitoreamos CT para cazar suplantación de marca vivimos de que cada dominio nuevo genere un certificado nuevo que caiga en los logs. Un wildcard rompe esa suposición completa. Un certificado, subdominios ilimitados, cero ruido en CT. Es una limitación conocida, pero una cosa es saberla y otra es tropezársela en una campaña activa contra una marca local.
Al enumerar el dominio por otras vías aparece esto:
dominos.pizzaguate.com
dominosgt.pizzaguate.com
whm.pizzaguate.com
cpanel.pizzaguate.com
mail.pizzaguate.com
webmail.pizzaguate.com
ftp.pizzaguate.com
webdisk.pizzaguate.com
cpcontacts.pizzaguate.com
cpcalendars.pizzaguate.com
Los últimos ocho son el juego de subdominios que cPanel crea de fábrica, pero whm. no aparece en una cuenta de hosting compartido normal. Su presencia apunta a reseller o VPS administrado, o sea que el actor crea subdominios a voluntad y reportar una URL individual no logra gran cosa. Hay que ir por la cuenta.
Y luego está dominosgt, que tiene el listado de directorios habilitado y sirve esto:
Index of /
cgi-bin 2026-06-29 00:52
index (html sin nada malo hola mundo).html 2026-06-29 00:53 4k
Proudly Served by LiteSpeed Web Server at dominosgt.pizzaguate.com Port 443
cgi-bin lo crea cPanel automáticamente al dar de alta un subdominio, así que ese timestamp fecha el nacimiento del subdominio: 29 de junio, 00:52. Doce días después de que dominos ya estaba operando. Un minuto más tarde subieron el archivo.
La línea de tiempo completa queda así:
| Fecha | Evento |
|---|---|
| 2026-06-16 23:43 | Emisión del wildcard *.pizzaguate.com |
| 2026-06-17 15:53 | Kit de dominos en línea |
| 2026-06-29 00:52 | Creación del subdominio dominosgt |
| 2026-06-29 00:53 | Subida del placeholder |
| 2026-07-15 | Escaneo |
dominosgt es además mejor señuelo que dominos, porque es el nombre que un guatemalteco reconoce más rápido. Lo que hay ahí es un subdominio de rotación aprovisionado y en espera: el día que tumben dominos, el kit se copia a dominosgt en minutos, sin certificado nuevo, sin registrar nada y sin una sola línea en CT. El takedown va a durar lo que el actor tarde en leer el correo de suspensión.
El otro subdominio
La página principal no era el único subdominio relacionado. En dominosgt[.]pizzaguate[.]com estaba habilitado el listado de directorios y aparecía un archivo llamado index (html sin nada malo hola mundo).html.
<title>Hola Mundo — Ejemplo HTML</title>
<p>Este es un archivo HTML de ejemplo — listo para abrir en tu navegador.</p>
<!-- JavaScript mínimo para interacción -->
<footer id="mensaje" aria-live="polite">
El archivo tenía variables CSS en :root, una paleta de colores completa, atributos de accesibilidad, comentarios explicativos y hasta un selector de modo claro y oscuro. Demasiado trabajo para un simple hola mundo. Es probable que haya sido generado con ayuda de una IA.
El nombre también resulta llamativo: index (html sin nada malo hola mundo). Como no se llama index.html, el servidor no lo utiliza como página principal y termina mostrando el contenido del directorio. El archivo que probablemente pretendía indicar que el subdominio todavía estaba limpio terminó exponiendo su estructura.
Lo que deja este caso
Este tipo de campaña puede pasar desapercibido porque no se presenta como el phishing tradicional. No busca credenciales de acceso, no pide OTP y no imita una plataforma financiera. La víctima cree que está realizando una compra legítima y entrega directamente los datos de su tarjeta dentro de un flujo que parece normal.
El problema puede detectarse solo después, cuando empiezan a aparecer cargos no reconocidos y resulta difícil identificar el punto exacto de compromiso. La víctima, además, puede afirmar con total honestidad que no ingresó a ningún sitio extraño: entró a pedir una pizza.
El punto ciego es estructural. Muchas marcas no financieras tienen menos capacidad para detectar y responder ante este tipo de suplantación, aunque el impacto termine afectando directamente a sus clientes. Mientras tanto, montar una campaña así requiere poco: un template reutilizado, hosting económico, un certificado gratuito y algunas modificaciones para capturar los datos.
En este caso, casi todo estaba mal hecho. Lo único realmente cuidado fue cambiar los nombres de los campos que recibían el número de tarjeta y el código de seguridad.
IoCs
dominos.pizzaguate.com
www.dominos.pizzaguate.com
dominosgt.pizzaguate.com
pizzaguate.com
89.163.155.33
AS24961 (MYLOC-AS WIIT AG, DE)
591e32826e58d02d2d2e74ab456ff2d735adb26989eaca6c23ac49b0701b7ee2 index
30ded20f4823376500e61709dbe2848a43026db1f3eab9c46263c0be24a9459f Home.css
/HTML/payment/payment.php
/HTML/payment/submit_order.php
/api/forms_action/submit_order_with_products.php
/HTML/viewDetail/viewDetail.php?order_id=
Reportado al proveedor de hosting, a Google Safe Browsing y al franquiciatario de la marca.
Cierre
Hasta a las pizzerías les hacen phishing.
En este caso, el actor reutilizó un sitio mal terminado, dejó errores visibles, publicó un subdominio con listado de directorios y desplegó código que ni siquiera funcionaba como esperaba. Aun así, el formulario principal seguía siendo capaz de recibir datos de tarjeta.
No hizo falta imitar un banco ni montar una operación sofisticada. Bastó con ofrecer una promoción creíble, dejar que la víctima armara su pedido y esperar a que ingresara la tarjeta.
La pizza nunca iba a llegar.