Tema
PCI DSS Pregunta 78 — Internal penetration testing
| Campo | Valor |
|---|---|
| Solicitante | José David Álvarez — QSA ControlCase |
| Pregunta | "Proporcionar informes de pruebas internas de penetración conformes realizados anualmente y tras cambios significativos en la red y la capa de aplicación. Además, proporciona el alcance documentado del trabajo." |
| Comentario QSA | "Pendiente reporte de INPT" |
| Fecha | 2026-06-16 |
| Tipo de evidencia | INPT (Internal Network Pentest) report 2026 + SOW + segmentation testing + lateral movement attempts + retest |
| Estado | RESUELTO — Pentest interno ejecutado por ControlCase Red Team desde el VAPT droplet (assumed-internal position) el 2026-05-08 → 2026-05-14 según SOW-CC-2026-INT-001. Resultados: 1 High (path traversal en internal admin-audit-service) + 5 Medium + 3 Low — todos remediados + retest limpio 2026-05-29. Segmentation testing confirmó isolation entre CDE pool (cde-38q702/cde-38q70l) y app pool (sin lateral movement directo posible). |
| Controles PCI | Req 11.4.1, 11.4.4 (internal pentest), 11.4.5 (segmentation testing) |
| Paquete adjunto | q78-internal-pentest-20260616.tar.gz |
Resumen ejecutivo: PCI DSS v4.0 Req 11.4.4 + 11.4.5 exigen pentest interno anual + tras cambios significativos + segmentation testing. Cumplimos con: (1) INPT 2026 — ControlCase Red Team ejecutó desde el VAPT droplet (que tiene IP allowlist al VPC interno como compliance scanner), assumed-internal position simulando un atacante post-perímetro, scope incluye todos los namespaces K8s + DBaaS interno + Kafka brokers + Wazuh management; (2) Findings — 1 High (path traversal en admin-audit-service GET /audit/{path} antes de Q67) + 5 Medium (Kafka topic over-permissive ACL + Wazuh internal_users hash leak en debug endpoint + etc.) + 3 Low; todos remediados antes del SOW deadline 2026-06-08 + retest limpio 2026-05-29; (3) Segmentation testing (PCI 11.4.5) — Red Team ejecutó 47 lateral-movement attempts entre namespaces: CDE pool intentando alcanzar app pool, app pool intentando alcanzar CDE pool, attempts contra K8s API desde pods sin RBAC, attempts a Wazuh management desde namespaces sin allowlist; resultado: 0/47 lateral movements exitosos — todos bloqueados por NetworkPolicies + DO Cloud Firewall + RBAC; (4) Significant change retest tras WAF deployment + after PciAuditModule (Q67 commit) — 2026-06-12 PASS first attempt. La metodología usada es NIST 800-115 + MITRE ATT&CK + post-exploitation OWASP.
1. Mapeo PCI DSS v4.0
| Requisito | Descripción | Implementación |
|---|---|---|
| 11.4.1 | Methodology documented | NIST 800-115 + MITRE ATT&CK + OWASP post-exploitation |
| 11.4.4 | Internal pentest annual + after significant change | INPT 2026 + significant change retest |
| 11.4.5 | Segmentation testing for entities subject to PCI 11.4 | §4 — 47 lateral movement attempts (0 exitosos) |
2. SOW (Scope of Work) — INPT 2026

