yoshikingのがんばる日記

あたまよくないけどがんばります

Sunshine CTF 2019 writeup

 3/30~4/1まで開催されていたSunshine CTFに出ました. チームzer0ptsとして参加し、全体で3255pts獲得して10位でした(すごい!).

[Crypto] WelcomCrypto 50pts

 謎の問題文から解読します.

~C8 =39 A?2V8 73J:C 8FG7 AF?JJC2ECP

DF?LHb=r_>b0%_0520<c8bPN

 シフト系の暗号に見えます. 古典暗号の類はいちいち実装するのは面倒なので、このサイトを使ってごちゃごちゃします.

Org lbh pna'g fbyir guvf punyyratr!

sun{w3lC0m3_T0_da_k4g3!}

 rot47すると取れました.ちなみに上の文字列はさらにrot18するとBet you can't solve this challenge!となります.

終わり

 はい、writeupは以上になります.

短い!!!!!!!!!!もっと解きたい!!!!!!!!

ので、過去問等解いていきます. この頃は、Shiho Midorikawaさんが作られたCrypto Challenge Listを埋めてます.

pastebin.com

 解いて、hackmdで適当にwriteup書いてます. hackmdで細かくタグ管理すると、知見がたまるのですごく良いです. Challenge Listは他にもあるので、ぜひやってみてください. 楽しいです.

 Writeupがあまりにも短くて悲しかったので、ちょっと関係のない話をしましたが、以上です. チームメンバー、運営の皆さん、お疲れさまでした.

Securinets CTF Quals 2019 writeup

 3/24~25にSecurinets CTFが開催されており、参加しました. チームzer0ptsとして参加し、結果は23393ptsで2位でした.

 2位!!!!!

 すごいですね(他人事感).例に漏れず、チームメンバーがつよつよでした. 今回はinsecureではなく、theoldmoon0602, ptr-yudai, st98プロと僕の4人でzer0ptsというチームで出ました.

 僕がフラグを提出した問題は、Sanity Checkぐらいなんですが... まあ、先に解いてるけど、空いた(手をつける問題がない)時間に解いた問題もあるので、それらのwriteupを書こうと思います. あとは、部分的に手伝った問題とかですね.

[Crypto] Useless Admin (869pts)

 OTP(One Time Password)を使ってるよ的な問題文と以下のファイルcipher.jsonが渡されます.

{
    "cipher_list": [
        "1b0605000e14000d1b524802190b410700170e10054c11480807001806004e4f1f4f01480d411400531158141e1c100016535a480c000c031a000a160d421e004113010f13451e0c0100100a020a1a4e165f500d0c1e041a090b001d0515521c0a0410000a4f4b4d1d1c184d071600071c0a521d1706540940",
        "1e10524e001f11481c010010070b13024f0704590903094d0c000e4f0711000615001911454217161a1a45040149000a5218404f1e0012060b1b590a1048171741140c01174c0d49174f0c8d4fc7520211531b0b0c1e4f",
        "1d0c04451352001a000154431b014109450a0a0b000045490403520a1d16490008535848085942071c0d0c57101c0045111c40430c4e111c0b1b1c451d4f071712010508475518061d00060a1b0a1a4c165d",
        "160d074300061d071b524e06190b134e450a0b0a4d4c12411d004f014045491b4649074804001100011d4504520612451e165d53064e164e1d060d0d44541a0041031b0b06540d1a070004001d4b074800531c04101d4f",
        "1a1d524912521548120045021b4e1506490a0859150345531d12521b4e094909030003011148420453074d161e05540b071e4c451b000a084a1d1c04084c0b45060b060a4742070618534218070210484512020043100e191e5956111a1c001c1f0b5c",
        "1a1d5248000154041a1c47430d0b04000005015900140c4f04534f094e08490103000000045442111b11001b1b1d000917535a48004e021d4a0e0b0044491c03080a001a024c11490748074f02040054451a1d150c1b150d020d0e",
        "1a1d5249125215481613500a1b0f0d4e4d0d1c0d000700001d1c001b06004f1d0f5a11480745040a011100181c0c540d13000e44085404404a061716014e010c0308104e084e0d4911450506011853540a5304120a1a154c0a1843001b45541c481607051b431f480d001e0400000c531d01011d00124441010200190d0800000000000e54060001100a1b4d0b040d105347",
        "0a0607000913020d551300041d0f0f0a0003061f154c034f1b53530602004e0c030c541f0454110a1d5a001e0649190419165d00104f104e1b1a101101001b0b1705051b0642040c5341114f0e4b104f0803110b0a060f42",
        "160d074300061d071b524e06190b134e450a0b0a4d4c12411d004f014045491b4649074804001100011d4504520612451e165d53064e16424a1810110c00060d04440e1c02411c0c00544209001953540d165009021a1542",
        "1e10524e001f11481c010010070b13024f0704590903094d0c000e4f0711000615001911454217161a1a45040149000a5218404f1e0012060b1b590a1048171741140c01174c0d49174f4201001f534b0b1c074b",
        "1a49134d4113540a0713490d434e160f541700174f4c11480c53520a1d1100000000190d4549114512544d12000c540402034b4e0d491d40"
    ],
    "cipher_flag": "1a4905410f06110c55064f430a00054e540c0a591603174c0d5f000d1b110006414c1848164516111f1100111d1b54001c17474e0e001c011f1d0a4b"
}

 OTPを使った問題の経験がなかったので、とりあえず調べた結果、こちらのサイト

