cute_otter’s blog

ハニーポットの観察日記を付けています

Quals: Saudi and Oman National Cyber Security CTF Writeup

はじめに

こんにちは。cute_otterです。
2019/02/08 01:00~2019/02/10 06:00(JST)にかけて開催されたQuals: Saudi and Oman National Cyber Security CTFに、個人で参加しました。
結果は250ptsで147位(点を取った457人中)でした。

[Web Security 50pts] Back to basics

解法

ブラウザで問題サイトにアクセスし、ブラウザのディベロッパーツールを使ってHTTPレスポンスを確認すると、以下のようなAllowヘッダ*1が設定されていました。

Allow: GET, POST, HEAD,OPTIONS


これで使用できるメソッドが分かりました。
そこで、ブラウザのディベロッパーツールを使って、GETメソッドの部分をPOSTメソッドに変更してPOSTリクエストを投げると、レスポンスに以下のJavaScriptのコードが含まれていました。(読みやすくするため、一部改行しています。)

var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];

function reverse(_0xa6e5x2){
    flag= _0xa6e5x2[_0x7f88[3]](_0x7f88[0])[_0x7f88[2]]()[_0x7f88[1]](_0x7f88[0])
}

console[_0x7f88[4]]= reverse;

console[_0x7f88[4]](_0x7f88[5])


上記のコードを読みやすくすると以下のようになります。

var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];

function reverse(_0xa6e5x2){
    flag = _0xa6e5x2.split("").reverse().join("")
}

console.log = reverse

reverse(_0x7f88[5])

reverse()関数内で、引数として渡されたceab068d9522dc567177de8009f323b2をsplit("")で一文字ずつに分割し、reverse()で反転し、join("")で分割した文字を結合していることが分かりました。

このままでは、フラグが出力されないため、上記のコードにconsole.error()を追加しました。

var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];

function reverse(_0xa6e5x2){
    flag = _0xa6e5x2.split("").reverse().join("")
    console.error(flag) // 追加した部分
}

console.log = reverse

reverse(_0x7f88[5])


Node.jsを使って、上記のコードを実行しました。

$ node
> var _0x7f88=["","join","reverse","split","log","ceab068d9522dc567177de8009f323b2"];
undefined
> 
> function reverse(_0xa6e5x2){
... flag = _0xa6e5x2.split("").reverse().join("")
... console.error(flag) // 追加した部分
... }
undefined
> 
> console.log = reverse
[Function: reverse]
> 
> reverse(_0x7f88[5])
2b323f9008ed771765cd2259d860baec
undefined

フラグ

2b323f9008ed771765cd2259d860baec

[Digital Forensics 50 pts] I love images

解法

添付されたファイルgodot.pngの形式を確認すると、PNG image dataであることが分かりました。

画像ファイルなので、EXIFがあるだろうと思い、exiftoolを使ってEXIFを確認しました。

$ exiftool godot.png 
ExifTool Version Number         : 11.16
File Name                       : godot.png
Directory                       : .
File Size                       : 3.5 kB
File Modification Date/Time     : 2019:02:08 11:13:53+09:00
File Access Date/Time           : 2019:02:08 11:14:30+09:00
File Inode Change Date/Time     : 2019:02:08 15:58:43+09:00
File Permissions                : rwxrwx---
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 64
Image Height                    : 64
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Warning                         : [minor] Trailer data after PNG IEND chunk
Image Size                      : 64x64
Megapixels                      : 0.004

Warningの部分(下から3行目)に[minor] Trailer data after PNG IEND chunkとあります。
イメージの終端を示すIENDチャンクの後にフラグがありそうなので、xxdコマンドで確認してみます。

$ xxd godot.png
(省略)
00000da0: 0000 4945 4e44 ae42 6082 495a 4745 4352  ..IEND.B`.IZGECR
00000db0: 3333 4a5a 5858 4958 3250 4e5a 5748 5358  33JZXXIX2PNZWHSX
00000dc0: 3243 4d46 5a57 4b4e 5255 5055 3d3d 3d3d  2CMFZWKNRUPU====
00000dd0: 3d3d 0a 


IENDの後に以下の文字列があることが分かりました。

IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======


Base64エンコードされていると思いデコードしたもののうまくいかなかったので、Base32でデコードしたらフラグが出てきました。

$ echo IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU====== | base32 -d
FLAG{Not_Only_Base64}

フラグ

FLAG{Not_Only_Base64}

[Malware Reverse Engineering 100pts] I love this guy

解法

添付ファイルScrambledEgg.exeのファイル形式を確認すると、PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windowsであることが分かりました。

ScrambledEgg.exeを実行すると以下のウィンドウが表示されました。

ScrambledEgg.exeの実行直後に表示されるウィンドウ
ScrambledEgg.exeの実行直後に表示されるウィンドウ

パスワードが分からないため、dnSpyを使ってファイルを調査します。
調査前に、このアプリケーションはGet Flag!!ボタンがクリックされるというイベントが起こった後にフラグが表示されるはずなので、ボタンがクリックされたというイベントがあった際に実行されるコードや入力値(パスワード)をチェックするようなコードの有無に注目することにしました。

すると、ボタンがクリックされた時に実行されると思われるコードを見つけました。

Button_Click()の一部
Button_Click()の一部

if文の部分でテキストボックスのテキストとvalueに代入された文字列を比較しているので、ここでパスワードのチェックを行っている部分だろうと推測しました。

次に、valueに代入される文字列(正規のパスワード)を調べます。
Letters配列の中身を確認すれば、valueに代入される文字列が分かりそうです。

Letters
Letters

代入される文字列はFONZYでした。

これを入力するとフラグが表示されました。

フラグ

flag{I_LOVE_FONZY}

[General Information 50pts] Just Another Conference

問題文

famous Cybersecurity conference runs by OWASP in different locations

解法

OWASP conferenceというキーワードをGoogleで検索しました。

以下のAppSecというカンファレンスのページがヒットしました。

www.owasp.org

フラグ

AppSec

おわりに

比較的簡単な問題しか解けなかったので、Mariaのような問題を解けるように頑張っていきたいです。

他の人のWriteup

satto.hatenadiary.com

ctftime.org

Quals: Saudi and Oman National Cyber Security CTFのWriteupは以上です。