Skip to content

Solutions

The seed solutions that ship in the repository.

The solutions/ folder holds the seed solutions. Each entry was verified against a vulnerable replica (mostly Docker containers built for the purpose) and, where the check is behavioral, falsified on a fixed build. A solution is listed by its id, with the identity it uses and the CVE it exercises. The source files live in the exploitmatic/solutions repository.

Supported protocols

The runtime implements eighteen protocols.

Browse the solutions

Sort any column or filter by protocol.

Click a column to sort.
ID Protocol CVE Summary Verified
tls/openssl-heartbleed-mem-leak tls CVE-2014-0160 TLS heartbeat over-read; verified on OpenSSL 1.0.1f, falsified on 1.0.1g verified
http/log4j-jndi-rce http CVE-2021-44228 JNDI lookup RCE via header, out-of-band LDAP bind assert verified
http/tpl-jinja2-ssti-rce http - Jinja2 server-side template injection to RCE to flag read verified
http/wp-batch-route-confusion-sqli-rce http CVE-2026-63030, CVE-2026-60137 REST batch route confusion reaches a SQLi sink; needs a live WordPress lab falsified
https/apache-cve-2021-42013-rce https CVE-2021-42013, CVE-2021-41773 Apache 2.4.49 path traversal to CGI RCE over TLS verified
smtp/opensmtpd-cve-2020-7247-rce smtp CVE-2020-7247 OpenSMTPD 6.6.1p1 MAIL FROM command injection RCE verified
ftp/vsftpd-cve-2011-2523-backdoor ftp CVE-2011-2523 vsftpd 2.3.4 backdoor root shell on port 6200 verified
dns/bind-cve-2015-5477-tkey-dos dns CVE-2015-5477 BIND 9.9.7-P1 TKEY assertion crash verified
snmp/cve-2018-18066-net-snmp-null-deref-dos snmp CVE-2018-18066 net-snmp 5.7.3 snmp_oid_compare NULL deref crash verified
tcp/memcached-cve-2011-4971-dos tcp CVE-2011-4971 memcached negative-length integer underflow crash verified
ldap/openldap-cve-2015-6908-ber-dos ldap CVE-2015-6908 OpenLDAP 2.4.42 ber_get_next assertion crash verified
ssh/openssh-cve-2018-15473-username-enum ssh CVE-2018-15473 OpenSSH 7.7 username enumeration via userauth parse error verified
websocket/ws-cve-2021-32640-redos websocket CVE-2021-32640 ws 7.4.5 ReDoS stall verified
websocket/jetbrains-datalore-interactive-report-unauth-rce websocket - Datalore anonymous RCE via READ to EXECUTE gate; falsified on the patched build verified
smb/samba-cve-2017-7494-rce smb CVE-2017-7494 Samba 4.6.3 is_known_pipename arbitrary module load verified
mysql/mysql-cve-2012-2122-auth-bypass mysql CVE-2012-2122 MySQL 5.5.23 check_scramble auth bypass verified
process/bash-cve-2014-6271-shellshock process CVE-2014-6271 Bash 4.3 env function RCE verified
file/imagemagick-cve-2016-3714-rce file CVE-2016-3714 ImageMagick 6.8.9-9 MVG url() RCE verified
telnet/telnet-cve-2011-4862-encryption-keyid-dos telnet CVE-2011-4862 inetutils 1.8 telnetd KEYID overflow crash verified

The detailed notes for each entry follow.

tls/openssl-heartbleed-mem-leak

CVE-2014-0160, tls identity. A hand-crafted TLS 1.2 ClientHello carrying the Heartbeat extension, then a heartbeat request with a spoofed payload length. The server replies with more bytes than were sent, proving the over-read. Verified on OpenSSL 1.0.1f (nginx), falsified on 1.0.1g. The entry carries the exact openssl-generated hello bytes and the 1803030003014000 heartbeat request.

http/log4j-jndi-rce

CVE-2021-44228, http identity. A ${jndi:ldap://...} lookup injected via the X-Api-Version header. The vulnerable logger resolves the JNDI reference and the LDAP provider calls back the out-of-band listener; the OOB assert on the LDAP bind prefix proves the lookup executed. Verified on a live vulnerable app. A containerized target needs the listener on a routable address (-oob-host), because 127.0.0.1 inside a container is the container’s own loopback.

http/tpl-jinja2-ssti-rce

http identity, Jinja2 server-side template injection. The probe step confirms the template engine evaluates user input, the RCE step runs a command, and the read step pulls the flag back. Verified against a local Flask app using render_template_string.

https/apache-cve-2021-42013-rce

CVE-2021-42013 / CVE-2021-41773, https identity. Apache 2.4.49 path traversal (/icons/.%%32%65/...) reaches a CGI handler and executes /bin/sh with an encoded command. Verified over TLS on httpd 2.4.49 with mod_ssl.

smtp/opensmtpd-cve-2020-7247-rce

CVE-2020-7247, smtp identity. OpenSMTPD 6.6.1p1 command injection through a crafted MAIL FROM address: the injected wget command phones home to the OOB listener. Note that the OpenSMTPD address parser strips colons, so the command must use a no-scheme wget with the implicit port 80 and the listener must run on port 80. Assert is oob "GET /pwned".

ftp/vsftpd-cve-2011-2523-backdoor

CVE-2011-2523, ftp identity. The vsftpd 2.3.4 backdoor opens a root shell on port 6200 after USER backdoor:) followed by PASS. The solution uses the per-step port field to reconnect from 21 to 6200. Verified on a vulnerable vsftpd 2.3.4 container.