dann.com.br

を見つけました.サイトを参照してもらえればわかるんですが、ほとんど同じなので今回の問題にしたものにコードを変更します.

import string
import collections
import sets, sys

ciphers = ["1b0605000e14000d1b524802190b410700170e10054c11480807001806004e4f1f4f01480d411400531158141e1c100016535a480c000c031a000a160d421e004113010f13451e0c0100100a020a1a4e165f500d0c1e041a090b001d0515521c0a0410000a4f4b4d1d1c184d071600071c0a521d1706540940",
        "1e10524e001f11481c010010070b13024f0704590903094d0c000e4f0711000615001911454217161a1a45040149000a5218404f1e0012060b1b590a1048171741140c01174c0d49174f0c8d4fc7520211531b0b0c1e4f",
        "1d0c04451352001a000154431b014109450a0a0b000045490403520a1d16490008535848085942071c0d0c57101c0045111c40430c4e111c0b1b1c451d4f071712010508475518061d00060a1b0a1a4c165d",
        "160d074300061d071b524e06190b134e450a0b0a4d4c12411d004f014045491b4649074804001100011d4504520612451e165d53064e164e1d060d0d44541a0041031b0b06540d1a070004001d4b074800531c04101d4f",
        "1a1d524912521548120045021b4e1506490a0859150345531d12521b4e094909030003011148420453074d161e05540b071e4c451b000a084a1d1c04084c0b45060b060a4742070618534218070210484512020043100e191e5956111a1c001c1f0b5c",
        "1a1d5248000154041a1c47430d0b04000005015900140c4f04534f094e08490103000000045442111b11001b1b1d000917535a48004e021d4a0e0b0044491c03080a001a024c11490748074f02040054451a1d150c1b150d020d0e",
        "1a1d5249125215481613500a1b0f0d4e4d0d1c0d000700001d1c001b06004f1d0f5a11480745040a011100181c0c540d13000e44085404404a061716014e010c0308104e084e0d4911450506011853540a5304120a1a154c0a1843001b45541c481607051b431f480d001e0400000c531d01011d00124441010200190d0800000000000e54060001100a1b4d0b040d105347",
        "0a0607000913020d551300041d0f0f0a0003061f154c034f1b53530602004e0c030c541f0454110a1d5a001e0649190419165d00104f104e1b1a101101001b0b1705051b0642040c5341114f0e4b104f0803110b0a060f42",
        "160d074300061d071b524e06190b134e450a0b0a4d4c12411d004f014045491b4649074804001100011d4504520612451e165d53064e16424a1810110c00060d04440e1c02411c0c00544209001953540d165009021a1542",
        "1e10524e001f11481c010010070b13024f0704590903094d0c000e4f0711000615001911454217161a1a45040149000a5218404f1e0012060b1b590a1048171741140c01174c0d49174f4201001f534b0b1c074b",
        "1a49134d4113540a0713490d434e160f541700174f4c11480c53520a1d1100000000190d4549114512544d12000c540402034b4e0d491d40"]

