Spaces:
Runtime error
Runtime error
Aaron Brown commited on
Commit Β·
5ef50e5
1
Parent(s): 018fa0c
Enterprise network topology ranges
Browse files
README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
# OpenRange
|
| 2 |
|
| 3 |
-
**Multi-agent cyber gymnasium with real
|
| 4 |
|
| 5 |
The first cybersecurity environment in the [OpenEnv](https://github.com/meta-pytorch/OpenEnv) ecosystem.
|
| 6 |
|
|
@@ -8,28 +8,31 @@ The first cybersecurity environment in the [OpenEnv](https://github.com/meta-pyt
|
|
| 8 |
|
| 9 |
## What is this?
|
| 10 |
|
| 11 |
-
OpenRange drops Red and Blue agents into a **real
|
| 12 |
|
| 13 |
```
|
| 14 |
You write a YAML manifest describing what you want:
|
| 15 |
-
"
|
|
|
|
| 16 |
|
| 17 |
The Builder LLM generates it:
|
| 18 |
-
Real nginx
|
|
|
|
|
|
|
| 19 |
|
| 20 |
The Validator confirms it works:
|
| 21 |
LLM review + 7 scripted checks including inverse mutation testing
|
| 22 |
|
| 23 |
-
Red attacks. Blue defends. Reset. New vulns. Repeat.
|
| 24 |
```
|
| 25 |
|
| 26 |
## Three Roles
|
| 27 |
|
| 28 |
| Role | What it does | Entry point |
|
| 29 |
|------|-------------|-------------|
|
| 30 |
-
| **Builder** | Generates and mutates vulnerable infrastructure from YAML manifests | LLM + templates |
|
| 31 |
-
| **Red** |
|
| 32 |
-
| **Blue** |
|
| 33 |
|
| 34 |
Red and Blue operate on the **same infrastructure simultaneously**. Red's stealth reward depends on whether Blue catches them. Blue's detection reward depends on Red's actual actions in the logs.
|
| 35 |
|
|
@@ -37,7 +40,7 @@ Red and Blue operate on the **same infrastructure simultaneously**. Red's stealt
|
|
| 37 |
|
| 38 |
```mermaid
|
| 39 |
flowchart TD
|
| 40 |
-
A[YAML Manifest<br/>
|
| 41 |
B --> C{Hybrid Validator}
|
| 42 |
C -->|Phase A| D[LLM Review<br/>Exploitability, alignment, difficulty]
|
| 43 |
C -->|Phase B| E[7-Check Scripted<br/>Services, flags, isolation,<br/>golden path, inverse mutation]
|
|
@@ -45,10 +48,10 @@ flowchart TD
|
|
| 45 |
E --> F
|
| 46 |
F -->|Yes| G[OpenEnv Server<br/>FastAPI: /reset, /step, /state, /ws]
|
| 47 |
F -->|No| B
|
| 48 |
-
G --> H[Red Agent<br/>
|
| 49 |
-
G --> I[Blue Agent<br/>
|
| 50 |
-
G --> J[NPC Traffic<br/>
|
| 51 |
-
H --> K[(
|
| 52 |
I --> K
|
| 53 |
J --> K
|
| 54 |
|
|
@@ -59,6 +62,66 @@ flowchart TD
|
|
| 59 |
style K fill:#7c73e6,color:#fff
|
| 60 |
```
|
| 61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
## Episode Lifecycle
|
| 63 |
|
| 64 |
```mermaid
|
|
@@ -67,9 +130,7 @@ sequenceDiagram
|
|
| 67 |
participant E as OpenEnv Server
|
| 68 |
participant B as Builder LLM
|
| 69 |
participant V as Validator
|
| 70 |
-
participant C as
|
| 71 |
-
participant R as Red Agent
|
| 72 |
-
participant Bl as Blue Agent
|
| 73 |
|
| 74 |
T->>E: reset()
|
| 75 |
E->>B: Manifest + mutation directive
|
|
@@ -80,37 +141,72 @@ sequenceDiagram
|
|
| 80 |
V->>V: Phase A: LLM review
|
| 81 |
V->>C: Phase B: 7 scripted checks
|
| 82 |
V-->>E: PASS
|
| 83 |
-
E-->>T: RangeObservation
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
T
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
end
|
| 96 |
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
```
|
| 99 |
|
| 100 |
## Reset = Mutation
|
| 101 |
|
| 102 |
-
Every call to `reset()` triggers a **mutation** -- the Builder LLM swaps vulnerability classes
|
| 103 |
|
| 104 |
```mermaid
|
| 105 |
flowchart LR
|
| 106 |
subgraph ep1 [Episode 1]
|
| 107 |
-
|
|
|
|
|
|
|
| 108 |
end
|
| 109 |
subgraph ep2 [Episode 2]
|
| 110 |
-
|
|
|
|
|
|
|
| 111 |
end
|
| 112 |
subgraph ep3 [Episode 3]
|
| 113 |
-
|
|
|
|
|
|
|
| 114 |
end
|
| 115 |
|
| 116 |
ep1 -->|reset| ep2
|
|
@@ -121,13 +217,13 @@ flowchart LR
|
|
| 121 |
style ep3 fill:#6bcb7722,stroke:#6bcb77
|
| 122 |
```
|
| 123 |
|
| 124 |
-
Agents must **generalize** across vulnerability classes, not memorize
|
| 125 |
|
| 126 |
## Quick Start
|
| 127 |
|
| 128 |
```bash
|
| 129 |
# Install
|
| 130 |
-
git clone https://github.com/
|
| 131 |
cd open-range
|
| 132 |
uv sync --all-extras
|
| 133 |
|
|
@@ -143,7 +239,7 @@ with OpenRangeEnv('http://localhost:8000').sync() as env:
|
|
| 143 |
result = env.reset()
|
| 144 |
print(result.observation.stdout)
|
| 145 |
|
| 146 |
-
result = env.step(RangeAction(command='nmap -sV
|
| 147 |
print(result.observation.stdout)
|
| 148 |
"
|
| 149 |
```
|
|
@@ -185,8 +281,8 @@ Every generated range passes a **7-check validation pipeline** before any agent
|
|
| 185 |
```mermaid
|
| 186 |
flowchart LR
|
| 187 |
S1[1. Services up<br/>nc -z ports] --> S2[2. Flags exist<br/>docker exec cat]
|
| 188 |
-
S2 --> S3[3. Network isolation<br/>
|
| 189 |
-
S3 --> S4[4. Golden path<br/>
|
| 190 |
S4 --> S5[5. Difficulty<br/>steps within 20%]
|
| 191 |
S5 --> S6[6. No leaks<br/>grep description]
|
| 192 |
S6 --> S7[7. Inverse mutation<br/>revert vuln, step fails]
|
|
@@ -203,81 +299,94 @@ Check 7 is from [Self-Play SWE-RL](https://arxiv.org/abs/2512.18552): it proves
|
|
| 203 |
|
| 204 |
## Tier System
|
| 205 |
|
| 206 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 207 |
|
| 208 |
```mermaid
|
| 209 |
flowchart TD
|
| 210 |
-
subgraph t1 [Tier 1 -
|
| 211 |
-
|
|
|
|
|
|
|
|
|
|
| 212 |
end
|
| 213 |
|
| 214 |
-
subgraph t2 [Tier 2 -
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
|
|
|
| 218 |
end
|
| 219 |
|
| 220 |
subgraph t3 [Tier 3 - Enterprise]
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
|
|
|
| 224 |
end
|
| 225 |
|
|
|
|
|
|
|
|
|
|
| 226 |
style t1 fill:#6bcb7722,stroke:#6bcb77
|
| 227 |
style t2 fill:#ffd93d22,stroke:#ffd93d
|
| 228 |
style t3 fill:#ff6b6b22,stroke:#ff6b6b
|
| 229 |
```
|
| 230 |
|
| 231 |
-
| Tier | Hosts | Networks | Services | Golden Steps |
|
| 232 |
-
|------|-------|----------|----------|--------------|
|
| 233 |
-
| 1 | web + db | dmz | nginx, mysql, sshd | ~8 |
|
| 234 |
-
| 2 | + mail + fw | + internal | + smtp, iptables | ~15 |
|
| 235 |
-
| 3 | + files + DC | + mgmt | + smb, ldap, kerberos | ~25 |
|
| 236 |
-
| 4 | + jump + NPC | all | + bastion, cron, rsync | ~35 |
|
| 237 |
-
| 5 | + honeypot | + trap | + decoys, WAF, IDS | ~50 |
|
| 238 |
-
|
| 239 |
## Tandem Red + Blue Training
|
| 240 |
|
| 241 |
```mermaid
|
| 242 |
sequenceDiagram
|
| 243 |
participant Red as Red Agent
|
| 244 |
-
participant
|
| 245 |
participant Blue as Blue Agent
|
| 246 |
|
| 247 |
Note over Red,Blue: Episode begins - Builder mutated range
|
| 248 |
|
| 249 |
-
Red->>
|
| 250 |
-
|
| 251 |
-
Note right of
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
Note left of Blue: True positive!
|
| 257 |
|
| 258 |
-
Red->>
|
| 259 |
-
|
| 260 |
-
|
|
|
|
| 261 |
|
| 262 |
-
Red->>
|
| 263 |
-
|
| 264 |
|
| 265 |
-
Blue->>
|
| 266 |
-
|
| 267 |
-
Blue->>
|
| 268 |
-
|
| 269 |
|
| 270 |
-
Note over
|
| 271 |
-
Note over
|
| 272 |
|
| 273 |
-
Note over Red,Blue: Red stealth LOW
|
| 274 |
```
|
| 275 |
|
| 276 |
## Project Structure
|
| 277 |
|
| 278 |
```
|
| 279 |
open-range/
|
| 280 |
-
βββ manifests/ YAML range definitions
|
| 281 |
βββ vulns/ Vulnerability catalog (plantable vuln templates)
|
| 282 |
βββ builder/ Builder LLM + Mutator + rendering templates
|
| 283 |
βββ validator/ Hybrid validator (LLM review + 7-check scripted)
|
|
|
|
| 1 |
# OpenRange
|
| 2 |
|
| 3 |
+
**Multi-agent cyber gymnasium with real enterprise networks, golden-path validation, and self-evolving infrastructure.**
|
| 4 |
|
| 5 |
The first cybersecurity environment in the [OpenEnv](https://github.com/meta-pytorch/OpenEnv) ecosystem.
|
| 6 |
|
|
|
|
| 8 |
|
| 9 |
## What is this?
|
| 10 |
|
| 11 |
+
OpenRange drops Red and Blue agents into a **real enterprise network** -- firewalls, web apps, databases, directory services, mail servers, VPNs, SIEM -- then lets them fight. An LLM Builder generates the vulnerable infrastructure. A Validator confirms it's actually exploitable. And on every `reset()`, the Builder **mutates** the range with entirely different vulnerabilities, so agents can never memorize their way to victory.
|
| 12 |
|
| 13 |
```
|
| 14 |
You write a YAML manifest describing what you want:
|
| 15 |
+
"Corporate network: DMZ with web app + mail, internal DB + file server,
|
| 16 |
+
firewall between zones, AD for auth, SIEM for monitoring"
|
| 17 |
|
| 18 |
The Builder LLM generates it:
|
| 19 |
+
Real nginx reverse proxy -> PHP app -> MySQL backend -> LDAP auth
|
| 20 |
+
Postfix mail -> iptables firewall rules -> Rsyslog to SIEM
|
| 21 |
+
Golden path: 12 steps from external recon to domain flag
|
| 22 |
|
| 23 |
The Validator confirms it works:
|
| 24 |
LLM review + 7 scripted checks including inverse mutation testing
|
| 25 |
|
| 26 |
+
Red attacks from outside. Blue defends from inside. Reset. New vulns. Repeat.
|
| 27 |
```
|
| 28 |
|
| 29 |
## Three Roles
|
| 30 |
|
| 31 |
| Role | What it does | Entry point |
|
| 32 |
|------|-------------|-------------|
|
| 33 |
+
| **Builder** | Generates and mutates vulnerable enterprise infrastructure from YAML manifests | LLM + templates |
|
| 34 |
+
| **Red** | External attacker. Recon, exploit, pivot, escalate, exfiltrate. | Outside the firewall -- no creds, no access |
|
| 35 |
+
| **Blue** | Internal defender. SIEM analysis, patching, firewall rules, incident response. | SOC workstation on management network |
|
| 36 |
|
| 37 |
Red and Blue operate on the **same infrastructure simultaneously**. Red's stealth reward depends on whether Blue catches them. Blue's detection reward depends on Red's actual actions in the logs.
|
| 38 |
|
|
|
|
| 40 |
|
| 41 |
```mermaid
|
| 42 |
flowchart TD
|
| 43 |
+
A[YAML Manifest<br/>Enterprise topology + vuln slots] --> B[Builder LLM<br/>Generates configs, plants vulns, writes golden path]
|
| 44 |
B --> C{Hybrid Validator}
|
| 45 |
C -->|Phase A| D[LLM Review<br/>Exploitability, alignment, difficulty]
|
| 46 |
C -->|Phase B| E[7-Check Scripted<br/>Services, flags, isolation,<br/>golden path, inverse mutation]
|
|
|
|
| 48 |
E --> F
|
| 49 |
F -->|Yes| G[OpenEnv Server<br/>FastAPI: /reset, /step, /state, /ws]
|
| 50 |
F -->|No| B
|
| 51 |
+
G --> H[Red Agent<br/>External attacker]
|
| 52 |
+
G --> I[Blue Agent<br/>SOC defender]
|
| 53 |
+
G --> J[NPC Traffic<br/>Employees, services, cron]
|
| 54 |
+
H --> K[(Enterprise Range<br/>10+ containers across 4 network zones)]
|
| 55 |
I --> K
|
| 56 |
J --> K
|
| 57 |
|
|
|
|
| 62 |
style K fill:#7c73e6,color:#fff
|
| 63 |
```
|
| 64 |
|
| 65 |
+
## Network Topology
|
| 66 |
+
|
| 67 |
+
Even the **basic** range emulates a real corporate network. Every tier is a functioning enterprise with interconnected services, proper network segmentation, and realistic traffic.
|
| 68 |
+
|
| 69 |
+
```mermaid
|
| 70 |
+
flowchart TB
|
| 71 |
+
subgraph internet [Internet]
|
| 72 |
+
ATK[Red Agent<br/>Attacker Workstation]
|
| 73 |
+
end
|
| 74 |
+
|
| 75 |
+
subgraph fw [Perimeter Firewall - iptables]
|
| 76 |
+
FW1[Firewall<br/>NAT + ACLs + IDS]
|
| 77 |
+
end
|
| 78 |
+
|
| 79 |
+
subgraph dmz [DMZ Network - 10.0.1.0/24]
|
| 80 |
+
WEB[Web Server<br/>nginx reverse proxy<br/>+ PHP/Python app]
|
| 81 |
+
MAIL[Mail Server<br/>Postfix SMTP<br/>+ Dovecot IMAP]
|
| 82 |
+
DNS[DNS Server<br/>Bind9<br/>corp.local zone]
|
| 83 |
+
end
|
| 84 |
+
|
| 85 |
+
subgraph internal [Internal Network - 10.0.2.0/24]
|
| 86 |
+
DB[Database Server<br/>MySQL + PostgreSQL<br/>app data + credentials]
|
| 87 |
+
FILES[File Server<br/>Samba SMB shares<br/>sensitive docs + configs]
|
| 88 |
+
APP[App Server<br/>Internal APIs<br/>microservices]
|
| 89 |
+
end
|
| 90 |
+
|
| 91 |
+
subgraph mgmt [Management Network - 10.0.3.0/24]
|
| 92 |
+
AD[Domain Controller<br/>OpenLDAP + Kerberos<br/>Active Directory]
|
| 93 |
+
SIEM[SIEM + Log Server<br/>Rsyslog + ELK<br/>Blue agent entry point]
|
| 94 |
+
JUMP[Jump Box<br/>SSH bastion<br/>admin access only]
|
| 95 |
+
end
|
| 96 |
+
|
| 97 |
+
ATK -->|ports 80,443,25| FW1
|
| 98 |
+
FW1 --> WEB
|
| 99 |
+
FW1 --> MAIL
|
| 100 |
+
FW1 --> DNS
|
| 101 |
+
WEB -->|SQL queries| DB
|
| 102 |
+
WEB -->|LDAP auth| AD
|
| 103 |
+
MAIL -->|user lookup| AD
|
| 104 |
+
APP -->|file access| FILES
|
| 105 |
+
APP -->|DB queries| DB
|
| 106 |
+
FILES -->|auth| AD
|
| 107 |
+
DB -->|logs| SIEM
|
| 108 |
+
WEB -->|logs| SIEM
|
| 109 |
+
MAIL -->|logs| SIEM
|
| 110 |
+
AD -->|logs| SIEM
|
| 111 |
+
JUMP -->|admin SSH| WEB
|
| 112 |
+
JUMP -->|admin SSH| DB
|
| 113 |
+
|
| 114 |
+
style internet fill:#ff6b6b22,stroke:#ff6b6b
|
| 115 |
+
style fw fill:#ffd93d22,stroke:#ffd93d
|
| 116 |
+
style dmz fill:#4a9eff22,stroke:#4a9eff
|
| 117 |
+
style internal fill:#6bcb7722,stroke:#6bcb77
|
| 118 |
+
style mgmt fill:#7c73e622,stroke:#7c73e6
|
| 119 |
+
```
|
| 120 |
+
|
| 121 |
+
**This is what Red has to break into. This is what Blue has to defend.**
|
| 122 |
+
|
| 123 |
+
Every service is real. The web app queries the database. Users authenticate against LDAP. Mail flows through Postfix. Logs stream to the SIEM. NPC traffic simulates employees browsing, sending email, and running cron jobs -- so Blue can't just flag everything as malicious.
|
| 124 |
+
|
| 125 |
## Episode Lifecycle
|
| 126 |
|
| 127 |
```mermaid
|
|
|
|
| 130 |
participant E as OpenEnv Server
|
| 131 |
participant B as Builder LLM
|
| 132 |
participant V as Validator
|
| 133 |
+
participant C as Enterprise Range
|
|
|
|
|
|
|
| 134 |
|
| 135 |
T->>E: reset()
|
| 136 |
E->>B: Manifest + mutation directive
|
|
|
|
| 141 |
V->>V: Phase A: LLM review
|
| 142 |
V->>C: Phase B: 7 scripted checks
|
| 143 |
V-->>E: PASS
|
| 144 |
+
E-->>T: RangeObservation with challenge briefing
|
| 145 |
+
|
| 146 |
+
rect rgb(255, 107, 107, 0.1)
|
| 147 |
+
Note over T,C: Red Team Operations
|
| 148 |
+
T->>E: step Red: nmap perimeter scan
|
| 149 |
+
E->>C: docker exec attacker nmap -sV fw
|
| 150 |
+
C-->>E: 80, 443, 25 open
|
| 151 |
+
E-->>T: observation + reward
|
| 152 |
+
|
| 153 |
+
T->>E: step Red: enumerate web app
|
| 154 |
+
E->>C: docker exec attacker nikto web
|
| 155 |
+
C-->>E: discovered /admin, /api, /search
|
| 156 |
+
E-->>T: observation + reward
|
| 157 |
+
|
| 158 |
+
T->>E: step Red: exploit SQLi in search
|
| 159 |
+
E->>C: docker exec attacker curl ...
|
| 160 |
+
C-->>E: DB credentials leaked
|
| 161 |
+
E-->>T: observation + reward
|
| 162 |
+
|
| 163 |
+
T->>E: step Red: pivot to internal DB
|
| 164 |
+
E->>C: docker exec attacker mysql -h db ...
|
| 165 |
+
C-->>E: flag captured from flags table
|
| 166 |
+
E-->>T: observation + flag reward
|
| 167 |
end
|
| 168 |
|
| 169 |
+
rect rgb(74, 158, 255, 0.1)
|
| 170 |
+
Note over T,C: Blue Team Operations
|
| 171 |
+
T->>E: step Blue: check SIEM alerts
|
| 172 |
+
E->>C: docker exec siem tail alerts
|
| 173 |
+
C-->>E: anomalous queries from web to db
|
| 174 |
+
E-->>T: observation + reward
|
| 175 |
+
|
| 176 |
+
T->>E: step Blue: analyze attack pattern
|
| 177 |
+
E->>C: docker exec siem grep SQLi signatures
|
| 178 |
+
C-->>E: injection pattern matched
|
| 179 |
+
E-->>T: observation + detection reward
|
| 180 |
+
|
| 181 |
+
T->>E: step Blue: patch and block
|
| 182 |
+
E->>C: docker exec web parameterize query
|
| 183 |
+
C-->>E: patch applied, firewall rule added
|
| 184 |
+
E-->>T: observation + patch reward
|
| 185 |
+
end
|
| 186 |
+
|
| 187 |
+
Note over T,C: Rewards computed with coupling
|
| 188 |
```
|
| 189 |
|
| 190 |
## Reset = Mutation
|
| 191 |
|
| 192 |
+
Every call to `reset()` triggers a **mutation** -- the Builder LLM swaps vulnerability classes across the entire enterprise. The topology stays the same, but the attack surface is completely different.
|
| 193 |
|
| 194 |
```mermaid
|
| 195 |
flowchart LR
|
| 196 |
subgraph ep1 [Episode 1]
|
| 197 |
+
direction TB
|
| 198 |
+
A1[SQLi in web search] --> B1[Pivot to internal DB]
|
| 199 |
+
B1 --> C1[Exfil flag from DB]
|
| 200 |
end
|
| 201 |
subgraph ep2 [Episode 2]
|
| 202 |
+
direction TB
|
| 203 |
+
A2[SSRF in web API] --> B2[Access internal file server]
|
| 204 |
+
B2 --> C2[Read flag from SMB share]
|
| 205 |
end
|
| 206 |
subgraph ep3 [Episode 3]
|
| 207 |
+
direction TB
|
| 208 |
+
A3[Phish creds via mail] --> B3[LDAP priv escalation]
|
| 209 |
+
B3 --> C3[Domain admin, flag in AD]
|
| 210 |
end
|
| 211 |
|
| 212 |
ep1 -->|reset| ep2
|
|
|
|
| 217 |
style ep3 fill:#6bcb7722,stroke:#6bcb77
|
| 218 |
```
|
| 219 |
|
| 220 |
+
Agents must **generalize** across vulnerability classes, attack vectors, and pivot chains -- not memorize a single exploit.
|
| 221 |
|
| 222 |
## Quick Start
|
| 223 |
|
| 224 |
```bash
|
| 225 |
# Install
|
| 226 |
+
git clone https://github.com/open-cybernauts/open-range.git
|
| 227 |
cd open-range
|
| 228 |
uv sync --all-extras
|
| 229 |
|
|
|
|
| 239 |
result = env.reset()
|
| 240 |
print(result.observation.stdout)
|
| 241 |
|
| 242 |
+
result = env.step(RangeAction(command='nmap -sV 10.0.1.0/24', mode='red'))
|
| 243 |
print(result.observation.stdout)
|
| 244 |
"
|
| 245 |
```
|
|
|
|
| 281 |
```mermaid
|
| 282 |
flowchart LR
|
| 283 |
S1[1. Services up<br/>nc -z ports] --> S2[2. Flags exist<br/>docker exec cat]
|
| 284 |
+
S2 --> S3[3. Network isolation<br/>zones enforced]
|
| 285 |
+
S3 --> S4[4. Golden path<br/>full exploit chain works]
|
| 286 |
S4 --> S5[5. Difficulty<br/>steps within 20%]
|
| 287 |
S5 --> S6[6. No leaks<br/>grep description]
|
| 288 |
S6 --> S7[7. Inverse mutation<br/>revert vuln, step fails]
|
|
|
|
| 299 |
|
| 300 |
## Tier System
|
| 301 |
|
| 302 |
+
Every tier is a **complete enterprise network**. Difficulty grows by adding business units, network zones, and attack surface -- not just harder passwords.
|
| 303 |
+
|
| 304 |
+
| Tier | Hosts | Zones | Key Infrastructure | Attack Complexity |
|
| 305 |
+
|------|-------|-------|-------------------|-------------------|
|
| 306 |
+
| 1 | 6-8 | DMZ, Internal, Mgmt | Web app + DB + mail + firewall + LDAP + SIEM | Single-stage: exploit web, grab flag |
|
| 307 |
+
| 2 | 10-12 | + VPN, Guest | + VPN gateway, guest WiFi segment, internal APIs, certificate authority | Multi-stage: exploit + pivot one hop |
|
| 308 |
+
| 3 | 14-18 | + Partner, Dev | + CI/CD pipeline, container registry, partner extranet, S3-like storage | Chain 2-3 vulns across zones |
|
| 309 |
+
| 4 | 20-25 | + OT/SCADA, Cloud | + Industrial control sim, cloud gateway, secrets vault, service mesh | Lateral movement across trust boundaries |
|
| 310 |
+
| 5 | 30+ | Full enterprise | + Honeypots, deception tech, WAF, IDS/IPS, EDR, threat intel | Evade active defenses while chaining |
|
| 311 |
|
| 312 |
```mermaid
|
| 313 |
flowchart TD
|
| 314 |
+
subgraph t1 [Tier 1 - Small Business]
|
| 315 |
+
direction LR
|
| 316 |
+
FW1[Firewall] --> W1[Web + Mail]
|
| 317 |
+
W1 --> D1[DB + Files]
|
| 318 |
+
D1 --> AD1[LDAP + SIEM]
|
| 319 |
end
|
| 320 |
|
| 321 |
+
subgraph t2 [Tier 2 - Mid-Market]
|
| 322 |
+
direction LR
|
| 323 |
+
FW2[Firewall + VPN] --> W2[Web + Mail + DNS]
|
| 324 |
+
W2 --> D2[DB + APIs + Files]
|
| 325 |
+
D2 --> AD2[AD + CA + SIEM]
|
| 326 |
end
|
| 327 |
|
| 328 |
subgraph t3 [Tier 3 - Enterprise]
|
| 329 |
+
direction LR
|
| 330 |
+
FW3[Firewall + WAF + IDS] --> W3[Web + Mail + DNS + CDN]
|
| 331 |
+
W3 --> D3[DB + APIs + CI/CD + Registry]
|
| 332 |
+
D3 --> AD3[AD + Kerberos + Vault + SIEM]
|
| 333 |
end
|
| 334 |
|
| 335 |
+
t1 -->|agent masters tier| t2
|
| 336 |
+
t2 -->|agent masters tier| t3
|
| 337 |
+
|
| 338 |
style t1 fill:#6bcb7722,stroke:#6bcb77
|
| 339 |
style t2 fill:#ffd93d22,stroke:#ffd93d
|
| 340 |
style t3 fill:#ff6b6b22,stroke:#ff6b6b
|
| 341 |
```
|
| 342 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 343 |
## Tandem Red + Blue Training
|
| 344 |
|
| 345 |
```mermaid
|
| 346 |
sequenceDiagram
|
| 347 |
participant Red as Red Agent
|
| 348 |
+
participant Range as Enterprise Range
|
| 349 |
participant Blue as Blue Agent
|
| 350 |
|
| 351 |
Note over Red,Blue: Episode begins - Builder mutated range
|
| 352 |
|
| 353 |
+
Red->>Range: nmap perimeter scan
|
| 354 |
+
Range-->>Red: firewall: 80,443,25 open
|
| 355 |
+
Note right of Range: Logged to SIEM
|
| 356 |
+
|
| 357 |
+
Blue->>Range: check SIEM dashboard
|
| 358 |
+
Range-->>Blue: NPC traffic + Red scan mixed in
|
| 359 |
+
Blue->>Range: submit_finding port scan from ext IP
|
| 360 |
+
Note left of Blue: True positive
|
| 361 |
|
| 362 |
+
Red->>Range: enumerate web app directories
|
| 363 |
+
Range-->>Red: found /admin /api /uploads
|
| 364 |
+
Note right of Range: Logged to SIEM
|
|
|
|
| 365 |
|
| 366 |
+
Red->>Range: exploit SQLi in /api/search
|
| 367 |
+
Range-->>Red: DB creds leaked
|
| 368 |
+
Red->>Range: pivot to internal DB with stolen creds
|
| 369 |
+
Range-->>Red: connected, flag captured
|
| 370 |
|
| 371 |
+
Red->>Range: submit_flag FLAG_db_compromised
|
| 372 |
+
Range-->>Red: Correct, reward 1.0
|
| 373 |
|
| 374 |
+
Blue->>Range: analyze SIEM for SQLi signatures
|
| 375 |
+
Range-->>Blue: injection pattern in web logs
|
| 376 |
+
Blue->>Range: patch /api/search, add WAF rule
|
| 377 |
+
Range-->>Blue: patch applied
|
| 378 |
|
| 379 |
+
Note over Range: Re-run golden path exploit
|
| 380 |
+
Note over Range: Exploit FAILS, patch valid
|
| 381 |
|
| 382 |
+
Note over Red,Blue: Red stealth LOW - Blue caught the attack<br/>Blue detection HIGH - found real intrusion
|
| 383 |
```
|
| 384 |
|
| 385 |
## Project Structure
|
| 386 |
|
| 387 |
```
|
| 388 |
open-range/
|
| 389 |
+
βββ manifests/ YAML enterprise range definitions
|
| 390 |
βββ vulns/ Vulnerability catalog (plantable vuln templates)
|
| 391 |
βββ builder/ Builder LLM + Mutator + rendering templates
|
| 392 |
βββ validator/ Hybrid validator (LLM review + 7-check scripted)
|