Lambda実行環境のハックが捗る?serverless-preyでLambda実行環境にシェルアクセスしてみよう!!

Lambda実行環境であんなこと、こんなことしてみましょう
2020.05.04

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

CX事業本部@大阪の岩田です。Serverless Daysの動画を見ていたところ、Lambda実行環境にシェルアクセスを提供するserverless-preyというおもしろそうなツールを見つけました。

という訳で早速試してみました。

serverless-preyとは?

serverless-preyはnetcatとngrokを利用して各FaaSプラットフォーム向けにシェルアクセスを提供する関数のコレクションです。

  • AWS Lambda向けのPanther
  • Azure Function向けのCougar
  • Google Cloud Function向けのCheetah

3種類から構成されており、各プラットフォームにデプロイ&実行することで関数の実行環境にシェルアクセスが可能になります。ソースコード等の一式は以下のGitHubリポジトリで公開されています。

https://github.com/pumasecurity/serverless-prey

アーキテクチャは以下のようになっています。

serverless-preyのアーキテクチャ

※公式の画像を引用

ローカル環境で起動したnetcatのlisterをインターネット経由でアクセスできるようにngrokで公開し、各FaaSプラットフォームからngrokのエンドポイントにアクセスしてもらうことでシェルアクセスを実現しています。

やってみる

実際にLambda実行環境へのシェルアクセスを試してみましょう。

serverless-preyはLambda実行環境へのシェルアクセスを提供するツールです。 検証目的でのみ利用し、プロダクション環境にはデプロイしないようにお願いします。 例えばですがLambda実行ロールに過剰な権限が付与されていた場合、攻撃者からLambda 実行環境のシェルにアクセスされて機密情報を盗み出されるといったリスクがあります。

まずはGitHubからserverless-preyをクローンします。

$ git clone https://github.com/pumasecurity/serverless-prey.git
$ cd serverless-prey

serverless frameworkとプラグインをインストールします。

$ npm install --dev

インストールできたらデプロイします。

$ sls deploy

しばらく待つと以下のように出力されてデプロイが完了します。発行されたAPIキーとAPI GWのエンドポイントを控えておきましょう。 

Serverless: Stack update finished...
Service Information
service: panther
stage: dev
region: us-east-1
stack: panther-dev
resources: 15
api keys:
  panther: <発行されたAPIキー>
endpoints:
  GET - <作成されたAPI GWのエンドポイントURL>
functions:
  panther: panther-dev-panther
layers:
  None
S3 Sync: No configuration found
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

クラウド側の準備ができたので、実際にシェルアクセスを試します。serverless-preyのpantherディレクトリ配下にスクリプトが置いてあるので、このスクリプトを実行します。

$ cd panther
$ ./script/panther --url-id <API GWのID> --api-key <発行されたAPIキー>

--url-idにはAPI GWのIDを渡します。作成されたAPI GWのエンドポイントがhttps://xyz.execute-api.us-east-1.amazonaws.com/dev/api/Pantherの場合はAPI GWのIDはxyzとなります。スクリプトを実行してしばらく待つとシェルのプロンプト>が表示されます。

$ ./script/panther --url-id <API GWのID> --api-key <発行されたAPIキー> 

  @@@@@@@@((.                                                        ((@@@@@@@@
   *@@@@@@(/*#@%,                                               %&@(*/(@@@@@@/
     (@@@@@(*.#%&@*/(                                       //*@&%#.*(@@@@@(
       /@@@@@(***//(&&&%.                               .%&&&(//***(@@@@@%
          #&@@@@@@&&&&&&&&&                           %&&&&&&&&@@@@@@&#

                                 Serverless Prey
                 https://github.com/pumasecurity/serverless-prey

>

ここまで進むとLambda実行環境のシェルに接続されている状態になるので、あとは好きなコマンドが実行できます。まずは定番のlsコマンドでも試してみます。

> ls
config.json
handler.js

無事にlsコマンドが実行され、Lambda Functionにパッケージされたファイルの一覧が表示されました!

まとめ

serverless-preyのご紹介でした。Lambda実行環境の理解を深めるのに役立つ非常に面白いツールだと思います。容量/用法を守ってうまく利用していきたいと思います。