Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
96665c2
test: add comprehensive unit and integration tests for all modules (#…
l50 Apr 23, 2026
31743e0
docs: update goad checklist with validation status and automation res…
l50 Apr 22, 2026
6b6a44b
feat: add automation for noPac, PrintNightmare, NTLM relay, and Zerol…
l50 Apr 22, 2026
02dc8a8
feat: add automation for share coercion and smb signing detection
l50 Apr 22, 2026
81ff685
feat: add automation for mssql coercion, ntlmv1, password policy, gpp…
l50 Apr 22, 2026
210d32f
docs: update goad checklist with latest validation and automation res…
l50 Apr 22, 2026
8a89cf5
feat: add automation for spooler, MAQ, DFS, PetitPotam, and WinRM lat…
l50 Apr 22, 2026
181c34e
feat: add new automation modules for comprehensive AD attack surface …
l50 Apr 22, 2026
79f658d
feat: add dacl abuse and authenticated smbclient enum automation tasks
l50 Apr 23, 2026
9a475c2
feat: implement tiered priorities for comprehensive strategy and fix …
l50 Apr 23, 2026
dd24721
feat: add acl discovery and cross-forest enum automation with test co…
l50 Apr 23, 2026
4b063b9
test: add comprehensive unit and integration tests for all modules (#…
l50 Apr 23, 2026
d055868
test: add comprehensive unit tests for automation modules
l50 Apr 23, 2026
e42848d
refactor: extract pure work collection logic for automation steps
l50 Apr 23, 2026
829bbb3
feat: add cross-domain support and new smb_login_check tool with disc…
l50 Apr 23, 2026
ce39417
feat: enhance timeline events, discovery hygiene, and checklist coverage
l50 Apr 23, 2026
1a68af5
fix: prevent duplicate 'CRITICAL:' prefix in attack path output
l50 Apr 23, 2026
f62d966
feat: robust cross-domain DC resolution and trust credential fallback…
l50 Apr 23, 2026
23d5289
feat: improve automation reliability and cross-domain AD attack coverage
l50 Apr 24, 2026
6ad2714
fix: propagate task metadata and ensure host ownership for secretsdum…
l50 Apr 24, 2026
50b502b
feat: inject structured findings and add new discovery types to repor…
l50 Apr 24, 2026
c9bed7a
feat: add ACL binary parser and full ADCS exploitation chain, expand …
l50 Apr 25, 2026
30fa11e
feat: improve ADCS ESC7 automation and update GOAD checklist status
l50 Apr 25, 2026
294de09
feat: add ADCS ESC10/ESC11/ESC15 support and update GOAD checklist co…
l50 Apr 26, 2026
a9a26ac
feat: add cgroup memory/task limits and OOM protection for SSM and wo…
l50 Apr 26, 2026
442f7f8
feat: improve trust exploitation reliability, evidence grounding, and…
l50 Apr 27, 2026
724be00
```
l50 Apr 27, 2026
da4edb9
docs: expand and restructure goad-checklist for clarity and operation…
l50 Apr 27, 2026
cbb4924
fix: enforce domain-matching credentials for certifried and mssql aut…
l50 Apr 27, 2026
a68434b
feat: add composite ESC8 relay_and_coerce tool and forge_inter_realm_…
l50 Apr 28, 2026
0d295f5
feat: improve AD domain/FQDN mapping, SID caching, coercion, and trus…
l50 Apr 29, 2026
cd57be8
fix: adjust trust handling logic for auth method and correct getST pr…
l50 Apr 29, 2026
470eb2b
feat: add Azure golden image template and improve SID extraction logic
l50 Apr 29, 2026
1c62092
feat: add host-wide relay lock to serialize ntlmrelayx invocations
l50 Apr 30, 2026
3a3984b
feat: support domain SID extraction from rpcclient lsaquery output
l50 Apr 30, 2026
1b1e977
feat: add cross-forest SID enumeration fallback with null session ins…
l50 Apr 30, 2026
2f06c14
fix: prevent state pollution from LLM-supplied domain typos and harde…
l50 Apr 30, 2026
0a10b95
fix: pin setuptools version for impacket and update nimbus_range sour…
l50 Apr 30, 2026
b99ad44
```
l50 Apr 30, 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
131 changes: 0 additions & 131 deletions .claude/agents/python-ares-expert.md

This file was deleted.

54 changes: 50 additions & 4 deletions .taskfiles/ec2/scripts/launch-orchestrator.sh.tmpl
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#!/bin/bash
# Launch ares orchestrator with environment variables
# Placeholders are substituted by the calling task via envsubst/sed
# Launch ares orchestrator in its own systemd transient unit so it (and any
# tool subprocesses it spawns) gets its own cgroup, separate from
# amazon-ssm-agent.service. Otherwise everything launched by SSM
# RunShellScript inherits SSM's cgroup and competes with it for memory —
# resulting in CONSTRAINT_MEMCG OOM-kills regardless of OOMScoreAdjust.
set -euo pipefail

export ARES_REDIS_URL=redis://127.0.0.1:6379
export RUST_LOG=info
export ARES_OPERATION_ID='__ARES_PAYLOAD__'
Expand All @@ -25,13 +30,54 @@ if [ -n "$_blue_model" ] && [ "$_blue_model" = "${_blue_model#__}" ]; then
fi
export ARES_DEPLOYMENT='__ARES_DEPLOYMENT__'
export ARES_CONFIG=/etc/ares/config.yaml
export ARES_MAX_CONCURRENT_TASKS=16
_otel_endpoint='__OTEL_TRACES_ENDPOINT__'
if [ -n "$_otel_endpoint" ] && [ "$_otel_endpoint" = "${_otel_endpoint#__}" ]; then
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="$_otel_endpoint"
export OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf'
export OTEL_RESOURCE_ATTRIBUTES='deployment.environment=staging,attack.team=red'
fi

mkdir -p /var/log/ares

# Stop any prior orchestrator (transient unit or stray nohup process).
systemctl stop ares-orchestrator.service 2>/dev/null || true
systemctl reset-failed ares-orchestrator.service 2>/dev/null || true
pkill -f 'ares orchestrator' 2>/dev/null || true
sleep 1
nohup /usr/local/bin/ares orchestrator >/var/log/ares/orchestrator.log 2>&1 &
echo "Orchestrator started (PID: $!)"

# Spawn as a transient systemd service in system-ares.slice. --setenv=NAME
# (no value) inherits from current environment, preserving quoting that
# would otherwise be mangled by EnvironmentFile parsing of JSON payloads.
exec systemd-run \
--unit=ares-orchestrator.service \
--slice=system-ares.slice \
--description="Ares Orchestrator (transient)" \
--collect \
--setenv=ARES_REDIS_URL \
--setenv=RUST_LOG \
--setenv=ARES_OPERATION_ID \
--setenv=OPENAI_API_KEY \
--setenv=ANTHROPIC_API_KEY \
--setenv=DREADNODE_API_KEY \
--setenv=DREADNODE_SERVER_URL \
--setenv=DREADNODE_ORGANIZATION \
--setenv=DREADNODE_WORKSPACE \
--setenv=DREADNODE_PROJECT \
--setenv=GRAFANA_SERVICE_ACCOUNT_TOKEN \
--setenv=GRAFANA_URL \
--setenv=ARES_LLM_MODEL \
--setenv=ARES_TOOL_DISPATCH \
--setenv=ARES_BLUE_ENABLED \
--setenv=ARES_BLUE_LLM_MODEL \
--setenv=ARES_DEPLOYMENT \
--setenv=ARES_CONFIG \
--setenv=ARES_MAX_CONCURRENT_TASKS \
--setenv=OTEL_EXPORTER_OTLP_TRACES_ENDPOINT \
--setenv=OTEL_EXPORTER_OTLP_PROTOCOL \
--setenv=OTEL_RESOURCE_ATTRIBUTES \
--property=StandardOutput=append:/var/log/ares/orchestrator.log \
--property=StandardError=append:/var/log/ares/orchestrator.log \
--property=OOMScoreAdjust=-500 \
--property=TasksMax=4096 \
/usr/local/bin/ares orchestrator
17 changes: 17 additions & 0 deletions .taskfiles/ec2/scripts/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ fi
echo "=== Creating directories ==="
mkdir -p /var/log/ares /etc/ares

echo "=== Removing legacy ares-worker@ unit (renamed in PR #226) ==="
if [ -f /etc/systemd/system/ares-worker@.service ]; then
for role in recon credential_access cracker acl privesc lateral coercion; do
systemctl disable --now "ares-worker@${role}.service" 2>/dev/null || true
done
rm -f /etc/systemd/system/ares-worker@.service
fi

echo "=== Creating systemd worker template unit ==="
cat >/etc/systemd/system/ares@.service <<'UNIT_EOF'
[Unit]
Expand All @@ -42,9 +50,18 @@ RestartSec=5
StandardOutput=append:/var/log/ares/%i.log
StandardError=append:/var/log/ares/%i.log

# Contain child processes (netexec, hashcat, nmap, etc.) within this cgroup.
# Without these limits, runaway tool processes can OOM the entire system and
# take down the SSM agent (see: Apr 2026 incident).
Delegate=yes
MemoryHigh=2G
MemoryMax=3G
TasksMax=256

[Install]
WantedBy=multi-user.target
UNIT_EOF
systemctl daemon-reload

echo "=== Installing cracking tools ==="
if ! command -v hashcat >/dev/null 2>&1 || ! command -v john >/dev/null 2>&1; then
Expand Down
3 changes: 2 additions & 1 deletion .taskfiles/red/Taskfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,7 @@ tasks:
BLUE_ENABLED: '{{.BLUE_ENABLED | default "0"}}'
BLUE_LLM_MODEL: '{{.BLUE_LLM_MODEL | default ""}}'
EC2_DEPLOYMENT: '{{.EC2_DEPLOYMENT | default "alpha-operator-range"}}'
STRATEGY: '{{.STRATEGY | default "comprehensive"}}'
RESOLVED_TARGETS:
sh: |
TARGET="{{.TARGET}}"
Expand Down Expand Up @@ -867,7 +868,7 @@ tasks:
# Build JSON payload for ARES_OPERATION_ID
TARGET_IPS_JSON=$(echo "{{.RESOLVED_TARGETS}}" | tr ',' '\n' | sed 's/^/"/;s/$/"/' | paste -sd, - | sed 's/^/[/;s/$/]/')

ORCH_PAYLOAD="{\"operation_id\":\"{{.OPERATION_ID_COMPUTED}}\",\"target_domain\":\"{{.DOMAIN}}\",\"target_ips\":${TARGET_IPS_JSON},\"model\":\"{{.MODEL}}\"}"
ORCH_PAYLOAD="{\"operation_id\":\"{{.OPERATION_ID_COMPUTED}}\",\"target_domain\":\"{{.DOMAIN}}\",\"target_ips\":${TARGET_IPS_JSON},\"model\":\"{{.MODEL}}\",\"strategy\":\"{{.STRATEGY}}\"}"

# Build orchestrator launch script from template
ORCH_SCRIPT=$(mktemp)
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions ansible/roles/aws_ssm_agent/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Install and configure AWS SSM Agent
| -------- | ---- | ------- | ----------- |
| `aws_ssm_agent_temp_dir` | str | <code>/tmp/ssm_install</code> | No description |
| `aws_ssm_agent_aws_region` | str | <code>us-east-1</code> | No description |
| `aws_ssm_agent_oom_protect` | bool | <code>True</code> | No description |
| `aws_ssm_agent_memory_max` | str | <code>512M</code> | No description |

### Role Variables (main.yml)

Expand All @@ -42,6 +44,8 @@ Install and configure AWS SSM Agent
- **Create temporary directory for SSM installation** (ansible.builtin.file) - Conditional
- **Download SSM agent** (ansible.builtin.get_url) - Conditional
- **Install SSM agent (Debian/Ubuntu)** (ansible.builtin.apt) - Conditional
- **Create SSM agent systemd override directory** (ansible.builtin.file) - Conditional
- **Deploy SSM agent OOM protection override** (ansible.builtin.template) - Conditional
- **Reload systemd** (ansible.builtin.systemd) - Conditional
- **Enable and start SSM agent** (ansible.builtin.systemd) - Conditional
- **Refresh snap SSM agent** (ansible.builtin.command) - Conditional
Expand Down
5 changes: 5 additions & 0 deletions ansible/roles/aws_ssm_agent/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@
# General settings
aws_ssm_agent_temp_dir: "/tmp/ssm_install"
aws_ssm_agent_aws_region: "us-east-1"

# OOM protection — cap SSM agent memory and lower its OOM score so the kernel
# kills worker tool processes (netexec, hashcat, nmap) instead of SSM.
aws_ssm_agent_oom_protect: true
aws_ssm_agent_memory_max: "512M"
22 changes: 22 additions & 0 deletions ansible/roles/aws_ssm_agent/tasks/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,28 @@
- aws_ssm_agent_snap_check.rc != 0
- aws_ssm_agent_dpkg_check.rc != 0

- name: Create SSM agent systemd override directory
ansible.builtin.file:
path: /etc/systemd/system/amazon-ssm-agent.service.d
state: directory
mode: '0755'
become: true
when:
- aws_ssm_agent_snap_check.rc != 0
- aws_ssm_agent_oom_protect | default(true)

- name: Deploy SSM agent OOM protection override
ansible.builtin.template:
src: ssm-oom-protect.conf.j2
dest: /etc/systemd/system/amazon-ssm-agent.service.d/oom-protect.conf
mode: '0644'
become: true
when:
- aws_ssm_agent_snap_check.rc != 0
- aws_ssm_agent_oom_protect | default(true)
notify:
- Restart ssm_agent (Linux)

- name: Reload systemd
ansible.builtin.systemd:
daemon_reload: true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Protect SSM agent from the OOM killer.
# Ares workers spawn many tool subprocesses (netexec, hashcat, nmap) that can
# exhaust memory. Without this override, the OOM killer targets the SSM agent's
# cgroup and kills it, making the instance unreachable.
[Service]
OOMScoreAdjust=-900
MemoryMax={{ aws_ssm_agent_memory_max }}
1 change: 1 addition & 0 deletions ansible/roles/privesc_tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ Install and configure privilege escalation tools for Ares agents
- **Clone SCMUACBypass from GitHub** (ansible.builtin.git) - Conditional
- **Clone noPac from GitHub** (ansible.builtin.git) - Conditional
- **Create virtual environment for noPac** (ansible.builtin.command) - Conditional
- **Install setuptools in noPac venv (provides pkg_resources)** (ansible.builtin.pip) - Conditional
- **Install noPac dependencies in venv** (ansible.builtin.pip) - Conditional
- **Create wrapper script for noPac** (ansible.builtin.copy) - Conditional
- **Clone PrintNightmare from GitHub** (ansible.builtin.git) - Conditional
Expand Down
8 changes: 8 additions & 0 deletions ansible/roles/privesc_tools/tasks/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,14 @@
creates: "{{ privesc_tools_nopac_install_dir }}/venv"
when: privesc_tools_install_nopac

- name: Install setuptools in noPac venv (provides pkg_resources)
ansible.builtin.pip:
# setuptools 81 dropped pkg_resources; impacket 0.9.24 still imports it.
name: "setuptools<81"
virtualenv: "{{ privesc_tools_nopac_install_dir }}/venv"
become: true
when: privesc_tools_install_nopac

- name: Install noPac dependencies in venv
ansible.builtin.pip:
requirements: "{{ privesc_tools_nopac_install_dir }}/requirements.txt"
Expand Down
3 changes: 3 additions & 0 deletions ansible/roles/redis/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ Redis server for Ares worker message broker
| `redis_ares_worker_binary` | str | <code>/usr/local/bin/ares</code> | No description |
| `redis_ares_log_dir` | str | <code>/var/log/ares</code> | No description |
| `redis_ares_config_dir` | str | <code>/etc/ares</code> | No description |
| `redis_ares_worker_memory_high` | str | <code>2G</code> | No description |
| `redis_ares_worker_memory_max` | str | <code>3G</code> | No description |
| `redis_ares_worker_tasks_max` | int | <code>256</code> | No description |
| `redis_verify_install` | bool | <code>False</code> | No description |

## Tasks
Expand Down
8 changes: 8 additions & 0 deletions ansible/roles/redis/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,13 @@ redis_ares_worker_binary: "/usr/local/bin/ares"
redis_ares_log_dir: "/var/log/ares"
redis_ares_config_dir: "/etc/ares"

# Worker cgroup resource limits (per-role instance).
# Workers spawn tool subprocesses (netexec, hashcat, nmap) that inherit the
# service cgroup. Without limits these can exhaust system memory and OOM-kill
# unrelated services like the SSM agent.
redis_ares_worker_memory_high: "2G"
redis_ares_worker_memory_max: "3G"
redis_ares_worker_tasks_max: 256

# Verification
redis_verify_install: false
8 changes: 8 additions & 0 deletions ansible/roles/redis/templates/ares@.service.j2
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,13 @@ RestartSec=5
StandardOutput=append:{{ redis_ares_log_dir }}/%i.log
StandardError=append:{{ redis_ares_log_dir }}/%i.log

# Contain child processes (netexec, hashcat, nmap, etc.) within this cgroup.
# Without these limits, runaway tool processes can OOM the entire system and
# take down the SSM agent (see: Apr 2026 incident).
Delegate=yes
MemoryHigh={{ redis_ares_worker_memory_high }}
MemoryMax={{ redis_ares_worker_memory_max }}
TasksMax={{ redis_ares_worker_tasks_max }}

[Install]
WantedBy=multi-user.target
Loading
Loading