Skip to content

How it works

A plain text file becomes a verified result

A solution describes an attack, step by step. The runtime reads the file, talks to the target, and reports whether the attack worked.

The file

Header, then steps

Header lines at the top name the attack. Each block after that is one step: it starts with an identity and a name, then key: value lines, and ends with an assert, the pass or fail test.

The identity is the protocol the step speaks. The session persists across steps, so a solution can stage a handshake and then fire its payload.

heartbleed-mem-leak.txt text
id: openssl/heartbleed-mem-leak
summary: CVE-2014-0160 Heartbleed
ref: CVE-2014-0160

tls clienthello-heartbeat
  send: 1603030125010001210303...
  recv_until: 0e000000
  recv: 65536
  assert: contains "0e000000"

tls malformed-heartbeat
  send: 1803030003014000
  recv: 70000
  assert: regex "18030[123]40"
terminal bash
$ exploitmatic heartbleed-mem-leak.txt 127.0.0.1:8443

clienthello-heartbeat  PASS  contains "0e000000"
malformed-heartbeat    PASS  regex "18030[123]40"

result: verified (2/2)

The run

What a run reports

The runtime prints what was sent, what came back, and the test that ran on each step. One line per step, then a result line. There is no artifact file; the console output is the result.

The result comes from the tests, never from the file, so it always comes from the run itself. When every test passes, the run is verified. When one fails, the report names the step and the test that failed.

Identities

The protocol is the identity

A step's identity is the protocol it speaks, from the open IANA/STIX vocabulary. The runtime implements eighteen protocols today, from HTTP and TLS to DNS, SMB, and host steps. The full identity list and per-protocol fields live in the documentation.

See the grammar in full

The whole format, on one page, written so a human can read it and an LLM can write it.