Mirage

An LLM-driven web honeypot that improvises convincing responses, plus an analyst agent that turns what it catches into verified detection rules. Built on Nebius Token Factory with NVIDIA Nemotron 3 Nano and Ultra.

What you are looking at. This is a static export of real output from Mirage running on Nebius Token Factory: 49 pages it built or generated for a fictional company (Northridge Logistics Group), and the dashboard of 13 recorded attacker sessions. The live system runs from the source code; the demo video shows it running.

Browse the fictional company site

Every page was written by Nemotron. Pages a live Mirage would generate on request are not included.

Open the analyst dashboard

Sessions, findings, CVE leads and replay-verified nginx, ModSecurity and Sigma rules.

Static baseline vs Mirage

                                             static    mirage   ratio
---------------------------------------------------------------------
Attacker sessions                                12        12        
Requests the attackers made                     267       267    1.0x
Distinct pages that returned content             54       144    2.7x
Attack payloads sent / answered (not 404)    30 / 0   30 / 24        
Responses that were dead-end 404s               79%       25%        
Responses improvised by the model                0%       22%        
Login POSTs answered (not 404)                   0%      100%        
Model failures (fell back to 404)                 0         0        

Mirage generation: 59 model calls, median 3804 ms, p90 4605 ms, 26764 completion tokens

Distinct pages that returned content, per attacker profile (static -> mirage):
  recon       9 -> 9     payloads answered 0/0 -> 0/0
  scanner    12 -> 12    payloads answered 0/30 -> 24/30
  brute       3 -> 3     payloads answered 0/0 -> 0/0
  crawler    30 -> 120   payloads answered 0/0 -> 0/0

Per run (pages that returned content, static -> mirage):
  run 1: 18 -> 48
  run 2: 18 -> 48
  run 3: 18 -> 48

Note: each attacker profile stops after 40 requests per run. Sessions that hit that cap: static 3, mirage 3. For those sessions the counts above are lower bounds.

Read the per-run lines: the totals add up the same scripted run repeated three times against the same cached state.