|
| 1 | +<p align="center"> |
| 2 | + <img src="assets/banner_v2.svg" alt="ApiProber" width="100%" /> |
| 3 | +</p> |
| 4 | + |
| 5 | +<p align="right"> |
| 6 | + <b>🇩🇪 Deutsch</b> | <a href="README.md">🇬🇧 English</a> |
| 7 | +</p> |
| 8 | + |
| 9 | +# ApiProber -- Passives API-Discovery- und Dokumentations-Tool |
| 10 | + |
| 11 | +[](https://github.com/dev-bricks/apiprober/actions/workflows/tests.yml) |
| 12 | + |
| 13 | +ApiProber ist ein abhängigkeitsfreies Python-CLI für passives API-Discovery. Es hilft Entwicklern und Maintainern, undokumentierte REST-Dienste zu kartografieren, das Live-Verhalten mit der API-Dokumentation zu vergleichen, Beobachtungen in SQLite zu persistieren und Markdown- oder JSON-Dokumentationen zu exportieren. |
| 14 | + |
| 15 | +**Autor:** Lukas Geiger | **Lizenz:** MIT | **Python:** 3.8+ (nur Standardbibliothek) |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## Einstieg |
| 20 | + |
| 21 | +| Ziel | Befehl oder Datei | |
| 22 | +|---|---| |
| 23 | +| CLI ausprobieren | `python api_prober.py --help` | |
| 24 | +| Autorisierte API kartografieren | `python api_prober.py probe <base-url>` | |
| 25 | +| Dokumentation exportieren | `python api_prober.py export <service> --format md` | |
| 26 | +| Maschinenlesbaren Kontext lesen | [`llms.txt`](llms.txt) | |
| 27 | +| Schwachstelle vertraulich melden | [`SECURITY.md`](SECURITY.md) | |
| 28 | + |
| 29 | +--- |
| 30 | + |
| 31 | +## Einsatzbereiche |
| 32 | + |
| 33 | +- Interne REST-Dienste, für die keine OpenAPI-Datei existiert |
| 34 | +- Legacy-APIs, die eine leichtgewichtige Endpunkt-Dokumentation benötigen |
| 35 | +- Dokumentations-Audits, bei denen das Live-Verhalten mit den erwarteten Routen verglichen werden soll |
| 36 | +- Local-First-Sondierung vor dem Schreiben eines eigenen Clients oder SDKs |
| 37 | +- Passive Sicherheitsüberprüfungen mit expliziter Autorisierung |
| 38 | + |
| 39 | +ApiProber ist kein Exploit-Framework, Schwachstellen-Scanner, Fuzzer oder Lasttester. Nutzen Sie es nur für APIs, die Sie besitzen oder zu deren Überprüfung Sie ausdrücklich berechtigt sind. |
| 40 | + |
| 41 | +--- |
| 42 | + |
| 43 | +## Funktionen |
| 44 | + |
| 45 | +- **Multi-Strategie-Erkennung:** OpenAPI-Erkennung, Wordlist-Probing, Pattern-Expansion (Mustererweiterung), Verfolgung von HATEOAS-Links |
| 46 | +- **Rate Limiting:** Konfigurierbare Verzögerung zwischen Anfragen (Standard: 500 ms) |
| 47 | +- **robots.txt-Konformität:** Automatische Berücksichtigung von Zugriffsbeschränkungen |
| 48 | +- **Authentifizierungs-Unterstützung:** Bearer-Token, API-Key, Basic-Auth |
| 49 | +- **JSON-Schema-Extraktion:** Automatische Ableitung von Schemata aus Antwort-Bodies |
| 50 | +- **SQLite-Persistenz:** Alle Ergebnisse werden in einer lokalen Datenbank gespeichert |
| 51 | +- **Export:** Markdown und JSON (OpenAPI-ähnlich) |
| 52 | +- **Fortsetzen:** Fortführung unterbrochener Probing-Sitzungen |
| 53 | +- **Standardmäßig ethisch:** Nur passive Erkundung, kein Fuzzing oder destruktive Methoden |
| 54 | +- **Keine Abhängigkeiten (Zero-Dependency):** Reines Python aus der Standardbibliothek (urllib, json, sqlite3, argparse, pathlib) |
| 55 | + |
| 56 | +--- |
| 57 | + |
| 58 | +## Installation |
| 59 | + |
| 60 | +Keine Installation erforderlich -- funktioniert ausschließlich mit der Python 3.8+ Standardbibliothek. |
| 61 | + |
| 62 | +```bash |
| 63 | +git clone https://github.com/dev-bricks/apiprober.git |
| 64 | +cd apiprober |
| 65 | + |
| 66 | +# Direkt aus dem Repository-Root ausführen |
| 67 | +python api_prober.py --help |
| 68 | + |
| 69 | +# Oder als Paket installieren |
| 70 | +pip install -e . |
| 71 | +apiprober --help |
| 72 | +``` |
| 73 | + |
| 74 | +--- |
| 75 | + |
| 76 | +## Schnellstart |
| 77 | + |
| 78 | +### Eine API untersuchen |
| 79 | + |
| 80 | +```bash |
| 81 | +# Einfache Untersuchung |
| 82 | +python api_prober.py probe https://jsonplaceholder.typicode.com |
| 83 | + |
| 84 | +# Tiefe Untersuchung mit benutzerdefinierter Verzögerung |
| 85 | +python api_prober.py probe https://api.example.com --depth 2 --delay-ms 1000 |
| 86 | + |
| 87 | +# Authentifizierte Untersuchung |
| 88 | +python api_prober.py probe https://api.example.com --auth-type bearer --auth-value "IHR_TOKEN" |
| 89 | +``` |
| 90 | + |
| 91 | +### Dienste verwalten |
| 92 | + |
| 93 | +```bash |
| 94 | +# Alle untersuchten Dienste auflisten |
| 95 | +python api_prober.py list |
| 96 | + |
| 97 | +# Details für einen bestimmten Dienst anzeigen |
| 98 | +python api_prober.py status jsonplaceholder |
| 99 | + |
| 100 | +# Unterbrochene Untersuchung fortsetzen |
| 101 | +python api_prober.py resume jsonplaceholder |
| 102 | +``` |
| 103 | + |
| 104 | +### Ergebnisse exportieren |
| 105 | + |
| 106 | +```bash |
| 107 | +# Als Markdown-Dokumentation exportieren |
| 108 | +python api_prober.py export jsonplaceholder --format md |
| 109 | + |
| 110 | +# Als JSON (OpenAPI-ähnlich) exportieren |
| 111 | +python api_prober.py export jsonplaceholder --format json |
| 112 | +``` |
| 113 | + |
| 114 | +### Konfiguration |
| 115 | + |
| 116 | +```bash |
| 117 | +# Aktuelle Konfiguration anzeigen |
| 118 | +python api_prober.py config --show |
| 119 | + |
| 120 | +# Werte festlegen |
| 121 | +python api_prober.py config --set delay_ms 1000 |
| 122 | +python api_prober.py config --set auth.type bearer |
| 123 | +``` |
| 124 | + |
| 125 | +### Umgang mit Anmeldedaten |
| 126 | + |
| 127 | +Anmeldedaten (Credentials) werden außerhalb der versionierten `config.json` und der lokalen SQLite-Datenbank gehalten: |
| 128 | + |
| 129 | +- **Empfohlen:** Setzen Sie die Umgebungsvariablen `APIPROBER_AUTH_VALUE` (und optional `APIPROBER_AUTH_TYPE`). Diese haben Vorrang vor allen Konfigurationsdateien und werden niemals auf die Festplatte geschrieben. |
| 130 | +- `python api_prober.py config --set auth.value "TOKEN"` schreibt den Wert in `config.local.json` -- eine gitignorierte Overlay-Datei neben `config.json` -- niemals in die versionierte `config.json`. |
| 131 | +- Konfigurationsauflösung: Standardwerte -> `config.json` -> `config.local.json` -> Umgebungsvariablen. |
| 132 | +- In der SQLite-Datenbank gespeicherte Run-Konfigurationen haben `auth.value` zensiert (`***REDACTED***`); `resume` liest das Credential erneut aus der aktuellen Konfiguration oder Umgebung ein. |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +## Erkennungsstrategien |
| 137 | + |
| 138 | +ApiProber verwendet vier Strategien in absteigender Priorität: |
| 139 | + |
| 140 | +1. **OpenAPI-Erkennung** (Priorität 1): Prüft auf `/swagger.json`, `/openapi.json`, `/api-docs` etc. |
| 141 | +2. **Wordlist-Probing** (Priorität 2): Testet ~140 gängige REST-Endpunkt-Pfade. |
| 142 | +3. **Pattern-Expansion** (Priorität 3): Erweitert Muster wie `/api/v{1,2,3}/{resource}`. |
| 143 | +4. **Response-Driven / HATEOAS** (Priorität 4): Folgt in Antwort-Bodies entdeckten Links. |
| 144 | + |
| 145 | +--- |
| 146 | + |
| 147 | +## Sicherheit und Ethik |
| 148 | + |
| 149 | +ApiProber ist für die verantwortungsvolle API-Erkundung konzipiert: |
| 150 | + |
| 151 | +- **Standardmäßig schreibgeschützt (Read-only):** Nur GET, HEAD, OPTIONS (keine POST/PUT/DELETE-Anfragen ohne das Flag --test-all-methods). |
| 152 | +- **Integriertes Rate Limiting:** Konfigurierbare Verzögerung zwischen Anfragen. |
| 153 | +- **robots.txt-Konformität:** Berücksichtigt automatisch Zugriffsbeschränkungen. |
| 154 | +- **Transparenter User-Agent:** `ApiProber/0.1 (github.com/dev-bricks/apiprober; passive-discovery)` |
| 155 | +- **Kein Fuzzing, kein Exploiting:** Ausschließlich passive Erkennung. |
| 156 | + |
| 157 | +--- |
| 158 | + |
| 159 | +## Projektstruktur |
| 160 | + |
| 161 | +``` |
| 162 | +ApiProber/ |
| 163 | ++-- api_prober.py CLI-Einstiegspunkt |
| 164 | ++-- config.json Standardkonfiguration (keine Geheimnisse) |
| 165 | ++-- config.local.json Lokale Overrides inkl. auth.value -- gitignoriert |
| 166 | ++-- core/ Kernmodule |
| 167 | +| +-- config.py Konfigurationsverwaltung |
| 168 | +| +-- database.py SQLite-Persistenzschicht |
| 169 | +| +-- http_client.py HTTP-Client mit Rate Limiting |
| 170 | +| +-- robots.py robots.txt-Parser |
| 171 | +| +-- schema_extractor.py JSON-Schema-Inferenz |
| 172 | ++-- discovery/ Erkennungsstrategien |
| 173 | +| +-- orchestrator.py Strategie-Koordination |
| 174 | +| +-- openapi_detect.py OpenAPI/Swagger-Erkennung |
| 175 | +| +-- wordlist.py Wordlist-basiertes Probing |
| 176 | +| +-- pattern.py Pattern-Expansion |
| 177 | +| +-- response_driven.py HATEOAS-Link-Verfolgung |
| 178 | +| +-- method_tester.py HTTP-Methoden-Tests |
| 179 | ++-- export/ Export-Formate |
| 180 | +| +-- json_export.py JSON-Export |
| 181 | +| +-- markdown.py Markdown-Dokumentationsgenerator |
| 182 | ++-- wordlists/ Probe-Wordlists (~140 Pfade) |
| 183 | +| +-- common_rest.txt Gängige REST-Endpunkte |
| 184 | +| +-- admin_paths.txt Admin- und Managementpfade |
| 185 | +| +-- auth_endpoints.txt Authentifizierungsendpunkte |
| 186 | +| +-- swagger_paths.txt Swagger/OpenAPI-Pfade |
| 187 | ++-- data/ Laufzeitdaten (api_prober.db) -- gitignoriert |
| 188 | ++-- exports/ Generierte Dokumentation -- gitignoriert |
| 189 | +``` |
| 190 | + |
| 191 | +--- |
| 192 | + |
| 193 | +## Anwendungsfälle |
| 194 | + |
| 195 | +- **Dokumentieren** von undokumentierten internen APIs |
| 196 | +- **Validieren** der API-Dokumentation gegen tatsächliches Verhalten |
| 197 | +- **Finden** erreichbarer Endpunkte in Systemen, zu deren Überprüfung Sie berechtigt sind |
| 198 | +- **Generieren** von API-Dokumentation für Legacy-Systeme |
| 199 | +- **Sicherheits-Audits** ausschließlich durch passive Aufklärung (Reconnaissance) |
| 200 | + |
| 201 | +--- |
| 202 | + |
| 203 | +## Sichtbarkeit & Keywords |
| 204 | + |
| 205 | +`passive API discovery`, `REST API documentation generator`, `OpenAPI detection`, `HATEOAS link crawler`, `local-first API reconnaissance`, `zero-dependency Python CLI`, `SQLite API inventory`, `ethical API probing`, `authorized API inventory`, `REST endpoint mapper` |
| 206 | + |
| 207 | +ApiProber steht in keiner Verbindung zu Cloudprober, probe-rs, aktiven Uptime-Monitoren oder semantischen Code-Suchmaschinen. Der Fokus liegt auf der lokalen, ratenlimitierten Dokumentation autorisierter REST-API-Oberflächen für Systeme, die Sie besitzen oder explizit überprüfen dürfen. |
| 208 | + |
| 209 | +--- |
| 210 | + |
| 211 | +## Lizenz |
| 212 | + |
| 213 | +MIT-Lizenz. Siehe [LICENSE](LICENSE). |
| 214 | + |
| 215 | +--- |
| 216 | + |
| 217 | +## Entwicklung |
| 218 | + |
| 219 | +Lokale Smoke-Tests ohne live Netzwerkzugriffe ausführen: |
| 220 | + |
| 221 | +```bash |
| 222 | +python -m pytest -q |
| 223 | +python -m compileall -q . |
| 224 | +``` |
| 225 | + |
| 226 | +Die Live-Untersuchung von `jsonplaceholder.typicode.com` kann für manuelle Prüfungen zugeschaltet werden: |
| 227 | + |
| 228 | +```bash |
| 229 | +set APIPROBER_RUN_NETWORK_TESTS=1 |
| 230 | +python -m pytest -q test_smoke.py |
| 231 | +``` |
| 232 | + |
| 233 | +--- |
| 234 | + |
| 235 | +## Autor |
| 236 | + |
| 237 | +Lukas Geiger -- [github.com/lukisch](https://github.com/lukisch) |
| 238 | + |
| 239 | +Repository -- [dev-bricks/apiprober](https://github.com/dev-bricks/apiprober) |
| 240 | + |
| 241 | +--- |
| 242 | + |
| 243 | +## Haftung / Liability |
| 244 | + |
| 245 | +Dieses Projekt ist eine **unentgeltliche Open-Source-Schenkung** im Sinne der §§ 516 ff. BGB. Die Haftung des Urhebers ist gemäß **§ 521 BGB** auf **Vorsatz und grobe Fahrlässigkeit** beschränkt. Ergänzend gelten die Haftungsausschlüsse aus der MIT-Lizenz. |
| 246 | + |
| 247 | +Nutzung auf eigenes Risiko. Keine Wartungszusage, keine Verfügbarkeitsgarantie, keine Gewähr für Fehlerfreiheit oder Eignung für einen bestimmten Zweck. |
| 248 | + |
| 249 | +This project is an unpaid open-source donation. Liability is limited to intent and gross negligence (§ 521 German Civil Code). Use at your own risk. No warranty, no maintenance guarantee, no fitness-for-purpose assumed. |
0 commit comments