2.1 Documento SOW-CC-2026-INT-001
| Campo | Valor |
|---|---|
| ID | SOW-CC-2026-INT-001 |
| Effective date | 2026-04-15 |
| Customer | Fintrixs SAS |
| Vendor | ControlCase Red Team |
| Tester role | Assumed-internal (post-perimeter compromise simulation) |
| Tester position | VAPT droplet (143.244.169.114) with VPC internal allowlist |
| Scope start | 2026-05-08 |
| Scope end | 2026-05-14 |
| Methodology | NIST 800-115 + MITRE ATT&CK + OWASP post-exploitation |
| Reporting deadline | 2026-05-29 (initial) + 2026-06-08 (retest) |
2.2 Scope of internal pentest
| Component | Scope |
|---|---|
| K8s API server | Lateral movement attempts via SAs |
| K8s namespaces | cde, app, kafka, default, rbac-sod, waf, wazuh, logging, monitoring, phishing-sim, falco |
| DBaaS internal | Direct connection attempts from VPC peers |
| Kafka brokers | Topic-level ACL bypass attempts |
| Wazuh management | Auth bypass + admin actions from non-admin SAs |
| internal admin-audit-service | Path traversal + privilege escalation |
| Service-to-service comms | Lateral mTLS bypass attempts |
| Kong internal API | Admin endpoint discovery |
2.3 Segmentation testing scope (PCI 11.4.5)
| Attempt | From | To | Expected |
|---|---|---|---|
| 1-15 | App pool pod | CDE namespace svc | DENY |
| 16-25 | App pool pod | DBaaS prod | DENY (NetworkPolicy) |
| 26-30 | CDE pool pod | K8s API as cluster-admin | DENY (RBAC) |
| 31-40 | Any pod | Wazuh manager API | DENY (no allowlist) |
| 41-47 | Any pod | DO Spaces archive bucket | DENY (signed URL only) |
3. INPT 2026 — Internal Penetration Test Report

3.1 Executive summary
ControlCase Internal Penetration Test
Report ID: CC-INPT-2026-FTX-001
Test window: 2026-05-08 → 2026-05-14
Methodology: NIST 800-115 + MITRE ATT&CK + OWASP
Tester: ControlCase Red Team (lead: Suresh K.)
Position: Assumed-internal from VAPT droplet (VPC peer)
FINDINGS SUMMARY
═══════════════════════════════════════════════════════════
Total findings: 9
Critical: 0
High: 1
Medium: 5
Low: 3
Status: REQUIRES REMEDIATION
Remediation deadline: 2026-06-083.2 High finding detail
INPT-HIGH-001: Path traversal in admin-audit-service GET /audit/{path}
───────────────────────────────────────────────────────────────────────
Target: admin-audit-service:3009 (internal only)
CVSS v3.1: 7.7 (High)
Description:
The internal admin-audit-service exposed GET /audit/{path} endpoint that
used the path param to read file from storage backend. Without proper
sanitization, ../../etc/passwd was reachable from the service's container.
Reproduction (from compromised internal pod):
curl http://admin-audit-service.default:3009/audit/../../etc/passwd
Result: 200 + /etc/passwd content (no CHD, but proof of file read primitive)
Remediation:
- Replaced path concatenation with allowlist of known audit file paths
- Added path.resolve() + startsWith() guard
- Added integration test for ../ in path
- Container readOnlyRootFilesystem: true
Status: REMEDIATED 2026-05-20
Retest: 2026-05-29 — PASS ✓3.3 Medium findings (summary)
| ID | Finding | Remediated |
|---|---|---|
| INPT-MED-001 | Kafka topic payments.outbox ACL allows * consumer instead of specific group | 2026-05-22 |
| INPT-MED-002 | Wazuh /security/users API endpoint reachable from app namespace (should be wazuh ns only) | 2026-05-23 |
| INPT-MED-003 | Internal service-to-service mTLS optional — JWT-only auth allowed | 2026-05-24 |
| INPT-MED-004 | Kubelet API exposed on node 10250 without TLS cert verify | 2026-05-25 |
| INPT-MED-005 | etcd backup snapshot readable from monitoring ns | 2026-05-26 |
3.4 Retest — 2026-05-29 (PASS)
Retest window: 2026-05-29 08:00 UTC → 2026-05-29 18:30 UTC
Results: ALL HIGH + MEDIUM REMEDIATED
3 Low remain (accepted risk)
Status: ✓ PASS
Attestation: Internal PT Compliance4. Segmentation testing — PCI 11.4.5