target_cipher = "1a4905410f06110c55064f430a00054e540c0a591603174c0d5f000d1b110006414c1848164516111f1100111d1b54001c17474e0e001c011f1d0a4b"

def strxor(a, b):
    return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)])

# To store the final key
final_key = [None]*150
# To store the positions we know are broken
known_key_positions = set()

# For each ciphertext
for current_index, ciphertext in enumerate(ciphers):
    counter = collections.Counter()
    # for each other ciphertext
    for index, ciphertext2 in enumerate(ciphers):
        if current_index != index: # don't xor a ciphertext with itself
            for indexOfChar, char in enumerate(strxor(ciphertext.decode('hex'), ciphertext2.decode('hex'))): # Xor the two ciphertexts
                # If a character in the xored result is a alphanumeric character, it means there was probably a space character in one of the plaintexts (we don't know which one)
                if char in string.printable and char.isalpha(): counter[indexOfChar] += 1 # Increment the counter at this index
    knownSpaceIndexes = []

    # Loop through all positions where a space character was possible in the current_index cipher
    for ind, val in counter.items():
        # If a space was found at least 7 times at this index out of the 9 possible XORS, then the space character was likely from the current_index cipher!
        if val >= 7: knownSpaceIndexes.append(ind)
    #print knownSpaceIndexes # Shows all the positions where we now know the key!

    # Now Xor the current_index with spaces, and at the knownSpaceIndexes positions we get the key back!
    xor_with_spaces = strxor(ciphertext.decode('hex'),' '*150)
    for index in knownSpaceIndexes:
        # Store the key's value at the correct position
        final_key[index] = xor_with_spaces[index].encode('hex')
        # Record that we known the key at this position
        known_key_positions.add(index)

# Construct a hex key from the currently known key, adding in '00' hex chars where we do not know (to make a complete hex string)
final_key_hex = ''.join([val if val is not None else '00' for val in final_key])
# Xor the currently known key with the target cipher
output = strxor(target_cipher.decode('hex'),final_key_hex.decode('hex'))

print "Fix this sentence:"
print ''.join([char if index in known_key_positions else '*' for index, char in enumerate(output)])+"\n"

# WAIT.. MANUAL STEP HERE 
# This output are printing a * if that character is not known yet
# fix the missing characters like this: "Let*M**k*ow if *o{*a" = "cure, Let Me know if you a"
# if is too hard, change the target_cipher to another one and try again
# and we have our key to fix the entire text!

#sys.exit(0) #comment and continue if u got a good key

target_plaintext = "i wanted to end the world, but i'll settle for ending yours."
print "Fixed:"
print target_plaintext+"\n"

key = strxor(target_cipher.decode('hex'),target_plaintext)

print "Decrypted msg:"
for cipher in ciphers:
    print strxor(cipher.decode('hex'),key)

print "\nPrivate key recovered: "+key+"\n"
Fix this sentence:
* *anted to ind t** y*rl*, but i'*l*settle for endin* ****s.

Fixed:
i wanted to end the world, but i'll settle for ending yours.

Decrypted msg:
how often have i said that when you have excluded the imposs
my name is sherlock holmes. it is my business to know what o
never trust to general impressions, my boy, but concentrate 
education never ends, watson. it is a series of lessons with
it is a great thing to start life with a small number of rea
it has long been an axiom of mine that the little things are
it is a capital mistake to theorize before one has data. ins
you have a grand gift for silence, watson. it makes you quit
education never ends, watson. it is a series of lessons, wit
my name is sherlock holmes. it is my business to know what o
i am a brain, watson. the rest of me is a mere appendix.

