HappyNote3966’s blog

備忘録、作業記録的なことを書きます。低レベル注意。ご指摘等ございましたらやんわりとお願いします(´;ω;`)

CVE-2018-7602の検証

Web系の脆弱性について勉強していきたいと思い、いくつか検証してみた。この記事はそのうちの3つ目。

CVE-2018-7602について

cve.mitre.org

Drupal 7.x系、8.x系にRCEの脆弱性が存在する。

今回検証するのはこのコード。

github.com

尚、こちらのPoCも参考にしている。

www.exploit-db.com

検証コードとDrupal7.57のソースをまとめたリポジトリを作成した。以降の検証はこのリポジトリ内にあるスクリプト等でインストール作業を自動化している。

github.com

検証環境は、Virtualbox上で動作するVM(Ubuntu 16.04 64bit)。予めgitがインストールされているものとする。

インストール

$ git clone https://github.com/happynote3966/CVE-2018-7602.git
$ cd CVE-2018-7602
$ sudo ./install.sh
# (途中でMySQLのrootパスワードの設定を求められる)
$ sudo ./install.2sh
# (ここでも途中でMySQLのrootパスワードの入力が2回求められる。)

ここまで実行したら、次はInstallation Script(Webコンソール)でDrupalをインストールする。 以降のインストール作業はこちらの手順と同様のため省略する。詳しくはこの記事を参照のこと。

happynote3966.hatenadiary.com

検証

この脆弱性は、ログインしているユーザが管理者によって認証され、記事の削除権限を持っていることが必要となる。 そのため、一般ユーザを作成し、そのユーザに対し記事の作成権限と削除権限を追加する。その後に、ログインを行ってからPoCを実行する。

まずは管理者権限でテスト用のユーザを作成する。画面上のPeopleのタブをクリックし、以下のような画面を出す。

f:id:HappyNote3966:20180830190709p:plain

次に、現れた画面の上部にあるAdd userをクリックし、一般ユーザを作成する。 ユーザ名はhappynote3966、パスワードはpasswordとしておく。下にあるCreate new accountをクリックして作成は完了。

f:id:HappyNote3966:20180830190926p:plain

次に、一般ユーザの権限を追加する。まずは画面上のPeopleのタブをクリックし、更にその中のPERMISSIONSのタブをクリックする。 この中のNodeの項目内にあるArticle: Create new contentArticle: Delete own contentAUTHENTICATED USERの列にチェックを入れ、Save Permissionをクリックして、権限を反映する。

f:id:HappyNote3966:20180830191140p:plain

最後に、記事を追加する。 まずはログアウトし、先ほど作成した一般ユーザ名とパスワードでログインする。

ログインできると、以下のような画面になる。

f:id:HappyNote3966:20180830191703p:plain

ここから、Add new contentをクリックし、記事の作成を行う。 記事の内容は適当にした。

f:id:HappyNote3966:20180830191931p:plain

一番下にあるSaveをクリックすると、作成した記事が反映される。

f:id:HappyNote3966:20180830192003p:plain

このときのURLを確認し、?q=node/1の最後の数字の部分を見てみると、1となっていることが分かる。これがノードIDとなる。

準備が完了したので、これからPoCを実行してみる。まずはブラウザ内でCookieをチェックする。 このサイトのCookie(今回はlocalhost)を閲覧する。今回は以下のようになっていた。

Name:SESS29af1facda0a866a687d5055f2fade2c
Content:bBJ40SrtSVWc7Y9-By57oyIqSElDNO1nPEghwMTMb9s

この情報と、ノードIDを用いてPoCを実行する。今回の場合は、以下のよう実行する。CookieのNameとContentは=で連結させる。

$ python drupalgeddon3_update.py http://localhost/drupal/ "SESS29af1facda0a866a687d5055f2fade2c=bBJ40SrtSVWc7Y9-By57oyIqSElDNO1nPEghwMTMb9s" 1 "ls -al"

すると、以下のような実行結果が表示された。

f:id:HappyNote3966:20180830193220p:plain

ls -alを実行することができている。

感想

ログインした状態で、且つ記事を削除できる権限を持ち合わせていること、などがRCEの条件になるというのを知った。特定の条件下でのみ攻撃が通ってしまうような脆弱性は見つけるのが難しいのかもしれないが、いずれそのような脆弱性も発見してみたい。