好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

Rice Tea Cat Panda CTF writeup [Rice Goddess]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Rice Goddess ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

Rice Goddess ジャンルってなんだよ!って感じですが、もう型にはまらない、色々なジャンルを組み合わせたやつ!って感じですかね。1/2しか解いてないのでわからないけど。

[Rice Goddess] Wrath of the Rice Goddess (4000pt)

So, uh, you see, when you wetuwnyed my uwu back to me, the wice goddess got a bit angwy - nyow she has a giant panda weady to sit on my uwu stowage... can you tawk to it? >w<

Quest: Talk to the giant panda on discord

Hints

Data linearization and generalization tend to make a lot of things lead to Rome.

... or I think that's how the saying goes

Python is more or less required for this. Try making a byte encoder!

I would try sweet-talking the panda, maybe start with something like I love rice, tea, cats, and pandas

Never, EVER trust the developer. (but do trust this hint)

dontbeconcerned.whatsoever,pandaspeak_encoder.pyが配布されます。

また、ヒントの通り、Discordにいた @Giant Panda に I love rice, tea, cats, and pandas と話しかけてみました。

パンダ語が返ってきた。

f:id:kusuwada:20200126115555p:plain

radjwr sqdak chaggjrp ragwr grrr grjrr chifdbirp hujdbff hugfhaff grgcciiebejagrr chgerp rajfwr chcfgrp huff huaedfff huiff sqbak grrr ragwr grddhcarr rawr rajhwr grhairr sqak grjhrr grhhrr sqak chdrp chcjbafjhhgfrp grabgcfrr hubff sqak rabawr rawr grjarr chjfjerp chgffrp grffgrr chjgarp chghcgrp huhff chhijaaggjfrp raeadjwr chrp rawr hufgdff huhddbchiff chrp chhfeirp raewr racgwr hufff chdhderp sqjeak sqcak huff hugdff chrp chrp sqegidak rahwr sqak sqibddidedefggchegak raegwr sqeadak sqcfhak sqak sqak chdrp sqiak sqdak grfarr sqdfak hufff chgrp charp grrr sqiihgcak grrr raddgefwr raghhwr hugff chebecjjrp huhff sqadabjak grbhrr rabhcwr huhff sqgeak chijrp hubcccahhgff chdrp sqcifjeidaak hujbff hucff chirp chafdirp ragcjcfbbwr sqcjhhaajfaeak chfcajebdegbiibfdeeibbfhghbbcjrp charp grgibdrr

このパンダ語、下記のパターンで構成されています。cat-chatの延長みたい。

ra[a-z]*wr
sq[a-z]*ak
gr[a-z]*rr
ch[a-z]*rp
hu[a-z]*ff

さーて、decoder書いてみるぞ!と思ったら、encoderあるじゃん!配信されてたわ!
このencoderpandaspeak_encoder.pyを動かしてみると

No such file or directory: 'key.key'

ほう。試しにもう一つ配信されていた、dontbeconcerned.whatsoeverkey.keyにリネームして再度実行してみると、

Fernet key must be 32 url-safe base64-encoded bytes.

ほう。そういえば、dontbeconcerned.whatsoever、中身がbase64の逆さまみたいな感じだったな。ということで

$ echo "=0GJUhKgKiIjSihnGY_g_o-dn-P2HiJ_wasilW_qUlL3" | rev
3LlUq_Wlisaw_JiH2P-nd-o_g_YGnhiSjIiKgKhUJG0=

これをkey.keyとして、再度実行してみます。

$ python pandaspeak_encoder.py 
Paste your message here: test

sqcgijeak chhddefrp huff raifjhicawr rabeicfwr sqak sqcbak huifff hugff huff sqak sqhak hueafcdeeejebdff grgcrr sqciak chrp hujeiff sqak grrr grdecjbijgiffarr hufff chjarp chihdferp grhajijgjfbrr huhff sqeiak grberr sqdhak graarr huhff sqak grgbrr hueff chjarp griacebhijrr huhjdff raicedagwr grrr gradfhebrr huff huifff rawr chgrp grjggrr sqak ragjefbicjfafhdjbbwr grrr huidff sqgaieaebgfggbefecdiafbak sqcajhdccbjahak sqak chjdrp grrr chcfrp grgrr grgrr sqak radegajwr rahiwr chghrp grdcbiaicrr hugff radiwr sqiejdhaajjhbgjehgcaak hudff huhebdbgbfff chejhfieghbjbrp grrr grcgbjbecbrr

おお、動いた!これ、同じ文字列を入力しても、encode結果は一意にはならないんだな…。
これはencoderなので、decoderを書きます。

import cryptography
from cryptography.fernet import Fernet
import random

