Obfuscated Javascript ontrafelen.

Door eghie op zaterdag 22 januari 2011 14:14 - Reacties (6)
Categorie: Clientside web, Views: 4.934

Het wil nog wel eens gebeuren dat er wormen, via Javascript PC's infecteren. Nu kom ik als hosting server beheerder (1 van mijn taken) wel eens websites op onze server tegen die obfuscated javascript code bevatten waarin een exploit wordt misbruikt, die via een worm of via een cracker op de websites wordt gezet.

Als ik die obfuscated code tegen kom, wil ik ook kunnen zien wat die code doet en kijken of het uberhaubt kwaadaardig is, voordat ik het verwijder. Nu zijn daar wel goede mogelijkheden voor om dat te ontrafelen.
1. Installeer spidermonkey
Eerst moeten we spidermonkey installeren. Dit is een javascript engine, die je javascript kan uitvoeren en de output op de CLI kan weergeven.

Op Ubuntu/Debian kun je het volgende commando gebruiken om het te installeren:
aptitude install spidermonkey-bin
2. Maak een bootstrap aan
Nu moeten we een bootstrap aanmaken, die functies bevat die hoogstwaarschijnlijk door het te debuggen script wordt gebruikt. Dit zijn functies die door de browsers worden geimplementeerd. Meestal zijn een paar basic functies wel genoeg om een heel eind te komen.

Inhoud van de basis bootstrap.js:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
replace_script = function(arg0) {
    re = new RegExp(/<\/?script[^>]*>/gi);

    return arg0.replace(re, '');
}

old_eval = eval;
eval = function(arg0) {
    print("eval arg: " + arg0);

    try {
        old_eval(replace_script(arg0));
    } catch (err) {}
}

document = {
    write: function(arg0) {
        eval(arg0);
        print(replace_script(arg0));
    },
    writeln: function(arg0) {
        eval(arg0);
        print(arg0 + "\n");
    }
}



Je ziet dat de code niet helemaal klopt. Ik heb dit in de praktijk een aantal keer op deze manier gebruikt en gaf me wel de meeste info om de gede-obfuscate code te snappen. Vandaar dat ik het op deze manier gebruik. Je kunt deze file met extra functies uitbereiden bij uitgebreidere obfuscated code.
3. stop de obfuscated code in obfuscated.js
Stop de code die je wilt deobfuscaten in obfuscated.js. Zodat je die aan spidermonkey kunt voeren.
4. Begin het debuggen met spidermonkey
Om spidermonkey te starten, open de CLI/terminal. En gebruik het volgende commando:
js -f bootstrap.js obfuscated.js


Die output wordt op het scherm weergegeven. Nu kun je aanpassingen maken aan bootstrap.js om de informatie uit te bereiden. Maar je hebt nu een goede basis draaien om veel van die code te ontrafelen.
Andere opties
Je hebt ook een website die je kan helpen. Zie http://jsunpack.jeek.org/dec/go Daar kun je ook obfuscated code in stoppen en geeft je ook debug info om te kijken of de code potentieel kwaadaardig is.


Ik als server beheerder wil eigenlijk wel een soort van detectie systeem aan de linux kant die alle virtual hosting mappen naloopt die scant naar obfuscated javascript code, zodat ik kan controleren of het ook daadwerkelijk schade kan en zo ja het kan verwijderen, iemand een idee hoe dat op te lossen?

Reacties


Door Tweakers user YopY, zaterdag 22 januari 2011 14:29

Lijkt me niet direct JS ontobfusceren (als dat een woord is, :+), maar eerder een tool die je kan helpen om de code te begrijpen, en op basis van dat begrip de code handmatig te de-obfuscaten. Of zie ik het verkeerd?

Door Tweakers user ACM, zaterdag 22 januari 2011 14:30

Je beseft wel dat niet alle obfuscated javascript-code 'badware' is? Het is ook nuttig/nodig om een optimaal 'minified' resultaat te krijgen. Als wij onze minified scripts ook nog van kortere variabelenamen zouden voorzien, dan zouden we zomaar nog 10KB besparen. Kortere functienamen zou nog meer schelen (maar veel meer werk om uit te voeren en het debuggen van problemen een stuk moeilijker).

Een voorbeeld daarvan zie je bij Google's analytics-script: http://www.google-analytics.com/ga.js

Uiteraard is het - voor hun - ook mooi meegenomen dat die code nauwelijks te lezen is en dus minder makkelijk over te nemen.

Door Tweakers user eghie, zaterdag 22 januari 2011 14:30

