🔔

GCPへの攻撃を考える。認証情報の窃取(gcloudコマンド)編

2021/04/14に公開

はじめに

こんにちは、ふぁいあー(@fire_fire_2)です。
普段、ペネトレーションテストをしています。
いつものペネトレは一般職員の使う端末で企業内ネットワーク(WindowsAD環境)を対象とすることが多く、対外サービス向けの環境のペネトレはあまり行いません。

しかし、昨今の風潮として、主に対外サービス向けなシステムでは、AWSを筆頭にAzure、GCPなどのクラウドサービスを利用する機会が増えているのを背景に、今回はGCP環境への攻撃(ペネトレ)を考えたいと思います。

ペネトレについて

昨今のペネトレサービスは、APTからの攻撃を想定して「職員の端末がマルウェアに感染し何らかの方法で遠隔操作されている」、という想定を前提として調査を始めることが多い印象です。
今回のGCPについても同じような前提で、「GCPを扱う開発者の端末がマルウェアに感染した」、という状況を想定したものにしたいと思います。

「GCPを扱う開発者の端末」の定義

GCPな開発者は下記の設定を行っていることが普通であると思うので、それを今回の端末の前提定義とします。

  • Google Cloud SDK(gcloudコマンド)がインストール済み
  • gcloudコマンド利用のためGoogleアカウント(Cloud Identityなど含む)でログイン済み

gcloudコマンドの認証情報のありか

Google Cloud SDKをインストールしたら、まず以下のコマンドを叩くと思います。

$ gcloud auth login

するといつものログイン画面がでてきて、2段階認証を設定している場合はそれも行わないとログインできません。

この認証の仕組み自体はOAuthですが、

Q. OAuth後の認証情報はどこに格納されているのかご存知でしょうか?

A. このパス以下に保存されています。

#Windowsの場合
%APPDATA%\gcloud\

#Linuxの場合
~/.config/gcloud/

特にWindows環境においては、%APPDATA%\gcloud\legacy_credentials\[アカウント名]\adc.jsonのファイルにGCPのAPIを叩くtoken取得に使う値が全部記載されています。

攻撃手法

さて、ここまでの話を踏まててどうすればGCPに侵入できるでしょうか?

方法1:Googleアカウントを盗む

一番にパッと思いつくのは、侵入したいGCPに紐付いたGoogleアカウントを盗んで、Google Cloud SDKなりコンソールなりにログインしてしまえば良いと思われるでしょう。

ですが、この方法は、ほとんどの場合うまくいくことはないでしょう。このご時世、大事なクラウド環境を管理するアカウントに2段階認証を設定していないことはほとんどないからです。運良くGoogleアカウントのメールアドレスとパスワードを盗めても2段階認証に阻まれてしまいます。

方法2:Google Cloud SDKの認証情報を盗む

次は、ログイン済みのGoogle Cloud SDKの認証情報を盗めばいいのではないかと考えることでしょう。
では、どうやってそれを盗むのか。。。

フォルダごと移植すればいいのです。

Windows環境でしか検証していませんが、さきほど紹介した設定ファイルの入った下記のフォルダをそっくりそのまま別のWindows環境に移植した場合でも、gcloudコマンドによりGCPの操作が可能なのです。

#Windowsの場合
%APPDATA%\gcloud\

つまり、開発者の端末に侵入した攻撃者は、その端末の中や、Lateral Movement可能な他の端末の中から、これらの設定ファイルを盗み出すことでGCPへの侵入という目的を達成できます。ペネトレでもこの攻撃ベクトルは有効だと思っています。

対策&緩和策

認証情報を移植するだけでGCPを操作できるのは、現状のgcloudコマンドの仕様なので、これを対策する方法は存在しません。しいていうならば、しばらくgcloudコマンドを使わないのであれば「認証情報を削除しておく。」といったことぐらいしかできません。

認証情報を盗まれて悪用されてもすぐに気付けるように、API呼び出しのモニタリングやAPI呼び出し元のIP制限などを行って被害を最小限に緩和してください。

もし、盗まれていることが分かった場合、この認証方式はあくまでOAuthであるので、Googleアカウントのアプリの権限設定https://myaccount.google.com/permissionsから、Google Cloud SDKのアプリからのアクセスを削除してください。そうすると、盗まれている認証情報は利用できなくなります。もう一度ログインし直すと新しい認証情報が設定されます。

まとめ

Google Cloud SDKの認証情報は移植するだけで他の端末でも簡単に利用できるようになってしまうので気をつけようねという話でした。正直どうしようもないよねという話なのですが、こういうこともできるし狙われる場所かも、というのは頭に入れておいてくれたらなと思います。
気が向いたら、GCPの他のセキュリティ関連の話題も書きたいと思います。

参考文献

GCP OAuth Token Hijacking in Google Cloud – Part 1
https://www.netskope.com/jp/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1
GCP OAuth Token Hijacking in Google Cloud – Part 2
https://www.netskope.com/jp/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

Discussion