Files
DECNET/rules/ttp/R0007.yaml
anti b1fe1f9403 feat(ttp): E.3.8 R0001-R0030 command cohort
30 YAMLs for the shell/command rule cohort per Appendix B (rules/ttp/).
Splits into engine-active (R0007-R0029, regex on command_text /
raw_url / user_agent) and lifter-bound (R0001-R0006, R0030 — the
v0 RuleEngine cannot count auth attempts, do identity rollups, or
parse fingerprint blobs; the BehavioralLifter / IdentityLifter /
CredentialLifter consume them by rule_id at E.3.9 / E.3.13).

test_command_rules.py asserts:
- every R000N has a YAML that compiles
- lifter-bound rules NEVER fire from the v0 engine (regression
  guard against a YAML drifting into a regex match.spec)
- engine-active rules meet their Appendix-C precision target
  against the seed corpus (≥0.95 high-conf, ≥0.80 medium)

Conftest fixes: precision_engine moved to module-scope so module-
scope precomputed dispatch fixture (fired_by_label) can request it;
_RULES_DIR path bumped from parents[2] to parents[3] so the loader
resolves the project root regardless of pytest cwd; make_event
synthesizes attacker_uuid so TTPTag's anchor invariant is satisfied.

Seed corpus broadened: positive examples for every regex rule plus
6 negative examples across innocuous shell verbs (ls, echo, cd, ps,
df, free) so FPs surface in precision rather than passing vacuously.
2026-05-01 09:16:38 -04:00

25 lines
674 B
YAML

rule_id: R0007
rule_version: 1
name: sqlmap_user_agent
description: |
sqlmap's default User-Agent header. Triggers on the raw URL
payload because the v0 engine's http_request default field is
raw_url; we override to user_agent. Same matcher catches nikto,
nmap-scripts, and other auto-tooling that brands itself in UA.
applies_to:
- http_request
match:
field: user_agent
pattern: '(?i)\b(sqlmap|nikto|w3af|acunetix|nessus|openvas|wpscan|dirbuster)\b'
emits:
- tactic: TA0001
technique_id: T1190
confidence: 0.9
- tactic: TA0043
technique_id: T1595
sub_technique_id: T1595.002
confidence: 0.9
evidence_fields:
- user_agent
- raw_url