YopY schreef op zaterdag 22 januari 2011 @ 14:29:
Lijkt me niet direct JS ontobfusceren (als dat een woord is, :+), maar eerder een tool die je kan helpen om de code te begrijpen, en op basis van dat begrip de code handmatig te de-obfuscaten. Of zie ik het verkeerd?
Ja klopt. Dat is inderdaad vrij waar. :) Ik zal het proberen aan te passen.
ACM schreef op zaterdag 22 januari 2011 @ 14:30:
Je beseft wel dat niet alle obfuscated javascript-code 'badware' is? Het is ook nuttig/nodig om een optimaal 'minified' resultaat te krijgen. Als wij onze minified scripts ook nog van kortere variabelenamen zouden voorzien, dan zouden we zomaar nog 10KB besparen. Kortere functienamen zou nog meer schelen (maar veel meer werk om uit te voeren en het debuggen van problemen een stuk moeilijker).

Een voorbeeld daarvan zie je bij Google's analytics-script: http://www.google-analytics.com/ga.js

Uiteraard is het - voor hun - ook mooi meegenomen dat die code nauwelijks te lezen is en dus minder makkelijk over te nemen.
Ik besef mij dat niet alle obfuscated code badware is inderdaad. Meestal wordt obfuscated code wat gewoon legale code is, gelinkt via een externe source. En wordt veel de exploit code gewoon inline geplaatst. Het is voor mij meer een methode als beheerder, om te controleren of het geen kwaad kan de code. Als dat zo is laat ik het staan, maar we hosten veel kleine websites die normaal gesproken helemaal geen obfuscated code gebruiken. En het wil nogal eens gebeuren dat mensen in de code van hun eigen website bladeren en zich afvragen wat dat stukje obfuscated js code daar doet. Dan is dit een handig hulpmiddel. Ik heb er al een paar keer handig gebruik van gemaakt.

[Reactie gewijzigd op zaterdag 22 januari 2011 14:35]


Door Tweakers user Ventieldopje, zaterdag 22 januari 2011 16:57

eghie schreef op zaterdag 22 januari 2011 @ 14:30:
[...]

Ja klopt. Dat is inderdaad vrij waar. :) Ik zal het proberen aan te passen.


[...]

Ik besef mij dat niet alle obfuscated code badware is inderdaad. Meestal wordt obfuscated code wat gewoon legale code is, gelinkt via een externe source. En wordt veel de exploit code gewoon inline geplaatst. Het is voor mij meer een methode als beheerder, om te controleren of het geen kwaad kan de code. Als dat zo is laat ik het staan, maar we hosten veel kleine websites die normaal gesproken helemaal geen obfuscated code gebruiken. En het wil nogal eens gebeuren dat mensen in de code van hun eigen website bladeren en zich afvragen wat dat stukje obfuscated js code daar doet. Dan is dit een handig hulpmiddel. Ik heb er al een paar keer handig gebruik van gemaakt.
Je mag natuurlijk niet zonder hun toestemming lekker in hun bestanden neuzen me thinks ;)

Door Tweakers user eghie, zaterdag 22 januari 2011 17:17

Phas0r schreef op zaterdag 22 januari 2011 @ 16:57:
[...]


Je mag natuurlijk niet zonder hun toestemming lekker in hun bestanden neuzen me thinks ;)
Dat doen we ook niet, alleen van de software van de klanten die we zelf onderhouden. 80% van de klanten die we hosten, onderhouden we de software zelf ook van. Mocht er een klant zelf zijn zooi onderhouden dan bellen we met de klant en dan overleggen we hoe we het gaan aanpakken.

Maar ik heb al wel eens een aantal topics tegen gekomen van mensen die exploit code van het Gumblar virus op hun website hadden staan of andere virussen waarvan ze in de 1e instantie niet wisten wat die code eigenlijk deed. Vandaar dat ik het hier post. Dan zijn er dus mogelijkheden om dat te debuggen.

Door Tweakers user ReenL, zaterdag 22 januari 2011 23:30

Vet idee om dat zo op te lossen, vraag me wel af hoe vaak deze oplossing werkt, elke obvuscation is anders, tuurlijk doen eval en document.write vaak mee. Maar ik neem aan dat je op deze manier ook vaak veel bullshit over je scherm ziet vliegen.

Desalniettemin goed bezig! Ik deed het voorheen nog altijd met een beetje firebug en copy pasta in een js file totdat ik het eindresultaat had.

Reageren is niet meer mogelijk