ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

IAMの権限昇格を可視化する「PMapper」

AWSの権限昇格してますか?(挨拶)

PMapperは、指定したAWSアカウントのIAMとOrganizationsを分析して、権限昇格可能なパスを可視化してくれるツールです。NCCグループ社製。

github.com

PMapperはIAMポリシー、ユーザー、グループなどをノード、権限昇格する(できる)ノードから、されるノードへのベクトルをエッジとして、有向グラフを生成します。こんな感じ。

権限昇格できるノード--昇格方法-->権限昇格されるノード

AdministratorsAccess の他、IAMFullAccess のように、自分自身にポリシーを割り当てられるノードをAdminと位置づけ、AssumeRolePathRole によってAdminに(直接的か間接的かを問わず)なれる別のノードを探す、という感じみたいです。

実行

CloudShellを使いました。Dockerイメージもありますが、リポジトリにrequirements.txtが同梱されているのでそっちで済ませました。

$ sudo yum install -y graphviz
$ git clone https://github.com/nccgroup/PMapper.git
$ cd PMapper
$ pip3 install --user -r requirements.txt

IAMリソースの情報を収集し、グラフを作成します。

$ python3 pmapper.py graph create

以下のコマンドで概況を把握できます。ノードが40あり、うち3つがAdminに相当するようです。これだけでは権限昇格できる・されるの関係は分かりません。

$ python3 pmapper.py graph display
Graph Data for Account:  omitted
  # of Nodes:              40 (3 admins)
  # of Edges:              13
  # of Groups:             2
  # of (tracked) Policies: 90

グラフの画像ファイルを出力します。

$ python3 pmapper.py visualize
Created file ./omitted-account-id.svg

出力したファイルを、CloudShell画面右上の「Actions」から「Download file」したもの(の一部)がこちら。青がAdminノード、赤がAdminに権限昇格できるノードです。

--only-privesc オプションを付けると、権限昇格可能な組み合わせのみが残って、その手法が表示されます。

$ python3 pmapper.py visualize --only-privesc
Created file ./omitted-account-id-privesc-risks.svg

こんな感じ。

上段は「CloudFormation」とあります。赤いほうのノード(ロール)はCloudFormationスタックの作成と青いノード(ロール)をPassRoleする権限を持っているので、例えばCloudFormationでAdmin相当の権限を持ったEC2インスタンスを立てて悪いことできちゃう、ということのようです。

下段は「AssumeRole」とあります。こちらは単純に、赤いノードが青いノードを引き受けられる、ということです。

要するに、赤いロールが侵害されるとマズい、ということです。ネクストアクションとしては、IAMの設定を見直すことで改善・解消できるならそうすべきだし、そうでないなら、この赤いロールを引き受けているリソースを特定して、それらが侵害される状態になっていないかを確認する、といったところでしょうか。

おわりに

グラフ生成機能は(おそらく)AdministratorAccessなど固定的な条件のみから生成されるっぽいですが、これとは別に query サブコマンドで任意の権限を利用できるノードを列挙する機能があるようです。

github.com

その他、Organizationsの分析もできたりするみたいですが、割愛します。

PMapperをラップしたパロアルト社の「IAM-Deescalate」も併せて紹介しようと思ったんですが、PMapperだけで結構重かったので、こちらも次回にします。

github.com