Out-of-band (OOB) techniques confirm blind vulnerabilities — cases where the application response gives no direct feedback (blind SSRF, blind XXE, blind injection). Instead of diffing responses, CyberAI plants a payload that forces the target to call back to phantom-grid, which captures the DNS/HTTP interaction out of band. A captured callback is proof of execution.
+-- SSRFWorkflow --> target app ----+
+-- XXEWorkflow --> XML parser ----+--> phantom-grid (captures callback)
+-- OOBWorkflow --> generic inject -+
|
PhantomGridClient.get_interactions(id) <+ (polls captured interactions) - cyberai/integrations/phantom_grid.py — PhantomGridClient (token-flow, v2 API)
cyberai/agents/exploit/ssrf_workflow.py—SSRFWorkflowcyberai/agents/exploit/xxe_workflow.py—XXEWorkflowcyberai/agents/exploit/oob_workflow.py—OOBWorkflow(generic orchestration)
The grid runs on port 9090. The capture URL is derived from a server-issued token, not a client-generated id:
from cyberai.integrations.phantom_grid import PhantomGridClient
grid = PhantomGridClient(base_url="http://127.0.0.1:9090")
if not grid.available(): # health check; graceful if grid is down
...
token = grid.create_token(label="ssrf-example") # POST /api/tokens -> token
url = grid.capture_url(token) # http://<host>/c/<token>
# ... inject `url` into the target ...
hits = grid.get_interactions(token) # GET captured interactionsOOBInteraction.confirmed is True once a DNS/HTTP hit lands on the token.
SSRFWorkflowrequests a capture URL from phantom-grid (server token).- Build the SSRF payload pointing at that URL (
_make_payload). - Inject into the candidate parameter via GET or POST (
test/test_batch). - Poll
get_interactions(token)for a DNS/HTTP callback. - Confirmed hit →
SSRFResultwith HIGH severity; recorded as a finding.
XXEWorkflowbuilds an XML payload with an external entity referencing the phantom-grid capture URL.- Submit to the XML-parsing endpoint.
- A parser that resolves the entity triggers the OOB callback.
- Poll for the interaction → confirmed blind XXE.
Authorized targets only. Confirm scope before running (
cyberai scope import).
- Start phantom-grid locally (or point
phantom.grid_urlat your instance). - Run the exploit phase with OOB enabled:
python -m cyberai scan example.com --scope example.com- ExploitAgent picks an SSRF-candidate parameter, requests a token from the
grid, and injects
http://<host>/c/<token>into it. - If
example.comfetches the URL server-side, phantom-grid records the hit. get_interactions(token)returns a confirmedOOBInteraction; the agent raises a HIGH-severity SSRF finding into the report.
- No callback within the poll window → reported as unconfirmed, never a false HIGH. Absence of evidence is not evidence.
- phantom-grid absent / unreachable → workflows degrade gracefully
(
available = False); the deterministic pipeline still completes. - WebSocket push is on the phantom-grid roadmap; the current client polls over HTTP.