Saudi and Oman National Cyber Security CTF 2019 Write-up
- はじめに
- 成績
- Just Another Conference [General Information, 50]
- Back to basics [Web Security, 50]
- I love images [Digital Forensics, 50]
- Hack a nice day [Digital Forensics, 100]
- I love this guy [Malware Reverse Engineering, 100]
- まとめ
はじめに
2019/02/02 ~ 2019/02/10 に開催されたSaudi and Oman National Cyber Security CTFに個人で参加しました.
成績
5問解いて 105位 (1問以上解いた457人中) でした.
Just Another Conference [General Information, 50]
famous Cybersecurity conference runs by OWASP in different locations
アプローチ:ググる
AppSec
フラグ提出チェック問ですね.
Back to basics [Web Security, 50]
not pretty much many options. No need to open a link from a browser, there is always a different way
アプローチ:POST
問題文に色々書かれてますが気にせずにリンクを踏んでみるとwww.google.com
にリダイレクトされてしまうことが分かります.
curl
でGETリクエスト
を投げて確かめてみます.
> curl http://35.197.254.240/backtobasics/ <script> document.location = "http://www.google.com"; </script>%
GETリクエスト
の情報量が微妙だったので基本に帰って (back to basics) POSTリクエスト
を投げてみます.
> curl -X POST http://35.197.254.240/backtobasics/ <!-- 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]) -->%
js
が降ってきたので整形してあげます.
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])
読みにくいの読みやすくします.
flag = "ceab068d9522dc567177de8009f323b2".split("").reverse().join("")
この結果がフラグになります.
2b323f9008ed771765cd2259d860baec
I love images [Digital Forensics, 50]
A hacker left us something that allows us to track him in this image, can you find it?
アプローチ:baseXX
> file godot.png godot.png: PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced
> strings godot.png | tail *TYlT_qP vL.I IK@ VMqa.% pDuF( op+P q}'ZA0 O-T& IEND IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======
png
にbase64
っぽい文字列が埋め込まれているのが分かります.
早速デコードしようとしますが上手くいきません.
> echo 'IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======' | base64 -D !�� �%��!}�5��I}�0VV(�T=%
ここでrot13系が噛んでるのかなと考え,rot1~rot25までを総当たりしますが上手くデコードできず,無限に時間を溶かしました.
もう一度IZGECR33JZXXIX2PNZWHSX2CMFZWKNRUPU======
をよく眺めてみると小文字が出現していないことやパディングが多すぎることに違和感を覚え,ようやくエンコード方式が違うことに気が付きました.
エンコード方式が違うといってもすぐに思いつくエンコード方式がbase58
(ビットコインのあれ)くらいだったので色々調べてみるとbase32
がそれっぽいことが分かりました.
あとはオンラインツールでデコードしてあげるとフラグを取得できます.
emn178.github.io
FLAG{Not_Only_Base64}
Hack a nice day [Digital Forensics, 100]
can you get the flag out to hack a nice day. Note: Flag format flag{XXXXXXX}
アプローチ:Steganography
> file info.jpg info.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: "badisbad", baseline, precision 8, 194x259, frames 3
comment: "badisbad"
が怪しいですね.
> strings info.jpg | head JFIF badisbad !1!%)+/.. 383-7(-.+ ---+------+----+-----+----+-------+------------7-- $3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz &'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz )((* YZI{0
ヘッダから恐らくSteganography
であることが分かります(経験則).
早速steghide
で埋め込まれたファイルを抽出します.
この際,passphrase
はbadisbad
を用いました.
> steghide extract -sf info.jpg Enter passphrase: wrote extracted data to "flaggg.txt".
あとはflaggg.txt
を読めば終わりです.
> cat flaggg.txt flag{Stegn0_1s_n!ce}
flag{Stegn0_1s_n!ce}
I love this guy [Malware Reverse Engineering, 100]
Can you find the password to obtain the flag?
アプローチ:デコンパイル
> file ScrambledEgg.exe ScrambledEgg.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.Net
系はdnSpy
に投げるのが自分の中で定石になりつつあるので早速デコンパイルしてみます.
// Token: 0x04000001 RID: 1 public char[] Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_".ToCharArray(); MessageBox.Show(new string(new char[] { this.Letters[5], this.Letters[11], this.Letters[0], this.Letters[6], this.Letters[26], this.Letters[8], this.Letters[28], this.Letters[11], this.Letters[14], this.Letters[21], this.Letters[4], this.Letters[28], this.Letters[5], this.Letters[14], this.Letters[13], this.Letters[25], this.Letters[24], this.Letters[27] }));
パスワードを見つけようとしたらフラグを見つけてしまったのでデコードします(恐らく想定解法ではない).
#!/usr/bin/env python3 # -*- coding: utf-8 -*- if __name__ == '__main__': letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_' flag = [ letters[5], letters[11], letters[0], letters[6], letters[26], letters[8], letters[28], letters[11], letters[14], letters[21], letters[4], letters[28], letters[5], letters[14], letters[13], letters[25], letters[24], letters[27]] print(''.join(flag))
> python solve.py FLAG{I_LOVE_FONZY}