2016/10/27 05:00 ~ 10/29 05:00 (JST)に開催されたEKOPARTY CTF 2016に,チームm1z0r3として参加しました.
今回は大人数で参加できて楽しかったですが,順位は振るわず課題が残ります(主に私に).
手を付けた問題
- Certified Excel Hacker (Forensic 50 pts)
- Super duper advanced attack (Web 100 pts)
- Url shortener (Web 200 pts)
- Carder (Web 150 pts)
Cryptoが無くて呼吸困難になっていましたが,代わりにWebを解いていました.
私が直接フラグを取ったのはCertified Excel Hacker (Forensic 50 pts)だけでした:(
Certified Excel Hacker (Forensic 50 pts)
問題のzipを解凍すると,Excelのファイルが出てきます.中身を見ると,CALCULATE ANSWERというボタンがあり,それを押すとマクロが実行されるようです.しかしマクロの処理が異常に時間のかかるものらしくいつまで経っても処理が終わりません.僕の環境ではExcelが落ちます.マクロの内容を確認しようとしますが,パスワードがかかっていて見ることができません.
どうやら保護がかけられたファイルらしく,パスワードを必要とする解除を行わなければ書き込みや一部の閲覧ができません.保護により禁止されているのは以下.シート保護についてはメニューのファイル>情報から確認できると思います.
- シート「FORM」への書き込みの禁止
- シート「ANSWER」の閲覧の禁止
- マクロの閲覧,編集の禁止
これらはパスワードによって保護されており,各操作を行おうとすると保護の解除を求められますが,パスワードが分からず開けることができません.しかしマクロの内容や,ANSWERのいうシートはいかにもフラグに関係していそうなので,中身を見たいです.
そこで,無理やり保護を解除します.Excelの保護機能にはいくつかの種類があります.例えば,シートの保護,ブックの保護などです.
今回のファイルは以下のような保護がかけられています.
- シート「FORM」への書き込みの禁止 (シート保護)
- シート「ANSWER」の閲覧の禁止 (シート保護)
- マクロの閲覧,編集の禁止 (VBA Projectのプロテクト)
これらの保護は無理やり解除することが可能です.VBA Projectのプロテクトの方はわかりませんが,シートの保護はExcel2013までのバージョンなら解除できるみたいです.
結論から申し上げますと,今回必要な解除は「シート保護の解除」のみです.マクロのプロテクト解除も可能ですが,実はこの問題においては必要ありません(フラグっぽいのが分かるのですが,ダミーです).しかしせっかくなのでどちらのクラック方法も載せておきます.
(以下の手順は,WindowsPCでは上手くいきましたが,Macでは上手くいきませんでした.)
Excelファイルの解凍
2つの保護解除どちらを行うにもまずはこの処理が必要です.
Excelファイルの正体は,既定のディレクトリ構造のファイル群をzip圧縮しているものですので,ファイル名を変更して解凍することで中身を取り出すことができます.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ cp CALCULATOR.xlsm CALCULATOR.zip $ unzip CALCULATOR.zip Archive: CALCULATOR.zip inflating: [Content_Types].xml inflating: _rels/.rels inflating: xl/_rels/workbook.xml.rels inflating: xl/workbook.xml inflating: xl/styles.xml inflating: xl/theme/theme1.xml inflating: xl/worksheets/sheet2.xml inflating: xl/worksheets/_rels/sheet1.xml.rels inflating: xl/drawings/_rels/vmlDrawing1.vml.rels inflating: xl/worksheets/sheet1.xml inflating: xl/vbaProject.bin inflating: xl/media/image1.emf inflating: xl/drawings/vmlDrawing1.vml inflating: xl/drawings/drawing1.xml inflating: xl/ctrlProps/ctrlProp1.xml inflating: xl/printerSettings/printerSettings1.bin inflating: xl/activeX/_rels/activeX1.xml.rels inflating: xl/activeX/activeX1.xml inflating: docProps/core.xml inflating: xl/activeX/activeX1.bin inflating: docProps/app.xml |
この中にある特定のファイルを改竄することで各種保護を解除することができます.
VBA Project(マクロ)のプロテクトの解除( Unnecessary )
この手順は問題には必要ありません.必要なのはこの次の項目のシート保護の解除です.
解凍したファイルのうち,xl/vbaProject.binを改竄します.
バイナリエディタでこのファイルを開き,文字列で“DPB=”となっている部分を検索します.
このDPBに続く部分がパスワードですので,この部分を改竄することで任意のパスワードに変更することができます.
改竄する文字列をどのように決めれば良いかと言うと,別のExcelシートでマクロを作り,パスワード保護した際のDPBの値を同様の方法で確かめてコピーすれば良いです.そうすれば,自分で決めた任意のパスワードでマクロのパスワードを解除することが可能になります.
しかしここで重要なのがDPBの値の長さです.改竄先のDPBと任意のDPBの長さが一致していなければ改竄はできません.この長さはパスワードの平文に依存するわけでなく,シートを上書き保存する度に長さが変更されます.ですので,目的の長さになるまでシートを上書きします.
この手順でDPBを改竄し,マクロの保護を解除すると問題のExcelファイルのマクロを見ることができます.できますが,このような内容になっており,””明らかに””このマクロの処理内容は答えではないことがわかります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub CALCULATE() Dim z57fbbe9a55b7e76e8772bb12c27d0537, NOT_ANSWER NOT_ANSWER = "NOTNOTNOTNOTNOTNOTNOTNOTNOTNOTNOTNOT" For z57fbbe9a55b7e76e8772bb12c27d0537 = 1 To 10 answer = bfd9aaddb34d3018d0842fe01cd876ce2(answer) Next z57fbbe9a55b7e76e8772bb12c27d0537 Hoja1.NOT_ANSWER.Text = "EKO{" + Replace(answer, "=", "") + "}" End Sub Public Function bfd9aaddb34d3018d0842fe01cd876ce2(ByVal sTextToHash As String) Dim b5d3ce0d93bdc39075041314952e56a03 As Object, be07792f9d366fe5e26844e720f7fd830 As Object Dim TextToHash() As Byte Set b5d3ce0d93bdc39075041314952e56a03 = CreateObject("System.Text.UTF8Encoding") Set be07792f9d366fe5e26844e720f7fd830 = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") TextToHash = b5d3ce0d93bdc39075041314952e56a03.Getbytes_4(sTextToHash) Dim bytes() As Byte bytes = be07792f9d366fe5e26844e720f7fd830.ComputeHash_2((TextToHash)) bfd9aaddb34d3018d0842fe01cd876ce2 = bbdc49a038db5a02827fb9a3373d77989(bytes) Set b5d3ce0d93bdc39075041314952e56a03 = Nothing Set be07792f9d366fe5e26844e720f7fd830 = Nothing End Function Private Function bbdc49a038db5a02827fb9a3373d77989(ByRef arrData() As Byte) As String Dim bc5197ca332c6a81c0e410b8010ffd7c1 Dim bde1a23ed20269f4573007d67e676a5e1 Set bc5197ca332c6a81c0e410b8010ffd7c1 = CreateObject("MSXML2.DOMDocument") Set bde1a23ed20269f4573007d67e676a5e1 = bc5197ca332c6a81c0e410b8010ffd7c1.createElement("b64") bde1a23ed20269f4573007d67e676a5e1.DataType = "bin.base64" bde1a23ed20269f4573007d67e676a5e1.nodeTypedValue = arrData bbdc49a038db5a02827fb9a3373d77989 = bde1a23ed20269f4573007d67e676a5e1.Text Set bde1a23ed20269f4573007d67e676a5e1 = Nothing Set bc5197ca332c6a81c0e410b8010ffd7c1 = Nothing End Function |
なお,僕たちはNOT_ANSWERと書いてあるのを無視して解析し,ダミーのフラグを投げ続けていました…
シート保護の解除
さて,本題の解除方法です.
workBookProtectionの改竄
xl/workbook.xml を開きます.その中にworkbookProtectionというタグがあります.そのタグの属性のlockStructure=”1″の部分を,lockStructure=”0″と変更します.
sheetProtectionの改竄
xl/worksheets/sheet1.xmlと,xl/worksheets/sheet2.xml の中身を改竄します.それぞれがシートFORMとシートANSWERを示しています.
そのファイルの中の,以下のようなsheetProtectionというタグを探し,そのタグをタグごと削除します.
1 |
<sheetProtection algorithmName="SHA-512" hashValue="S9Q99vrOdGKVj4Y88WfBJwMQgnXDiYVjlBANC4P/ZQkDOXgPccaLBv1AChzw5fxG1upUuHgyv2Q4quPALcinKw==" saltValue="2eNeYfmpsT9bhuwq/ZQPhA==" spinCount="100000" sheet="1" formatCells="0" formatColumns="0" formatRows="0" insertColumns="0" insertRows="0" insertHyperlinks="0" deleteColumns="0" deleteRows="0" sort="0" autoFilter="0" pivotTables="0"/> |
再度圧縮しxlsmファイルを復元
xlsmファイルの復元は,再度zip圧縮するだけです.
1 |
$ zip -r CALCULATOR_hacked.zip \[Content_Types\].xml _rels/ docProps/ xl/ |
シートANSWERの閲覧
復元したExcelファイルを開き,シートの部分で右クリック->再表示という項目をクリック->ANSWERを選択,という手順でシートを表示させます.表示させると以下のように見えるようになります.
シートANSWERを見ると,一つ一つのセルの大きさが明らかにでかいので,セルのサイズを全て変えます.行の高さを5,列の幅を0.5程度にします.セルを全選択した状態で列(行)を右クリックし,列の幅(行の高さ)という項目を変更することで一気に変えることができます.
The flag is EKO{HIDDEN_SHEET_123}
まとめ
やるだけ問題.また,マクロの方の罠にめげずにシート保護を解除すればフラグが取れる簡単な問題でした.
余談
問題サーバがすぐに落ちる系CTFなので,Web問とか再チャレンジできないのが悲しいです.