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
http/keycloak-cve-2026-18963-reset-credentials-bypass http CVE-2026-18963 Keycloak reset-credentials email-gate bypass to account takeover; verified on 26.7.1, falsified on 26.7.2 verified
http/nextjs-cve-2026-75604-rce http CVE-2026-75604 Next.js Windows cache-traversal to Server Action key disclosure and forged-action RCE; verified on 16.2.11, falsified on 16.3.3 verified
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
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 ws@7.4.5 server container.

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.

http/keycloak-cve-2026-18963-reset-credentials-bypass

CVE-2026-18963 (GHSA-4gv3-mc9p-5wqc), http identity. Keycloak 26.0.0 through 26.7.1 unauthenticated account takeover through the reset-credentials flow. The flow trusts a boolean AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED note and ResetCredentialEmail.action() succeeds without an action token, so a caller who knows a username skips the email gate, lands on UPDATE_PASSWORD, sets a new password, and logs in as the victim. The solution replays cookies and rotating session codes with capture, uses raw-form bodies for the multi-field update-password form, and ends with a direct-grant login as the final assert. Verified on Keycloak 26.7.1 (8/8), falsified on 26.7.2 (the selector re-show and bypass steps fail). Adjust the vars (realm, client, username, newpass) for the target.

http/nextjs-cve-2026-75604-rce

CVE-2026-75604 (GHSA-p293-qw3h-jr36), http identity. Unauthenticated remote command execution in Windows-hosted Next.js. The solution walks the reference attack chain: it reads the dynamic Pages ISR page for the build id, primes the dynamic App-route cache with a backslash traversal (Connection: close, required for the cache entry to flush), leaks the private Server Action manifest through the pages data route (encryptionKey plus action ids), parses the Server Action form for the reference and action id, seals the bound arguments with a set AES-GCM transform, and POSTs a forged multipart action whose constructor gadget runs cmd.exe and phones the output back to the OOB listener. The forge step’s report line shows the command output (body "command\\goldendivider"). Verified on next@16.2.11 (4/4), falsified on next@16.3.3 (the leak-manifest step fails and the run reports not verified). The target must be a native Windows server with a pristine .next cache; a failed traversal attempt writes a rendered cache entry that shadows the manifest until the build is rebuilt. Adjust origin, field, and command in vars.

Give exploit research a common language.

Bring a PoC, a writeup, or an AI-generated draft into an Exploitmatic solution: inspect it, validate it, and replay it against a target you own. The runtime and the corpus are open source.