الملفات
ghaymah-exam-mahmoud-secops/q2-attack-simulation/incident-response.md
2026-07-27 00:08:02 +03:00

249 أسطر
7.7 KiB
Markdown
خام اللوم التاريخ

هذا الملف يحتوي على أحرف Unicode غامضة

هذا الملف يحتوي على أحرف Unicode قد تُخلط مع أحرف أخرى. إذا كنت تعتقد أن هذا مقصود، يمكنك تجاهل هذا التحذير بأمان. استخدم زر الهروب للكشف عنها.

# Q2 — Attack Simulation & Incident Response
**Scenario:** A successful brute force attack on the API login endpoint led to a data leak.
---
## Part 1: Attack Timeline
### T+00:00 — Reconnaissance
- Attacker scans the public IP using tools like `nmap` or online port scanners.
- Discovers the exposed API endpoint: `POST /api/v1/auth/login`
- Identifies no rate-limiting or lockout protection via repeated test requests.
### T+00:15 — Credential Acquisition
- Attacker uses previously leaked or weak credentials (e.g., from public breach databases or common password lists).
- Builds a wordlist targeting usernames like `admin`, `deploy`, or known email patterns.
### T+00:30 — Brute Force Attack Begins
- An automated script (e.g., `hydra`, `ffuf`, or custom Python) starts sending POST requests to the login endpoint.
- Sends hundreds of attempts per minute with different username/password combinations.
- No lockout policy is enforced — the server continues responding normally.
### T+01:00 — Successful Authentication
- A valid credential pair is found.
- The attacker receives a valid JWT access token.
- **First point of compromise confirmed.**
### T+01:05 — Session Takeover & Enumeration
- Attacker uses the JWT token to call authenticated API endpoints.
- Discovers `/api/v1/users/export` and `/api/v1/reports/download` via path probing.
### T+01:15 — Data Exfiltration Begins
- Attacker downloads a full CSV dump of user records including: names, emails, hashed passwords, internal metadata.
- No anomaly alert fires on the large data download.
### T+01:45 — Exfiltration Complete
- All accessible data is exfiltrated to the attacker's remote server.
- The token remains valid for the full expiry window — no revocation triggered.
### T+03:00 — Detection (Delayed)
- An administrator notices unusual API traffic in access logs.
- Investigation reveals the brute-force pattern in `/api/v1/auth/login` logs.
### T+03:30 — Incident Confirmed
- Security team confirms unauthorized access and data exfiltration.
- **Incident Response Plan is activated.**
---
### Root Cause Summary
| Root Cause | Detail |
|---|---|
| No rate limiting | API accepted unlimited login attempts |
| No account lockout | No lockout after failed attempt threshold |
| Weak or reused credentials | Password matched a known leaked value |
| No anomaly alerting | No alert fired for burst of failed logins |
| Overly broad API authorization | Export endpoint accessible with any valid token |
| No egress monitoring | Large data download went undetected |
---
## Part 2: Incident Response Plan
**Classification:** P1 — Critical Security Incident
**System Affected:** API Login Endpoint
### Phase 1: Identification (015 min)
1. Pull API access logs and filter for `POST /api/v1/auth/login` in the last 6 hours.
2. Identify source IPs with >50 failed attempts followed by a successful login.
3. Confirm large API calls to export endpoints post-login.
4. Assign an incident commander and open a dedicated communication channel.
### Phase 2: Containment (1560 min)
| Action | Method |
|---|---|
| Block attacker IP(s) | Firewall / WAF deny rule |
| Revoke all active JWT tokens | Rotate JWT signing secret or blacklist tokens |
| Force logout all active sessions | Flush session store (Redis/DB) |
| Disable the export endpoint | Feature flag or reverse proxy block |
| Enable emergency rate limiting | Nginx `limit_req_zone` or API gateway rule |
| Enable account lockout | Application config: 5 attempts → 15 min lock |
### Phase 3: Eradication (12 hours)
1. Patch the login endpoint with rate limiting, account lockout, and MFA enforcement.
2. Audit all API endpoints for over-permissive authorization.
3. Check for any persistence (e.g., new admin accounts created during the attack).
4. Rotate all application secrets and API keys.
5. Require password reset for all users whose data was exported.
### Phase 4: Recovery (28 hours)
1. Re-enable the export endpoint with admin-only authorization.
2. Deploy the patched container image.
3. Verify monitoring and alerting is active.
4. Notify affected users per data breach disclosure requirements.
### Phase 5: Lessons Learned (within 72 hours)
1. Conduct a post-mortem with all stakeholders.
2. Update the threat model and security runbooks.
3. Schedule a penetration test to verify fixes.
---
## Part 3: Prevention on the Cloud
> The following controls can be implemented in a Ghaymah cloud deployment using its networking, container, and monitoring capabilities.
### Network-Level Controls
**Rate Limiting via Nginx:**
```nginx
http {
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
server {
location /api/v1/auth/login {
limit_req zone=login_limit burst=10 nodelay;
limit_req_status 429;
proxy_pass http://app_backend;
}
}
}
```
**Web Application Firewall:**
- Deploy a WAF in front of the application layer.
- Configure rules to block IPs generating >100 requests/min to `/auth` endpoints.
- Block known malicious user agents (e.g., scanner fingerprints).
**IP Restriction for Admin Endpoints:**
```bash
# Allow only internal network to access sensitive endpoints
iptables -A INPUT -p tcp --dport 8080 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
```
**Container Network Policy:**
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-login-access
namespace: production
spec:
podSelector:
matchLabels:
app: api-server
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 8080
policyTypes:
- Ingress
```
### Container Security Controls
**Run as non-root user:**
```dockerfile
FROM python:3.12-slim
RUN useradd --create-home appuser
USER appuser
```
**Read-only filesystem:**
```yaml
services:
api:
read_only: true
tmpfs:
- /tmp
```
**Secrets via environment injection (never baked into images):**
```yaml
services:
api:
env_file:
- .env.production
```
**Image vulnerability scanning in CI/CD:**
```yaml
- name: Scan Docker image
uses: aquasecurity/trivy-action@master
with:
image-ref: 'registry/api:latest'
exit-code: '1'
severity: 'CRITICAL,HIGH'
```
### Application-Level Controls
| Control | Implementation |
|---|---|
| Account lockout | Lock after 5 failed attempts, notify user by email |
| MFA | TOTP required for all admin accounts |
| Password validation | Reject known-weak passwords, enforce minimum 12 chars |
| JWT expiry | Short-lived access tokens (15 min), refresh token rotation |
| Structured auth logging | Log all login attempts to SIEM for real-time analysis |
---
## Part 4: Brute Force Alert Rule
The full deployable Prometheus rule file is in [`alert-rule.yml`](./alert-rule.yml). It defines three rules:
### Alert Rules Explanation
| Rule | Trigger | Severity | Recommended Action |
|---|---|---|---|
| `BruteForceLoginAttempt` | >10 failed logins/min from same IP for 1+ min | Critical | Auto-block IP at firewall |
| `SuspiciousLoginAfterFailures` | 20+ failures then 1 success from same IP | Critical | Revoke token, notify security team |
| `AbnormalDataExport` | >10 MB exported in 5 min by single user | Warning | Flag for human review |
### AlertManager Notification Config
```yaml
# alertmanager.yml
receivers:
- name: secops-slack
slack_configs:
- api_url: ${SLACK_WEBHOOK_URL}
channel: '#security-alerts'
title: '{{ .CommonAnnotations.summary }}'
text: '{{ .CommonAnnotations.description }}'
- name: secops-pagerduty
pagerduty_configs:
- routing_key: ${PAGERDUTY_KEY}
severity: critical
route:
receiver: secops-slack
routes:
- match:
severity: critical
receiver: secops-pagerduty
```