class BytesIntEncoder:
    @staticmethod
    def encode(b: bytes) -> int:
        return int.from_bytes(b, byteorder='big')

    @staticmethod
    def decode(i: int) -> bytes:
        return i.to_bytes(((i.bit_length() + 7) // 8), byteorder='big')

file = open('key.key', 'rb')
key = file.read()
file.close()

with open('panda.txt', 'r') as f:
    data = f.read()

cleaned = ''
for d in data.split(' '):
    cleaned += d[2:-2]

plain = ''
for c in cleaned:
    plain += str(ord(c)-97)

decoded0 = BytesIntEncoder.decode(int(plain))

f = Fernet(key)
human = f.decrypt(decoded0)

print(human)

実行

$ python pandaspeak_decoder.py 
b'especially pandas'

おお、人語になった!
あとは、翻訳した人語をまたパンダボットに話しかけると、別のパンダ語が返ってくるので、それを翻訳してまた投げて…を繰り返します。

$ python pandaspeak_decoder.py 
b'especially pandas'
$ python pandaspeak_decoder.py 
b'yeah do you want to tell me how much you love pandas?'
$ python pandaspeak_decoder.py 
b"i love them so much, i'd cuddle them all day"
$ python pandaspeak_decoder.py 
b'so? the rice goddess does that too.'
$ python pandaspeak_decoder.py 
b"darn!!! here's your flag: rtcp{pand4z_just_w4nt_cudd13z_fr0m_y0u!}"

(๑• ̀д•́ )✧+°フラグゲットォォォォォォォォ!!!

他のジャンルに出てきた問題

  • botとやりとり
  • 動物語を翻訳
  • Fernet

などの要素が盛り盛りで、めっちゃ楽しかった💖

Rice Tea Cat Panda CTF writeup [Genral Skills]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Genral Skills ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

[General Skills] Come Eat Grandma (25pt)

Oh, my bad, this spreadsheet appears to be missing its commas.

Hints

https://docs.google.com/spreadsheets/d/1EQDYaEU9jWZGIh96nGQpzpMnMdcT9ukZGT5GwRBfos4/edit?usp=sharing

DO NOT edit/remove competition resources. You will be banned.

Googleスプレッドシートに飛びます。

f:id:kusuwada:20200126114341p:plain

flagっぽい文字列などたくさんありますが、どれも違います。変更履歴を表示すると、怪しい履歴が。
見てみると、flagがありました。

f:id:kusuwada:20200126114410p:plain

[General Skills] Sticks and Stones (50pt)

may break my bones but words could never hurt me

Hints

https://github.com/JEF1056/riceteacatpanda/tree/master/Sticks and Stones (50)

githubの該当のディレクトリには、READMEと巨大なテキストファイルworbz.txtがあります。巨大すぎてエディタでは開けないので、DLしてコマンドラインから操作します。

ちょっと開いてみた感じ、rtcp{...} のフォーマットの文字列が沢山ありそうだったのですが、 rtcp{...{}みたいになっていたりしたので、まずは正しいフォーマットのもののみを抽出します。

$ grep -Eo rtcp{[^{}]*} worbz.txt > candidates.txt

それでも

$ wc candidates.txt 
   44698   44698 1288654 candidates.txt

4万行!
でもここからフィルタリングする方法を思いつかなかったので、エイヤで _ を使ってるのがflagなんじゃない?と思って検索してみた。ら、最初に引っかかったこれがflagでした。

f:id:kusuwada:20200126114452p:plain

[General Skills] Grandma's Recipes (100pt)

So Delphine and the GIANt wanted to make a recipe that Delphine's grandma passed down to her. The problem is, her grandma is extremely tech-savvy. In fact, she likes using a Certain Website on the endless Inter-Webs. She says it's very useful for storing her recipes. It'll be kinda hard for Delphine and the GIANt to git her recipes though; they don't know her username. Oh well. But hey, they know that she likes naming things after the Holy Rice Goddess.

I wonder what recipe Delphine and GIANt are making. . .

問題文から察するに、おばあちゃんはGithubユーザーで、Guthubの中から"the Holy Rice Goddess"にちなんだユーザー名を探せば、そこにレシピがある…かも知れない。OSINTだな。このCTF全体的にそんな感じだけど。

ということで、githubのsearch機能で Holy Rice Goddess を検索してみると、1repositoryがhitしました。

GitHub - pandaram/holy-rice-goddess-recipes

ここのmeatloaf_recipe.txtにflagがありました。

[Grandma’s Meatloaf Recipe]

Ingredients:
-Meat
-Uh some secret ingredients
-Some spices
-A dash of attitude
-A sprinkle of sass

Steps:
-Combine
-But like, combine in the right order
-And then you get this:
rtcp{ju5t_l1k3_gr4ndm45_m34tl04f_1029837} 

[General Skills] Treeeeeeee (100pt)

It appears that my cat has gotten itself stuck in a tree... It's really tall and I can't seem to reach it. Maybe you can throw a snake at the tree to find it?

Oh, you want to know what my cat looks like? I put a picture in the hints.

Hints

Here, my cat looks like this:

#FFC90E#FFC90E#FFC90E#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFC90E #FFC90E#000000#FFC90E#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFC90E#FFFFFF #FFC90E#FFC90E#FFC90E#FFC90E#FFC90E#FFC90E#FFC90E#FFFFFF#FFFFFF #FFFFFF#FFFFFF#FFC90E#FFC90E#FFC90E#FFC90E#FFC90E#FFFFFF#FFFFFF #FFFFFF#FFFFFF#FFC90E#FFC90E#FFC90E#FFC90E#FFC90E#FFFFFF#FFFFFF #FFFFFF#FFFFFF#FFFFFF#FFC90E#FFFFFF#FFC90E#FFFFFF#FFFFFF#FFFFFF

他、treemycatisin.7zが配布されます。これを解凍するとおびただしい数のdirectoryとjpg画像が。

ヒントの文字列は、おそらく色を表しているので、これでお絵描きしてみます。

f:id:kusuwada:20200126114554p:plain:w200

エクセルでお絵描きしてみた。これが猫ちゃん。
まずは、下記コマンドで、このビッグツリーから画像のパスのリストを作ってみます。

$ find . -name *.jpg > jpgs.txt
$ wc jpgs.txt 
    1337    1337   64175 jpgs.txt

1337枚。まぁそんなに無いかな!気合で目でも探せそう。でもちゃんとスクリプト書く。
このリストをもとに、全画像をhash化して比較、よく見る画像が2パターンあるので、それ以外の画像が出てきたらきっとそれがflag。

import hashlib

hashs = {}

with open('jpgs.txt', 'r') as f:
    img_paths = f.readlines()

for path in img_paths:
    path = path.strip()
    with open(path, 'rb') as f:
        md5 = hashlib.md5(f.read()).hexdigest()
    hashs[md5] = path
print(hashs)

実行結果

$ python solve.py 
{
  '49390dd9695e7ab7c49fbea6697bc1a9': './bigtree/NUD67JGK/CIXOYN/9FRPBEDP8Y/B53Y83BADE/VJ3B0/2YB5L.jpg',
  '2d7b81239b77deb7fbda026d9521939b': './bigtree/NUD67JGK/CIXOYN/9FRPBEDP8Y/3NVWWNNEM/YZ1LGD8Z/TIXRMLR32K.jpg',
  'aeb3e033f8bdbf2ec44fda714da72f77': './bigtree/P24AKQCA/I0E91C/6SF60/N02AKM/EAJCOQ6/ENP92.jpg'
}

※ちょっと整形した。
最後の出力のpathにあるのがflag。

f:id:kusuwada:20200126114625j:plain

ちゃんとさっきの猫ちゃんもいました。(使わなかった)

[General Skills] ghost-in-the-system (1500pt)

I think my ls is being haunted... the colors are all weird!!! What's that? It's highlighting things?! Where!!?

Hints

Flag is 100 characters long.

It starts with rtcp{ and ends with }

The first character is w

The flag is written in standard leet, the only exceptions are the flag wrapping (rtcp{}) and underscores (_)

他、lsという名前の実行ファイルが配布されます。

1500ptの割には、解いてる人が多い…。難易度と点数はこのCTF崩壊気味。

linux上で、試しにlsファイルを実行してみます。
実行してみると、確かに機能としてはlsの機能を果たしていますが、coloringが変。一文字ずつ違う色になってる。同じ文字は同じ色なので、文字によって色の値が変わる仕組みのようだ。

ghidraにdecompileしてもらったのと、radare2で見てみた所、怪しい文字列(1000文字)と、0x3a2=930までくらいのhexがちょうど100個ずらりと並んだ処理が。

文字列候補とindexかなぁ。でも1500ptでこんなに簡単に出ないよなーと思いつつ、試してみる。

data = "s}yvzezqr_6x45jx2yp4d38qq1mvnsl0u7w32lr12gi}t3i5kw0oewkqb_vv6726}}95cmfy_jfgyx25n1e9cuyvsor_0mijcnhoa2kpvdtjd9js2kstbe5}s6zgyil6qxtr}wbol}dzmg3t02466hu1gkpm2xv8u{ryn0s11uzu_426p8k4owb21f3buof6ok{cp9s2s88k3yhzdsq1d2u7n3}9ex}9sly0p0}lp5yxdi7m37_p82o54im1z7bw5u2tu9n2loybmr51jih8lxf7z6n62goh3_63cnnbfczhmsy4pe}ijluq9xbkk4d{c13s5hjkjldeww9z}78oyt1pog5qudz{6fkw_wgon99yc{7v4sakj6pddk5i1c_1g74e_xwivk7mmbm16it6zxfc1y6sdz{0zrmuvysbl}pmw8z6jb8ejmrqknxbu5w4sv542plnzs8_}znyq6b6x67ar0lsq04qu742uenp4ufoxz7ir8gzohi352}7{9hk{yu4_zbj7gmvl{c_24weh8rwxp_24dhp{giv9k}gz840uezqk9s}qxi{2u2lbbt4i}kq8gomrqewvrj65dgwaoitc99yh4jest6sccnz2wlgmap6f9k04lhanc3wmgpj6xawln_jce6c6vfttu{zws4odom7{h5hewr_{5}6fty4a14ar64q1vvg0s28zsik}nhpmw}j92s42k}zzxx0bn7cddk70iw4{f8wqguyj6a58s0u2}xzwh{0vdawdge8n88j6ms8uvt_r4hezvei3u2k179tlepun{c1l02_e92ijk9xx0o_a8gwnmp1jr9gtk2{cq7qnmrphvyecps}63cqvxcy{i5}d2r1r{rg1n}nufm7sue378uwdqe9ezscxoq90nme76}jx4}}b8ahe_paby2qxqwop63kc6eujs7}f90pkkiddlvfobb24wj52wzu2cnhoa_p4jjw4nh9kr5gif04ojbh1e_eec12"

key = [0x1f0, 0x192, 0x322, 0xe4, 0x2f6, 0x2f4, 0x276, 0x27a, 0x2d6, 0xce, 0x8e, 0x33d, 0x1cb, 0xd3, 0x126, 0x22a, 0x125, 0x2ad, 0x1ab, 0x274, 0x117, 0x3a2, 0x1cb, 0x161, 0xfb, 0x28a, 0xa9, 0x216, 0x142, 0x2f, 0x21a, 0x325, 0x216, 0x164, 0x1e4, 0x1b9, 0x2df, 0x1e9, 0x3d, 0x1fe, 0x2d3, 0x1a1, 0x97, 0xaa, 0x123, 0x2d8, 0x184, 0x2d7, 0x90, 0x14, 0xd9, 0x5b, 0x346, 0x25c, 0x1f7, 0x1b6, 0xba, 0x1bd, 0x204, 0xf8, 0x135, 0x14c, 0xb3, 0x35b, 0xe9, 9, 0x1c3, 0x333, 0x3a1, 0xce, 0x2f7, 0x4f, 0x374, 0x164, 0xb8, 0x2c1, 0x1cb, 0x36f, 0x62, 0x123, 0x395, 0x4f, 0x12e, 0x1bd, 0x208, 0x142, 0xef, 0x1cb, 0x368, 0x2ee, 0xd, 0x28a, 0x3e2, 0x388, 0x39a, 0x3a5, 0xf2, 0xe5, 0x2f7, 0xe6]

flag = ''
for k in key:
    flag += data[k]
print(flag)

実行結果

$ python solve.py 
rtcp{wh37h3r_1n4n1m473_f16ur35_0r_un4u7h0r1z3d_c0d3_7h3r35_4lw4y5_4_6h057_1n_7h3_5y573m_1056_726_00}

えー出た。びっくり。

Rice Tea Cat Panda CTF writeup [Cryptography]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Cryptography ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

[Cryptography] HOOOOOOOOOOMEEEEEE RUNNNNNNNNNNNNN!!!!!

AND JAKE IS ROUNDING THE BASES HE PASSES BASE 32!!! HE ROUNDS BASE 64!!!!!!! WE'RE WITNESSING A MIRACLE!!!!!!!!!!!!!

Just one more base to go ;D

Hints

Ecbf1HZ_kd8jR5K?[";(7;aJp?[4>J?Slk3<+n'pF]W^,F>._lB/=r

問題文を見ると、base32, base64のあとに「もう一つのbase」とあります。知らないので base32, base64でググってみると、候補にbase85というのが出てきました。記号が増えているので、きっとbaseの数は増える方向だと当たりをつけていたので有力そう。

pythonにも関数があるそうなので、これを使ってdecodeしてみました。

import base64

enc = b"""Ecbf1HZ_kd8jR5K?[";(7;aJp?[4>J?Slk3<+n'pF]W^,F>._lB/=r"""
print(base64.a85decode(enc))

実行結果

$ python solve.py 
b"rtcp{uH_JAk3_w3REn't_y0u_4t_Th3_uWust0r4g3}"

[Cryptography] Don't Give The GIANt a COOKie

It was just a typical day in the bakery for Delphine. She was preparing her famous chocolate cake, when all of a sudden a GIANt burst through the doors of her establishment and demanded a cookie. Being the strong-willed girl she was, Delphine refused and promptly threw her rolling pin at the GIANt. Doing what any sensible being would do when faced with projectiles, the GIANt let out a shriek and ran out of the shop. Delphine smiled to herself, it was another day well done.

But oh? What's this? It seems the GIANt dropped this behind while he was screaming and scrambling out of the shop.

69acad26c0b7fa29d2df023b4744bf07

Hints

This challenge still follows typical flag format, just wrap your answer with rtcp{answer_here}.

Non-case sensitive.

タイトルがcookieとのことなのでcookie関連を見てみたけれども違いそう。
この16進数の文字列、32文字なのでなにかしらのhashかもしれない。ということで、オンラインのhashデータベースサイトで調べてみたらヒットしました!

f:id:kusuwada:20200126112900p:plain

形式を揃えて

flag: rtcp{chocolate_mmm}

[Cryptography] 15

Lhzdwt eceowwl: Dhtnwt Pcln Eaao Qwoohvw

Okw qsyo okcln bah'i fslo cl baht Dhtnwt Pcln dhtnwt cy yazwalw'y eaao ehlnhy. Dho sy co ohtly aho, okso zcnko dw fkso bah nwo. S 4vksllwt hmqasiwi s mkaoa slalbzahyqb oa okw ycow ykafvsycln kcy ewwo cl s mqsyocv dcl ae qwoohvw, fcok okw yosowzwlo: "Okcy cy okw qwoohvw bah wso so Dhtnwt Pcln." Sizcoowiqb, kw ksi ykawy al. Dho okso'y wgwl fatyw.

Okw mayo fwlo qcgw so 11:38 MZ al Xhqb 16, sli s zwtw ofwlob zclhowy qsowt, okw Dhtnwt Pcln cl rhwyocal fsy sqwtowi oa okw tanhw wzmqabww. So qwsyo, C kamw kw'y tanhw. Kaf ici co ksmmwl? Fwqq, okw DP wzmqabww ksil'o twzagwi okw WJCE isos etaz okw hmqasiwi mkaoa, fkcvk yhnnwyowi okw vhqmtco fsy yazwfkwtw cl Zsbecwqi Kwcnkoy, Akca. Okcy fsy so 11:47. Oktww zclhowy qsowt so 11:50, okw Dhtnwt Pcln dtslvk siitwyy fsy mayowi fcok fcykwy ae ksmmb hlwzmqabzwlo. Ecgw zclhowy qsowt, okw lwfy yosocal fsy valosvowi db slaokwt 4vksllwt. Sli oktww zclhowy qsowt, so 11:58, s qclp fsy mayowi: DP'y "Owqq hy sdaho hy" alqclw eathz. Okw eaao mkaoa, aokwtfcyw plafl sy wjkcdco S, fsy soosvkwi. Vqwgwqsli Yvwlw Zsnsuclw valosvowi okw DP cl rhwyocal okw lwjo isb. Fkwl rhwyocalwi, okw dtwspesyo ykceo zslsnwt ysci "Ak, C plaf fka okso cy. Kw'y nwoocln ectwi." Zbyowtb yaqgwi, db 4vksl. Laf fw vsl sqq na dsvp oa wsocln aht esyo eaai cl mwsvw.

tovm{v4T3Ehq_f1oK_3J1e_i4O4}

Challenge Author: Jess (the other one)/J

キタコレ!好きなやつ。単一換字暗号。

tovm{v4T3Ehq_f1oK_3J1e_i4O4} はフラグと思われるので、tovm -> rtcpokwがたくさん出てくる、&otなので、the。あとはそれっぽい英文になるように頑張る。

出来た変換表を使ってdecryptoするスクリプトがこちら。

cipher = """Lhzdwt eceowwl: Dhtnwt Pcln Eaao Qwoohvw

Okw qsyo okcln bah'i fslo cl baht Dhtnwt Pcln dhtnwt cy yazwalw'y eaao ehlnhy. Dho sy co ohtly aho, okso zcnko dw fkso bah nwo. S 4vksllwt hmqasiwi s mkaoa slalbzahyqb oa okw ycow ykafvsycln kcy ewwo cl s mqsyocv dcl ae qwoohvw, fcok okw yosowzwlo: "Okcy cy okw qwoohvw bah wso so Dhtnwt Pcln." Sizcoowiqb, kw ksi ykawy al. Dho okso'y wgwl fatyw.

Okw mayo fwlo qcgw so 11:38 MZ al Xhqb 16, sli s zwtw ofwlob zclhowy qsowt, okw Dhtnwt Pcln cl rhwyocal fsy sqwtowi oa okw tanhw wzmqabww. So qwsyo, C kamw kw'y tanhw. Kaf ici co ksmmwl? Fwqq, okw DP wzmqabww ksil'o twzagwi okw WJCE isos etaz okw hmqasiwi mkaoa, fkcvk yhnnwyowi okw vhqmtco fsy yazwfkwtw cl Zsbecwqi Kwcnkoy, Akca. Okcy fsy so 11:47. Oktww zclhowy qsowt so 11:50, okw Dhtnwt Pcln dtslvk siitwyy fsy mayowi fcok fcykwy ae ksmmb hlwzmqabzwlo. Ecgw zclhowy qsowt, okw lwfy yosocal fsy valosvowi db slaokwt 4vksllwt. Sli oktww zclhowy qsowt, so 11:58, s qclp fsy mayowi: DP'y "Owqq hy sdaho hy" alqclw eathz. Okw eaao mkaoa, aokwtfcyw plafl sy wjkcdco S, fsy soosvkwi. Vqwgwqsli Yvwlw Zsnsuclw valosvowi okw DP cl rhwyocal okw lwjo isb. Fkwl rhwyocalwi, okw dtwspesyo ykceo zslsnwt ysci "Ak, C plaf fka okso cy. Kw'y nwoocln ectwi." Zbyowtb yaqgwi, db 4vksl. Laf fw vsl sqq na dsvp oa wsocln aht esyo eaai cl mwsvw.

tovm{v4T3Ehq_f1oK_3J1e_i4O4}"""

chr_map = {"a":"O", "b":"Y", "c":"I", "d":"B", "e":"F", "f":"W", "g":"V", "h":"U", "i":"D", "j":"X", "k":"H", "l":"N", "m":"P", "n":"G", "o":"T", "p":"K", "q":"L", "r":"Q", "s":"A", "t":"R", "u":"Z", "v":"C", "w":"E", "x":"J", "y":"S", "z":"M"}

plain = ''

for c in cipher:
    if c.isupper():
        plain += chr_map[c.lower()].upper()
    elif c.islower():
        plain += chr_map[c].lower()
    else:
        plain += c
print(plain)

実行結果

$ python solve.py 
Number fifteen: Burger King Foot Lettuce

The last thing you'd want in your Burger King burger is someone's foot fungus. But as it turns out, that might be what you get. A 4channer uploaded a photo anonymously to the site showcasing his feet in a plastic bin of lettuce, with the statement: "This is the lettuce you eat at Burger King." Admittedly, he had shoes on. But that's even worse.

The post went live at 11:38 PM on July 16, and a mere twenty minutes later, the Burger King in question was alerted to the rogue employee. At least, I hope he's rogue. How did it happen? Well, the BK employee hadn't removed the EXIF data from the uploaded photo, which suggested the culprit was somewhere in Mayfield Heights, Ohio. This was at 11:47. Three minutes later at 11:50, the Burger King branch address was posted with wishes of happy unemployment. Five minutes later, the news station was contacted by another 4channer. And three minutes later, at 11:58, a link was posted: BK's "Tell us about us" online forum. The foot photo, otherwise known as exhibit A, was attached. Cleveland Scene Magazine contacted the BK in question the next day. When questioned, the breakfast shift manager said "Oh, I know who that is. He's getting fired." Mystery solved, by 4chan. Now we can all go back to eating our fast food in peace.

rtcp{c4R3Ful_w1tH_3X1f_d4T4}

[Cryptography] notice me senpai

uwu...senpai placed this note on my desk before class but i cant wead what it says!!!!!! can you hewp me????????? uwu tysm

tlyrc_o_0pnvhu}{137rmi__i_omwm

Challenge Author: Jess (the other one)/J

senpaiって日本語のあれやんなぁ…?tysmは "thank you so much" の略らしい。hewpは "help" の間違いかな?

rtcp{lyoonvhuietrmiiomwm_____を並べ替え}だと思うんだけど、英語の並び替えは難しい…。でもこういうのが好きでCTFやっているのもあるので、とにかくやってみる。
mが使いにくいのに3つも出てきていることから、mを使う単語にフォーカスして考えたりした。それくらい。

いろいろ試した結果、これが怪しい。まさかの展開。

im_in_love_with_your_mom

ただ、leet文字がi=1o=0なので、それぞれ3箇所試さないとだめ。そんな問題ある?と思いつつ下記パターンを試した所、correct!のところでflagが通った。

rtcp{1m_in_l0v3_wi7h_your_mom}
rtcp{im_1n_l0v3_wi7h_your_mom}
rtcp{im_in_l0v3_w17h_your_mom}
rtcp{1m_in_lov3_wi7h_y0ur_mom}
rtcp{im_1n_lov3_wi7h_y0ur_mom} // correct!
rtcp{im_in_lov3_w17h_y0ur_mom}
rtcp{1m_in_lov3_wi7h_your_m0m}
rtcp{im_1n_lov3_wi7h_your_m0m}
rtcp{im_in_lov3_w17h_your_m0m} 

とおったので良し!フラグゲット٩(๑❛ᴗ❛๑)尸

[Cryptography] That's Some Interesting Tea(rs).......

You know, the tears of one's enemies works lovely in tea. Turns out, there's tons of different bases for tea. In fact, I think I heard Delphine talk about this chef website she used for her tea base combinations. . .

Oh! Speaking of which, GIANt wants Delphine to make him tea. . . all he has is the tea leaves and the cup though. Maybe you can help Delphine, since she's really busy with cooking other things?

O53GG4CSJRHEWQT2GJ5HC4CGOM4VKY3SOZGECZ2YNJTXO6LROV3DIR3CK4ZEMWCDHFMTOWSXGRSHU23DLJVTS5BXOQZXMU3ONJSFKRCVO5BEGVSELJSGUNSYLI2XQ32UOI3FKWDYMJQWOMKQOJ4XIU2WN5KTKWT2INUW44SZONGUUN2BMFRTQQJYKM3WGSSUNVXGEU3THFIFUSDHIVWVEQ3LJVUXEMSXK5MXSZ3TG5JXORKTMZRFIVQ=

文字列のレンジがbase32のような感じなので、まずは base32 decode。そしたら今度はまた違うレンジの文字列が出てきたので…と繰り返し base** dedode を試していきます。
問題文から、base** のバリエーションを試す問題だと思ったので、ぐぐったりして色々試しながらやりました。

import base64
import base58
import base62

enc = b"""O53GG4CSJRHEWQT2GJ5HC4CGOM4VKY3SOZGECZ2YNJTXO6LROV3DIR3CK4ZEMWCDHFMTOWSXGRSHU23DLJVTS5BXOQZXMU3ONJSFKRCVO5BEGVSELJSGUNSYLI2XQ32UOI3FKWDYMJQWOMKQOJ4XIU2WN5KTKWT2INUW44SZONGUUN2BMFRTQQJYKM3WGSSUNVXGEU3THFIFUSDHIVWVEQ3LJVUXEMSXK5MXSZ3TG5JXORKTMZRFIVQ="""

data = base64.b32decode(enc)
data = base58.b58decode(data)
data = base62.decodebytes(data.decode('utf-8'))
data = base64.b64decode(data)
data = base64.a85decode(data)

print(data)

実行結果

$ python solve.py 
b'rtcp{th4t5_50m3_54lty_t34_1_bl4m3_4ll_th0s3_t34rs}'

padding errorは見飽きたよ…。涙でしょっぱくなったってか。

[Cryptography] That's a Lot of Stuff . . . (275pt)

Do you want some numbers? Here, take these numbers. I don't need them anyways. I have too many numbers at home, so go on, take them. Shoves numbers towards the computer screen

36 31 20 36 31 20 36 34 20 34 30 20 36 31 20 36 31 20 36 36 20 34 30 20 37 31 20 37 31 20 34 30 20 36 31 20 36 31 20 36 32 20 34 30 20 36 31 20 36 32 20 36 33 20 34 30 20 37 31 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 31 20 36 31 20 36 30 20 34 30 20 36 31 20 36 31 20 37 30 20 34 30 20 36 35 20 36 31 20 34 30 20 36 31 20 36 31 20 36 34 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 36 34 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 31 20 36 31 20 36 30 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 36 37 20 34 30 20 36 31 20 36 31 20 36 34 20 34 30 20 36 35 20 36 31 20 34 30 20 37 31 20 36 35 20 34 30 20 36 35 20 36 32 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 34 20 37 30 20 34 30 20 36 37 20 36 36 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 37 31 20 34 30 20 36 35 20 36 32 20 34 30 20 36 31 20 36 31 20 36 36 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 36 31 20 36 32 20 36 35

まずは、3文字おきに20が登場していること、それ以外の数字が30番台なことから、それぞれの数字をhexとみなしてascii変換してあげると、文字量が1/3に減るぞ(ascii(0x20)はblank)と思い、やってみた。

61 61 64 40 61 61 66 40 71 71 40 61 61 62 40 61 62 63 40 71 71 40 64 70 40 61 61 60 40 61 61 70 40 65 61 40 61 61 64 40 61 61 65 40 64 71 40 64 70 40 61 61 60 40 61 61 65 40 71 65 40 71 67 40 61 61 64 40 65 61 40 71 65 40 65 62 40 71 65 40 71 71 40 64 70 40 64 70 40 67 66 40 71 65 40 71 71 40 65 62 40 61 61 66 40 61 61 65 40 61 62 65

今度は定期的に40が出てきて、それ以外の数字は60~71。眺めていると、114 116と変換すると、asciiでrt…。これはこの線で行こう。c99だから、次の71 7199に変換されて欲しい。あとは他の出力を眺めて、708と出力してほしかったので、これもエイヤで処理に入れました。

import base64

numbers = "36 31 20 36 31 20 36 34 20 34 30 20 36 31 20 36 31 20 36 36 20 34 30 20 37 31 20 37 31 20 34 30 20 36 31 20 36 31 20 36 32 20 34 30 20 36 31 20 36 32 20 36 33 20 34 30 20 37 31 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 31 20 36 31 20 36 30 20 34 30 20 36 31 20 36 31 20 37 30 20 34 30 20 36 35 20 36 31 20 34 30 20 36 31 20 36 31 20 36 34 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 36 34 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 31 20 36 31 20 36 30 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 36 37 20 34 30 20 36 31 20 36 31 20 36 34 20 34 30 20 36 35 20 36 31 20 34 30 20 37 31 20 36 35 20 34 30 20 36 35 20 36 32 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 37 31 20 34 30 20 36 34 20 37 30 20 34 30 20 36 34 20 37 30 20 34 30 20 36 37 20 36 36 20 34 30 20 37 31 20 36 35 20 34 30 20 37 31 20 37 31 20 34 30 20 36 35 20 36 32 20 34 30 20 36 31 20 36 31 20 36 36 20 34 30 20 36 31 20 36 31 20 36 35 20 34 30 20 36 31 20 36 32 20 36 35"

array1 = numbers.split()
reduce1 = ''
for a in array1:
    reduce1 += chr(int(a,16))
# print(reduce1)

array2 = reduce1.split()
reduce2 = ''
fragment = ''
for b in array2:
    if b == '40':
        reduce2 += chr(int(fragment))
        fragment = ''
    elif b == '71':
        fragment += str(9)
    elif b == '70':
        fragment += str(8)
    else:
        fragment += str(int(b)-60)
reduce2 += chr(int(fragment))
print(reduce2)

実行結果

$ python solve.py 
rtcp{c0nv3rs10ns_ar3_4_c00L_c4ts}

[Cryptography] FBI (375pt)

Happy MLK day! (January 20th for y'alls non-American folk).

Hints

What's does the challenge name have to do with its theme?

Flag format is rtcp(...) not rtcp{}

The text you use to solve this challenge may slightly vary by a few characters, spacing etc. If these exists, correct them to make it a valid string of english words separated by -s

配布されたmessage.txtはこちら。

KING,

1 4 33
6 1 43
6 3 6
2 4 54
3 6 6
2 2 33
4 8 42
4 3 2
2 4 54
4 10 9
4 11 24
4 1 60
4 2 26
6 0 32
2 3 8
6 5 0
3 4 60
4 0 26
4 5 9
4 11 24
1 0 32
3 0 54
5 1 45
4 11 24
4 1 63
2 4 30
1 4 7
4 11 24
1 1 39
2 3 1
4 1 11
4 5 47
4 6 43
4 15 41
6 4 17
4 11 24
5 2 54
2 3 28
3 0 32
4 11 24
5 1 29
5 0 42
4 7 38
4 6 22
4 11 24
4 4 4
4 11 24
4 5 55
2 2 16
2 2 53
6 3 12
4 11 24
2 2 52
2 1 31
6 0 39
3 6 24

flagフォーマットを見る限り、3 6 6 -> (, 3 6 24 -> ) になるのかな?
ヒントのもう一つ、タイトルと問題の関連性は?FBIとキング牧師

FBIとキング牧師について調べてみると、FBI–King suicide letter - Wikipedia こんなん出てきた。
この手紙の画像、問題文と書き出しの文が一致していること、上記の 3パラグラフ目、6行目、6文字目が ( なので、この線はあってそう。パラグラフは1から数えて、行数・文字数は0からカウントすると合いそう。地道に読む。

rtcp(halpy-fifti th-mll-day-america-has-lome-a-long-way)

こんなん出てきた。
微修正してね、とのことだったので、ちょっとおかしなところを修正。

rtcp(happy-fiftieth-mlk-day-america-has-come-a-long-way)

[Cryptography] Code On (500pt)

My houseplant and I were working on a biology assignment together. Yes, my houseplant. Don't question it. Anyways, she ended up giving me a new cipher to use in my next project! So I'm giving it to my biology friends to see if they can solve it. They are, after all, studying DNA and mRNA right now.

AUGCAAGGUCUCUUGACCCAGUGGAUACUAAAUGCCUGGAAGGUAGCAUACUAG

Key: 6, 3, 4, 3, 1, 9, 8, 3, 3, 2, 7, 4, 1, 2, 4, 1

Hints

Make sure to encase the plaintext with rtcp{} Spaces are represented by a underscore, (_)

mRNA伝令RNA - Wikipedia 参照。
どうも A,C,G,Uからできている文字列のほうがmRNAに見立てられているらしい。3つ単位で意味を持つということで3文字ずつに分けてみた。

mRNA = "AUGCAAGGUCUCUUGACCCAGUGGAUACUAAAUGCCUGGAAGGUAGCAUACUAG"

tRNAs = []
for i in range(len(mRNA)//3):
    tRNAs.append(mRNA[i*3:i*3+3])

print(tRNAs)

['AUG', 'CAA', 'GGU', 'CUC', 'UUG', 'ACC', 'CAG', 'UGG', 'AUA', 'CUA', 'AAU', 'GCC', 'UGG', 'AAG', 'GUA', 'GCA', 'UAC', 'UAG']

コドン表を調べてみると、最初のAUGは開始コドン、UAGは終止コドンとのことなので、ビンゴ!あとは、上記の長さが18, keyの長さが16なので、開始と終止を除いたコドン名の key 文字目をつなげると良さそう。

対応表はこちらを見て作成。オレンジのM-RNA Codonsの列を使いました。wikipediaとかを参考にした対応表ではうまく行かなかった。

対応表

CAA: glutamine
GGU: glycine
CUC: leucine
UUG: leucine
ACC: threonine
CAG: glutamine
UGG: tryptophan
AUA: isoleucine
CUA: leucine
AAU: asparagine
GCC: alanine
UGG: tryptophan
AAG: lysine
GUA: valine
GCA: alanine
UAC: tyrosine
key = [6, 3, 4, 3, 1, 9, 8, 3, 3, 2, 7, 4, 1, 2, 4, 1]
tRNA_names = ["glutamine", "glycine", "leucine", "leucine", "threonine", "glutamine", "tryptopha", "isoleucin", "leucine", "asparagin", "alanine", "tryptopha", "lysine", "valine", "alanine", "tyrosine"]

plain = ''
for i in range(len(tRNA_names)):
    plain += tRNA_names[i][key[i]-1]
print(plain)

実行結果

$ python solve.py 
mycutehouseplant

ということで、ヒントよりflagは

rtcp{my_cute_houseplant}

Rice Tea Cat Panda CTF writeup [Web]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Web ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

[Web] Robots. Yeah, I know, pretty obvious. (25pt)

So, we know that Delphine is a cook. A wonderful one, at that. But did you know that GIANt used to make robots? Yeah, GIANt robots.

問題文はよくわからなかったけど、タイトルが Robots のWeb問なので、https://riceteacatpanda.wtf/robots.txtにアクセスしてみたらこんな感じ。

f:id:kusuwada:20200126104920p:plain

/flagはdummyで、/robot-nursesが正解。https://riceteacatpanda.wtf/robot-nursesにアクセスすると

f:id:kusuwada:20200126104904p:plain

[Web] No Sleep (100pt)

Jess doesn't get enough sleep, since he's such a gamer so in this challenge, you'll be staying up with him until 4:00 in the morning :D on a Monday! Let's go, gamers!

Hints

https://riceteacatpanda.wtf/onlyrealgamers

topページを訪れると、カウントダウンが始まっています。

f:id:kusuwada:20200126105045p:plain

このまま待ってるとflagが表示されるのかもですが、カウントダウンが終わるのは競技終了時間っぽい。ソースを見てみるとjavascriptコードが。

var _0x1d8e = ['gamerfuel=Jan 27, 2020 04:20:00', 'Jan 27, 2020 04:20:00',
    'getTime', 'exec', 'floor', 'getElementById', 'gamer timer', 'AES', 'decrypt',
    'U2FsdGVkX18kRm6FDkRVQfVuNPTxyOnJzpu8QnI/9UKoCXp6hQcley11nBnLIItj',
    'ok boomer', 'innerHTML', 'Utf8', 'cookie'
];
(function(_0x29eed8, _0x4bb4aa) {
    var _0x47e29c = function(_0x2d3fd2) {
        while (--_0x2d3fd2) {
            _0x29eed8['push'](_0x29eed8['shift']());
        }
    };
    _0x47e29c(++_0x4bb4aa);
}(_0x1d8e, 0x99));
var _0x2ad1 = function(_0x545e19, _0x47cdd3) {
    _0x545e19 = _0x545e19 - 0x0;
    var _0x4275c2 = _0x1d8e[_0x545e19];
    return _0x4275c2;
};
document[_0x2ad1('0x0')] = _0x2ad1('0x1');
var countDownDate = new Date(_0x2ad1('0x2'))[_0x2ad1('0x3')]();
var x = setInterval(function() {
    var _0x27a8c6 = new Date(/[^=]*$/ [_0x2ad1('0x4')](document[_0x2ad1('0x0')])[
        0x0])[_0x2ad1('0x3')]();
    var _0x5b92f1 = new Date()['getTime']();
    var _0x3a5a33 = _0x27a8c6 - _0x5b92f1;
    var _0x4214a2 = Math[_0x2ad1('0x5')](_0x3a5a33 / (0x3e8 * 0x3c * 0x3c * 0x18));
    var _0x48c0d9 = Math[_0x2ad1('0x5')](_0x3a5a33 % (0x3e8 * 0x3c * 0x3c * 0x18) /
        (0x3e8 * 0x3c * 0x3c));
    var _0x2de271 = Math[_0x2ad1('0x5')](_0x3a5a33 % (0x3e8 * 0x3c * 0x3c) / (
        0x3e8 * 0x3c));
    var _0x240ffb = Math['floor'](_0x3a5a33 % (0x3e8 * 0x3c) / 0x3e8);
    document[_0x2ad1('0x6')](_0x2ad1('0x7'))['innerHTML'] = _0x4214a2 + 'd ' +
        _0x48c0d9 + 'h ' + _0x2de271 + 'm ' + _0x240ffb + 's ';
    _0x3a5a33 = 0x0;
    if (_0x3a5a33 < 0x0) {
        clearInterval(x);
        var _0x1018af = CryptoJS[_0x2ad1('0x8')][_0x2ad1('0x9')](_0x2ad1('0xa'),
            _0x2ad1('0xb'));
        document[_0x2ad1('0x6')](_0x2ad1('0x7'))[_0x2ad1('0xc')] = _0x1018af[
            'toString'](CryptoJS['enc'][_0x2ad1('0xd')]);
    }
}, 0x3e8);

これを解読できれば良さそうだなーと眺めていたのですが、読みづらいので_0x1d8e変数の内容を展開して書き換えます。

document['gamerfuel=Jan 27, 2020 04:20:00'] = 'Jan 20, 2020 04:20:00';
var countDownDate = new Date('getTime')['exec']();
var x = setInterval(function() {
    var _0x27a8c6 = new Date(/[^=]*$/ ['floor'](document['gamerfuel=Jan 27, 2020 04:20:00'])[
        0x0])['exec']();
    var _0x5b92f1 = new Date()['getTime']();
    var _0x3a5a33 = _0x27a8c6 - _0x5b92f1;
    var _0x4214a2 = Math['getElementById'](_0x3a5a33 / (0x3e8 * 0x3c * 0x3c * 0x18));
    var _0x48c0d9 = Math['getElementById'](_0x3a5a33 % (0x3e8 * 0x3c * 0x3c * 0x18) /
        (0x3e8 * 0x3c * 0x3c));
    var _0x2de271 = Math['getElementById'](_0x3a5a33 % (0x3e8 * 0x3c * 0x3c) / (
        0x3e8 * 0x3c));
    var _0x240ffb = Math['floor'](_0x3a5a33 % (0x3e8 * 0x3c) / 0x3e8);
    document['gamer timer']('AES')['innerHTML'] = _0x4214a2 + 'd ' +
        _0x48c0d9 + 'h ' + _0x2de271 + 'm ' + _0x240ffb + 's ';
    _0x3a5a33 = 0x0;
    if (_0x3a5a33 < 0x0) {
        clearInterval(x);
        var _0x1018af = CryptoJS['decrypt']['U2FsdGVkX18kRm6FDkRVQfVuNPTxyOnJzpu8QnI/9UKoCXp6hQcley11nBnLIItj']('ok boomer',
            'innerHTML');
        document['gamer timer']('AES')['Utf8'] = _0x1018af[
            'toString'](CryptoJS['enc']['cookie']);
    }
}, 0x3e8);

だいぶ見やすくなりました。
最後の行にcookieとあります。cookieを見てみると、gamerfuel: Jan 27, 2020 04:20:00というのがありました。
なんとなく現在時刻より前に設定すると良さそうなので、試しにこれをJan 23, 2020 04:20:00に書き換えてみると、flagが出ました。

f:id:kusuwada:20200126105016p:plain

[Web] Phishing for Flags (105pt)

I got a bunch of emails from people across the galaxy... some are more interesting than others.

Hints

You only have two tries, so be careful :D

Emails.zipが配布されます。

$ unzip Emails.zip 
Archive:  Emails.zip
  inflating: Applying For A Job.eml  
  inflating: College of Flag.eml     
  inflating: CONFIRM YOUR UNSUBSCIBE REQUEST.eml  
  inflating: GIVE ME BACK MY EYEHOLES.eml  
  inflating: Please Verify Your Account (RiceTeaCatPanda).eml  
  inflating: Updates on my reseach.eml

フィッシング問題。それぞれのメールには、リンクが沢山埋め込まれていますが、2回までしかチャンスがないということで正しいリンクを選んで踏まないとダメそう(実際は存在しないドメインで、特に間違えても問題なさそうでした)。ざっと見た感じ、下記のリンクが埋め込まれていました。urlをよく読んで選びます。

  • http://areyousurethisisaresume.com // are you sure this is a resume
  • https://www.google.com/drive/docs/file0116 (not link)
  • http://thisisnotalinktotheflag.com // this is not a link to the flag
  • http://yeahrightcanyouevengrammar.org // yeah right can you even grammar
  • http://comeonthisisabigredbutton.com // come on this is a big red button
  • https://riceteacatpanda.baycyberctf.net/phishingemail
  • https://help.riceteacatpanda.b5ycyb3rctf.net
  • http://yestotallyapasswordresetlinkforrtcp.com // yes totally a password reset link for rtcp
  • http://auth.berkeley.eduh.in/news/nvidea-jetson1 (not link)
  • http://articleabouthowfartscancreateallkindsofstuff.com // article about how fart scan create all kinds of stuff
  • http://www.sciencedirect.com/science/article/pii/S164496651500082 (not link) *http://NOOOOOOOOOOOOOOMORTYWHYYYYYY.com // No MORTY Why

この中で怪しい&有効そうだったのが https://riceteacatpanda.baycyberctf.net/phishingemail。行ってみると証明書の警告が出た後、RTCPCTFのミラーのようなサイトのログイン画面に飛ばされます(ゲストウィンドウでやっていたため)。 ログイン後に https://riceteacatpanda.baycyberctf.net/phishingemailにアクセスするとflagが得られました。

f:id:kusuwada:20200126105319p:plain

Read Before You Click!

[Web] Uwu? (125pt)

ᵘʷᵘ oh no ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ hecc sorry guys ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ sorry im dropping ᵘʷᵘ my uwus all over the ᵘʷᵘ place ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ oh no I lost one ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ ᵘʷᵘ

ah, Jake, you idiot

Hints

https://riceteacatpanda.wtf/uwu

This challenge gets progressively harder the faster your internet is if you do it manually

uwuってなんぞ。と思ってググったらドンピシャのFAQがあった。
【uwu】 とはどういう意味ですか? | HiNative
顔らしい。なんだか可愛く見えてきたぞ。

リンク先に飛んでみると、エライコッチャ。

f:id:kusuwada:20200126105509p:plain

redirectで何度か飛ばされ、最終的に/uwustorageに落ち着きました。
下記が飛ばされるページ。

  • /uwu
  • /omgmeow
  • /pandaaaaaaa
  • /you-better-wash-your-rice
  • /footprint
  • /uwustorage

それぞれのページのソースを引っ張ってきて保存しておきます。

次。uwu言語とかで書かれた言語だと思ったので、ググってみました。ksnctfの「うーにゃー言語」とかそんな感じと思ったのだ。なんかちょっと違う、語尾をちょっと変えただけのuwu language的なサイトがたくさん出てきました( •̅_•̅ ) コレジャナイ。

gitHub上でググってもそれらしきものが出てこないので、とりあえず落としておいたページのソースをgrepしたら出てきた。

$ ls
footprint.txt           uwu.txt
omgmeow.txt         uwustorage.txt
pandaaaaaaa.txt         you-better-wash-your-rice.txt
$ grep -o rtcp{.*} *
you-better-wash-your-rice.txt:rtcp{uwu_,_1_f0und_y0u}

[Web] What's in The Box?! (200pt)

📦

Hints

You may drag it to your bookmarks bar ;D

言われたとおりに、boxをブックマークバーにドラッグし、追加したブックマークを開いてみると…!

f:id:kusuwada:20200126105700p:plain

なんと猫ちゃんが現れた。しかも動いている。
bookmarkを編集、から詳細を見てみるとjavascriptが埋まってた。最後の方のコメントアウトしてある断片をurlデコードしてつなげるとflagに。

(略)
/*rtcp%7B*/ var ticks %3D 0%3B var jump_t %3D 20%3B var move_t %3D 180%3B cat.style.cssFloat %3D "left"%3B cat.style.position %3D "absolute"%3B cat.style.width %3D "64px"%3B cat.style.height %3D "64px"%3B cat.style.left %3D 0%3B cat.style.up %3D 0%3B cat.style.zIndex %3D 100000000%3B document.body.insertBefore(cat, document.body.firstChild)%3B setInterval(function() %7B ticks%2B%2B%3B if (onGround) %7B if (dx !%3D 0) %7B if (ticks >%3D jump_t) %7B /*k4wA1*/ onGround %3D false%3B dy %3D 2 %2B Math.random() * 4%3B jump_t %3D ticks %2B Math.floor(Math.random() * 100) %2B 10%3B %7D %7D %7D else %7B dy -%3D 0.1%3B if (ticks >%3D jump_t) %7B onGround %3D true%3B dy %3D 0%3B /*I_kitT3nz*/ jump_t %3D ticks %2B Math.floor(Math.random() * 200) %2B 50%3B %7D %7D /*_4_tH*/ if (ticks >%3D move_t) %7B if (dx %3D%3D 0) %7B var temp %3D Math.random()%3B if (temp > 0.5) %7B dx %3D 0.5 %2B Math.random()%3B cat.setAttribute("src", cat_right)%3B %7D else %7B dx %3D -0.5 - Math.random()%3B /*3_w1N*/ cat.setAttribute("src", cat_left)%3B %7D move_t %3D ticks %2B Math.floor(Math.random() * 200) %2B 25%3B %7D else %7B dx %3D 0%3B move_t %3D ticks %2B Math.floor(Math.random() * 200) %2B 25%3B cat.setAttribute("src", cat_idle)%3B %7D %7D if (x %2B dx >%3D 0 %26%26 x %2B 64 %2B dx < window.innerWidth) %7B x %2B%3D dx%3B %7D else if (x %2B dx < 0) %7B dx %3D 0%3B x %3D 0%3B %7D else %7B dx %3D 0%3B x %3D window.innerWidth - 64%3B %7D if (y - dy >%3D 0) %7B y -%3D dy%3B /*!!_4123*/ %7D else %7B dy %3D -dy%3B y %3D 0%3B %7D cat.style.left %3D (x %2B "px")%3B /*2345%7D*/ cat.style.top %3D (y %2B "px")%3B %7D, 20)%3B %7Dvar i%3B for (i %3D 0%3B i < 2%3B i%2B%2B) %7B spawncat()%3B %7D

コメント部分だけ抜き出し

rtcp%7B
k4wA1
I_kitT3nz
_4_tH
3_w1N
!!_4123
2345%7D

urlデコードしてつなげると
flag: rtcp{k4wA1I_kitT3nz_4_tH3_w1N!!_41232345}

可愛い子猫ちゃんは正義!

[Web] growls at the chicken (1000pt)

grrrrrrR

big chicken, i hisS At you!!!

Hints

NQr2MIa1jsaifAVOn3zYeMynNJwd4oBiiem4fJHsA1WjzfyhUp1+seCW0GMijoDHb3w9BMKj7aw6hhtae5/Qw5xOqMioJU3vvEj0BEHO1wInPqlOeTRdZb8BcTsXP+Z/KBA2FjSZcpGHo7rOZ7NtR15y3eY4s/e/tgKUHvPe9MdmDe1kINtyRXgjghJO9e3uMEQmFe2Ai5moVnG7yIVfUd3QG6/Z+K4PSttbJtjWSLFO7zpmYpEOg3XBxsOw/w5scJQqJ7OLGiH22u4+JFXRlD/wPmDzk9uYlLWLcCuxnY0xuMlSfKIFJtVmF0ViO4o4X89ZwsQjjHuYYDaB3el7iA63BzBlsC54Q7Ekv70/GI0UA3R3zJkMaBV12Z6NAE/kAgEJu9ZRcVm6MAIZInLwMU4R1frM0Bks1jeTe72agmxnAIrR8XDeAxzovbvXFwoxNyxiA63fPJGPVoGZq4ecfGvJ23i/Cg+cynB35lc3f+4QifpjCn+MxWkKCzCVEJXdDah19yXKlIxbaR1zm+YHkS0YSUzjr7NJUXHfDCrwAUpXpikfi2f9tgcXEnuhszScE1PCbdt22rRz1pS7MNdRxjCZ5j+8BQNRBLi2BjLGW14X3zd4d6ieoHWH+4fmbqU9dFsUgKN5qL4Gs2LZbbQwkf3+VbIRQK9RaSO9Hj+4/T0=

Public

MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmy27XroKLfED3q32/K7G +TnREe2ZkSgceDJH9X+Jf2I++kJHxNxe5HbQBdTHW/tLTWxwMEpric9zGFlt1f76 zdG2iocGw81BVznN/btVAYJBGbhJPYTeULSCv4WG+NTrss8NSl6WGS9NCOKEWTA/ JjR1z8fXik5foTK18sLJloRFGmxcKV6ZI0VFEi77U6PouOseaPBRYgVlPAjNM/pl AuJotPjFYtNTQWCgpj+Vgt3cxm9erBl8G9K9rIsK6snNA1yEZT774CMLCnyovkd5 i55/5mIjGOdmy+x3qCYC2J+Xmssx56OebPyO8cAou8XQf5E/PMxBZ+8X5zuqnHza 2oK9Lo4K2hYVGpCBmG8WhCstYVvfxeb0cXifPOZnpiC4DrQ3q5atx7sH1V4OaAze eJ+nWKTKVaT9NLKEC3ObUNtLLjoh3AZr/RFh9OsYf3rmRFflJkswlVpfMQF6MAR4 CrDITaTdL0M5RWzE2/1Mh98p2HvTJXz0bFbcIfAvd3rAYku0P3OyO3EZ7KrpGXZa 4Mdu10GKEllk9bwCmDFHK/HMVzZPFK9RvKNpMyWchLCLO2gRxIHySn3lF/MHlBkq 0+DH3YM5L0EW92Uzu/IkZJ4o3z7YnrMHdVVN14bGlBfspn+t7LT2xTx3sWYQLm6r xYeQDSkiY24IqAiQzwdPmi0CAwEAAQ==

Private

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

なんか鍵っぽいのが渡されました。

問題文の大文字をつなげると、RSAになってるので、RSAが関係ありそう。

まずはpublicの方を。ヒントの最初のワードと、文字列の形式的にRSAの公開鍵と秘密鍵っぽいので、文字列をブランクで改行し、一番上と下の行に

-----BEGIN PUBLIC KEY-----
hogehoge
-----END PUBLIC KEY-----

を追加したファイルpub.pemを作成します。中身を確認。

$ openssl rsa -pubin -in pub.pem -text
Public-Key: (4096 bit)
Modulus:
    00:9b:2d:bb:5e:ba:0a:2d:f1:03:de:ad:f6:fc:ae:
    c6:f9:39:d1:11:ed:99:91:28:1c:78:32:47:f5:7f:
    89:7f:62:3e:fa:42:47:c4:dc:5e:e4:76:d0:05:d4:
    c7:5b:fb:4b:4d:6c:70:30:4a:6b:89:cf:73:18:59:
    6d:d5:fe:fa:cd:d1:b6:8a:87:06:c3:cd:41:57:39:
    cd:fd:bb:55:01:82:41:19:b8:49:3d:84:de:50:b4:
    82:bf:85:86:f8:d4:eb:b2:cf:0d:4a:5e:96:19:2f:
    4d:08:e2:84:59:30:3f:26:34:75:cf:c7:d7:8a:4e:
    5f:a1:32:b5:f2:c2:c9:96:84:45:1a:6c:5c:29:5e:
    99:23:45:45:12:2e:fb:53:a3:e8:b8:eb:1e:68:f0:
    51:62:05:65:3c:08:cd:33:fa:65:02:e2:68:b4:f8:
    c5:62:d3:53:41:60:a0:a6:3f:95:82:dd:dc:c6:6f:
    5e:ac:19:7c:1b:d2:bd:ac:8b:0a:ea:c9:cd:03:5c:
    84:65:3e:fb:e0:23:0b:0a:7c:a8:be:47:79:8b:9e:
    7f:e6:62:23:18:e7:66:cb:ec:77:a8:26:02:d8:9f:
    97:9a:cb:31:e7:a3:9e:6c:fc:8e:f1:c0:28:bb:c5:
    d0:7f:91:3f:3c:cc:41:67:ef:17:e7:3b:aa:9c:7c:
    da:da:82:bd:2e:8e:0a:da:16:15:1a:90:81:98:6f:
    16:84:2b:2d:61:5b:df:c5:e6:f4:71:78:9f:3c:e6:
    67:a6:20:b8:0e:b4:37:ab:96:ad:c7:bb:07:d5:5e:
    0e:68:0c:de:78:9f:a7:58:a4:ca:55:a4:fd:34:b2:
    84:0b:73:9b:50:db:4b:2e:3a:21:dc:06:6b:fd:11:
    61:f4:eb:18:7f:7a:e6:44:57:e5:26:4b:30:95:5a:
    5f:31:01:7a:30:04:78:0a:b0:c8:4d:a4:dd:2f:43:
    39:45:6c:c4:db:fd:4c:87:df:29:d8:7b:d3:25:7c:
    f4:6c:56:dc:21:f0:2f:77:7a:c0:62:4b:b4:3f:73:
    b2:3b:71:19:ec:aa:e9:19:76:5a:e0:c7:6e:d7:41:
    8a:12:59:64:f5:bc:02:98:31:47:2b:f1:cc:57:36:
    4f:14:af:51:bc:a3:69:33:25:9c:84:b0:8b:3b:68:
    11:c4:81:f2:4a:7d:e5:17:f3:07:94:19:2a:d3:e0:
    c7:dd:83:39:2f:41:16:f7:65:33:bb:f2:24:64:9e:
    28:df:3e:d8:9e:b3:07:75:55:4d:d7:86:c6:94:17:
    ec:a6:7f:ad:ec:b4:f6:c5:3c:77:b1:66:10:2e:6e:
    ab:c5:87:90:0d:29:22:63:6e:08:a8:08:90:cf:07:
    4f:9a:2d
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmy27XroKLfED3q32/K7G
+TnREe2ZkSgceDJH9X+Jf2I++kJHxNxe5HbQBdTHW/tLTWxwMEpric9zGFlt1f76
zdG2iocGw81BVznN/btVAYJBGbhJPYTeULSCv4WG+NTrss8NSl6WGS9NCOKEWTA/
JjR1z8fXik5foTK18sLJloRFGmxcKV6ZI0VFEi77U6PouOseaPBRYgVlPAjNM/pl
AuJotPjFYtNTQWCgpj+Vgt3cxm9erBl8G9K9rIsK6snNA1yEZT774CMLCnyovkd5
i55/5mIjGOdmy+x3qCYC2J+Xmssx56OebPyO8cAou8XQf5E/PMxBZ+8X5zuqnHza
2oK9Lo4K2hYVGpCBmG8WhCstYVvfxeb0cXifPOZnpiC4DrQ3q5atx7sH1V4OaAze
eJ+nWKTKVaT9NLKEC3ObUNtLLjoh3AZr/RFh9OsYf3rmRFflJkswlVpfMQF6MAR4
CrDITaTdL0M5RWzE2/1Mh98p2HvTJXz0bFbcIfAvd3rAYku0P3OyO3EZ7KrpGXZa
4Mdu10GKEllk9bwCmDFHK/HMVzZPFK9RvKNpMyWchLCLO2gRxIHySn3lF/MHlBkq
0+DH3YM5L0EW92Uzu/IkZJ4o3z7YnrMHdVVN14bGlBfspn+t7LT2xTx3sWYQLm6r
xYeQDSkiY24IqAiQzwdPmi0CAwEAAQ==
-----END PUBLIC KEY-----

(๑•̀ㅂ•́)و✧ヨシ

次にpivateのほうを。同じようにブランクで改行して、一番上と下の行に

-----BEGIN RSA PRIVATE KEY-----
hogehoge
-----END RSA PRIVATE KEY-----

を追加して鍵っぽくしてみます。中身を確認。

$ openssl rsa -in private.pem -text
Private-Key: (4096 bit)
modulus:
    00:9b:2d:bb:5e:ba:0a:2d:f1:03:de:ad:f6:fc:ae:
    c6:f9:39:d1:11:ed:99:91:28:1c:78:32:47:f5:7f:
    89:7f:62:3e:fa:42:47:c4:dc:5e:e4:76:d0:05:d4:
    c7:5b:fb:4b:4d:6c:70:30:4a:6b:89:cf:73:18:59:
    6d:d5:fe:fa:cd:d1:b6:8a:87:06:c3:cd:41:57:39:
    cd:fd:bb:55:01:82:41:19:b8:49:3d:84:de:50:b4:
    82:bf:85:86:f8:d4:eb:b2:cf:0d:4a:5e:96:19:2f:
    4d:08:e2:84:59:30:3f:26:34:75:cf:c7:d7:8a:4e:
    5f:a1:32:b5:f2:c2:c9:96:84:45:1a:6c:5c:29:5e:
    99:23:45:45:12:2e:fb:53:a3:e8:b8:eb:1e:68:f0:
    51:62:05:65:3c:08:cd:33:fa:65:02:e2:68:b4:f8:
    c5:62:d3:53:41:60:a0:a6:3f:95:82:dd:dc:c6:6f:
    5e:ac:19:7c:1b:d2:bd:ac:8b:0a:ea:c9:cd:03:5c:
    84:65:3e:fb:e0:23:0b:0a:7c:a8:be:47:79:8b:9e:
    7f:e6:62:23:18:e7:66:cb:ec:77:a8:26:02:d8:9f:
    97:9a:cb:31:e7:a3:9e:6c:fc:8e:f1:c0:28:bb:c5:
    d0:7f:91:3f:3c:cc:41:67:ef:17:e7:3b:aa:9c:7c:
    da:da:82:bd:2e:8e:0a:da:16:15:1a:90:81:98:6f:
    16:84:2b:2d:61:5b:df:c5:e6:f4:71:78:9f:3c:e6:
    67:a6:20:b8:0e:b4:37:ab:96:ad:c7:bb:07:d5:5e:
    0e:68:0c:de:78:9f:a7:58:a4:ca:55:a4:fd:34:b2:
    84:0b:73:9b:50:db:4b:2e:3a:21:dc:06:6b:fd:11:
    61:f4:eb:18:7f:7a:e6:44:57:e5:26:4b:30:95:5a:
    5f:31:01:7a:30:04:78:0a:b0:c8:4d:a4:dd:2f:43:
    39:45:6c:c4:db:fd:4c:87:df:29:d8:7b:d3:25:7c:
    f4:6c:56:dc:21:f0:2f:77:7a:c0:62:4b:b4:3f:73:
    b2:3b:71:19:ec:aa:e9:19:76:5a:e0:c7:6e:d7:41:
    8a:12:59:64:f5:bc:02:98:31:47:2b:f1:cc:57:36:
    4f:14:af:51:bc:a3:69:33:25:9c:84:b0:8b:3b:68:
    11:c4:81:f2:4a:7d:e5:17:f3:07:94:19:2a:d3:e0:
    c7:dd:83:39:2f:41:16:f7:65:33:bb:f2:24:64:9e:
    28:df:3e:d8:9e:b3:07:75:55:4d:d7:86:c6:94:17:
    ec:a6:7f:ad:ec:b4:f6:c5:3c:77:b1:66:10:2e:6e:
    ab:c5:87:90:0d:29:22:63:6e:08:a8:08:90:cf:07:
    4f:9a:2d
publicExponent: 65537 (0x10001)
privateExponent:
    00:8f:89:dc:d0:81:8b:da:f5:1e:9c:43:14:bc:a4:
    ba:be:5c:21:ac:d0:b8:05:12:32:4b:68:4f:31:a1:
    f8:40:91:53:29:d0:57:6c:9c:5f:56:3b:24:ae:d0:
    24:5c:4b:f5:5a:b7:9c:8a:be:bb:fc:6c:9c:cd:00:
    23:de:17:8e:4d:05:d8:31:09:37:53:b4:af:e5:0c:
    3e:23:9e:bd:c1:b8:87:99:4f:e2:c7:79:f8:de:74:
    2a:a1:17:d5:42:a4:49:25:4b:ea:c2:48:fd:d4:6b:
    f1:78:ef:76:76:bd:6f:1c:5a:d8:43:0b:5a:af:bf:
    51:2b:dd:a9:79:d5:7d:fc:b1:7a:ee:37:1f:84:d0:
    d1:1c:53:fd:d1:15:0e:3b:4e:d9:7c:fb:57:54:c0:
    3e:b7:49:c0:5b:a8:d4:8f:68:e5:38:a6:cf:2d:df:
    13:4e:17:a5:e2:4a:8c:2f:5b:8f:63:ce:ef:61:ca:
    30:ab:46:a3:8b:65:03:37:f0:21:78:0e:94:89:b0:
    71:72:e9:b0:b8:a2:11:9b:70:b5:f1:d4:51:74:b9:
    77:1b:56:d9:9a:36:a9:da:a5:70:05:64:ab:ab:4e:
    ec:40:2e:06:8a:7a:c9:97:8c:82:78:d2:43:9b:75:
    1e:28:71:e5:29:ca:d2:11:5e:93:20:bc:0b:53:d7:
    15:e4:29:df:00:3c:c6:20:a5:6f:c9:4e:8e:f4:e5:
    ac:d9:b9:36:af:4c:36:a5:9d:d5:50:98:c2:5a:69:
    b5:f5:2e:60:01:6c:00:be:05:04:00:19:ca:38:32:
    46:b3:6f:2d:b6:58:da:4c:ea:e0:3e:53:4c:48:40:
    d5:97:9e:91:13:26:83:f4:19:7d:63:b6:e3:42:8a:
    76:13:bf:85:fb:d4:a2:59:89:9b:d6:c4:33:db:fe:
    fb:ce:4d:d9:c6:da:27:02:c5:4f:ed:78:b1:49:6e:
    e1:a7:45:19:0e:ea:fb:56:8f:17:bb:33:f9:7e:73:
    8f:df:47:34:45:68:e5:43:0b:a2:c5:db:5a:60:b6:
    af:28:fd:d6:e0:7b:29:4d:02:f7:8c:e6:ba:5a:ad:
    33:7a:d7:0f:bf:7a:cb:60:65:d0:d0:bf:5f:36:19:
    00:ec:09:dc:3b:86:62:14:63:01:b3:82:7b:45:eb:
    82:41:09:96:59:bf:34:0e:10:40:43:b3:4d:ee:48:
    99:a3:bb:ae:1c:b2:06:0f:57:10:72:0e:ca:1f:27:
    02:bb:63:8e:05:6a:e8:96:ae:ab:64:e6:3c:23:9b:
    63:8f:31:06:1a:49:9c:cd:cc:24:68:0a:c2:56:18:
    83:05:15:b6:9b:c4:e0:aa:76:01:10:fb:05:80:5f:
    f9:16:01
prime1:
    00:d6:a1:d7:08:c8:47:7e:9b:ca:70:df:10:5d:97:
    cb:10:99:16:6b:d7:76:ee:71:3f:28:40:82:36:d5:
    b0:34:f2:d2:9e:5e:59:2f:9f:06:ec:6b:e7:be:25:
    b7:97:31:52:fe:00:97:3b:f4:7d:db:6e:09:a2:ff:
    7c:43:9e:fd:bb:fc:66:54:97:cc:b6:4f:92:a7:4e:
    a5:33:90:a8:02:8a:5c:1d:39:ac:b0:61:18:c3:64:
    66:34:03:14:04:24:8d:8f:92:a6:94:a5:e4:0b:5d:
    6c:8b:a1:76:19:5b:7b:25:fb:37:07:33:6c:55:55:
    87:a6:67:39:d9:d4:de:b3:0d:90:b6:68:c4:42:54:
    ce:d1:6b:3c:90:68:c2:74:5b:46:6f:90:41:4a:7d:
    c3:1a:d9:a8:a3:e2:2e:18:4a:9d:35:df:02:f3:35:
    8e:b7:65:39:aa:ca:a6:57:6b:06:c6:31:75:37:ae:
    38:fd:a0:b2:28:ff:46:c1:88:fd:d8:71:2e:e7:80:
    94:2b:e2:ce:c4:33:4b:de:15:82:d2:eb:24:9d:36:
    64:4c:99:56:a9:06:cc:65:be:b5:89:ef:96:ec:9d:
    2c:55:3d:09:7c:82:ea:37:f0:e9:ea:19:63:ec:13:
    1b:74:d1:45:b9:11:33:b8:49:6a:3d:4e:bf:9c:59:
    b2:81
prime2:
    00:b9:16:65:76:23:eb:ad:46:72:d2:79:e1:1f:a7:
    d9:49:66:d6:bf:60:31:75:6c:76:68:aa:38:ec:26:
    b2:ab:40:54:a2:24:b3:9c:a4:86:2d:27:d3:93:49:
    75:a9:f6:e3:eb:79:73:db:bc:b4:ff:0e:ae:ae:6a:
    6e:12:01:01:43:10:26:da:2b:45:39:ed:8b:12:59:
    6b:8a:19:e6:50:c2:72:c4:8b:2a:f4:c7:2a:a7:00:
    9d:4c:25:2f:6b:32:77:2f:c8:c6:f4:ec:8d:17:67:
    ac:45:fc:41:5d:a8:ab:8d:1f:6f:6b:41:23:cd:17:
    7c:1c:92:0f:2e:ca:10:f7:46:6f:32:36:fc:a6:cf:
    68:56:63:a6:17:39:a8:d3:95:f4:16:a0:be:3a:85:
    98:d3:bc:0d:8c:91:1e:c4:84:9d:5c:93:b9:73:a5:
    91:b2:4f:bc:a2:11:36:78:8d:25:10:48:3f:48:85:
    b7:01:6d:2d:91:94:08:c1:fb:4c:af:bd:68:a8:c1:
    62:2c:cf:03:39:25:49:ff:7f:a6:87:86:96:eb:8a:
    9f:93:34:1b:89:af:08:26:55:b4:e1:70:ea:9d:90:
    ee:3d:63:5d:46:10:11:cb:3d:be:0c:a8:6c:07:d0:
    35:eb:ff:24:b3:23:78:68:da:69:76:95:ef:59:d3:
    79:ad
exponent1:
    00:be:88:18:de:20:fc:e6:b5:e1:f6:64:ee:a0:47:
    19:ea:f8:1b:61:4c:7a:b5:9d:2e:95:ca:fe:4d:33:
    51:23:0f:d4:4c:e6:30:82:07:c8:1b:a4:86:aa:d3:
    cc:b0:99:06:b5:99:4c:a7:da:98:c7:6c:5d:7d:a7:
    13:66:ec:03:0f:18:36:b7:2d:b2:7a:bd:14:d1:15:
    0d:ae:42:e2:02:af:54:aa:55:02:a9:e8:e8:14:bc:
    51:c6:26:5d:64:78:16:7a:b7:92:cd:2e:9e:cc:3f:
    f9:15:d3:15:85:d9:21:ef:4b:9d:43:f5:30:5c:68:
    7a:ed:0b:81:dd:90:0c:ca:22:66:ae:a7:3e:62:2b:
    eb:15:18:ff:40:aa:de:c4:70:2a:8c:eb:20:2a:c2:
    8d:aa:8e:42:18:89:b6:a5:b5:c6:ed:85:b5:96:b5:
    9a:a5:cf:64:6b:eb:4d:d3:18:9d:80:df:72:d1:25:
    06:4e:90:92:d7:b6:15:d7:c4:86:a3:d7:85:ed:d8:
    c4:b0:58:bd:78:8a:98:f4:e3:5f:a9:61:38:b5:9f:
    0d:56:ba:60:a5:d7:f5:26:f5:2f:2e:ed:d3:aa:e4:
    b3:f0:4f:28:d6:b1:58:be:a4:4c:e2:95:fb:90:1c:
    3e:29:6b:85:5b:8e:9b:bd:22:de:fe:e1:a3:53:66:
    85:01
exponent2:
    69:6e:8c:95:63:98:d8:b7:8c:a8:c0:ac:b0:af:98:
    62:eb:a5:e0:96:17:16:60:96:82:c0:94:74:51:06:
    ed:ee:53:47:99:c8:86:ae:61:90:4f:63:82:3f:12:
    3b:a3:5b:e9:c2:e1:70:86:6a:43:f0:45:29:2d:8f:
    4d:ca:2c:c1:da:ed:86:d1:a7:39:7c:4b:00:44:d7:
    b1:6f:57:77:21:8c:e6:d0:af:c3:87:c0:90:29:15:
    71:4e:ad:58:4f:02:fd:c1:4d:34:2f:9b:9f:7d:7a:
    f0:d2:e5:19:48:ff:90:00:1c:23:e8:93:50:3c:d4:
    82:21:e1:6c:31:c6:c0:54:ea:fa:9b:c0:07:f5:95:
    e5:c0:15:d8:9d:0b:c2:9b:64:d3:8e:f5:4d:b8:d4:
    79:a8:61:bf:74:db:25:ee:b5:05:0b:51:54:c3:37:
    df:6e:f4:71:0d:85:0d:de:b9:02:31:65:7b:16:50:
    4d:0b:b8:2d:79:3a:13:e5:e6:a5:25:2b:fd:15:4b:
    ab:62:b0:df:58:92:72:6c:70:9c:3a:da:b5:89:dd:
    a4:a8:c6:17:04:11:8c:64:be:08:bd:9d:a7:eb:eb:
    0a:25:13:f8:d9:26:89:b3:be:12:cf:cd:da:15:8c:
    e1:c6:11:4d:ca:22:c8:f7:c1:a3:bf:7c:fc:9a:2e:
    71
coefficient:
    70:d9:59:b6:09:46:d6:0b:52:25:80:75:36:ac:49:
    e0:07:51:75:73:a6:ac:c6:6a:48:9f:78:f8:12:28:
    a0:c0:ef:b6:ec:6f:5c:9a:94:39:e0:2b:d1:8e:9d:
    7c:17:0d:bf:64:00:68:93:c0:bc:79:d9:be:54:cb:
    56:45:de:60:5c:54:cf:2b:b9:66:58:99:c6:27:45:
    b6:78:67:23:74:e0:ab:1d:9c:77:b0:5c:68:7a:bd:
    15:77:2d:dd:41:b7:16:b4:04:09:86:a5:01:6c:8a:
    82:c0:b9:16:21:08:2b:b0:d7:65:09:08:9a:78:aa:
    81:cf:47:10:ae:3e:94:90:db:36:a9:77:e3:cd:38:
    3c:c4:f8:11:fd:86:a9:a6:ce:0e:f7:2a:09:50:aa:
    55:52:23:25:70:78:11:1a:2f:f0:b2:01:f1:32:af:
    c6:86:fc:fa:b5:83:16:ef:32:17:8e:06:30:e7:be:
    4d:77:d0:49:cb:eb:22:f5:d5:d2:86:c1:66:c0:54:
    34:32:85:34:b8:71:48:e6:81:93:1a:fa:9c:d3:b8:
    fc:79:51:4d:57:e7:66:e1:da:fd:22:bb:74:aa:14:
    87:c5:c6:95:0b:20:ec:df:a6:d7:cf:b4:b4:91:28:
    2f:10:25:75:42:18:2d:15:03:ce:ad:54:1d:82:c4:
    e7
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

(๑•̀ㅂ•́)و✧ヨシッ

問題文の最初のヒントがcipherだとすると、とりあえず公開鍵は使わずに復号できそう。

$ base64 -D cipher.txt > cipher
$ openssl rsautl -decrypt -inkey prikey -in cipher
unknown-123-246-470-726.herokuapp.com

なんか hostname っぽいのが出てきた!Web問になったぞ。とりあえずブラウザで覗いてみます。

f:id:kusuwada:20200126105857p:plain

おぉ、日本アニメ的空間…!

ページのソースコードを見てみると

   <p hidden>9 20 30 15 16 5 14 19 30 27 29 8 20 13 12 28</p>
   <p hidden>"abcdefghijklmnopqrstuvwxyz[]. "</p>

こんな行が。[index],[候補文字列]として解読を試みます。

#!/usr/bin/env python3

candidates = "abcdefghijklmnopqrstuvwxyz[]. "
arry = [9, 20, 30, 15, 16, 5, 14, 19, 30, 27, 29, 8, 20, 13, 12, 28]

flag = ''
for a in arry:
    flag += candidates[a-1]
print(flag)

実行結果

$ python solve.py 
it opens [.html]

意味のある言葉になったけど…。どうして良いのかわからない…。

ページのソースコードにもありましたが、conloseに会話が表示されます。

f:id:kusuwada:20200126105957p:plain

drawer(引き出し)の中にある…。

うーん、このgifを解析するのか?でもwebだしなぁ…。一応stringsコマンドくらいは打ってみたけどめぼしいものは出てこなかったし…。
さっきのもう一つのヒントit opens [.html]ってのも気になる。なにかワードをつけて、例えばflag.htmlみたいにして開くよってことかな…。

( ✧Д✧) カッ

drawer.html!
ということで http://unknown-123-246-470-726.herokuapp.com/drawer.htmlにアクセスすると、コードにflagが埋まってました!!!

f:id:kusuwada:20200126110023p:plain

Rice Tea Cat Panda CTF writeup [Forensics]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Forensics ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

[Forensics] BTS-Crazed (75pt)

My friend made this cool remix, and it's pretty good, but everyone says there's a deeper meaning in the music. To be honest, I can't really tell - the second drop's 808s are just too epic.

Hints

https://github.com/JEF1056/riceteacatpanda/raw/master/BTS-Crazed (75)/Save Me.mp3

Save Me.mp3がDLできます。

strings -> grep で出た。

$ strings Save\ Me.mp3 | grep rtcp
rtcp{j^cks0n_3ats_r1c3}N

[Forensics] Allergic College Application (100pt)

I was writing my common app essay in Mandarin when my cat got on my lap and sneezed. Being allergic, I sneezed with him, and when I blew my nose into a tissue, the text for my essay turned really weird! Get out, Bad Kitty!

Common_App_Essay.txtが配布されます。

Ëæ×Åʱ¼äµÄÍÆÒÆ£¬ÎÒƳ¼ûÁËÎҵĻ𳵵ǻúƽ̨¡£¾ÍÏñÒ»¸ö·è¿ñµØÔڷ籩ÖÐÑ°ÕҸۿڵĴ¬³¤£¬ÎÒÔÚÈËÃǶ¯µ´µÄº£ÑóÖÐÍÏÀ­×Ô¼º£¬ÊÔͼ±ÜÃâÔÚÊÀ½çÉÏ×î³¾ÍÁµÄ³ÇÊÐÖб»À§ - »ò±»¼ṳ̀£º±±¾©£¬ÖйúµÄÊ׶¼ºÍÑÌÎí¡£

ÐÒÔ˵ÄÊÇ£¬ÎÒµÇÉÏÎҵĻð³µÖ»Ð輸ÃëÖÓ£¬¶øÇÒûÓбä³É¼å±ý - ×ÜÊÇÒ»¸ö¼ÓºÅ¡£ÊÛƱԱ»¶Ó­ÎÒÉÏ´¬¡£×îºó£¬ÊÇʱºò»Øµ½ÉϺ£ÁË¡£

ÕâÊÇ2012ÄêµÄÏÄÌ죬ÉϺ£²»»á³¤¾Ã»Ø¼Ò¡£ÔÚÁíÒ»¸öÐÇÆÚ£¬ÎÒ½«´©Ô½È«Çò£¬ÔÚÒ»¸öÃûΪÏÄÂåÌصÄÒìÓò¿ªÊ¼ÐµÄÉú»î¡£

ÄĸöÊǼң¿ÎÒÒªÀ뿪µÄµØ·½»¹ÊÇÎÒҪȥµÄµØ·½£¿µ½´ï»¹ÊÇÀ뿪£¿¾ÍÏñÒ»¸ö´ÅÌõ¶ÏÁѵÄÖ¸ÄÏÕ룬ÎÒÎÞ·¨¾ö¶¨ÎÒÕæÕýµÄ±±·½¡£

²»Îȶ¨£¬ÎÒתÏòÎÒÓÀÔ¶´æÔÚµÄÊéÒÔ»ñµÃ°²Î¿¡£½ñÌìÊÇTim O'Brien´øÀ´µÄ¶«Î÷£¬ÒѾ­Ä¥Ëð£¬ÂÔ΢Öå°Í°Í¡£ËûÃÇ˵×îºÃµÄÊé»á¸æËßÄãÄãÒѾ­ÖªµÀµÄ¶«Î÷£¬ÓëÄã×Ô¼ºµÄ˼ÏëºÍÇé¸Ð²úÉú¹²Ãù¡£ÔÚÎÒ¶Áµ½µÄʱºò£¬¾ÍºÃÏñÎÒµÄÏë·¨µÄ·ç±©ÔÚÖ½ÉÏƴд³öÀ´¡£µÙÄ·¡¤°Â²¼À³¶÷£¨Tim O'Brien£©µÄÕ½Õù»°ÓïÖÐÒç³öµÄ³¬ÏÖʵ¸ÐÉø͸µ½ÁËÎÒµÄÊÀ½ç¡£ËûµÄ»°Óï²»ÖªºÎ¹Ê³ÉΪÎҵĻ°ÓËûµÄ¼ÇÒä³ÉÁËÎҵļÇÒä¡£¾¡¹Ü×Óµ¯ÁгµËٶȺܿ죬µ«ÎÒµÄ˼Ð÷ÈÔÈ»ÍêÃÀ - ±»À§ÔÚÊéµÄÐðÊöºÍÎÒ×Ô¼ºÉú»îµÄÐðÊöÖ®¼ä¡£

ÎÒ¾õµÃÎÒÓ¦¸Ã¸Ðµ½²»°²£¬µ«ÎÒ²»ÊÇ¡£ÎÒ¶ÁÁË×îºóÒ»Ò³²¢¹ØÉÏÊ飬¶¢×ÅÉÁÁÁµÄÓãÌÁºÍÄþ¾²µÄµ¾ÌïµÄ´°»§¡£ÎÒ¾õµÃ»ð³µÍâÃæÓÐÒ»ÍŻҳ¾£¬Æ¯¸¡£¬Âú×ã²¢ÇҺܸßÐËÔÚÄ¿µÄµØÖ®¼ä¡£

ÎÒÔÚÊÀ½çÖ®¼äµÄ¼Ò¡£ÎÒ˵ӢÓïºÍÖÐÎÄ£ºÖÐÎÄÊÇÊýѧ£¬¿ÆѧºÍ¹ý³Ì£¬µ«ÎÒ¸üϲ»¶Ó¢Ó²»ÂÛÊÇÒÕÊõ£¬Çé¸ÐºÍÃèÊö¡£ÃÀ¹úÓµÓÐÎÒµÄͯÄ꣬³äÂúÁËËÉÊ÷£¬Ò»Ãù¾ªÈ˵ĵçÓ°ºÍÌ«ºÆºþµÄÑ©;ÖйúÓµÓÐÇà´ºÆÚ£¬°éËæ׏¤ÒµÑÌÎí£¬Ñ¸ËÙµÄÁ÷¶¯ÐԺͿì½Ú×àµÄÉç½»³¡¾°¡£

ÎÒÃÇÕýÔÚ½øÈëÉϺ£ºçÇÅÕ¾¡£ÎÒµÄåÚÏ벢ûÓнáÊø£¬µ«ÎÒ¶Ô×Ô¼ºµÄÎÊÌâÓÐÁ˴𰸡£ÎÞÂÛÊÇÃÀ¹ú»¹ÊÇÖйú£¬¼Ò¶¼²»Êǵ½À´Ò²²»Êdzö·¢¡£¼ÒÊÇÖмäµÄ£¬¹ý¶ÉµÄ¼â¶Ë - ÕâÊÇÎҸе½×îÂúÒâµÄµØ·½¡£

ʲôÓÐÓã¿

ÔÚÎÒÃǵÄѧԺÂÛÎÄClich¨¦s±ÜÃâ·¢Ìûʱ£¬ÎÒÃǽ¨ÒéѧÉú²»ÒªÐ´¹ØÓÚ´ÓÍâ¹úÒƾÓÃÀ¹úµÄÎÄÕ¡£ºÜ¶àʱºò£¬ÕâЩÎÄÕÂÊǹ«Ê½»¯µÄ£¬Ã»ÓÐÎüÒýÁ¦ - ±Ï¾¹£¬ËäȻѧϰһÃÅÐÂÓïÑÔºÍÎÄ»¯¿Ï¶¨ÊÇÒ»¸öÌôÕ½£¬µ«Ã¿Ì춼ÓÐÊý°ÙÍòÈËÕâÑù×ö£¬ËùÒÔËü¸ù±¾²»ÊÇÈÃѧÉúÓëÖÚ²»Í¬µÄ¶«Î÷¡£

ÕâƪÎÄÕÂÊÇÈçºÎ½²ÊöÒÔ¶ÀÌØ·½Ê½ÒƾÓÃÀ¹úµÄ¹ÊʵÄÒ»¸öÀý×Ó¡£ÕâÃûѧÉúרעÓÚÒ»¸öÎÊÌâ - ÔÚÄÄÀ - Ïò¶ÁÕßչʾÁËËû×÷Ϊһ¸öÈ˵ÄÉí·Ý¡£Í¨¹ýÕâƪ¾«ÐıàдµÄÎÄÕ£¬ÎÒÃÇÁ˽⵽ѧÉú¹ý×ŷdz£¹ú¼Ê»¯µÄÉú»î£¬Ñ§ÉúÓÐÎÄ×Ö£¬Ñ§Éúϲ»¶ÎÄѧ£¬Ñ§ÉúÊÇË«ÓѧÉú¶Ô±ä»¯¸Ðµ½ÐË·Ü¡£ÕâƪÎÄÕÂÊÇÒ»ÖÖÔĶÁµÄÀÖȤ£¬·ÖÏíÁËѧÉú¸öÐÔµÄÏêϸһƳ£¬¶ø²»ÊǸоõËüÊÔͼÁгö»ý¼«µÄ¸öÈËÆ·ÖÊ¡£

{ÎÒ_Ö»_ÐÞ¸Ä_ÁË_Á½_´Î}

文字化けしたみたいになってるけど、最後がflagっぽい。

問題文にin Mandarinとあるので調べてみた。文字化けだとしたら、何語なのかがわかるかと思って。

マンダリン (Mandarin)

マンダリン (官僚) - 官吏。以下はこれから派生。

中国語の官話(北京官話)のこと。17世紀、華南に渡来した宣教師が、土着の言語のほかに官署で話されている公用語があることに気付き、これを官僚(マンダリン)の言語と呼んだことに由来する。

それに由来して、中国語の標準語である標準中国語(中華人民共和国普通話中華民国の国語など)のこと。

という事で中国語が怪しい。
他の問題で使ってみた、CyberChefを試してみます。

f:id:kusuwada:20200126100309p:plain

今回みたいに、色々ササッと試したい時は、とても使いやすくて良い!!

最後の -*-*{我_只_修改_了_两_次}をflag形式に直してrtcp{我_只_修改_了_两_次}を入れたら通りました!

[Forensics] cat-chat (125pt)

nyameowmeow nyameow nyanya meow purr nyameowmeow nyameow nyanya meow purr nyameowmeow nyanyanyanya nyameow meow purr meow nyanyanyanya nya purr nyanyanyanya nya meownyameownya meownyameow purr nyanya nyanyanya purr meowmeownya meowmeowmeow nyanya meownya meowmeownya purr meowmeowmeow meownya purr nyanyanyanya nya nyameownya nya !!!!

Hints

once you've figured this out, head to discord's #catchat channel.

問題文をよーく見ると、nya, meow, purr しか出てきていない。しかもpurrは単独で使われることしかなさそうだ。なので、実質nya, mewo。2値といえば バイナリデータ か モールス信号かな?今回は空白があること、purrが改行っぽいことからモールス信号と当たりをつけて変換してみます。

手動でちょこちょこやったらそれっぽかったので、猫ちゃん語を人語に変換するツールを作った。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

catchat = "nyameowmeow nyameow nyanya meow purr nyameowmeow nyameow nyanya meow purr nyameowmeow nyanyanyanya nyameow meow purr meow nyanyanyanya nya purr nyanyanyanya nya meownyameownya meownyameow purr nyanya nyanyanya purr meowmeownya meowmeowmeow nyanya meownya meowmeownya purr meowmeowmeow meownya purr nyanyanyanya nya nyameownya nya"

mors_map = {"A": ".-",
            "B": "-...",
            "C": "-.-.",
            "D": "-..",
            "E": ".",
            "F": "..-.",
            "G": "--.",
            "H": "....",
            "I": "..",
            "J": ".---",
            "K": "-.-",
            "L": ".-..",
            "M": "--",
            "N": "-.",
            "O": "---",
            "P": ".--.",
            "Q": "--.-",
            "R": ".-.",
            "S": "...",
            "T": "-",
            "U": "..-",
            "V": "...-",
            "W": ".--",
            "X": "-..-",
            "Y": "-.--",
            "Z": "--..",
            "0": "-----",
            "1": ".----",
            "2": "..---",
            "3": "...--",
            "4": "....-",
            "5": ".....",
            "6": "-....",
            "7": "--...",
            "8": "---..",
            "9": "----.",
            "(": "-.--.",
            ")": "-.--.-",
            "-": "-....-",
            "_": "..--.-",
            ".": ".-.-.-",
            ",": "--..--",
            ":": "---...",
            "?": "..--..",
            "start": "-...-",
            "end": ".-.-."
            }

def morse_to_message(mor):
    arry = mor.split(' ')
    message = ''
    try:
        for a in arry:
            message += [k for k, v in mors_map.items() if v == a][0]
    except:
        message += a
    return message

## create morse
signal = ''
arry = catchat.split()
for a in arry:
    while a != '':
        if a.startswith('nya'):
            signal += '.'
            a = a[3:]
        elif a.startswith('meow'):
            signal += '-'
            a = a[4:]
        elif a.startswith('purr'):
            signal += '\n'
            a = a[4:]
        else:
            raise('what is ' + a)
    if not signal.endswith('\n'):
        signal += ' '
# print(signal)

## comvert morse to message
human = ''
for l in signal.split('\n'):
    human += morse_to_message(l.strip())
    human += (' ')
print(human)

実行結果

$ python solve.py
WAIT
WAIT
WHAT
THE
HECK
IS
GOING
ON
HERE

いい感じ。さて、変換できたので、今度はDiscordの#catchatチャンネルに行ってみます。

f:id:kusuwada:20200126100333p:plain

おびただしい数の猫語での会話。100個はあるんじゃなかろうか。これ全部翻訳していくのはプログラムがあっても大変そう...。
けど、Dicordの特定チャネルの内容をAPI取得するのは、Rule的に禁止されているようなのでやめて、結局会話をテキストファイルに全部コピペして変換しました。

上記のプログラムを、テキストから読み出すように変更し、

$ python solve.py > human.txt

human.txtRTCPを検索するとflagが出てきました。

TH15_1Z_A_C4T_CH4T_N0T_A_M3M3_CH4T

flag: rtcp{TH15_1Z_A_C4T_CH4T_N0T_A_M3M3_CH4T}

モールス信号、今までなんとなくオンラインツールや手動で変換してたので、副産物でモールス信号解読スクリプトができた✌。

[Forensics] catch-at (129pt)

636274425917865984

これだけ。ヒントもなし。

タイトルがさっきのcat-chatとハイフンの位置だけ違うのが気になる。あと情報量が少なすぎるので、さっきの情報量が多すぎたcat-chatと関連があるような気がする。

ということで、Discordの#cat-chatチャネルにまた戻って眺めていると、URLが

https://discordapp.com/channels/624036526157987851/633364891616411667/{行のID}であることに気づく。
最後の行に 636274425917865984 を入れてアクセスすると、猫語が一つ手に入る。これをさっきのスクリプトで翻訳すると

$ python solve.py 
OH BY THE WAY, HERE'S A LITTLE SOMETHING: W0W_D15C0RD_H4S_S34RCH_F34TUR35 

flag: rtcp{W0W_D15C0RD_H4S_S34RCH_F34TUR35}

[Forensics] Chugalug's Footpads (150pt)

Chugalug makes footpads that he can chug and lug. However, his left one is different from his right... I wonder why?

left.jpgright.jpgが配布されます。

f:id:kusuwada:20200126100538j:plain:w200 f:id:kusuwada:20200126100459j:plain:w200

macのプレビューで開くと、明らかに左が壊れています。

  • chug: 一気飲み/ぽっぽと音を立てる
  • lug: 引きずる
  • chug-a-lug: 一気に飲む

うーん、完全に英語のお勉強(でもよくわからない)になっている。海外CTFはそこが難しくて楽しい。(でもよくわからない)

$ cmp -l left.jpg right.jpg 
  1720 162 122
  1721 164 115
  2041 143 105
  2042 160 121
  2328 173 160
  2329 124 165
  2330 150 102
  2854  63 240
  2855 172  63
  2856 145 154
  3016 137 144
  3017 136 201
  3019 162  24
  3110  63 161
  3332 137  14
  3626 156  21
  3627  60 232
  4215 124 112
  4405 143  40
  4413 110   2
  4775  64  62
  4776 156 347
  5125 103  57
  5149  61 114
  5150 141 112
  5400  65 364
  5401 175 362

とりあえずバイナリの比較を出してみた。壊れている左足のほうの値を8進数の配列としてchr(n)してあげると、flagが出てきた。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

cipher = [162, 164, 143, 160, 173, 124, 150, 63, 172, 145, 137, 136, 162, 63, 137, 156, 60, 124, 143, 110, 64, 156, 103, 61, 141, 65, 175]

for c in cipher:
    print(chr(int(str(c),8)), end='')

実行結果

$ python solve.py 
rtcp{Th3ze_^r3_n0TcH4nC1a5}

[Forensics] BASmati ricE 64 (150pt)

There's a flag in that bowl somewhere...

Replace all zs with _ in your flag and wrap in rtcp{...}.

rice-bowl.jpgが配布されます。

f:id:kusuwada:20200126100756j:plain

画像系なので、とりあえず GitHub - DominicBreuker/stego-toolkit: Collection of steganography tools - helps with CTF challenges にかけてみます。いろいろ試した所、steghide を実行したら何か出てきました。

# steghide extract -sf rice-bowl.jpg -xf output.txt
Enter passphrase: (just press enter)
wrote extracted data to "output.txt".
# cat output.txt
?I??Y??;a?x9?
??y??=?

flagにはちょうど良さそうな長さのデータが抽出されています。
バイナリとして読み込んで表示させてみたところ、\xb3I\xb7\xb7Y\xb7\xe7;a\xd6x9\xcc\n\xf7\xcfy\xdc\xd0=\xddとのこと。
intの配列になおすと 179, 73, 183, 183, 89, 183, 231, 59, 97, 214, 120, 57, 204, 10, 247, 207, 121, 220, 208, 61, 221。レンジ的にそこそこ良心的っぽい。

ここでタイトルに注目します。大文字だけ見るとBASE64。あやしい。
ということで、このバイナリ列を base64 decode してみましたが、paddingが不正とのこと。じゃあ逆にencodeしたれ!と思ってやってみた。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import base64

with open('steghide.txt', 'rb') as f:
    data = f.read()

print(data)

decoded = base64.b64encode(data)
print(decoded)

実行結果

$ python solve.py 
b'\xb3I\xb7\xb7Y\xb7\xe7;a\xd6x9\xcc\n\xf7\xcfy\xdc\xd0=\xdd'
b's0m3t1m35zth1ng5zAr3z3nc0D3d'

おや!読めるものが出てきたぞ!問題文の通り、z_に置換してrtcp{}で囲ったら、通った!

flag: s0m3t1m35_th1ng5_Ar3_3nc0D3d (sometimes things are encoded)

[Forensics] Clean Pandas (250pt)

You see, I want my pandas to be squeaky clean, just like the Holy Rice Goddess requires you to make your rice squeaky clean before cooking.

pandas.pkl,soap.pklが配布されます。

問題文からすると、soapでrice...はないので、pandasを洗ってあげるのが良さそう(意味不明)

pkl 拡張子 で検索すると、こんな記事が引っかかりました。

Pythonでコマンドラインからpickleの中身を確認する - Qiita

おお、これっぽい。pythonのpickleってやつ。pythonのドキュメントはこちら

pickle モジュールは Python オブジェクトの直列化および直列化されたオブジェクトの復元のためのバイナリプロトコルを実装しています。"Pickle 化" は Python オブジェクト階層をバイトストリームに変換する処理、"非 pickle 化" は (バイナリファイル または バイトライクオブジェクト から) バイトストリームをオブジェクト階層に復元する処理を意味します。

こんなのがあるんですね。知らなかった。
配布されたファイルを、非pickle化してみます。

$ python -m pickle soap.pkl 
[b'sI33vvCGh735Lt9I5r2FNLbt-aigcrcADtEJWml-D8I=',
 b'2xruhrC7Gbkne6DAwl9R6UwcVG5PRgdezJJEkxzdGco=',
 b'WCE6_c1QCjGLp6LsnYki9pCPSmQZepgDrdi5p4LejR0=',
 b'm_Modz8huoecjj3GatHepBDPt4eGUdHLwwmXMOaQBIw=',
 b'OE4w7zepYc3KO0XdZl-BTKffJJGgEWBHOAT1ws6my_4=',
 b'b5tgnBeA1ac5S6fMHWv2civwLcKAlK8JrroYN5fktkE=',
 b'x-nsrRdnmU7RQpn57_48iT-BRinBhVT3fOOcgYJb9Ks=',
 b'gZINGc-CaTbKAvKQPkN-lcDqMa9HnPe5jqTRupLAF3s=',
 b'rqu87SluCPDRxCUQlgeK56yiXekrJjq3_owc9NApDbg=',
 b'_mLyz6HuEXa3Kh13QBGgf5NE2gLN2oupWhz7Dj2motM=',
 b'KL27tGZETxxDFbyEc1PH8d4ptnGppGQLNVVbCfdDIzY=',
 b'LuqCo-qavxRNuIR2ipLiQ6l6s0aQIo508nzoMcGMKaM=']

同じくpandas.pklを非pickle化しようとすると、ModuleNotFoundError: No module named 'pandas'が出たので、
pip install pandas==0.24.1でinstall。※最新版の0.25.*だと warning が発生したため、暫定的にバージョンを下げてみた。
再度非pickle化してみます。

$ python -m pickle pandas.pkl 
                                            Todolist  ...                    unknown step 923426390324272983
0  b'gAAAAABdpj5DDTyLF2fNzCGlbiIChbh5-02R0a-nugJX...  ...  b'gAAAAABdpj5EoybPiqaRJtGayObj_1Up3D9PqlCxySI5...
1  b'gAAAAABdpj5DqNjA20qHEjrCBvFbCW-D5Fo96UPt_177...  ...  b'gAAAAABdpj5EqMj7oG_qZ2gSNSlwSKUvrw84537w6xgM...
2  b'gAAAAABdpj5DcrqcD3GMoaiWO2P5_4TI-qLJilzQIro3...  ...  b'gAAAAABdpj5EBtvM821QtU9bF7IoLptiI_rQgY0bjzNo...
3  b'gAAAAABdpj5DQEcMd-8Uy2iVADyWzpmWIBNsGu1vw8Jb...  ...  b'gAAAAABdpj5ENHdnxYWHu4KI0lIOVrIUWlKxuK41FZUq...

[4 rows x 13 columns]

この文字列、soapの方は base64 decodeできそうに見えますが、意味の有りそうな文字列になりません。pandasのほうはgAAAAAで始まるのが目に付きますが、なんのことやら?

しばらくほっといたあと、Wrath of the Rice Goddess チャレンジを解いていたら同じような文字列が出てきたので、これだ!と
cryptography.fernetを疑ってみました。鍵の長さもpaddingの数も合ってそうです。

が、soapkey,pandasをencoded dataとして解読を試みるも、

cryptography.exceptions.InvalidSignature: Signature did not match digest.

と冷たい反応。そういえば、上の pandas の unpickle の出力、なんか省略されてるような感じなんだよなぁ…。[4 rows x 13 columns]って書いてあるけど、そんなに無いし…。

更にしばらく期間をおいていたら、pandasライブラリにunpickleの機能があればフルの情報がunpickleされて見れるのでは?と思いつき、pandasライブラリを調べてみました。

pandas.DataFrame, Seriesをpickleで保存、読み込み(to_pickle, read_pickle) | note.nkmk.me

ありました!read_pickle()関数を使えば良さそう。早速実装してみます。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from cryptography.fernet import Fernet
import pandas as pd

soap_df = pd.read_pickle('soap.pkl')
pandas_df = pd.read_pickle('pandas.pkl')

print(pandas_df.columns)

for j in range(12):
    for i in range(4):
        for k in range(12):
            key = soap_df[k]
            f = Fernet(key)
            try:
                dec = f.decrypt(pandas_df[pandas_df.columns[j]][i])
                print(dec.decode(), end='')
                #print(str(k))
                break
            except:
                continue
    print()

column一覧を表示してみると、めっちゃ出てきたので行けたっぽい!ので、そのまま復号まで実装してみました。

実行結果

$ python solve.py
Index(['Todolist', 'Side note', 'unknown step', 'unknown step 0',
       'unknown step 1246523', 'unknown step 39865432',
       'unknown step 26745643547', 'unknown step 69821830',
       'unknown flag 394052487124', 'unknown step 446537364',
       'unknown step 53920324379187589', 'unknown step 890348',
       'unknown step 923426390324272983'],
      dtype='object')
slayDemon
notUseful
binary image
binary to string
shift by lucky number
binary to string
base 32
byteencode to integerthough bytes from hex
rtcp{CAr3fu1_wH^t_y0u_c134n_696}
split in intervals of 5
base 85

unknown flag 394052487124の行を復号すると、flagが出てきました٩(๑❛ᴗ❛๑)尸

この問題、自分が時間が取れるぎりぎりで解いたので、この問題を解いたら出てきた問題に手がつけられなかった…。けど、明らかに情報がたくさん得られていて、flag以外の行自体がもう問題みたいになってるので、きっとこれを使う問題があるに違いない。

Rice Tea Cat Panda CTF writeup [Misc]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Misc ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

[Misc] Strong Password (1pt)

Eat, Drink, Pet, Hug, Repeat!

flags are entered in the format rtcp{flag}

Hints

  • Words are separated by underscores ("_")

  • Come on, repeat it! Just once!

問題文の"Eat, Drink, Pet, Hug"を一度繰り返してみたけど違ったので、このCTFの名前を繰り返して入れてみたら通った。

flag: rtcp{Rice_Tea_Cat_Panda_Rice_Tea_Cat_Panda}

[Misc] A Friend In Need Is A Friend Indeed (50pt)

Hm, I see a lot of potential friends in the midst of that discord, but... one is not like the others; maybe I'll slide into their dms and strike up a conversation about passwords!

Hints

  • You had better slide into their dms. I swear if you don't....

  • Is there a chance... that you already have the solution, right in your mouth I mean fingers I mean hands? I dunno what I'm talking about anymore

  • JD, if that helps any

ということで、DiscordでJD(bot)さんを見つけ、DMを送ってみます。何を送って良いのか全然わからなかったので、"Please give me the password" とか "Give me flag" とか、あとはbotとの雑談を楽しんだりして時間を溶かしていました。

一日後にふと再度問題文に目を通したとき、flagじゃなくてpasswordについて話しましょう、と言っているところに引っかかり。ひとつ上の問題のタイトルに Password が入ってたなー!ということで、一個上の問題のflagを送ってみるとこの問題のflagを教えてくれました。

f:id:kusuwada:20200126014445p:plain

余談ですが。botと初めて会話したんですけど、英語なのもあってなかなかそれっぽいこと喋ってくれてる気がする…。しゅごい…。

[Misc] Off-Topic (28pt)

#off-topic

Hints

※この問題のHintsはポイントと引き換えの様子。開かなかった。

Discordの #off-topic チャネルを覗いてみます。チャネルの説明に

who here knows the name of the catpanda in the server picture? will give points if you know

とあります。

CTFサイトのトップに居る猫ちゃんのことかな?と思い、トップの画像のURLと代替テキスト(alt)を確認してみました。

<img class="img-responsive ctf_logo" src="/files/d063935a8cfc065550060fb9b49cf5f7/riceteacatpanda.png" height="25" alt="🍚🍵🐈🐼">

riceteacatpandaと🍚🍵🐈🐼をflagに入れてみましたが、違うみたい。

Discordにいるかも知れないと思い、Discordのユーザー一覧をざっと眺めましたが、この写真のアイコンはなさそう。

再度top画面のソースを見ると、もう一つありました。

<img class="w-100 mx-auto d-block" style="max-width: 350px;" src="/files/71a3cdff21828480efb3bd1a2203c159/riceteacatpanda.png" alt="Jubie">

おや、altが名前っぽいぞ!

flag:rtcp{Jubie}

[Misc] Survey! (100pt)

Wew a survey!!! Free points are always nice :3

Hints

https://forms.gle/mRdF6A5FFLBukrwh6

終盤に出てきました。アンケートです。
アンケートに答えて送信するとflagがもらえました。

f:id:kusuwada:20200126014709p:plain

Rice Tea Cat Panda CTF writeup & record

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF に参加していました。

🍚🍵🐈🐼

このCTFは、Twitterで流れてきて知りました。初心者向け、picoCTFとカテゴリが似てそうなこと、そして何より開催期間が平日&長めで、娘sのお昼寝・就寝時間に時間を使って取り組めそうなことから、割としっかり参加しました٩( 'ω' )و 
解いてみたら結構解ける問題・面白い問題が多かったので、ハマってしまったというのもある。

戦績

戦績は、31問解いて 10177 pt。40位でした。1pt以上入れたのが1323チーム、登録が2435チームだったみたい。(オフィシャルな数字ではない)
今まで参加した中では一番良い成績なのでは!
※とはいえこのCTF、配点が偏りまくっており、解いた問題に順位がえらく左右されるためあまり参考にはならないと思う。

f:id:kusuwada:20200126011947p:plain

見ての通り、RevとBinaryは例によって全滅ですが、他は結構手が出せて楽しかった!Revの1問目は解けると思ったんだけどなぁ…。
残念ながら時間切れで泣く泣く終わりましたが、CryptoやGeneralはまだまだ解ける問題が残ってそうな感じだった。一人チームの辛いところ。圧倒的に時間が足りない。
writeup書きながら、解けなかった問題をその場でまた解きそうになるくらい、CTFも楽しかったし、まだまだ楽しみたかった!

f:id:kusuwada:20200126012018p:plain

1万点超えて嬉しい。最初「化け物か」と思っていた NekochanNano! が意外と近くにいてびっくり。

f:id:kusuwada:20200126012027p:plain

guessingなflagも多かったため、失敗flagもガンガン突っ込みました。きれいにフォーマットに従ったフラグが、きれいに出てくる問題が好きです。ええ。

writeup list

writeupは、今回ジャンル別に書きました。後追いでやったら追記していく予定です。

以下、解いた問題(ジャンル別)一覧です。

  • [Cryptography] HOOOOOOOOOOMEEEEEE RUNNNNNNNNNNNNN!!!!! (50pt)
  • [Cryptography] 15 (100pt)
  • [Cryptography] notice me senpai (100pt)
  • [Cryptography] That's a Lot of Stuff . . . (275pt)
  • [Cryptography] FBI (375pt)
  • [Cryptography] Code On (500pt)
  • [Cryptography] Don't Give The GIANt a COOKie (100pt)
  • [Cryptography] That's Some Interesting Tea(rs)....... (175pt)
  • [Forensics] BTS-Crazed (75pt)
  • [Forensics] cat-chat (125pt)
  • [Forensics] catch-at (66pt)
  • [Forensics] Chugalug's Footpads (150pt)
  • [Forensics] BASmati ricE 64 (150pt)
  • [Forensics] Clean Pandas (250pt)
  • [Forensics] Allergic College Application (100pt)
  • [General Skills] Come Eat Grandma (25pt)
  • [General Skills] Sticks and Stones (50pt)
  • [General Skills] Grandma's Recipes (100pt)
  • [General Skills] Treeeeeeee (200pt)
  • [General Skills] ghost-in-the-system (1500pt)
  • [Misc] Strong Password (1pt)
  • [Misc] A Friend In Need Is A Friend Indeed (50pt)
  • [Misc] Off-Topic (5pt)
  • [Misc] Survey! (100pt)
  • [Web] Robots. Yeah, I know, pretty obvious. (25pt)
  • [Web] Phishing for Flags (105pt)
  • [Web] Uwu? (125pt)
  • [Web] What's in The Box?! (200pt)
  • [Web] No Sleep (100pt)
  • [Web] growls at the chicken (1000pt)
  • [Rice Goddess] Wrath of the Rice Goddess (4000pt)

感想など徒然なるままに

序盤はこんなこと言っていましたが、そこそこセキュリティの知識・技術を問う問題も出てきて益々楽しかった。謎解き・リアル脱出ゲーム勢はguessing要素が好物だと思うので(閃いた!の瞬間が幸せ)、この快感を味わいたい人にはとてもオススメ。私は来年もあったらまた参観したい。

Cryptoは古典暗号中心ながら、最後の方にはRSAも出てきたし。…他の分野にも触れようと思ったけど多大なネタバレになりそうなので自粛。

Discordを見た感じだと、数日後に再オープンして、1年間遊べるようになるっぽい。挑戦しそびれた方も、時間がなくて不完全燃焼な方も、もし興味を持たれたら是非チャレンジしてみてください!

ちょっとネタバレ入ってますが、今回辛かった楽しかった思い出たち

  • 「君のお母さんのことが好きなんだ」っていう文章を、leetこねくり回しながらずっと眺めてた
  • flagをくれるという噂のチャットボット相手にひたすら会話した
  • 猫語やパンダ語が翻訳できるようになった
  • 深夜のCTFのお供に、貝紐は結構良いということがわかった
  • ついにCyberChefに手を出した

個人的には [Rice Goddess] Wrath of the Rice Goddess (4000pt) がめちゃめちゃ楽しかった。一人チームならではかもですが、今まで解いてきた問題の要素が少しずつ集まってる感じ。それでいて全く同じではない。解きながら小躍りしてた。

picoCTFと比べると、「コマンド打つだけ」「やるだけ」レベルの超簡単な問題はあまりなく、guessingが必要になってゲーム性が増していた。今回のCTFを通じて初めて知った知識も割とあり、自分ができないことも認識できた。
Binaryはゲームのチート問題が多く「gdb使って変数の書き換えたらいけそうだなー」とやってみるも、やり方がわからずできなかったので復習したい。gdbの使い方、なかなかマスターできずにいる…。

とは言え、セキュリティの勉強・研鑽を積むのに適している教材というわけではないので、楽しくCTFしたい・解けない難しい問題ばかりじゃやる気が出ないという方に向いてるかな。

あと、今回のCTFはDiscordを使うチャレンジがいくつかあったのでDiscordを結構眺めていたんだけど、英語のスラング・略語がたくさん出てきて英語の勉強にもなった。長文の問題文も多く、ノンネイティブには厳しいポイントだったけど、今年は英語学習に力を注ぐつもりなのでちょうどよかった💪
Discordって結構ヒントがやり取りされてるんだね…。"dm me" ってDMしたらヒント教えてくれるのかな…。他のCTFも実はそんな感じなのかな。

まだこの問題はほとんど見れてないけど、解けそうだし、でも他の人がwriteup書いちゃうし、あーまだwriteup書かないで!ってwriteup書きながら念じてました(大矛盾)
なるべく自力で後追いするぞー(๑•̀ㅂ•́)و✧