← Mirage demo home · fictional company site
Mirage dashboard
Honeypot persona: Northridge Logistics Group · database: evidence_nebius_final.db · read-only
13sessions
268requests logged
52%answered from cache
59generated live
3.8savg generation time
89528/26764model tokens (in/out)
How requests were answered
cache 140generated 59offsurface 66static 3
Sessions
| Session | Visitor (user agent) | Source | Requests | Pages | Generated | Analyst label |
|---|---|---|---|---|---|---|
| 1155961e | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) | 127.0.x.x | 40 | 40 | 0 | recon |
| 0293f274 | python-requests/2.31.0 r3 | 127.0.x.x | 7 | 1 | 6 | credential_attack |
| a20e1677 | Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:Port Check) r3 | 127.0.x.x | 30 | 21 | 0 | vuln_scanning |
| d608577a | Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/ | 127.0.x.x | 12 | 11 | 0 | vuln_scanning |
| a147adfe | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) | 127.0.x.x | 40 | 40 | 0 | recon |
| b7bb0367 | python-requests/2.31.0 r2 | 127.0.x.x | 7 | 1 | 6 | credential_attack |
| e74a84f5 | Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:Port Check) r2 | 127.0.x.x | 30 | 21 | 0 | vuln_scanning |
| 420d2a5c | Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/ | 127.0.x.x | 12 | 11 | 0 | vuln_scanning |
| 75e0e4a8 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) | 127.0.x.x | 40 | 40 | 30 | recon |
| fd7bd52b | python-requests/2.31.0 r1 | 127.0.x.x | 7 | 1 | 6 | credential_attack |
| 6a7aeb01 | Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:Port Check) r1 | 127.0.x.x | 30 | 21 | 10 | vuln_scanning |
| 50d338a4 | Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/ | 127.0.x.x | 12 | 11 | 1 | vuln_scanning |
| c1d34803 | Python-urllib/3.14 | 127.0.x.x | 1 | 1 | 0 | not analysed |
Analyst findings (run 1)
| Session | Intent | ATT&CK | Confidence | Summary | CVE mentions (Tavily) |
|---|---|---|---|---|---|
| 1155961e | recon low | T1592 | 70% | Visitor systematically enumerated application endpoints including admin panels, shipment records, customer accounts, driver profiles, and vehicle VINs in a 4.5-second automated crawl. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| 0293f274 | credential_attack medium | T1110.001 | 90% | Visitor performed a credential stuffing attack against the login endpoint using a small list of common username/password pairs. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| a20e1677 | vuln_scanning medium | T1595.002 | 90% | Automated scanner (Nikto) probed for admin panels, sensitive files (.env, git config, backups), and injected SQLi, path traversal, and XSS payloads against login and admin endpoints. | CVE-2018-12613, CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-0813, CVE-2022-28330 |
| d608577a | vuln_scanning medium | T1595.002 | 90% | Visitor used Nmap Scripting Engine to probe for admin panels, sensitive files (.env, .git/config, backup.zip), and phpMyAdmin, receiving 200 responses for root and .env. | CVE-2018-12613, CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-0813, CVE-2022-28330 |
| a147adfe | recon low | T1592 | 70% | Visitor systematically enumerated application endpoints including admin panels and specific resource IDs across shipments, customers, drivers, and vehicles in 4.4 seconds. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| b7bb0367 | credential_attack medium | T1110.001 | 90% | Visitor performed a credential stuffing attack against the login endpoint, trying six common username/password pairs in rapid succession. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| e74a84f5 | vuln_scanning medium | T1595.002 | 90% | Automated scanner probed for admin panels, sensitive files (.env, config, backups), and injected SQLi, path traversal, and XSS payloads against login and admin endpoints. | CVE-2018-12613, CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-0813, CVE-2022-28330 |
| 420d2a5c | vuln_scanning medium | T1595.002 | 90% | Automated scanner (Nmap NSE) probed for admin panels, sensitive files (.env, .git/config, backup.zip), and phpMyAdmin, retrieving a valid .env file. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| 75e0e4a8 | recon low | T1592 | 75% | Visitor systematically enumerated application endpoints including admin panels and specific resource IDs across shipments, customers, drivers, and vehicles, indicating reconnaissance of a logistics management system. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| fd7bd52b | credential_attack medium | T1110.001 | 90% | Visitor used a Python script to perform a credential stuffing attack against the login endpoint, trying six common username/password pairs in rapid succession. | CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-28330, CVE-2022-28614, CVE-2022-36760 |
| 6a7aeb01 | vuln_scanning medium | T1595.002 | 90% | Automated scanner probed for admin panels, sensitive files (.env, backups, git config), and API endpoints, then injected SQLi, path traversal, and XSS payloads against discovered endpoints. | CVE-2018-12613, CVE-2021-41773, CVE-2021-42013, CVE-2021-44790, CVE-2022-0813, CVE-2022-28330 |
| 50d338a4 | vuln_scanning medium | T1595.002 | 90% | Visitor used Nmap Scripting Engine to probe for admin panels, sensitive files (.env, .git/config, backup.zip), and phpMyAdmin, indicating automated vulnerability scanning. | CVE-2013-0156, CVE-2013-6786, CVE-2014-2126, CVE-2014-2127, CVE-2014-2128, CVE-2018-12613 |
Detection rules (replay-verified)
Credential stuffing with common weak passwords verified caught 18 attack requests, 0 false positives out of 319 replayed requests
nginx
# Credential stuffing with common weak passwords # Matches POST requests to the login endpoint submitting well-known default or weak credential pairs (admin/admin, admin/password, admin/123456, root/toor, administrator/Welcome1, test/test) which are c # not expressible in stock nginx (needs request-body inspection); use the ModSecurity rule
modsecurity
# Credential stuffing with common weak passwords
# requires: SecRequestBodyAccess On
SecRule REQUEST_METHOD "@streq POST" "id:1529789,phase:2,deny,status:403,log,msg:'Credential stuffing with common weak passwords',chain"
SecRule REQUEST_FILENAME "@rx (?i)^/login$" "t:none,chain"
SecRule REQUEST_BODY "@rx (?i)username=(admin|root|administrator|test)&password=(admin|password|123456|toor|Welcome1|test)" "t:none,t:urlDecodeUni"sigma
# Credential stuffing with common weak passwords # Matches POST requests to the login endpoint submitting well-known default or weak credential pairs (admin/admin, admin/password, admin/123456, root/toor, administrator/Welcome1, test/test) which are c # not expressible as a Sigma web-log rule (web servers do not log request bodies); use the ModSecurity rule
Sensitive file probe verified caught 30 attack requests, 0 false positives out of 319 replayed requests
nginx
# Sensitive file probe
# Attackers request well-known sensitive files at root level (.env, .git/config, backup.zip, db.sql) that legitimate users never access legitimate zip files are under /downloads/.
set $mr_1094923 "";
if ($request_method = GET) { set $mr_1094923 "${mr_1094923}M"; }
if ($uri ~* "^/\\.(env|git/config)$|^/backup\\.zip$|^/db\\.sql$") { set $mr_1094923 "${mr_1094923}P"; }
if ($mr_1094923 = "MP") { return 403; }modsecurity
# Sensitive file probe
SecRule REQUEST_METHOD "@streq GET" "id:1094923,phase:1,deny,status:403,log,msg:'Sensitive file probe',chain"
SecRule REQUEST_FILENAME "@rx (?i)^/\.(env|git/config)$|^/backup\.zip$|^/db\.sql$" "t:none"sigma
title: 'Sensitive file probe'
id: 9c53bd98-ab8c-5ca4-b898-06a898b0ffd2
status: experimental
description: 'Attackers request well-known sensitive files at root level (.env, .git/config, backup.zip, db.sql) that legitimate users never access legitimate zip files are under /downloads/.'
author: Mirage honeypot analyst
logsource:
category: webserver
detection:
selection:
cs-method: GET
c-uri|re: '(?i)^/\.(env|git/config)$|^/backup\.zip$|^/db\.sql$'
condition: selection
level: medium
tags:
- attack.t1595.002Admin panel enumeration verified caught 48 attack requests, 0 false positives out of 319 replayed requests
nginx
# Admin panel enumeration
# Scanners systematically probe common admin panel paths legitimate traffic uses deeper, application-specific routes like /admin/audit.
set $mr_1536110 "";
if ($request_method = GET) { set $mr_1536110 "${mr_1536110}M"; }
if ($uri ~* "^/(admin|administrator|wp-login\\.php|phpmyadmin|console|server-status|cgi-bin|info\\.php|test)/?$") { set $mr_1536110 "${mr_1536110}P"; }
if ($mr_1536110 = "MP") { return 403; }modsecurity
# Admin panel enumeration
SecRule REQUEST_METHOD "@streq GET" "id:1536110,phase:1,deny,status:403,log,msg:'Admin panel enumeration',chain"
SecRule REQUEST_FILENAME "@rx (?i)^/(admin|administrator|wp-login\.php|phpmyadmin|console|server-status|cgi-bin|info\.php|test)/?$" "t:none"sigma
title: 'Admin panel enumeration'
id: 9981ffd9-0665-5508-a0c4-46163b9509ae
status: experimental
description: 'Scanners systematically probe common admin panel paths legitimate traffic uses deeper, application-specific routes like /admin/audit.'
author: Mirage honeypot analyst
logsource:
category: webserver
detection:
selection:
cs-method: GET
c-uri|re: '(?i)^/(admin|administrator|wp-login\.php|phpmyadmin|console|server-status|cgi-bin|info\.php|test)/?$'
condition: selection
level: medium
tags:
- attack.t1595.002Injection payloads on auth endpoints verified caught 18 attack requests, 0 false positives out of 319 replayed requests
nginx
# Injection payloads on auth endpoints
# Attackers append SQLi, path traversal, and XSS payloads to login/admin endpoints benign requests only carry harmless paging or tracking parameters.
# note: nginx sees $args URL-encoded, so encoded variants may need extra patterns
set $mr_1283502 "";
if ($request_method = GET) { set $mr_1283502 "${mr_1283502}M"; }
if ($uri ~* "^/(admin|login)/?$") { set $mr_1283502 "${mr_1283502}P"; }
if ($args ~* "(\\b|[?&])(id|file|q)=([^&]*(\\'|\\.\\./|<script|alert\\())") { set $mr_1283502 "${mr_1283502}Q"; }
if ($mr_1283502 = "MPQ") { return 403; }modsecurity
# Injection payloads on auth endpoints
SecRule REQUEST_METHOD "@streq GET" "id:1283502,phase:1,deny,status:403,log,msg:'Injection payloads on auth endpoints',chain"
SecRule REQUEST_FILENAME "@rx (?i)^/(admin|login)/?$" "t:none,chain"
SecRule QUERY_STRING "@rx (?i)(\b|[?&])(id|file|q)=([^&]*(\'|\.\./|<script|alert\())" "t:none,t:urlDecodeUni"sigma
title: 'Injection payloads on auth endpoints'
id: 6c207e90-f73c-5da3-b81e-142411ce8f40
status: experimental
description: 'Attackers append SQLi, path traversal, and XSS payloads to login/admin endpoints benign requests only carry harmless paging or tracking parameters.'
author: Mirage honeypot analyst
logsource:
category: webserver
detection:
selection:
cs-method: GET
c-uri|re: '(?i)^/(admin|login)/?$'
cs-uri-query|re: '(?i)(\b|[?&])(id|file|q)=([^&]*(\''|\.\./|<script|alert\())'
condition: selection
level: medium
tags:
- attack.t11901 proposed rule(s) were rejected by the replay check.
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.