WaniCTF Writeup
こんにちは!Ken.Sです!
今回は大阪大学の CTF サークル Wani Hackaseさんが開催したWaniCTFのwriteupですが、あまり解けなかったのでCrypto, Forensics以外の解法は他の方のを…
Web
DevTools_1 Beginner
ブラウザの開発者ツールを使ってソースコードをのぞいてみましょう!
F12を押して開発者ツールを覗くとflagが
FLAG{you_can_read_html_using_devtools}
DevTools_2 Easy
開発者ツールを使うと表示を書き換えることができます。
5000兆円欲しい!
(5000000000000000円持っていることにするとフラグを手に入れることができます。)
サイトを見ると、「あなたの総資産は0円です!」とある。
開発者ツールのElementsからこの文を表示させているところを見つけ、5k兆にするとflagがpopで出る。
FLAG{you_can_edit_html_using_devtools}
5000兆とは言わないから1億円くらいくれないかな
Simple Memo Beginner
問題ページ:https://simple.wanictf.org/
flag.txtというファイルに私の秘密を隠したが、 完璧にサニタイズしたため辿りつける訳がない。
(Hint) ディレクトリトラバーサルという脆弱性です。
ディレクトリトラバーサルについて
ディレクトリトラバーサルとは?対策の方法7選と主な被害例3つをご紹介! | テックマガジン from FEnetインフラ
../したあとにflagないかな。
URLに../flag.txtと付けるとflagが見えた。
FLAG{y0u_c4n_get_hi5_5ecret_fi1e}
striped table Easy
テーブルの行の背景色をストライプにする作業をしてもらったら、こんなことになってしまいました!
ページにjavascript alert(19640503)を埋め込み実行させるとフラグが得られます。
https://striped.wanictf.org/?sourceにアクセスするとソースが閲覧できます。
どうやってalert文挿入するんだろ、メモに追加するときにねじこめないのかな。
ソースを見ると、背景色を変えているときのmemoの記述が他と違う。
メモを追加するときに、<script> alert(19640503) </script>
とすると、flagがもらえる。
FLAG{simple_cross_site_scripting}
SQL Challenge 1
問題ページ: https://sql1.wanictf.org/index.php?year=2011
今まで見たアニメのリストをデータベースに登録したよ。間違えて秘密の情報(FLAG)もデータベースに登録しちゃったけど、たぶん誰にも見られないし大丈夫だよね。
(Hint)
SQL injectionの問題です。
URLの「year=」の後に続く数字(年号)をSQL injectionを起こすような文字列に変更するとFLAGが表示されます。
SQL系の問題は解けてないですが、ご紹介だけ。
year=の後に必ずtrueになる文を投げればいいらしい。
FLAG{53cur3_5ql_a283b4dffe}
SQL Challenge 2
問題ページ: https://sql2.wanictf.org/index.php?year=2011
やっぱり前のページは危ない気がするからページを作り直したよ。これで大丈夫だね。
(Hint)
SQL injectionの問題です。
必要に応じてソースコード(index.php)とデータベースのスキーマ(1_schema.sql)を参考にしてください。
year=0で通るらしい。なんで?
FLAG{5ql_ch4r_cf_ca87b27723}
Reversing
strings Beginner
この問題ではLinuxのELF実行ファイル(バイナリ)である「strings」が配布されています。このバイナリは入力文字列をチェックし、正しいものかどうか判定する機能をもっています。
試しにFAKE{this_is_fake}と入力するとIncorrectと表示され、間違っている入力文字列であると示してくれます。
このバイナリが「正しい」と判定してくれる文字列を見つけ出してください。
ヒント:バイナリ解析のはじめの一歩は「表層解析」という手法です。
ファイル:strings
stringsコマンドで終わり。
FLAG{s0me_str1ngs_rem4in_1n_t7e_b1nary}
simple Normal
「strings」問題は表層解析でフラグを見つけることができましたが、この問題では同じようにフラグは見つからないようです。
次の手法は「動的解析」と「静的解析」です。
Linux実行ファイルの解析において動的解析の代表的なツールが「GDB」、静的解析の代表的なツールが「Ghidra」です。
それぞれ入門記事が多く公開されていますのでぜひ動的解析と静的解析にチャレンジしてみてください!
ファイル:simple
ヒントとは異なりますが、先日インストールしたIDAに投げたら一発。
flagを一文字ずつ確認しているみたいで、それがキレイに出ていました。
FLAG{5imp1e_Revers1ng_4rray_5trings}
Pwn
netcat Beginner
nc netcat.wanictf.org 9001
netcat (nc)と呼ばれるコマンドを使うだけです。
つないだら何も表示されなくても知っているコマンドを打ってみましょう。ファイル:pwn01, pwn01.c
相手のサーバにアクセスできているよう。lsでflag.txtがあるのが分かるので、catで表示。
FLAG{netcat-1s-sw1ss-4rmy-kn1fe}
var rewrite Beginner
nc var.wanictf.org 9002
stackの仕組みを理解する必要があります。
ローカル変数はstackに積まれます。
ローカル変数を書き換えて下さい。ファイル:pwn02, pwn02.c
名前を聞かれるので、とりあえず1~n文字を打ち込んで見ると10文字の時に名前が何も表示されなくなった。そしてcファイルを読むと、targetをWANIにすると良いよう。普通にするとHACKASEになるが10文字の時は何も表示されない。a*10+WANIとするとどうだろう。Congratulations!と褒められた。あとはさっきと一緒でls->cat flag.txt
FLAG{1ets-1earn-stack-w1th-b0f-var1ab1e-rewr1te}
Misc
Find a Number Beginner
隠された数字を当てるとフラグが表示されます.
数字は0以上500000以下であることが保証されています.
nc number.wanictf.org 60000
二分探索したらゲット。
FLAG{b1n@ry_5e@rch_1s_v3ry_f@5t}
Forensics
logged_flag Beginner
ワニ博士が問題を作っていたので、作っているところをキーロガーで勝手に記録してみました。
先に公開してしまいたいと思います。
(ワニ博士は英字配列のキーボードを使っています)
ファイル:key_log.txt, secret.jpg
key_log.txtを見ると、MKDIRの文字が。他にも[Space]や[Enter], [Shift]などがあり、これが英字配列キーボードか、と。TOEFLの際によくやったなぁ。
とりあえず、復元します。
mkdir steghide
cp original.jpg ./steghide
cd steghide
echo FLAG{k3y_l0gg3r_1s_v3ry_d4ng3r0us} > flag.txt
steghide embed -cf original.jpg -ef flag.txt -sf secret.jpg
machikanetamachikanesai
machikanetamachikanesai
steghide extract -sf secret.jpg
machikanetamachikanesai
ycat flag.txt
US版キーボードでShiftを押すと、[ ]-> { }, . -> >, (ここまでは基本的には一緒?) - -> _です。
FLAG{k3y_l0gg3r_1s_v3ry_d4ng3r0us}
ALLIGATOR_01 Easy
ワニ博士のPCでは,悪意のあるプロセスが実行されているみたいです。
取得したメモリダンプから、”evil.exe”が実行された日時を報告してください。
(注意: スペースはすべて半角のアンダースコアにしてください)
example: FLAG{1234-56-78_99:99:99_UTC+0000}
問題ファイル: ALLIGATOR.zip (ミラー: ALLIGATOR.zip)
推奨ツール: volatility
こういうツールを教えてくれるの本当にいいですよね!普段やらない分野でもきっかけが掴めるので、取り掛かりやすいです(作問者ありがとう)。
とりあえずvolatilityを入れてみます。
sudo apt update
sudo apt install volatility
まず、"volatility -f FILENAME imageinfo" でOSを突き止めます。(その前に-hでコマンドを確認しよう)
Suggested Profile(s) : Win7SP1x86_23418
あとはプロセスツリーを見てみます。
volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 pstree
そして、evil.exeの実行時間をFLAGとして提出!
FLAG{2020-10-26_03:01:55_UTC+0000}
ALLIGATOR_02 Normal
コマンドプロンプトの実行履歴からFLAGを見つけてください。
(ALLIGATOR_01で配布されているファイルを使ってください)
consolesで履歴が見れるみたい。
volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 consoles
FLAG{y0u_4re_c0n50les_master}
ALLIGATOR_03 Hard
Dr.WANIはいつも同じパスワードを使うらしいです。
Dr.WANIのパソコンから入手したパス付のzipファイルを開けて、博士の秘密を暴いてしまいましょう。
(ALLIGATOR_01で配布されているファイルを使ってください)
ファイル:wani_secret.zip
「volatility パスワード」でググるとSECCONで似た問題があったらしい。
[SECCON] Forensics300 ログインパスワードを解明せよ | ごみばこいん Blog
[SECCON 2013_WEB, Forensics 300] ログインパスワードを解明せよ – どうも、わさむすめです
ここらへんの記事が参考になりました。
volatility hivelist -f ALLIGATOR.raw --profile=Win7SP1x
86_23418
Volatility Foundation Volatility Framework 2.6
Virtual Physical Name
---------- ---------- ----
0x96833008 0x29f35008 \??\C:\System Volume Information\Syscache.hve
0x9a37a008 0x0edcf008 \??\C:\Users\ALLIGATOR\ntuser.dat
0x9a37c008 0x0eed1008 \??\C:\Users\ALLIGATOR\AppData\Local\Microsoft\Windows\UsrClass.dat
0x8780a6b8 0x282fb6b8 [no name]
0x8781a008 0x28349008 \REGISTRY\MACHINE\SYSTEM
0x87838218 0x28367218 \REGISTRY\MACHINE\HARDWARE
0x8b0599c8 0x248859c8 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x8cb07008 0x26f46008 \Device\HarddiskVolume1\Boot\BCD
0x8e7f7008 0x26313008 \SystemRoot\System32\Config\SOFTWARE
0x904655f8 0x225685f8 \??\C:\Users\IEUser\ntuser.dat
0x9144b5c0 0x260205c0 \SystemRoot\System32\Config\DEFAULT
0x937338d0 0x250778d0 \SystemRoot\System32\Config\SECURITY
0x93791458 0x1d940458 \SystemRoot\System32\Config\SAM
0x937b79c8 0x248899c8 \??\C:\Users\IEUser\AppData\Local\Microsoft\Windows\UsrClass.dat
0x937fb758 0x248dd758 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x96449458 0x03f4f458 \??\C:\Users\sshd_server\ntuser.dat
0x9645d3d8 0x2830b3d8 \??\C:\Users\sshd_server\AppData\Local\Microsoft\Windows\UsrClass.dat
VirtualのSYSTEMとSAMのhexが必要らしい。
volatility hashdump -f ALLIGATOR.raw --profile=Win7SP1x
86_23418 -y 0x8781a008 -s 0x93791458
Volatility Foundation Volatility Framework 2.6
Administrator:500:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
IEUser:1000:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
sshd:1001:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
sshd_server:1002:aad3b435b51404eeaad3b435b51404ee:8d0a16cfc061c3359db455d00ec27035:::
ALLIGATOR:1003:aad3b435b51404eeaad3b435b51404ee:5e7a211fee4f7249f9db23e4a07d7590:::
ALLIGATORが出てきて、以降がpasswordのハッシュのようです。ophcrackやjohn the ripperに投げてもなかなか出てこない。というか出ない。
なんとか、ここでできた。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
NTMLハッシュの仕様が分からず、ここで時間かかりました。後ろの方をぶん投げるとパスワード "ilovewani"が出た。そのパスワードでzipを開きます。
FLAG{The_Machikane_Crocodylidae}
chunk_eater Normal
pngの必須チャンクをワニ博士が食べてしまいました!
ファイル:eaten.png
PNGはすこーし勉強してたので、必要なチャンクはIHDR,IENDチャンクだろうと。必須チャンクを食べたということで挿入すればいいのかな。
分からん。
ずっと気になっているWANIという文字列…。ここを変えたらいいらしい。そしてIDATも無い。複数あってもいいらしい。(教えてもらった。)
5個のWANIがあるので、IHDR, IDAT, IDAT, IDAT, IENDを入れ替える。
FLAG{chunk_is_so_yummy!}
zero_size_png Very hard
この画像のサイズは本当に0×0ですか?
実はこれ、以前m1z0r3の勉強会でやったことがあって、その時のsolverをほんのちょっと変えたらOKでした。
FLAG{Cyclic_Redundancy_CAT}
解説??他当たってください。
Crypto
Veni, vini Beginner
SYNT{fvzcyr_pynffvpny_pvcure}
rot13ですね。
FLAG{simple_classical_cipher}
exclusive Easy
XORを使った暗号です🔐
ファイル:encrypt.py, output.txt
encrypt.py を見ると、flagの長さが57でkeyは3毎同じのが使われて、FLAG{.{51}}という形です。
output.txt -> ot[0~56]とすると
key[0] = ot[0] ^ ord('F')
key[1] = ot[1] ^ ord('L')
key[2] = ot[2] ^ ord('A')
でkeyを求められます。あとはそのkeyを使い回してxorしましょう。
FLAG{xor_c1ph3r_is_vulnera6le_70_kn0wn_plain7ext_@ttack!}
Basic RSA Normal
ncすると計算しろという無言の圧力が。
1問目:(譲) p,q (求) n=p*q
2問目:(譲) m,e,n (求) c = m^e mod n
3問目:(譲) p,q,c,e (求) m = pow(c,d,n)
計算すればOKです。
FLAG{y0uv3_und3rst00d_t3xtb00k_RSA}
LCG crack Hard
安全な暗号は安全な乱数から
nc lcg.wanictf.org 50001ファイル:server.py
このサーバーは、seedを生成するとそこから線形合同法で乱数を生成するそうです。1.で次の乱数がもらえ、2.で10連続で乱数を当てるとflagが手に入ります。
この方の記事がすごく分かりやすい!!
線形合同法のパラメータを乱数列から求めてみる。 - みつのCTF精進記録
まず、x = a*x' + c mod m とすると、mから求めます。
T_i = x_i+1 - x_i として、乱数xを5個くらい貰います。T_i*T_i+2 - (T_i+1)^2 = 0 mod m から、この値を計算して素因数分解して64bitの素数をGETします。3通りくらい計算すると、ほぼ一意にmが決まります。
mが分かると、次はaです。
a = T_i+1 / T_i mod m となるので(modがあるときの割り算注意)、すぐ計算できます。
c = x_i+1 - a*x_i mod m でcも簡単に求まるので、このパラメータが決まればあとは最後のxを入力としてx'を10回計算してサーバに送り付けましょう。
FLAG{y0u_sh0uld_buy_l0tt3ry_t1ck3ts}
l0g0n Very hard
🕵️♂️
nc l0g0n.wanictf.org 50002ファイル:server.py
ざっくりとした手順はこんな感じです。
- 偶数桁hexを入力する。bytesにしたのをclient_challengeに入れる
- server_challengeに8bitの乱数を入れ、見せてくれる。
- session_keyに(psk(未知のbytes)+client_challenge+server_challenge)を入力としたsha256(ソルト付)の出力を入れる
- client_credentialにもう一度偶数桁hexを入力してもらう。
- cipherは自作のクラスのインスタンス。そのフィールドblock_sizeは常に16, フィールドcipherは先程のsession_keyをkeyとしてAES(ECBモード)。
- iv_plaintext = bytes(16) (\x00が16個) の後ろにclient_challengeを付けて、iv_plaintext[i:i+16]をAESのECBモードで暗号化したのとclient_challenge[i]のxorしたのをserver_credentialに入れる
- server_credentialとclient_credentialが一致したらflagがもらえる。
複雑ですね。3でもうsession_keyが予測不可能として考えるとヤマカンで当てるしかないのか…?ってなりました。実はヤマカンで当てられました。1,4での入力を2桁の入力にすると、******_credentialが1 byteになります。なので、1/256を引き当てるまでグルグル回します。つまり、こんだけの仕組みを理解してなくてもたまたまを引き当てればOKです。
1. 12, 4. 34を送り続けたら、70回目でflagが出ました。
これが恐らく想定解のはずです。
何故この話をしたかというと、1.,4. で空文字列を送ると一発でflagが出てきました。
FLAG{4_b@d_IV_leads_t0_CVSS_10.0__z3r01090n}
先日のPaken CTFのようにサークルの方が作問したCTFは取っ掛かりがしやすくて勉強になりました!しかし、CTFを今年始めたばかりの後輩に500点以上も差を付けられ、少し落ち込んでます(笑)
それでは!
See you next time!