コンテンツにスキップ

ネットワークと IPC

外部からは見えなかった localhost のサービス、Unix ドメインソケット、内部ネットワークを探す。見つけた待ち受けの調べ方はlocalhost サービスとUnix socket とファイルディスクリプタにまとめた。

追加確認例:

ターミナルウィンドウ
ss -lntup
ss -ant
ss -lxnp
ip addr
ip route
lsof -i
lsof -U
  • 目的: localhost の待ち受け、Unix ドメインソケット、内部ネットワーク、接続元の制限を探す。
  • 前提条件: ss, ip, lsof がない最小コンテナでは /proc/net/tcp を直接読む。
  • 何を確認しているか: 127.0.0.1:<port>、0.0.0.0:<port>、*:3000、Unix ドメインソケットの所有者・グループ・アクセス権、接続元の制限。
  • 期待される出力: 127.0.0.1:1337 の root 権限のサービス、127.0.0.1:7777 の管理 UI、/run/<app>/mgmt.sock。
  • 出力の解釈: localhost での待ち受けは、外部から直接接続できない設定を示す。同一ホストの別ユーザーや、SSH トンネルを通じて接続できる場合がある。
  • 失敗した場合の切り分け: IPv4 と IPv6、コンテナのネットワーク名前空間、ファイアウォール、認証、HTTP 以外のプロトコルを分ける。
  • 代替コマンド: cat /proc/net/tcp, cat /proc/net/tcp6, nc -vz 127.0.0.1 <port>, curl -v --max-time 3。
  • 状態変更: ss と ip は読み取り専用。nc や curl は対象サービスのログに接続記録を残す場合がある。未知のプロトコルへ入力を連打しない。
ターミナルウィンドウ
cat /proc/net/tcp

st が 0A の行は LISTEN を示す。アドレスとポートは 16 進数で、IPv4 アドレスのバイト順はリトルエンディアンになる。ss がないコンテナでは Python や awk で変換する。UID はソケット作成時の実効 UID を示す(proc_pid_net(5))。実行中のプロセスを特定するには、inode を /proc/<PID>/fd と照合する。

見え方読み方次
localhost の root プロセスが HTTP の管理操作を提供する実行ユーザーと認証を確認するlocalhost サービス
印刷ポートと /run/<app>/*.sock があるroot 権限のデーモンとソケットの所有者を対応付けるUnix socket
localhost が HTTP を返さない専用プロトコルのクライアントを探す。curl の失敗だけで到達不能とは判断しないlocalhost サービス
コンテナ内だけで見える HTTPファイル読み取りの入口になり得る。待ち受けプロセスの実行ユーザーを確認するlocalhost サービス
root 権限の組み込み HTTP サーバ起動引数から公開ディレクトリを確認するプロセスと systemd

内部ネットワークの通信を tcpdump で取得した場合は、実行ユーザーと、ネットワーク名前空間をホストと共有していたかを記録する。通信を取得できたことだけで、ホストの root 権限を得たとは判断しない。

外部スキャンで filtered だったポートも、侵入後にこの分類へ戻して再確認する。起点は外部公開サービス。