週末のQiwi-Infosec CTFとRC3 CTF 2016 Writeup
週末Writeup. SECCONまであと20日を切ったので頑張りたいところ. CTFのWriteupをバラバラに書くとワチャワチャになるのでまとめて書いてしまいます.
Qiwi-Infosec CTFとRC3 CTF 2016に参加していました.
結果はQiwi-Infosecは800 pt でちょうど100位, RC3の方は1300ptくらい.(競技終了後,スコアサーバーが落ちてるのでわからないw)
Writeupは続きからどうぞ.
Qiwi-Infosec CTF
最初の金土開催とかのCTFでした.珍しくフラグ形式が決まっていないので結構キツイ.
Rev 100
Pythonのpycファイルが渡されました.pycdcを使ってPythonコードに戻すとこんな感じに.
# Source Generated with Decompyle++ # File: snake.pyc (Python 2.7) import marshal import dis src = 'YwAAAAADAAAAGAAAAEMAAABz7wAAAGQBAGoAAGcAAGQCAGQDAGQEAGQFAGQGAGQHAGQIAGQJAGQKAGQLAGQMAGQNAGQOAGQPAGQMAGcPAERdHAB9AAB0AQB0AgB8AACDAQBkEAAXgwEAXgIAcToAgwEAfQEAdAMAZBEAgwEAfQIAfAIAfAEAawIAcuYAZAEAagAAZwAAZBIAZBMAZBQAZBUAZBYAZBcAZBgAZBkAZBoAZBsAZBwAZB0AZB4AZAsAZBwAZB8AZAMAZB0AZAgAZB4AZCAAZCEAZxYARF0VAH0AAHwAAGoEAGQiAIMBAF4CAHHGAIMBAEdIbgUAZCMAR0hkAABTKCQAAABOdAAAAAB0AQAAAF50AQAAADR0AQAAAEt0AQAAAGl0AQAAAC50AQAAAC90AQAAAE50AQAAAGp0AQAAAFB0AQAAAG90AQAAAD90AQAAAGx0AQAAADJ0AQAAAFRpAwAAAHMJAAAAWW91IHBhc3M6dAEAAABzdAEAAAB5dAEAAABudAEAAAB0dAEAAAA6dAEAAAB7dAEAAAB3dAEAAABxdAEAAABFdAEAAAA2dAEAAABmdAEAAABYdAEAAAB1dAEAAABhdAEAAAAxdAEAAAB9dAUAAABST1QxM3MFAAAATm8gOigoBQAAAHQEAAAAam9pbnQDAAAAY2hydAMAAABvcmR0CQAAAHJhd19pbnB1dHQGAAAAZGVjb2RlKAMAAAB0AQAAAGV0AwAAAHRtcHQGAAAAcGFzc3dkKAAAAAAoAAAAAHMHAAAAdGFzay5weVIcAAAAAgAAAHMKAAAAAAFfAQwBDAFvAQ=='.decode('base64') code = marshal.loads(src) exec code
codeの部分でPythonのdisモジュールでディスアセンブルしてコードを読むとやっているのはsyntから始まる文字列ROT13してただけ.syntでROT13ってことはflagじゃん!
flag = "synt:{wqE6fXuofa4XNu1}".decode('ROT13')
PPC 100_2
問題文忘れましたw 何かファイル名が数字でかつそのファイルには1文字入っています.素数のファイルの中身を読め.みたいな感じだった気がします.シェルのワンライナーでときました.
ls | factor | grep -E '[0-9]+: [0-9]+$' | sed -E 's/[0-9]+: //g' | xargs cat | awk '{ printf "%s", $1 }'
うーん 微妙なワンライナーw
RC3 CTF 2016
あまり問題の質がいいとは思えないCTFでしたね.後運営の対応がクソみたい.Web問はサーバーに繋がらないまたはレスポンスが返ってこない,返ってきても500などお粗末な感じだった.
とりあえず私はちょいちょい参加して1190 pt入れました.珍しく1000pt超え.
フラグフォーマットはルールに載ってるように RC3-2016
で始まるらしいです.
Crypto
Salad 100
問題文からシーザー暗号ということが判明しました.あとは置換テーブルにアルファベットだけでなく,数字も加え何文字ローテートしてるかを自分で調べて動かすだけ.
>>> plain_table = string.ascii_uppercase + string.digits; >>> "7sj-ighm-742q3w4t".upper().translate(str.maketrans(plain_table[16:] + plain_table[:16], plain_table)) 'RC3-2016-ROMANGOD'
Flag: RC3-2016-ROMANGOD
Forensics
Some Pang - 50
ICMPパケットのやり取りが10万くらいあるPCAPファイルが渡されます.チームで話してみたところ,data部に怪しいデータが載ってるのでは?ということ.
ちなみにデータ部には, 414141....
みたいな感じで同じ2ビットのまとまりが大量にくっついていました.更に最終パケット等を読むと=
で終わっています.何かBase64っぽいデータが載っている雰囲気を醸し出していますねw.
そこでScapyで読み,適当に奇数パケットの2ビットを取り出し,文字列化すると画像ファイルが生み出されます.
(おっチームメンバーの1人が確認できる)
Flag: RC3-2016-PANG-ME-LIKE-ONE-OF-YOUR-FRENCH-GORILLAZ
そしてこれ50ptじゃない気がする
My Lil Droid - 100
APKファイルが渡されます.デコンパイルしてみると滅茶苦茶大量にJavaファイルが出てきます.しかし全然Flagを生成しているコードが見つかりません. VMで動かしてみようとするも動かずorz
諦めていましたが,普通にapkをunzipし,build-data.properties を覗いていみると怪しい文字列が.
UkMz-2016-R09URU0yMQ==
何かBase64っぽいw
Flag: RC3-2016-GOTEM21
糞問
Graphic Design - 200
ファイルを開くとスペースで区切られた数字と文字がいっぱい.どっかのCTFでみたことあるけど3Dデータを格納するデータ形式.Blenderとかで開かないといけないのかなぁと思いきやMacのPreview.appで普通に開けた.強い!!
表面上には載っていないのでグルグルカメラを回しつつ内部にめり込んでみるとやっぱり中身にFlagが書かれていました.
Flag: RC3-2016-St3GG3rz
Dirty Birdy - 400
展開するとdtrump.imgというファイルが得られます.ドナルドトランプかな?
おもむろにfileコマンドを使ってファイルを判定すると
$ file dtrump.img dtrump.img: ISO 9660 CD-ROM filesystem data 'CDROM'
でした.Macで普通にマウントしてみると色々ディレクトリがありますが,secretfilesというフォルダが見つかります.
$ tree /Volumes/CDROM/secretfiles /Volumes/CDROM/secretfiles ├── README.md ├── Workbook1.xlsx.gpg └── document.txt
document.txtにはpassword123
と書かれているだけ.使えないな
Workbook1.xslx.gpgが怪しい.どうやらGPG秘密鍵で暗号化したもののように見えます.
はて.もう一度同じディレクトリを見ると, .gitが見つかります.
$ git status -s D private.key ?? README.md ?? Workbook1.xlsx.gpg ?? document.txt
private.keyが見つかりました.あとは適当に鍵を復元し,gpgコマンドで解読してみます.
$ gpg --import private.key $ gpg --decrypt Workbook1.xlsx.gpg > Workbook1.xlsx
あとはExcelで開いてみましょう.するとパスワードを要求してきます.先程見つけたパスワードを打ってみると普通に開きました.あとはシート2枚めにFlagが載っています.
Flag: RC3-2016-SNEAKY21
Pwn
もともとRev 150となっていたのに気付いたらPwnに鞍替えしてた問題. 問題名は忘れてしまったのですが雰囲気的にはスタック上に何文字か格納されているのでそこと比較しているのかな?と思いきや単純にBOFして0x0と比較している部分をTrueにしちゃえばいいみたいな感じだった気がする.
なので適当に\x00
を大量に送ってみたらFlagが出ました.
python -c 'print("\x00" * 100)' | nc -v 52.71.70.98 2091 found 0 associations found 1 connections: 1: flags=82<CONNECTED,PREFERRED> outif en0 src 192.168.111.3 port 54019 dst 52.71.70.98 port 2091 rank info not available TCP aux info available Connection to 52.71.70.98 port 2091 [tcp/prp] succeeded! === Welcome to the RC3 Secure CTF Login === === Please enter the correct password below === Password: RC3-2016-STACKPWN
Flag: RC3-2016-STACKPWN
Reversing
Logmein - 100
鍵は"harambe"であとは謎の文字列とXORを取ってるみたいな感じ
>>> key = "harambe"; print("".join([chr(ord(c) ^ ord(key[i % len(key)])) for i, c in enumerate(":\"AL_RT^L*.?+6/46")])) RC3-2016-XORISGUD
Flag: RC3-2016-XORISGUD
Trivia
何か適当に問題文でググるとでてきたけど何が解答だったか忘れました.
最初の方,時間があってRC3を解きまくっていたのもあり最高順位35位まで行きましたが結局行き詰まり放置していたら100位以下になってしまった〜
あと今週のCTFは質があまり良くなかったなと言う感じです.
更に言うと自宅の録画サーバーのHDDが飛びましてCTFしながら自宅のHDDからデータを復活させ何とか再構築するという大変な思いをしていましたが構築記もブログにしておきたいですね.