dns/bind-cve-2015-5477-tkey-dos

CVE-2015-5477, dns identity. A crafted TKEY query hits an assertion failure in BIND 9.9.7-P1 and kills named. The assert empty type passes when the server stops responding. Verified on a from-source BIND build; the container exits 139 after the crash.

snmp/cve-2018-18066-net-snmp-null-deref-dos

CVE-2018-18066, snmp identity. A crafted SNMPv3 UDP packet (EDB 45544) reaches snmp_oid_compare in snmplib/snmp_api.c in net-snmp before 5.8, dereferences a NULL pointer, and the agent segfaults. The solution proves the agent is up with a normal SNMPv2c GET, fires the malformed packet (the agent answers with a report echoing the attacker username, then crashes), and asserts an empty response to a follow-up GET. Verified against a from-source net-snmp 5.7.3 build; the container exits 139 after the crash.

tcp/memcached-cve-2011-4971-dos

CVE-2011-4971, tcp identity. A memcached ADD with a negative value length triggers an integer underflow that crashes the process. assert empty verifies the crash. Verified on a vulnerable memcached container.

ldap/openldap-cve-2015-6908-ber-dos

CVE-2015-6908, ldap identity. OpenLDAP 2.4.42 ber_get_next assertion failure from a malformed BER packet crashes slapd. assert empty verifies the crash. Verified on a vulnerable OpenLDAP container.

ssh/openssh-cve-2018-15473-username-enum

CVE-2018-15473, ssh identity via the process identity. A malformed userauth request makes OpenSSH 7.7 bail early for nonexistent users, so the response differs for existing and missing usernames. The runtime drives the public exploit script (Rhynorater) through a process step. Verified against a vulnerable OpenSSH 7.7 container.

websocket/ws-cve-2021-32640-redos

CVE-2021-32640, websocket identity. The ws 7.4.5 ReDoS: a crafted frame makes the server stall on a pathological regex. assert empty verifies the stall. Verified against a [email protected] server container.

websocket/jetbrains-datalore-interactive-report-unauth-rce

websocket identity. Datalore 2026.2.3 anonymous RCE through the InteractiveReport READ-to-EXECUTE gate bug. The solution replays the WebSocket conversation, follows the server-assigned port, and writes a marker to prove execution. Verified on the vulnerable replica (marker written), falsified on the patched replica.

smb/samba-cve-2017-7494-rce

CVE-2017-7494, smb identity via the process identity. Samba is_known_pipename calls smb_probe_module on a client-supplied absolute path, and dlopen runs a shared object’s constructor. The exploit uploads pwn.so to a writable guest share, then triggers the load with a raw SMB1 NT_CREATE_ANDX that preserves forward slashes (impacket otherwise normalizes them to backslashes). The constructor writes id output back to the share; the assert reads it. Verified on a from-source Samba 4.6.3 container.

mysql/mysql-cve-2012-2122-auth-bypass

CVE-2012-2122, mysql identity via the process identity. MySQL 5.5.23’s check_scramble memcmp returns a value treated as zero for about 1 in 256 wrong passwords, so looping wrong-password logins eventually authenticates as root. The process step runs a pymysql loop and asserts on LOGIN BYPASS OK. Note the server’s max_connect_errors blocks the host after enough failures; flush it before running, and give the step a long -timeout.

process/bash-cve-2014-6271-shellshock

CVE-2014-6271, process identity. Bash 4.3 parses past the closing brace of a function definition in an exported variable and runs trailing commands. The step runs docker exec into a container with an unpatched bash 4.3.0, sets the crafted variable, and reads back the injected id output as root. Verified against a from-source bash 4.3.0.

file/imagemagick-cve-2016-3714-rce

CVE-2016-3714, file identity. A crafted MVG image whose fill color contains an url(...) value with an embedded pipe runs a shell command when processed by vulnerable ImageMagick. The file step writes the crafted image, the process step runs a vulnerable ImageMagick 6.8.9-9 convert on it, and the injected id output is read back. Verified against a from-source ImageMagick 6.8.9-9.

telnet/telnet-cve-2011-4862-encryption-keyid-dos

CVE-2011-4862, telnet identity. GNU inetutils telnetd copies a client KEYID into a fixed 64-byte buffer with memmove and no length check. The solution negotiates TELOPT ENCRYPT (IS with IV, SUPPORT, REPLY), then sends a 400-byte KEYID that smashes the buffer and the adjacent function pointer, crashing the telnetd child. assert empty verifies the crash. Verified against a from-source inetutils 1.8 telnetd with ENCRYPTION and AUTHENTICATION enabled.

http/wp-batch-route-confusion-sqli-rce

CVE-2026-63030 plus CVE-2026-60137, http identity. Requires a live WordPress lab; the route-confusion path lets an unauthenticated batch request reach a SQL injection sink.

Write attacks down. Verify them.

Download the binary, point it at a target you own, and get a verified result. The corpus is open and the format is plain text.