mid-engagement-ir-detection — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mid-engagement-ir-detection (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Trigger when:
DO NOT use for:
In a real red-team engagement against a competent SOC, the security state of the target is not static. It changes during your test in response to your traffic. These state changes are:
Anti-pattern: treating reproduction failure as evidence the original signal was a false positive. Original PoC artifacts captured before the change are still the vulnerability finding.
# Capture pre-test fingerprint of the target
fingerprint = {
"ts_pre": time.time(),
"ip_seen": "<operator-src-ip>",
"baseline_response_time_ms": <measure>,
"baseline_response_size_bytes": <measure>,
"response_headers": <capture set>,
"waf_cookies": <list>,
"lockout_count_in_state": <count from o365_attempts.json>,
}Persist to engagement_log/fingerprint_pre.json.
Log every test result with full context (timestamp, IP, payload, response code, response size, response time, headers if relevant) to JSONL append-only.
fingerprint_post = same structure
delta = {
"baseline_time_change_ms": post.time - pre.time,
"baseline_size_change_bytes": post.size - pre.size,
"new_headers_appeared": post.headers - pre.headers,
"new_waf_cookies": post.cookies - pre.cookies,
"new_lockouts": post.locked_count - pre.locked_count,
}If any delta is significant — investigate, don't retract.
Symptoms:
cf-bm, __cf_bm, awselb)Confirmation: retry with WAF-evasion variants:
%27 vs %5cu0027)SLEEP → SlEeP)If WAF-evasion variants restore the signal, the mitigation is at the WAF layer (bypassable).
If even WAF-evasion variants stay blocked, the mitigation is likely in code.
Finding template:
Subject: Mid-engagement mitigation deployed for <vulnerability X>
Observation: At engagement timestamp T0, vulnerability <X> on <endpoint> was
confirmed via <PoC>. At T0+<minutes>, recheck via the original payload no longer
reproduces the timing/error/size differential. <WAF-evasion variant> [does/does
not] restore the signal.
Description: This pattern is consistent with the client SOC observing engagement
traffic and deploying a mitigation in real time. Mitigation depth assessment:
[at-WAF, bypassable] vs [in-code, durable].
Impact (positive): Client SOC has both detection-grade visibility into application
traffic AND the authority to deploy mitigations within ~<minutes> of detection.
Impact (caveat): The original vulnerability did exist and was exploitable for at
least the engagement window before mitigation. If the mitigation is at the WAF
layer only, the underlying code-level flaw remains exploitable via alternative
payloads.
Recommendation:
1. Verify the mitigation is in code (parameterized queries, input sanitization),
not just at the WAF layer.
2. Audit the codebase for the same root cause across sister applications.
3. (Positive) Document the IR responsiveness as a capability metric.Symptoms:
AADSTS50053 (LOCKED) responses despite your 1-attempt-per-user disciplineMath check:
Confirmation:
noreply@, info@, oc@) — if it's locked, attacker is hitting service mailboxes too (typically MFA-exempt → high-value to attackers)Finding template:
Subject: Active external password-spray campaign detected during engagement
Observation: During M365 ROPC validation against the <tenant> Entra tenant, <N>
unique principals returned AADSTS50053 (Smart Lockout) when probed with a single
password attempt at safe pace. With our hard cap of 1 attempt per user, we cannot
mathematically cause these lockouts. The locks are pre-existing and continue to
accumulate during our engagement window — <K> NEW locks observed between
<timestamp_start> and <timestamp_end>.
Description: The pattern (alphabetical clustering, real-time accumulation,
including system mailboxes) is consistent with an external attacker performing
a username-list-driven password spray attack against the tenant.
Impact: An external adversary is actively attempting to compromise corporate
M365 accounts. The attacker has knowledge of the user-email schema and a
password-guess wordlist. <List of locked accounts is now in attacker's hands>
(Smart Lockout differentiates valid from invalid usernames).
Recommendation (CRITICAL — within 24h):
1. Open a P1 incident with the SOC. Pull Entra sign-in logs for the <N> locked
accounts over the last 30-60 days. Identify source IPs and time windows.
2. Apply Conditional Access rule blocking sign-ins from outside <expected geo>
for non-admin accounts.
3. Enable Identity Protection's User Risk policy with auto-reset on high risk.
4. Force tenant-wide password reset for all <N> previously-locked accounts.
5. Audit service accounts for MFA exemptions; ensure all human-interactive
accounts have phishing-resistant MFA.
Evidence: engagement_log/poc/m365/locked_accounts.txt (<N> entries with timestamps)Symptoms:
Confirmation:
Server:, Via:, CF-Cache-Status: headers for CDN-introduced limitsFinding template (operational note, usually low/info severity):
Subject: Engagement traffic detected — IP <X> rate-limited at <timestamp>
Observation: After ~<N> requests in <window> from IP <X>, target <hostname>
began returning <code> for all subsequent requests. Rotation to IP <Y>
restored normal responses.
Description: Active anti-automation control at the perimeter (CDN/WAF/origin).
Impact (positive): Volumetric anti-automation is functional.
Impact (caveat): Rotation defeats this control trivially (cloud VMs cost <$5).
A patient adversary or spray-from-residential-proxies attacker is not affected.Maintain three pieces of state:
engagement_log/baseline.json — captured at session start{
"ts": "2026-05-08T13:00:00",
"source_ip": "<operator-src-ip>",
"targets": {
"https://target.example.com/login": {
"baseline_response_time_ms": 584,
"baseline_response_size_bytes": 11966,
"headers_seen": ["Server: Apache", "X-Powered-By: PHP/8.0.26"],
"set_cookie_names": ["PHPSESSID"]
}
},
"m365": {
"lockout_count": 247,
"valid_creds_count": 0
}
}engagement_log/journal.jsonl — append-only test logEvery test logs:
{"ts":"...","ip":"...","tool":"...","target":"...","payload":"...","resp_code":...,"resp_size":...,"resp_ms":...,"verdict":"...","notes":"..."}engagement_log/state_changes.jsonl — observed deltasWhen a state change is detected, append:
{"ts_observed":"2026-05-08T14:30:00","change_type":"baseline_time_shift","target":"https://<employee-app-host>/<app>/login.php","baseline_pre_ms":24412,"baseline_post_ms":90403,"interpretation":"likely WAF rule deployed","actions_taken":["tested WAF-evasion variants — no signal restoration","documented as IR-mitigation finding"]}This third file is your finding evidence. Every entry is a candidate finding.
# Bash watcher — runs every 5 min during engagement, alerts on shifts
cd "$ENGAGEMENT_DIR"
# Re-measure baseline timing on key targets
for target in "$@"; do
ms=$(curl -sk -o /dev/null -w "%{time_total}" "$target" --max-time 30)
ms_int=$(echo "$ms * 1000" | bc | cut -d. -f1)
echo "$(date -u +%FT%TZ) $target $ms_int" >> baseline_history.log
done
# Diff against pre-session baseline
python3 - << 'PY'
import json, time
baseline = json.load(open("engagement_log/baseline.json"))
for line in open("baseline_history.log"):
parts = line.strip().split()
ts, target, ms = parts[0], parts[1], int(parts[2])
if target in baseline["targets"]:
pre = baseline["targets"][target]["baseline_response_time_ms"]
if abs(ms - pre) > pre * 0.5: # >50% shift
print(f"ALERT {ts} {target} time {pre} -> {ms}")
PYFor lockout-count tracking on M365:
# Run every 30 min during M365 spray
LOCK_COUNT=$(grep -c '"AADSTS50053"' engagement_log/o365_results.jsonl)
echo "$(date -u +%FT%TZ) lockout_count $LOCK_COUNT" >> lockout_history.log
# Diff first vs last to surface deltaIf a confirmed-vulnerable finding stops reproducing:
This is the discipline that distinguishes professional red team from "hobbyist scanning". Your client wants the timeline of vulnerability + mitigation, not just the static state.
When you tell a client "I confirmed SQLi at 14:24, you deployed a mitigation by 14:55, here's the original PoC and here's why you should still verify the fix is in code":
This is a more valuable deliverable than "I confirmed SQLi" alone, because it captures the engagement's full operational picture.
redteam-mindset — broader discipline framework; this skill is a specific applicationm365-entra-attack — specific case for M365 / Smart Lockout differentialevidence-hygiene — how to capture and redact PoC evidence properlyreport-writing — finding template for IR observationsbb-methodology — note that this skill is INAPPROPRIATE for bug bounty (no real-time IR there)Your engagement leaves a footprint. The footprint changes the target. Capture both states. Both are findings.
redteam-mindset loaded at engagement start → baseline-capture habit built in → when response patterns shift mid-test, mid-engagement-ir-detection activates to capture the SOC-patch state as a NEW finding (defensive-action observed = client capability metric, not "the bug got fixed so we lose the finding").mid-engagement-ir-detection captures the policy change as a finding ("CA policy hardened mid-engagement; defensive response measured").mid-engagement-ir-detection captures behavior-change event → triage-validation 7-Question Gate (specifically: "is the behavior-change attributable to my activity?") → redteam-report-template packages as a "client capability observation" with explicit timeline and detection-latency metric.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.