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ポリシーはその名称から、セキュリティ監査に関連する権限を一括して付与できるポリシーだと推測できます。
入手したアカウントに紐付けられているポリシーはiam list-attached-user-policies
で確認できますが、アカウントのユーザ名が必要です。作業中のアカウント情報はsts get-caller-identify
で確認できます。
入手した認証情報を設定し、問題文で与えられたアカウントの情報を確認すると、ユーザ名がLevel 6であることがわかりました。
入手したユーザ名を用いてiam list-attached-user-policies
を実行しアカウントに紐づくポリシーを確認すると、list_apigateways
とMySecurityAudit
という2つのポリシーがアタッチされていることがわかりました。MySecurityAuditは問題文でSecurityAuditポリシーとして挙げられていたものと思われます。list_apigatewaysは詳細不明ですが、名称からAmzon API Gatewayとの関連が考えられます。
ポリシーのARNがわかったので、iam get-policy
でポリシーの中身を確認します。
- list_apigatewaysの内容
- MySecurityAuditの内容
list_apigatewaysについてさらに調査します。既にVersionIdが判明しているので、iam get-policy-version
を使ってポリシーが記述されたJSONファイルを参照できます。
Resourceに"apigateway"という文字列が存在しており、推測通りAmazon API Gateway関連のポリシーでした。ドキュメントで記述形式を確認すると、このポリシーはGETメソッドでarn:aws:apigateway:us-west-2::/restapis/*というリソースにアクセスする権限が与えられていると読み取れます。
何らかの手段で実装されているコードが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という関数の存在がわかりました。
名前からして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
で調査できます。
改行が上手くいっておらず見づらいですが、APIに関するポリシーの記述形式を参考にするとなんとか意味がわかります。ポイントになるのは操作対象のAPIを指定するResourceの箇所で、出力結果のarn:aws:lambda:us-west-2:975426262029:function:Level6
は以下のように指定されていることがわかります。
- リージョン : us-west-2
- アカウントID : 975426262029
- API ID : s33ppypa75
これで必要な情報はステージ名を残すだけとなりました。apigateway get-stages
でステージ名を調査すると、Prodだとわかりました。
得られた情報を整理すると以下のとおりです。
- 関数名 : level6
- リージョン : us-west-2
- API ID : s33ppypa75
- ステージ名 : Prod
この情報をもとにRest APIでLambda関数level6を実行するURLにアクセスすると、別のURLへ誘導する応答が得られました。
誘導先のURLにブラウザでアクセスすると、最後のページに辿り着きました。
以上