日記帳

WE NEED メーデー 睡眠を!

flaws.cloud Level6 Write up

Level6の問題です。問題文は次のとおり。

問題

For this final challenge, you're getting a user access key that has the SecurityAudit policy attached to it. See what else it can do and what else you might find in this AWS account. Access key ID: Secret:

(認証情報はマスクしてます……)

SecurityAuditポリシーがアタッチされたユーザアクセスキーを入手したので、何ができるのか調査してみようという問題です。

解答

AWSのドキュメントによればSecurityAuditポリシーは職務機能の AWS 管理ポリシーの一つです。職務機能の AWS 管理ポリシーは特定の業務に関連するタスクの実行に必要な権限を簡単に付与できるポリシーで、多くのサービスの権限が1つのポリシーにまとめられています。SecurityAuditポリシーはその名称から、セキュリティ監査に関連する権限を一括して付与できるポリシーだと推測できます。

docs.aws.amazon.com

入手したアカウントに紐付けられているポリシーはiam list-attached-user-policiesで確認できますが、アカウントのユーザ名が必要です。作業中のアカウント情報はsts get-caller-identifyで確認できます。

awscli.amazonaws.com

入手した認証情報を設定し、問題文で与えられたアカウントの情報を確認すると、ユーザ名がLevel 6であることがわかりました。

f:id:mot_skmt:20210418143808p:plain

入手したユーザ名を用いてiam list-attached-user-policiesを実行しアカウントに紐づくポリシーを確認すると、list_apigatewaysMySecurityAuditという2つのポリシーがアタッチされていることがわかりました。MySecurityAuditは問題文でSecurityAuditポリシーとして挙げられていたものと思われます。list_apigatewaysは詳細不明ですが、名称からAmzon API Gatewayとの関連が考えられます。

f:id:mot_skmt:20210418143951p:plain

ポリシーのARNがわかったので、iam get-policy でポリシーの中身を確認します。

  • list_apigatewaysの内容

f:id:mot_skmt:20210418144049p:plain

  • MySecurityAuditの内容

f:id:mot_skmt:20210418144113p:plain

list_apigatewaysについてさらに調査します。既にVersionIdが判明しているので、iam get-policy-versionを使ってポリシーが記述されたJSONファイルを参照できます。

f:id:mot_skmt:20210418144310p:plain

Resourceに"apigateway"という文字列が存在しており、推測通りAmazon API Gateway関連のポリシーでした。ドキュメントで記述形式を確認すると、このポリシーはGETメソッドでarn:aws:apigateway:us-west-2::/restapis/*というリソースにアクセスする権限が与えられていると読み取れます。

docs.aws.amazon.com

何らかの手段で実装されているコードがAmazon API Gatewayから実行されているのではないかと考えられます。APIから呼び出されるコードはEC2やLambdaで作成できるようですが、どちらかといえばLambdaのほうが一般的ではないでしょうか。

先ほど見つけたもう一つのポリシー MySecurityAudit の内容を確認すると、Lambda関連で複数次の権限が割り当てられていることがわかります。

  • GetAccountSettings
  • GetPolicy
  • List*
$ aws --profile level6 iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/MySecurityAudit --version-id v1
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        中略
            "lambda:GetAccountSettings",
                        "lambda:GetPolicy",
                        "lambda:List*","acm:Describe*",
                                     ],
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        },
        "VersionId": "v1",
        "IsDefaultVersion": true,
        "CreateDate": "2019-03-03T16:42:45+00:00"
    }
}

List* が許可されていたのでlambda list-functionsで作成されているLambda関数を確認してみると、Level6という関数の存在がわかりました。

f:id:mot_skmt:20210418145633p:plain

名前からしてLevel6関数は怪しいため、この関数を実行する方法を考えます。この関数がAmazon API Gatewayで呼び出されると推測すると、適切なエンドポイントにリクエストを投げれば実行できるはずです。ドキュメントによればAmazon API Gatewayで作成されたRest APIは以下の形式のURLにリクエストを送信することで実行できます。

https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/

APIを実行するためにはAPI IDとリージョン、ステージ名を特定する必要があります。API IDとリージョンはlambda get-policyで調査できます。

f:id:mot_skmt:20210418150116p:plain

改行が上手くいっておらず見づらいですが、APIに関するポリシーの記述形式を参考にするとなんとか意味がわかります。ポイントになるのは操作対象のAPIを指定するResourceの箇所で、出力結果のarn:aws:lambda:us-west-2:975426262029:function:Level6は以下のように指定されていることがわかります。

  • リージョン : us-west-2
  • アカウントID : 975426262029
  • API ID : s33ppypa75

これで必要な情報はステージ名を残すだけとなりました。apigateway get-stagesでステージ名を調査すると、Prodだとわかりました。

f:id:mot_skmt:20210418150149p:plain

得られた情報を整理すると以下のとおりです。

  • 関数名 : level6
  • リージョン : us-west-2
  • API ID : s33ppypa75
  • ステージ名 : Prod

この情報をもとにRest APIでLambda関数level6を実行するURLにアクセスすると、別のURLへ誘導する応答が得られました。

f:id:mot_skmt:20210418150331p:plain

誘導先のURLにブラウザでアクセスすると、最後のページに辿り着きました。

f:id:mot_skmt:20210418150608p:plain

以上