Private key recovered: sir arthur conan doyale is one of the best writers. i enjoye

 Fixedには上のFix this sentenceを直したものを直接コードに書きます. Fix this sentenceを直すのが大変で、ひたすら調べてi wanted to ind t** y*rl*, but i'll settle for ending yours.までたどり着いたんですが前半がわかりませんでした. 後にptr-yudaiが名言?であることを見つけ、Fixedはi wanted to end the world, but i'll settle for ending yours.であることがわかりました.

Securinets{i wanted to end the world, but i'll settle for ending yours.}

[Crypto] RSA/Encoding error (1000pts) first solve!

 zipファイルが渡されます. 解凍すると、以下のようなpngファイルが出てきます. f:id:y05h1k1ng:20190325160735p:plain  読み取ると、Hint: Every single information mattersで大した情報ではないです. stringsコマンドにかけるとoutput.txtというものが見えるので、foremostコマンドで取り出します. output.txtが取れたので、中身を見ると以下のようなビット列が複数行に渡って書かれています.

11111.11111.00011.10110.00000.00000.00000.10111.10000.10001.00000.11111.10111.01111.00100.00000.10101.10011

 ここからが本当にわからなくて、大変でした. theoldmoon0602とptr-yudaiによるとどうやら反復符号というものらしいです. これでoutput.txtの解釈はできても、RSA要素が全く出てきてません. 色々調べると、はじめのpngexif情報でした. exiftoolにかけると以下になります.

$ exiftool ctf_image.png 
ExifTool Version Number         : 10.80
File Name                       : ctf_image.png
Directory                       : .
File Size                       : 11 kB
File Modification Date/Time     : 2019:03:23 22:53:12+09:00
File Access Date/Time           : 2019:03:25 16:07:35+09:00
File Inode Change Date/Time     : 2019:03:24 13:14:23+09:00
File Permissions                : rw-r--r--
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 887
Image Height                    : 521
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
SRGB Rendering                  : Perceptual
Gamma                           : 2.2
Pixels Per Unit X               : 3780
Pixels Per Unit Y               : 3780
Pixel Units                     : meters
Comment                         : e = 2^16+1
Warning                         : [minor] Trailer data after PNG IEND chunk
Image Size                      : 887x521
Megapixels                      : 0.462

 これで、e = 2^16+1、あとはエスパー?で画像の縦横のサイズが素数だとわかり、必要なものが揃いました. dを計算し、output.txtを1行ずつ復号してやるとでます.

from Crypto.Util.number import inverse

with open("./output/zip/output.txt", "rb") as f:
    buf = f.read()
#buf = buf.replace(b"\n", ".")

p = 887
q = 521
e = 2**16 + 1
N = p*q
phi = (p-1)*(q-1)

d = inverse(e, phi)

m = ''
for a in buf.split(b"\n"):
    result = ''
    for block in a.split(b'.'):
        if block.count(b'1') > 2:
            result += '1'
        else:
            result += '0'
        c = int(result, 2)
    tmp = pow(c, d, N)
    m += hex(tmp)[2:-1].decode('hex')
print m
A repetition code is a coding scheme that repeats the bits across a channel to achieve error-free communication. Given a stream of data to be transmitted, the data are divided into blocks of bits. Each block is transmitted some predetermined number of times. For example, to send the bit pattern "1011", the four-bit block can be repeated three times, thus producing "1011 1011 1011". However, if this twelve-bit pattern was received as "1010 1011 1011"  where the first block is unlike the other two  it can be determined that an error has occurred.  hope you have understand it, please validate the task with the following Flag : xJbht0oWpsOa1e3WnXo9FDnUj3VZpZsuxMPVlYEN

Securinets{xJbht0oWpsOa1e3WnXo9FDnUj3VZpZsuxMPVlYEN}

[Forensics] Easy Trade (200pts)

 pcapファイルが渡されます. wiresharkで見ると、いくつかのtcpがあるのでtcp streamします(無条件反射). あるパケットの中にPKflag.txtを含んだバイト列があるので、zipだろうということで、摘出します.f:id:y05h1k1ng:20190325163847p:plain  tcp streamで内容を保存できますが、デフォルトではASCIIの保存になるので、下のShow and sava data asrawに変更して保存します. f:id:y05h1k1ng:20190325163716p:plain  これでzipを手に入れることができたので、あとは解凍するだけですが、ここでパスワードを聞かれます. ここは、tcpgive me the keyとあったのでその後にあるパケットのsecurinetsXDを入れると解凍できます. これでflag.txtを手に入れることができます.

Securinets{c2VjdXJpbmV0c3s5NTRmNjcwY2IyOTFlYzI3NmIxYTlmZjg0NTNlYTYwMX0}

 これは、ptr-yudaiが秒で(5分もかからないぐらい)解いたのですが、僕は20分ぐらいかかりました. 圧倒的マッスルですね.

まとめ

 1位、2位の繰り返しで激アツでした. また、今回は初チームということで楽しく24時間過ごせました(4時間ほど寝たけど...).

 最近はCryptoを練習しているので、更にやっていきます.

 チームメンバー、運営の皆様ありがとうございました.お疲れ様です.

TRUNK Hackathon 参加記

 3/16~17にTRUNK Hackathonに参加しました. 初ハッカソンです!!!!

 チーム構成としては、僕含め3人バックエンド、2人デザイナーでした. バックエンド3人は正直多すぎで、何も仕事がない時間が結構ありました. 逆にフロントが最初から最後まで大変そうでした.(手伝える知識なくてゴメンナサイ) (作ろうとしたものが、機能てんこ盛りよりシンプルを重視したのもある)

 作ったものは

旅先で偶然出会った店に連れて行ってくれるアプリ。 ゆっくりと行き当たりばったりな旅を楽しみたい!旅の予定を組むのも面倒! ふらっと観光が出来ればご飯はなんでもいい!出来ればその土地のものが食べたいな! そんなニーズに回答するアプリです

です. f:id:y05h1k1ng:20190317211203p:plain

オサレ....

やったこと

 僕は、pythonでバックエンドの処理を書きました. 実装したこととしては、

を書きました. 実際に使ったのは、一番上の関数のみで他はボツでした. 下2つは別に要らなかったけど、とにかく時間があったので作ってみました. 言語がpythonだったので、それなりに遊べて楽しかったです.

 基本的には各種apiのドキュメントを見ながら、いいかんじにします.

感想

 ハッカソンめっちゃつらいです.(たのしかったけど...) なんかCTFよりめちゃめちゃ体力を使いました. 体痛い.木の椅子でおしりが壊滅的な状態です.

 うーん、しばらくしたらハッカソンまた行ってみたいですね. なんか僕のミジンコレベルの技術力では、まだ真の楽しさがわからない気がします.

 チームメンバーの方々、運営の皆様、ありがとうございました.お疲れ様です.

UTCTF 2019 writeup

 3/9~11にUTCTFが開催されていました. チーム insecure として出て、総得点8250pts で18位でした. そのうち700pts取ったので、writeupを書きます.(うーん少ない)

[Reverse Enginneering] [basic] re (100pts)

I know there's a string in this binary somewhere.... Now where did I leave it?

 elfファイルが渡されます. とりあえずstringsしたら、flagが出てきました.

$ strings calculator | grep utflag
utflag{str1ng5_15_4_h4ndy_t00l}

[Forensics] RIP(600pts)

My friend John sent me this password protected ZIP, but forgot the password. I'm sure you can still find a way in, though.

 パスワード付きzipファイルが渡されます. この問題はdiscordを眺めていた時に、運営が「john使ったら解けることは確認してるよ」みたいなことを言っていたので解きました. さすがに総当たりで解析するわけがないので、wordlistを使った解析だと考えました. kali にはデフォルトで強いwordlistのrockyou.txtがあるのでそれを使うと、パスワードを得られます.

$ zip2john let-me-in.zip > let-me-in.hash
$ john --wordlist=/usr/share/wordlists/rockyou.txt let-me-in.hash

 出力を書けていないのは、writeup書くからもう一回やろーと思ったらできなかったからです(泣). どうなってるんですかね.

わかんないです...

終わり

 オンラインのCTFでwelcome・basic問題以外を通したのは、たぶん初なのでテンション上がりました. 結局、解けてないので本末転倒ですが、本番では30分もかからず出来たのでホメテクダサイ.

 チームメンバー、運営さんお疲れさまでした.

セキュリティミニキャンプ in 福岡 2019 参加記

 3/2,3にミニキャンプがあり,参加しました. 内容をどこまで話してよいのかわからないですが,ダメそうな感じが多少するので,大雑把に振り返ります(感想ばっかりです). www.security-camp.or.jp

1日目

 shin-shinのラーメンを食べようと会場が開く1時間前についたけど,コインロッカー探していたら時間なくなってよくわからない醤油ラーメンを食べました(おいしかったですよ).

 それからついに会場入りです.めちゃくちゃワクワクしてました.

Webアプリケーション攻防戦演習

 hardeningっぽいやつです. 運営からの攻撃しかないhardeningと違って,チーム間の攻撃も可能でした. このチーム間の攻撃が可能なのが厄介で,修正して保存しようとしたらファイルが消されていることがあり,泣きました.

 今回の環境ではlaravelが使われており,テンプレート等の構造がよくわからなくて,エスケープしないといけない場所すらわからなかったです.でも,講師の方がヒントとして教えてくださり,構造を多少理解できました. 理解したとか言ってますが,結局はエスケープできてないです. まじで,申し訳ない. チームメイトにもhardeningしていた方がいたので,順位は1回目2位,2回目3位と悪くない成績でした.

 チームメイトの方々,ありがとうございました.

LANケーブルを自作して通信をモニタリングしてみよう

 LANケーブル切ったりして,実際にパケットを盗み見ました. 僕の班は,pingを送りあうpcを決めるのに手こずってましたが,一通りできてよかったです(結局チューターの方の機器をかりてしましたが...).

 以上で1日目終了です. 晩御飯は一人もつ鍋を食べました.めっちゃおいしかった.

2日目

 カフェで朝ごはん食べてから,ansibleとか実行してました.結構ハンズオンの資料を進めたのですが,のちに悲劇となります.

クラウドホスティングサービスのセキュリティと運用技術の研究

 松本 亮介 / まつもとりー (@matsumotory) | Twitterさんの講義でした.とても濃い講義でした.正直,話が全然わからないので,ちょいちょい調べながら聞いてました. アカデミックな世界をちょっと知ることができた気がして,すごく面白かったです.

Private CaaS 基盤の構築と開発

 ついに最後の講義です. 講師はShuya Motouchi (@nwiizo) | Twitterさんでした. ハンズオンでひたすら手を動かしました. ansible/docker/kubernetesを触りました.

 kubectlがカフェでは動作確認できていたのですが,会場で動かなくなって,チューターの方と色々デバッグしても解決策が見えないので,vpsを立てるところからやり直しました.めっちゃ悲しかったし,めっちゃ会場暑かった.

 そんなこんなで一通りできました. これはほんとに反省なんですが,全然理解できすにコマンドを打ってました. ハンズオンに書いていることを実行すればうまくいくけど,どう動いてるの?みたいな感じでした.

 クラウド周りの話は,要復習ですね. クーポンを使い倒して,もう少しいじってみます.

終わり

 ミニキャンプ終了後,同じチーム(机)の人とチューターの方々でご飯を食べました.こうゆうことって中々ないなー,スゴイなーseccampと思いました.すごいといえば,講義のサポートが手厚くて時間の無駄が全然なかったです.とても濃い時間を過ごせるのは,すごい良かったです.

 最近は,いろいろなことを知りたすぎて,バタバタしてたんですけど,ちょっとずつでも成長していきます.とてもいい経験でした.高い交通費・宿泊費だしてよかった(泣).

 次は,全国ですかね.すごくいきたいと思う反面,実力不足ではと思ってます....各位と約束したので,頑張って応募します.

 勢いで書き上げたので,すごく雑で中身のないものとなってしまいました. ここまで読んで下さり,ありがとうございます. 最後になりましたが,参加者の皆様,チューターの皆様,運営・講師の皆様,ありがとうがございました. キャンプには今後もお世話になると思うので,その際はよろしくお願いします.

近状報告??

こんにちは.

このブログでは,今までイベントの時しか更新しなかったのですが,適当なことも更新してみます.

この前の更新は,SECCONにでた話でした. それからは,お正月ゴロゴロしたり,InterKosenCTFの運営だったり,nanoHardeningしたり,卒論を提出したりしました.

こんな感じのことをつらつら書いていきます.

InterKosenCTFやったよ!

1月18~20日にInterKosenCTFを開きました. 実は最初は参加者として出るつもりだったのですが, ふるちゅき (@theoldmoon0602) | Twitterptr-yudai (@ptrYudai) | Twitter からどうしても問題の情報を聞いてしまう(同じ研究室)ので運営になりました. といっても,まだ作問をする力が微塵もないので,問題のテスターとかペンギンの絵(デフォルトアイコン)をかいたりしました.

f:id:y05h1k1ng:20190215183218p:plain:w100

当日の運営も大したことはしてないです. ほかのメンバーは夜通し質問の対応などしてましたが,僕は遅くても深夜2時とかには寝てました. すいません...あんまり夜更かしは得意じゃないんです...

そんなこんなで,無事終えて,評価も上々で,なんもしてないけどハッピーでした. 成績優秀チームには商品があったのですが,それなりのお金が飛んで行ったのはアンハッピーでした.

あと,TokyoWesternsの人たちが出てたのは,びっくりしましたね. 唯一の全完チームで,チョー強かったです. ほかにも強い人がたくさん出ていて,うひゃーと思っていました.

今更ですけど,お疲れさまでした. 参加者の皆様や運営メンバーには感謝です.

運営メンバーの記録

こっちの方がきちんと書かれているよ

スラスト (@thrust2799) | TwitterInterKosenCTF の運営に参加しきれなかった話 (spaceship Write Up) - すらすと’s 生活の跡

ふるちゅき:InterKosenCTFを開催した - ふるつき

ptr-yudai:InterKosenCTFを開催しました - CTFするぞ

nanoHardeningを初めてやってきた

2月13日にセキュリティマイスター道場(SecDojo)が開催するnanoHardeningというプチHardeningをしてきました. Hardeningとは,サーバーが与えられて安全に運営する大会です(たぶん). 運営から攻撃が仕掛けられるので,webアプリケーションを落とされないよう頑張ります.

これもふるちゅきとptr-yudaiの3人で参加しました. 参加者は22~3人で,6チームで競いました.

結果から言うと1位でした(拍手)!!

僕がしたことは,アプリケーションが落ちていないか確認してました. ptr-yudaiが前に参加していたので,何をすればよいかはっきりしてました. また,僕は運用チェック,ptr-yudaiはログ解析,ふるちゅきはソース修正といった感じに担当を分けていて,それもよかったと思います. これは身内で固まったので,それぞれのできることが分かりきちんと担当を分けられました. ほとんどの参加者は始めましての状態のチームだったので,身内で固まったのは勝ちに行ってましたね...

よく置くファイルの場所とか全然しらないので,その辺の知識を付けないとなーと思います.

卒論提出したよ

つい最近,なんと最終版の卒論を出しました. うへぇー,大変だった.

このブログを書こうと思ったのも,これが大きな要因です. 卒論だすと,気持ちが軽いです!!

おわり

色々ありましたが,大体のイベントでは,僕の実力がよわよわじゃん!と思うことがほとんどですね. 頑張っていこうと思います.

これからは,セキュリティミニキャンプin福岡が近いです. とても楽しみです. あとは,せっかくの春休みですしバイトしようかなと思ってます. コーディング力とか上げたいです.

ブログにはCTFのwriteupとかイベントごとしか書かないかなと思ってましたが,適当に書いてみました. ここまで,読んだ方ありがとうございます!

ではでは

SECCON 2018 国内決勝 参加記

12/23にSECCON 国内決勝にinsecureとして出場しました. メンバーはtheoldmoon0602, thrust2799, ptr-yudaiと僕です. 結果は1191ptで5位でした.(←スゴイのでは...!!!)

f:id:y05h1k1ng:20181224232833j:plain

僕自身は今年の夏にCTFを始めた初心者なんですが,このような経験をさせてくれたチームメンバーには感謝です. 国内決勝が始まるまでは,難しくて手も出ずに終わると思っていたのですが,少々仕事をしたので書いていきます.

松島

途中から公開された問題です. ポーカーで遊べる問題で,フルハウスを出すと100pt,フォーカード以上で300ptがもらえます.

問題が公開されてから遊んでたらフルハウスがでて100ptいただきました. 運も実力のうちということで,功績にしておきます.

バイナリの解析はtheoldmoonとptr-yudaiに任せて,解法のめどが立つまで遊んでましたが結局フォーカードは出ませんでした. 具体的な解法は,ptr-yudaiのwriteupにかかれています. SECCON 2018 国内決勝に参加しました - CTFするぞ

この問題は,ただ遊び続けることでフォーカードを出したチームもいるみたいですね. 懇親会で作問者の方とお話しをしたんですが,「リアルカジノでフォーカードはでないよ!!リアルカジノ行ってみろ!!」って泣いてました.

天橋立(XSS HELL)

各チームがXSSの問題(alert('XSS')を呼ぶと正解)を投稿し,解きあう問題でした. 解かれずに残った問題のタイトルが5分おきにチェックされて,タイトルにチームトークンがあればそのチームにdefense pointが入る仕組みでした. この仕組みであることを理解するのに,時間がかかりました.

theoldmoon0602がハッシュを実装している間,ぎりぎりに問題を投稿して,点を取ろうとしましたが,defense flagの表示バグにより取れませんでした. 表示バグに関しては,thrustが解決策を見つけたため,割と序盤でdefense pointがもらえていました.

yharimaの方が作ったsha256スクリプトがほとんどのチームで使われてました. theoldmoon0602の独自スクリプトも途中で解かれて,2ptほど落としました. 誰が解いたんですかね?解いた方を観測していないです. 解かれた後はすぐにyharimaのスクリプトを拝借し,更新しました(すいません).

あと,独自で実装していたTeam Enuの問題も解かれていました. 懇親会の時に知ったのですが,yharimaの方が1時間ほどかけて解いたみたいです.

タイトルの自動更新スクリプトをうまく書けなかったので,最後まで手動で更新していました(よわい).

懇親会

ご飯おいしかったです. あと,オレンジジュースを死ぬほど飲みました.

始めに,yharimaのチームの方々とお話しをしてXSS周りの話が楽しかったです. 松島の作問者の方ともお話しをすることができました. 裏話(リアルカジノで大金を溶かした話とか)を聞けて面白かったです. st98プロともお話しできて,よかったです(文部科学大臣賞おめでとうございます!). 最後には親方ともお話ししてました. 宮島の問題は国際でも出されていたみたいですね.

感想

楽しかったです!!! 来年も参加できるように精進していきたいです.

懇親会でお世話になった方々とも,またどこかでお会いしたらよろしくお願いします.

最後になりましたが,運営の方々や参加者の皆様,お疲れさまでした. ありがとうございます.

チームメンバーのwriteup

theoldmoon0602 : furutsuki.hatenablog.com

thrust : thrust2799.hatenablog.jp

ptr-yudai : ptr-yudai.hatenablog.com