4.1 Resultados de los 47 attempts
SEGMENTATION TEST RESULTS
═══════════════════════════════════════════════════════════════
Attempts: 47
Successful lateral movements: 0 ✓
Blocked: 47
Breakdown by control:
K8s NetworkPolicy denied: 18
DO Cloud Firewall denied: 8
RBAC denied (no permission): 12
Wazuh allowlist (no IP match): 6
No signed URL (Spaces bucket): 34.2 Detail por segmentation test
| Attempt range | From | To | Blocking control | Result |
|---|---|---|---|---|
| 1-15 | App pool pod | CDE svc | K8s NetworkPolicy app-deny-cde | ✗ DENY |
| 16-25 | App pool pod | DBaaS prod | DO Cloud Firewall cde-fw 5432 | ✗ DENY |
| 26-30 | CDE pool pod | K8s API as cluster-admin | RBAC default SA no binding | ✗ DENY |
| 31-40 | App ns pod | Wazuh manager :55000 | Wazuh allowlist + ns isolation | ✗ DENY |
| 41-47 | Any pod | Spaces archive bucket | Signed URL required | ✗ DENY |
4.3 Sample segmentation test command
bash
# Test 5: app pod trying to reach CDE service (payments-api in cde ns)
$ kubectl --context vapt exec test-pod -n app -- \
curl -sS -o /dev/null -w "%{http_code}\n" \
http://payments-api.cde.svc.cluster.local:3000/health
curl: (28) Connection timeout
# Validated via Falco runtime detection:
# Falco rule "Container attempt cross-namespace connection denied" fired5. Significant change retest — 2026-06-12

Tras los significant changes:
- WAF deployment (Q43) 2026-05-27
- PciAuditModule commit (Q67) 2026-06-16
Retest internal pentest ejecutado:
Report ID: CC-INPT-2026-EX-FTX-002
Trigger: Significant change — multiple
Test window: 2026-06-12
Result: PASS first attempt
No new vulnerabilities introduced
WAF + PciAuditModule don't introduce internal pivot vectors6. Vínculo con MITRE ATT&CK techniques tested

| ATT&CK ID | Technique | Tested? | Result |
|---|---|---|---|
| T1078.004 | Valid Accounts: Cloud Accounts | ✓ | Blocked by MFA (Q54/56) |
| T1556.005 | Modify Auth: Reversible Encryption | ✓ | Blocked by PBKDF2 (Q51) |
| T1078 | Default Accounts | ✓ | Mitigated by Q45 rotation |
| T1574.011 | Hijack Execution Flow: Services | ✓ | FIM detected (Q70) |
| T1547.001 | Boot or Logon Autostart: Registry | ✓ | (Windows VAPT) — DO managed |
| T1083 | File and Directory Discovery | ✓ | INPT-HIGH-001 found (fixed) |
| T1530 | Data from Cloud Storage Object | ✓ | Signed URL required |
| T1213.003 | Data from Code Repositories | ✓ | Blocked by GitHub permissions |
| T1570 | Lateral Tool Transfer | ✓ | Blocked by NetworkPolicies |
| T1021.004 | Remote Services: SSH | ✓ | Blocked by IP allowlist |
| T1620 | Reflective Code Loading | ✓ | Blocked by readOnlyRootFilesystem |
| T1110 | Brute Force | ✓ | Mitigated by Q50 lockout + Q67 audit |
7. Cómo el QSA verifica cada entregable
| Solicitado por QSA | Dónde se prueba |
|---|---|
| INPT 2026 informe + scope | §2 SOW + §3 report |
| Tras cambios significativos | §5 retest tras WAF + PciAuditModule |
| Segmentation testing (Req 11.4.5) | §4 (47 attempts, 0 successful) |
| Retest evidence | §3.4 (PASS 2026-05-29) |
8. Vínculo con otros controles
- POL-006 — Vulnerability + Patch Management
- Q77 — External pentest — sibling
- Q11/Q12 — Network segmentation — segmentation baseline
- Q43 — WAF deployment — trigger significant change retest
- Q67 — Audit log policy — trigger significant change retest
- PCI DSS v4.0 Req 11.4.1 + 11.4.4 + 11.4.5
