OWASP ServerlessGoatを利用してセキュリティソフトの確認をする準備をしてみた

2022.02.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

aqua社が提供しているAqua Enterprise版 を試す機会がありNanoEnforcerとLambdaサーバレスの動作を確認するためOWASP Serverless Goatを使ってみようと思い導入方法をまとめています。

OWASP Serverless Goat とは?

OWASP Serverless Goatはイスラエルの PureSec社 が作成したアプリケーションでThe Ten Most Critical Risks for Serverless Applications v1.0に基づき セキュリティの教育、指導向けにわざと脆弱性を埋め込まれている状態で公開されているWeb アプリケーションになります。
PureSec社は2019年5月に企業買収されてそれ以降GitHubのアップデートが止まっていますが、現状でも利用可能とのことで確認用途に利用しています。

■ GitHub OWASP/Serverless-Goat
https://github.com/OWASP/Serverless-Goat

■ ServerlessRepo serverless-goat
https://serverlessrepo.aws.amazon.com/applications/ap-southeast-1/075675446607/serverless-goat

注意事項

脆弱性を利用したテストはAWSが掲載している「侵入テスト」のポリシーを確認いただき、決まりを遵守するようにお願いします。

ペネトレーションテスト(侵入テスト)- AWS セキュリティ|AWS
https://aws.amazon.com/jp/security/penetration-testing/

OWASP Serverless Goatは脆弱性が埋め込まれたアプリケーションになるためサービスが動作している実環境にはデプロイしないでください。
検証環境でセキュリティの勉強用途にご利用ください。
アプリケーションはIP制限を設定してご利用ください。

アプリケーションの導入

AWSへのログイン

検証用のAWS環境にログインをおこないます。

リポジトリから取得

AWS Serverless Application Repositoryにアクセスをしてserverless-goatのデプロイをおこないます。

■ ServerlessRepo serverless-goat
https://serverlessrepo.aws.amazon.com/applications/ap-southeast-1/075675446607/serverless-goat

画面表示右側の[Deploy]をクリックする事でSAMを利用したデプロイ画面が表示されます。

リポジトリから取得1

SAMの画面では内容は変更せず、画面下の[Deploy]をクリックします。

リポジトリから取得2

CloudFormationによる作成確認

デプロイを実行するとCloudFormationに「serverlessrepo-serverless-goat」という名称でスタックが作成されます。
ステータスがCREATE_COMPLETEになるのを待って[出力]欄に表示される[WebsiteURL]をクリックして画面が表示される事を確認します。

CloudFormationによる作成確認1

正常にデプロイができている場合、OWASP ServerlessGoatのページが表示されます。
※ロゴは開発元サイトが閉鎖されているため表示されません。
CloudFormationによる作成確認2

API Gatewayでアクセス制限

Serverless-GoatのAPIにアクセス制限を追加します。
[API Gateway]に移動をして作成されている[serverlessrepo-serverless-goat]を選択します。
[リソースポリシー]に移動をしてIPアクセスの制限を追記します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:(AWSアカウント番号):(API GatewayのID)/Prod/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "XXX.XXX.XXX.XXX/32 ※許可するIPアドレス"  
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:(AWSアカウント番号):(API GatewayのID)/Prod/*"
        }
    ]
}

API Gatewayでアクセス制限1

リソースポリシーの保存をおこないます。
[リソース]に移動をおこない[アクション]から[APIのデプロイ]をおこないデプロイをおこないます。
デプロイはProd と Stage 両方におこないます。

API Gatewayでアクセス制限2

上記でアプリケーションの導入は完了になります。

脆弱性の確認

脆弱性がある項目をいくつか試してみます。

スタックトレースの表示

アプリケーションではファイルのパスを指定してSubmitする機能があります。
パスはGET値で「document_url」にて送信されていますが上記を消した状態で再度送信をおこないます。

■ URLの例
https://[API Gatewayで指定されるURL]/Prod/api/convert

■ 画面表示 スタックトレースの表示

画面表示をするとdocument_urlが存在しないことでスタックトレースが表示されます。
表示には使っているスクリプトのパスが表示されていてプログラムの構造を一部把握する事ができます。

OSコマンドインジェクション

アプリケーションのファイル指定のフォームに「; sleep 5 #」と「; sleep 100 #」の内容を追加して[Submit]をしてみます。
※実際の入力は「http s://」のスペースを外して入力ください。

■ 入力例 (通常)
http s://www.puresec.io/hubfs/document.doc

■ 入力例 (sleep 5追加)
http s://www.puresec.io/hubfs/document.doc; sleep 5 #

■ 入力例 (sleep 100追加)
http s://www.puresec.io/hubfs/document.doc; sleep 100 #

実行をすると5を指定した方は、5秒経過後に表示がおこなわれ、100を指定した方は一定時間後「Internal server error」にてエラーになることがわかりました。
上記からプログラムにはOSコマンドインジェクションの問題があることが予測できます。

スクリプトの奪取

OSコマンドインジェクションとスタックトレースの内容を利用してプログラムの内容を奪取してみます。 先ほどスタックトレースにて「/var/task/index.js」というファイルが存在することを確認しています。
上記を catコマンド を利用して出力できるか確認してみます。

■ 入力例 (index.js パス指定)
http s://www.puresec.io/hubfs/document.doc; cat /var/task/index.js #

■ 画面表示
スクリプトの奪取

表示をするとスクリプトの内容を確認することができました。
スクリプトを見るとDynamoDBやaws-sdk、node-uuidライブラリの利用、環境変数が設定されていること、OSコマンドインジェクションの対策がされていないことがわかります。

環境変数の奪取

プログラムを確認する事でOSコマンドインジェクションの対策がされていないことがわかり環境変数の取得も出来そうということで試してみます。
取得は envコマンド を利用してみます。

■ 入力例 (index.js パス指定)
http s://www.puresec.io/hubfs/document.doc; env #

■ 画面表示
環境変数の奪取

表示をすると環境変数などがすべて出力できることを確認できます。

その他脆弱性について

Serverless-Goatにはレッスンという形式で脆弱性が用意されています。
上記以外に確認できる脆弱性は「LESSONS.md」を参照ください。

■ GitHub OWASP/Serverless-Goat/LESSONS.md
https://github.com/OWASP/Serverless-Goat/blob/master/LESSONS.md

さいごに

今回はセキュリティの勉強、検証用途に利用できるOWASP ServerlessGoatをデプロイしてみました。
次回はAqua Enterprise版のNanoEnforcerを利用して脆弱性の対策を実装しています。