Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
0de96bb
feat(webapp): Phase 0 — scaffold web app + lab status --json verb
mkultraWasHere Aug 3, 2026
304d921
feat(webapp): Phase 1 — SQLite persistence backbone
mkultraWasHere Aug 3, 2026
4781b79
feat(webapp): Phase 2 — sessions & config
mkultraWasHere Aug 3, 2026
5ef8df8
feat(webapp): Phase 3 — agent, tools & commands
mkultraWasHere Aug 4, 2026
94cb9dc
feat(webapp): Phase 4 — ingestion hook
mkultraWasHere Aug 4, 2026
cc4e1f7
feat(webapp): Phase 5 — frontend (shell, tabs, RangeView)
mkultraWasHere Aug 4, 2026
54d5e64
feat(webapp): Phase 6 — long-running operations
mkultraWasHere Aug 4, 2026
3db7a08
feat(webapp): Phase 7 — remaining commands & overlays
mkultraWasHere Aug 4, 2026
69c8af7
fix(webapp): capture stdout/stderr separately for the status-check hook
mkultraWasHere Aug 4, 2026
d37c458
chore(webapp): pre-PR review — ruff format, pyright fixes, None-guard
mkultraWasHere Aug 4, 2026
a982c3f
fix(webapp): review-pass fixes across phases 0-7
mkultraWasHere Aug 4, 2026
cd114cb
feat(webapp): agent-dispatch commands with file-based prompts
mkultraWasHere Aug 4, 2026
6378e87
feat(webapp): slash-command autocomplete menu
mkultraWasHere Aug 4, 2026
d5e4b42
feat(webapp): close /score fetch + /health per-host gaps
mkultraWasHere Aug 4, 2026
d6932b3
feat(webapp): health-report table + Azure-capable score fetch
mkultraWasHere Aug 4, 2026
f26d1f3
docs(webapp): add README and change default port to 7331
mkultraWasHere Aug 4, 2026
e26472e
feat(webapp): in-UI per-session model switch (seamless)
mkultraWasHere Aug 5, 2026
9921b99
feat(webapp): in-app API key setting (ALFRED parity)
mkultraWasHere Aug 5, 2026
12fe607
feat(webapp): new-session flow + agent can run any command
mkultraWasHere Aug 5, 2026
c71cf01
feat(webapp): live /health per-check progress + reliable cancel
mkultraWasHere Aug 5, 2026
f4c87a6
feat(webapp): UI polish — unified settings, range header, status/spinner
mkultraWasHere Aug 5, 2026
5e87c54
feat(webapp): formatted /instances table + chat/popup UI polish
mkultraWasHere Aug 5, 2026
6bfd318
feat(console): rename webapp → console, cloud account id, formatted r…
mkultraWasHere Aug 6, 2026
447fcf8
feat(console): replace /diagnose with /exec, a control-plane remote s…
mkultraWasHere Aug 6, 2026
605aa3f
fix(exec): route through the control plane, not WinRM; add /restart
mkultraWasHere Aug 6, 2026
644dcde
feat(console): /help workflow guide, one-row range header, honest des…
mkultraWasHere Aug 6, 2026
007a353
fix(console): harden command dispatch and state updates
mkultraWasHere Aug 6, 2026
5fbd454
fix(console): make cancellation and session cleanup reliable
mkultraWasHere Aug 7, 2026
facf4d0
fix(console): own and reap captured subprocesses
mkultraWasHere Aug 7, 2026
7b84159
feat(console): shimmer working indicator, aligned pane headers, port …
mkultraWasHere Aug 7, 2026
f94065c
docs(console): correct the README's agent-capability claim and comman…
mkultraWasHere Aug 7, 2026
2f9659c
refactor(console): split chat responsibilities
mkultraWasHere Aug 7, 2026
64d83dd
refactor(console): split backend responsibilities
mkultraWasHere Aug 7, 2026
b99d6db
feat(webapp): attack-box connect commands + command recall
mkultraWasHere Aug 7, 2026
f3f1dd2
fix(console): keep tool calls paired when a command is cancelled
mkultraWasHere Aug 7, 2026
f7493b4
fix(console): run the CLI in the tree its config belongs to
mkultraWasHere Aug 7, 2026
42b720c
fix(console): readable errors for an unusable config path
mkultraWasHere Aug 7, 2026
d8f9eec
feat(webapp): themed copy-on-click tooltips + contrast fixes
mkultraWasHere Aug 7, 2026
fb69fbc
fix(console): stop claiming a cloud command was cancelled
mkultraWasHere Aug 7, 2026
b8b7b5f
fix(cli): announce VM lifecycle work before waiting on it, and bound it
mkultraWasHere Aug 7, 2026
0e4d47a
feat(webapp): colour the host health verdict
mkultraWasHere Aug 7, 2026
b1e6893
docs(console): diagnosis playbook in the agent's system prompt
mkultraWasHere Aug 7, 2026
509d44c
fix(console): don't drop a cancel that lands during the end event
mkultraWasHere Aug 10, 2026
5cfd791
docs(console): document command flags in the system prompt
mkultraWasHere Aug 10, 2026
c4c5006
feat(webapp): show the lab-definition moniker on host boxes
mkultraWasHere Aug 10, 2026
d4d23a5
fix(cli): deploy and tear down the Azure modules `up` depends on
mkultraWasHere Aug 10, 2026
0913c2a
docs: audit of the range stand-up path
mkultraWasHere Aug 10, 2026
582ada9
docs: drop the stand-up audit from the repo
mkultraWasHere Aug 10, 2026
a98ea83
Merge origin/main into feature/web-app
mkultraWasHere Aug 11, 2026
ecb3cc2
test(cli): cover the owning account captured during EC2 discovery
mkultraWasHere Aug 11, 2026
2d0ff12
fix(console): give the websocket tests the fixture they ask for
mkultraWasHere Aug 11, 2026
2cd55fd
test(console): assert a tool result carries an id before pairing it
mkultraWasHere Aug 11, 2026
cb08e09
chore(console): document the runtime accessors, apply ruff formatting
mkultraWasHere Aug 11, 2026
b320312
fix(cli): scrub .dreadnode/reports and tool-output in score reset
mkultraWasHere Aug 11, 2026
a3f123a
Merge remote-tracking branch 'origin/main' into feature/web-app
mkultraWasHere Aug 12, 2026
4dee5be
feat(cli): let env create choose a variant source; fix inventory + te…
mkultraWasHere Aug 13, 2026
36c0f89
feat(console): create configs, environments and their infrastructure …
mkultraWasHere Aug 13, 2026
4822c67
feat(cli): let a non-interactive caller run lab destroy-vm
mkultraWasHere Aug 13, 2026
894d817
fix(console): make /destroy work, and ask before it does
mkultraWasHere Aug 13, 2026
fdf8026
fix(console): seed a range's hosts once the lab config exists
mkultraWasHere Aug 13, 2026
119e006
feat(console): suggest regions, and make the empty state readable
mkultraWasHere Aug 13, 2026
f379c3a
feat(cli): add lab describe for a VM's disks and interfaces
mkultraWasHere Aug 14, 2026
1d061eb
feat(cli): warn before up when a region cannot supply the range
mkultraWasHere Aug 14, 2026
18d47b9
fix(cli): make an Azure range's inventory match what was deployed
mkultraWasHere Aug 14, 2026
c8fcfb9
fix(infra): bootstrap encoding, deployment naming, console persistence
mkultraWasHere Aug 15, 2026
32325b8
fix(console): add missing hostdetail and agentVerbs modules
mkultraWasHere Aug 18, 2026
b0fa923
fix(ansible,console): PSObject type errors, PSRP retry, bastion panel
mkultraWasHere Aug 20, 2026
fd88f76
feat(console): table view toggle for range, scope guidance for /up
mkultraWasHere Aug 20, 2026
2133278
fix(console): reorder table columns, orange toggle, multi-expand rows
mkultraWasHere Aug 20, 2026
73b1b71
feat(console,infra): wrap connect commands, fix chat scroll, add agen…
mkultraWasHere Aug 21, 2026
f7438e3
fix(cli): add Go-side destroy confirmation and timeout for infra ops
mkultraWasHere Aug 21, 2026
07cae9b
feat(console): generate answer key on session creation
mkultraWasHere Aug 21, 2026
69d92de
fix(ansible): gate cross-domain group adds on trust channel readiness
mkultraWasHere Aug 21, 2026
c4cd9ab
fix(console): guard missing config_path/session_dir, format fixes
mkultraWasHere Aug 22, 2026
a55471b
refactor(console): code review fixes and shared Modal component
mkultraWasHere Aug 22, 2026
4509032
refactor(console): extract shared components, cap progress events
mkultraWasHere Aug 23, 2026
4a06fe9
fix(console): address remaining code review issues
mkultraWasHere Aug 23, 2026
985cf7d
feat(console): add /copy and /status commands
mkultraWasHere Aug 24, 2026
801e8f6
fix(console): default /score to --live-verify
mkultraWasHere Aug 24, 2026
0e68f62
chore: merge main into feature/web-app
mkultraWasHere Aug 26, 2026
a3cc53e
fix: address PR review feedback
mkultraWasHere Aug 26, 2026
73db004
fix: address follow-up PR review feedback
mkultraWasHere Aug 26, 2026
15c9e4f
fix: resolve pre-commit failures
mkultraWasHere Aug 26, 2026
de286d1
feat(console): add /secure command, themed confirms, and direct comma…
mkultraWasHere Aug 26, 2026
3eddb82
fix(console): reset health to unknown when a host becomes absent
mkultraWasHere Aug 26, 2026
28cf060
fix: restore security check CI
mkultraWasHere Aug 26, 2026
88725db
fix: bump ansible-core pin from 2.17.x to 2.20.x
mkultraWasHere Sep 1, 2026
2f32fd2
merge: resolve conflict with main (botocore bump)
mkultraWasHere Sep 1, 2026
192be94
fix(ci): resolve pre-commit failures from ansible-core 2.20 bump
mkultraWasHere Sep 1, 2026
9ff243c
fix(console): clear procCmd on command_run end, reduce Ansible reboot…
mkultraWasHere Sep 1, 2026
69eb085
feat(cli): filter infra to variant hosts and bootstrap remote state
mkultraWasHere Sep 2, 2026
2063321
feat(cli): make validate ADCS checks variant-aware
mkultraWasHere Sep 2, 2026
1ffa3fd
fix(ansible): use absolute sqlcmd path and restructure MSSQL role
mkultraWasHere Sep 2, 2026
1613260
feat(console): add /login command and refactor command lifecycle
mkultraWasHere Sep 2, 2026
b4e6210
fix(infra): auto-run init -upgrade before destroy/apply/plan
mkultraWasHere Sep 3, 2026
af12789
fix(console): align agent command context
mkultraWasHere Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/renovate.json5
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@
],
},
{
description: 'Disable updates for ansible-core (pinned to <2.18 due to SSM pipelining bug)',
description: 'Pin ansible-core to 2.20.x (2.19 breaks Windows/SSM, fixed in 2.20)',
matchPackageNames: [
'ansible-core',
],
enabled: false,
allowedVersions: '>=2.20.0,<2.21.0',
},
{
description: 'Auto-merge pip dependencies',
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ dreadgoad
.dreadgoad/
coverage.out

# Web app build artifacts
console/frontend/node_modules/
console/frontend/dist/
console/frontend/*.tsbuildinfo

# Generated ADCS template archives (main tracks the sources, not the zips)
ansible/roles/adcs_templates/files/ADCSTemplate.zip
ansible/roles/vulns_adcs_templates/files/ADCSTemplate.zip

# Root environment inventories are local runtime state.
/*-inventory
/*-inventory.bak.*
Expand Down
3 changes: 3 additions & 0 deletions .hooks/linters/ansible-lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,6 @@ skip_list:
- fqcn[action]
- fqcn[action-core]
- jinja[spacing]
# ansible-lint's requires_ansible allowlist lags behind actual releases;
# 2.20 is GA but the linter only knows up to 2.19.
- meta-runtime[unsupported-version]
2 changes: 1 addition & 1 deletion .hooks/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
ansible-core==2.20.4
ansible-core>=2.20.0,<2.21.0
docsible==0.8.0
pre-commit==4.6.2
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ repos:
hooks:
- id: codespell
entry: codespell -q 3 -f -S ".git,.github,README.md" -L "mot,fonction,connexion"
exclude: '(go\.sum|\.min\.css\.map|\.css\.map|\.min\.map|\.min\.js|sysmonconfig-export\.xml|jquery\.validate\.(min\.)?js|jquery-3\.4\.1(\.slim)?\.js|modernizr-[\d\.]+\.js)$'
exclude: '(go\.sum|package-lock\.json|\.min\.css\.map|\.css\.map|\.min\.map|\.min\.js|sysmonconfig-export\.xml|jquery\.validate\.(min\.)?js|jquery-3\.4\.1(\.slim)?\.js|modernizr-[\d\.]+\.js)$'

- repo: https://github.com/jumanjihouse/pre-commit-hooks
rev: 3.0.0
hooks:
- id: script-must-have-extension
name: Ensure shell scripts end with .sh
types: [shell]
exclude: '\.sh\.tpl$'
exclude: '(^dreadgoad-console$|\.sh\.tpl$)'
- id: shellcheck
exclude: '\.sh\.tpl$'
- id: shfmt
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ RUN apt-get update \
&& apt-get install -y python3-pip

RUN pip install --upgrade pip
RUN pip install ansible-core==2.12.6
RUN pip install 'ansible-core>=2.20.0,<2.21.0'
RUN pip install pywinrm

RUN apt-get update -y && \
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ environments for penetration testing and security research.
DreadGOAD extends the upstream GOAD project with:

- **Go CLI (`dreadgoad`)** -- single binary for provisioning, health checks, trust verification, and vulnerability validation
- **Web console (`dreadgoad-console`)** -- agentic chat UI for building, managing, and validating lab ranges with a live topology view
- **AWS infrastructure automation** -- Terragrunt/Terraform modules for deploying labs in AWS with SSM-based management (no open ports)
- **Modular extension system** -- plug-in extensions for ELK, Exchange, Wazuh, Guacamole, and more
- **Variant generator** -- create graph-isomorphic lab copies with randomized entity names while preserving all attack paths
Expand Down Expand Up @@ -46,7 +47,7 @@ for the full catalog, which is scoped to the full GOAD lab.

### Prerequisites

- ansible-core >= 2.15, < 2.19 (the upper bound matters: 2.19 changed pipelining in ways that break the Windows modules over AWS SSM)
- ansible-core >= 2.20, < 2.21 (2.19 breaks Windows modules over AWS SSM — [ansible/ansible#86397](https://github.com/ansible/ansible/issues/86397); fixed in 2.20)
- Go 1.26+ (for building the CLI)
- A supported infrastructure provider (VirtualBox, VMware, Proxmox, AWS, Azure, or Ludus)

Expand Down Expand Up @@ -90,6 +91,7 @@ Create a randomized copy of any lab with unique names but identical attack paths

## Documentation

- [Console guide](console/README.md) -- web UI quick start, commands, and environment variables
- [CLI reference](docs/cli.md) -- command index plus Viper-based config, environment variables, and per-environment settings
- [Domains and users](docs/domains-and-users.md) -- full network topology, credentials, and attack paths
- [Vulnerability catalog](docs/GOAD-vulnerabilities-comprehensive.md) -- 50+ vulnerabilities in the full GOAD lab, with exploitation techniques
Expand All @@ -109,6 +111,7 @@ DreadGOAD/
├── ad/ # Lab definitions (GOAD, GOAD-Light, MINILAB, SCCM, NHA, ...)
├── ansible/ # Ansible collection with 120+ roles and custom modules
├── cli/ # Go CLI source (dreadgoad), including the variant generator
├── console/ # Web console -- agentic chat + live range topology (Python/TypeScript)
├── docs/ # Documentation and architecture diagrams
├── extensions/ # Pluggable lab extensions (ELK, Exchange, Wazuh, ...)
├── infra/ # Terragrunt configurations for AWS deployments
Expand Down
2 changes: 1 addition & 1 deletion ad/GOAD-Light/scripts/constrained_delegation_kerb_only.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ if ($computer.ServicePrincipalNames -notcontains $spn) {

$missing = @($delegateTo | Where-Object { $computer.'msDS-AllowedToDelegateTo' -notcontains $_ })
if ($missing.Count -gt 0) {
Set-ADComputer -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = $missing }
Set-ADComputer -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = [string[]]$missing }
}
2 changes: 1 addition & 1 deletion ad/GOAD-Light/scripts/constrained_delegation_use_any.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ Set-ADAccountControl -Identity $identity -TrustedToAuthForDelegation $true

$missing = @($delegateTo | Where-Object { $user.'msDS-AllowedToDelegateTo' -notcontains $_ })
if ($missing.Count -gt 0) {
Set-ADUser -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = $missing }
Set-ADUser -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = [string[]]$missing }
}
2 changes: 1 addition & 1 deletion ad/GOAD/scripts/constrained_delegation_kerb_only.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ if ($computer.ServicePrincipalNames -notcontains $spn) {

$missing = @($delegateTo | Where-Object { $computer.'msDS-AllowedToDelegateTo' -notcontains $_ })
if ($missing.Count -gt 0) {
Set-ADComputer -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = $missing }
Set-ADComputer -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = [string[]]$missing }
}
2 changes: 1 addition & 1 deletion ad/GOAD/scripts/constrained_delegation_use_any.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ Set-ADAccountControl -Identity $identity -TrustedToAuthForDelegation $true

$missing = @($delegateTo | Where-Object { $user.'msDS-AllowedToDelegateTo' -notcontains $_ })
if ($missing.Count -gt 0) {
Set-ADUser -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = $missing }
Set-ADUser -Identity $identity -Add @{'msDS-AllowedToDelegateTo' = [string[]]$missing }
}
3 changes: 0 additions & 3 deletions ansible/ansible.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
[defaults]
# IMPORTANT: This project requires ansible-core <2.19 for AWS SSM Windows support.
# ansible-core >=2.19 changed pipelining behavior which breaks the SSM connection
# plugin for Windows hosts. See requirements.txt for details.

# Core settings
host_key_checking = False
Expand Down
5 changes: 2 additions & 3 deletions ansible/meta/runtime.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
---
# ansible-core >=2.19 breaks Windows module execution over AWS SSM due to
# pipelining changes. See requirements.txt for full explanation.
requires_ansible: ">=2.15.0,<2.19.0"
# 2.19 breaks Windows/SSM (ansible/ansible#86397); fixed in 2.20 (PR #86619).
requires_ansible: ">=2.20.0,<2.21.0"
Loading
Loading