Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4811845
test: add comprehensive unit and integration tests for all modules (#…
l50 Apr 23, 2026
c5310f1
docs: update goad checklist with validation status and automation res…
l50 Apr 22, 2026
0bcaa51
feat: add automation for noPac, PrintNightmare, NTLM relay, and Zerol…
l50 Apr 22, 2026
be17176
feat: add automation for share coercion and smb signing detection
l50 Apr 22, 2026
b96d8ef
feat: add automation for mssql coercion, ntlmv1, password policy, gpp…
l50 Apr 22, 2026
a141eda
docs: update goad checklist with latest validation and automation res…
l50 Apr 22, 2026
0c2c5cd
feat: add automation for spooler, MAQ, DFS, PetitPotam, and WinRM lat…
l50 Apr 22, 2026
c16741b
feat: add new automation modules for comprehensive AD attack surface …
l50 Apr 22, 2026
a19efb0
feat: add dacl abuse and authenticated smbclient enum automation tasks
l50 Apr 23, 2026
66f4eaa
feat: implement tiered priorities for comprehensive strategy and fix …
l50 Apr 23, 2026
e97b9d4
feat: add acl discovery and cross-forest enum automation with test co…
l50 Apr 23, 2026
bda0eaa
test: add comprehensive unit and integration tests for all modules (#…
l50 Apr 23, 2026
81d9cfd
Merge branch 'main' into feat/more-attack-cov
l50 Apr 23, 2026
2c4eafb
test: add comprehensive unit tests for automation modules
l50 Apr 23, 2026
d4b2dbc
style: remove section marker and commentary banners from codebase
l50 Apr 23, 2026
21fc079
refactor: extract pure work collection logic for automation steps
l50 Apr 23, 2026
ac10f51
feat: add cross-domain support and new smb_login_check tool with disc…
l50 Apr 23, 2026
77bd6f9
feat: enhance timeline events, discovery hygiene, and checklist coverage
l50 Apr 23, 2026
ef03f34
fix: prevent duplicate 'CRITICAL:' prefix in attack path output
l50 Apr 23, 2026
f78079c
feat: robust cross-domain DC resolution and trust credential fallback…
l50 Apr 23, 2026
5d8f1a7
feat: improve automation reliability and cross-domain AD attack coverage
l50 Apr 24, 2026
d3bd866
fix: propagate task metadata and ensure host ownership for secretsdum…
l50 Apr 24, 2026
8d3f1c2
feat: inject structured findings and add new discovery types to repor…
l50 Apr 24, 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
1 change: 1 addition & 0 deletions .taskfiles/ec2/scripts/launch-orchestrator.sh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ 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"
Expand Down
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
7 changes: 7 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,13 @@
creates: "{{ privesc_tools_nopac_install_dir }}/venv"
when: privesc_tools_install_nopac

- name: Install setuptools in noPac venv (provides pkg_resources)
ansible.builtin.pip:
name: setuptools
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
24 changes: 24 additions & 0 deletions ares-cli/src/detection/techniques/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ use super::lateral::{
use super::names::{get_technique_name, pyramid_level_name};
use ares_core::models::{Credential, Host, Share, SharedRedTeamState};

// ---------------------------------------------------------------------------
// names
// ---------------------------------------------------------------------------

#[test]
fn get_technique_name_known() {
assert_eq!(get_technique_name("T1046"), "Network Service Discovery");
Expand Down Expand Up @@ -46,6 +50,10 @@ fn pyramid_level_name_unknown() {
assert_eq!(pyramid_level_name(255), "Unknown");
}

// ---------------------------------------------------------------------------
// builders (router)
// ---------------------------------------------------------------------------

#[test]
fn build_technique_detections_known_techniques() {
let state = SharedRedTeamState::new("test-op".to_string());
Expand Down Expand Up @@ -199,6 +207,10 @@ fn build_technique_detections_all_kerberos_techniques() {
}
}

// ---------------------------------------------------------------------------
// lateral.rs — direct builder tests
// ---------------------------------------------------------------------------

#[test]
fn build_t1021_empty_state() {
let state = SharedRedTeamState::new("test-op".to_string());
Expand Down Expand Up @@ -398,6 +410,10 @@ fn build_t1046_populated_hosts() {
assert_eq!(det.targets, vec!["192.168.58.5".to_string()]);
}

// ---------------------------------------------------------------------------
// credential.rs — direct builder tests
// ---------------------------------------------------------------------------

#[test]
fn build_t1003_empty_state() {
let state = SharedRedTeamState::new("test-op".to_string());
Expand Down Expand Up @@ -600,6 +616,10 @@ fn build_t1110_properties() {
assert!(!det.detection_queries[0].expected_evidence.is_empty());
}

// ---------------------------------------------------------------------------
// kerberos.rs — direct builder tests
// ---------------------------------------------------------------------------

#[test]
fn build_t1558_properties() {
let start = Utc::now() - chrono::Duration::hours(1);
Expand Down Expand Up @@ -637,6 +657,10 @@ fn build_t1558_001_properties() {
.any(|e| e.to_lowercase().contains("krbtgt")));
}

// ---------------------------------------------------------------------------
// time window plumbing
// ---------------------------------------------------------------------------

#[test]
fn detection_query_time_window_is_set() {
let state = SharedRedTeamState::new("test-op".to_string());
Expand Down
8 changes: 5 additions & 3 deletions ares-cli/src/ops/loot/format/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -422,10 +422,12 @@ fn print_attack_path(timeline_events: &[serde_json::Value]) {
.and_then(|v| v.as_str())
.unwrap_or("unknown event");

let already_critical = description.starts_with("CRITICAL:");
let desc_lower = description.to_lowercase();
let is_critical = desc_lower.contains("krbtgt")
|| (desc_lower.contains("administrator") && desc_lower.contains("hash"))
|| desc_lower.contains("domain admin");
let is_critical = !already_critical
&& (desc_lower.contains("krbtgt")
|| (desc_lower.contains("administrator") && desc_lower.contains("hash"))
|| desc_lower.contains("domain admin"));
let prefix = if is_critical { "CRITICAL: " } else { "" };

let mitre = extract_mitre_from_event(event);
Expand Down
8 changes: 8 additions & 0 deletions ares-cli/src/orchestrator/automation/acl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ mod tests {
use super::*;
use serde_json::json;

// --- extract_chain_steps ---

#[test]
fn extract_chain_steps_from_array() {
let chain = json!([{"source": "a"}, {"source": "b"}]);
Expand Down Expand Up @@ -213,6 +215,8 @@ mod tests {
assert!(extract_chain_steps(&chain).is_none());
}

// --- extract_source_user ---

#[test]
fn extract_source_user_from_source_key() {
let step = json!({"source": "admin"});
Expand Down Expand Up @@ -249,6 +253,8 @@ mod tests {
assert_eq!(extract_source_user(&step), "");
}

// --- extract_source_domain ---

#[test]
fn extract_source_domain_from_source_domain_key() {
let step = json!({"source_domain": "contoso.local"});
Expand Down Expand Up @@ -279,6 +285,8 @@ mod tests {
assert_eq!(extract_source_domain(&step), "");
}

// --- acl_step_dedup_key ---

#[test]
fn acl_step_dedup_key_basic() {
assert_eq!(acl_step_dedup_key(0, 0), "chain:0:step:0");
Expand Down
Loading
Loading