ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

UECTF2022 Writeup

はじめに

UECTF2022、shinozakiaiというユーザー名で参加して20位でした。Writeupを書きます。

uectf.uec.tokyo

逆Writeup(解けなかった問題を復習することを勝手にそう呼んでます)もセットで書くつもりだったんですが、丁寧、丁寧、丁寧にやりたいので別記事にしようと思います。

感想

私にはちょうどいい難易度で、比較的たくさん解けて面白かったです。特にMISCにユニークな問題が多かった印象です。運営の皆様、ありがとうございました。

WEB

webapi

HTMLにベタ書きされているFLAG_URLを見ればflag。

request-validation

ソースコードを読むと、GETパラメータ q がobjectならflagがもらえるみたい。

  if (req.query.q && typeof req.query.q === 'object') {$    
    res.send(FLAG)$

どうしたらobject扱いになるかなーと思って、ローカルで立ち上げた環境に ?q={'test': 'test'} など色々投げてたら、?q=test1&q=test2 でflag。

FORENSICS

Compare

バイナリ同士を比較する cmp というコマンドがあることを知る。見た目は一緒だけど、差分はあるみたい。

$cmp -l UECTF_org.bmp UECTF_new.bmp 
 101845 377 125
 102818 377 105
 103839 377 103
 104752 377 124
 105401 377 106
 106038 377 173
 106639 377 143
 107228 377 157
 107757 377 155
 108406 377 160
 109103 377 141
 109848 377 162
 110605 377 145
 111218 377 137
 111855 377 164
 112504 377 167
 113141 377 157
 113754 377 137
 114379 377 146
 115040 377 151
 115593 377 154
 116326 377 145
 116939 377 163
 117480 377 137
 118285 377 142
 118874 377 171
 119523 377 164
 120040 377 145
 120605 377 137
 121170 377 142
 121819 377 171
 122384 377 137
 123033 377 142
 123574 377 171
 124103 377 164
 124668 377 145
 125065 377 175

この 125 とか 105Pythonchr() したりすればいいのか?と思うもなんかうまくいかず。しかたがないのでorgとnewそれぞれの xxd の出力を保存して diff で比較した。差分になっている箇所が UECTF{ となっているので、温かみのある手作業でflagを組み立てた。

377ってなんだ?

$diff -u org new | grep ^+
+++ new 2022-11-26 15:35:15.396738997 +0900
+00018dd0: ffff ffff 55ff ffff ffff ffff ffff ffff  ....U...........
+000191a0: ff45 ffff ffff ffff ffff ffff ffff ffff  .E..............
+00019590: ffff ffff ffff ffff ffff ffff ffff 43ff  ..............C.
+00019920: ffff ffff ffff ffff ffff ffff ffff ff54  ...............T
+00019bb0: ffff ffff ffff ffff 46ff ffff ffff ffff  ........F.......
+00019e30: ffff ffff ff7b ffff ffff ffff ffff ffff  .....{..........
+0001a080: ffff ffff ffff ffff ffff ffff ffff 63ff  ..............c.
+0001a2d0: ffff ffff ffff ffff ffff ff6f ffff ffff  ...........o....
+0001a4e0: ffff ffff ffff ffff ffff ffff 6dff ffff  ............m...
+0001a770: ffff ffff ff70 ffff ffff ffff ffff ffff  .....p..........
+0001aa20: ffff ffff ffff ffff ffff ffff ffff 61ff  ..............a.
+0001ad10: ffff ffff ffff ff72 ffff ffff ffff ffff  .......r........
+0001b000: ffff ffff ffff ffff ffff ffff 65ff ffff  ............e...
+0001b270: ff5f ffff ffff ffff ffff ffff ffff ffff  ._..............
+0001b4e0: ffff ffff ffff ffff ffff ffff ffff 74ff  ..............t.
+0001b770: ffff ffff ffff ff77 ffff ffff ffff ffff  .......w........
+0001b9f0: ffff ffff 6fff ffff ffff ffff ffff ffff  ....o...........
+0001bc50: ffff ffff ffff ffff ff5f ffff ffff ffff  ........._......
+0001bec0: ffff ffff ffff ffff ffff 66ff ffff ffff  ..........f.....
+0001c150: ffff ffff ffff ffff ffff ffff ffff ff69  ...............i
+0001c380: ffff ffff ffff ffff 6cff ffff ffff ffff  ........l.......
+0001c660: ffff ffff ff65 ffff ffff ffff ffff ffff  .....e..........
+0001c8c0: ffff ffff ffff ffff ffff 73ff ffff ffff  ..........s.....
+0001cae0: ffff ffff ffff ff5f ffff ffff ffff ffff  ......._........
+0001ce00: ffff ffff ffff ffff ffff ffff 62ff ffff  ............b...
+0001d050: ffff ffff ffff ffff ff79 ffff ffff ffff  .........y......
+0001d2e0: ffff 74ff ffff ffff ffff ffff ffff ffff  ..t.............
+0001d4e0: ffff ffff ffff ff65 ffff ffff ffff ffff  .......e........
+0001d710: ffff ffff ffff ffff ffff ffff 5fff ffff  ............_...
+0001d950: ff62 ffff ffff ffff ffff ffff ffff ffff  .b..............
+0001dbd0: ffff ffff ffff ffff ffff 79ff ffff ffff  ..........y.....
+0001de00: ffff ffff ffff ffff ffff ffff ffff ff5f  ..............._
+0001e090: ffff ffff ffff ffff 62ff ffff ffff ffff  ........b.......
+0001e2b0: ffff ffff ff79 ffff ffff ffff ffff ffff  .....y..........
+0001e4c0: ffff ffff ffff 74ff ffff ffff ffff ffff  ......t.........
+0001e6f0: ffff ffff ffff ffff ffff ff65 ffff ffff  ...........e....
+0001e880: ffff ffff ffff ffff 7dff ffff ffff ffff  ........}.......

Deleted

ディスクイメージは binwalkforemost かけときゃええやろ精神で、 foremost で画像ファイルがいくつか発掘できた。漁ったらflagが描いてあるファイルがあった。

Discord 1

ワンライナーで画像ファイルを列挙して、片っ端から確認した。

$find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'
./Cache/f_00002b: PNG image
./Cache/f_00002c: PNG image
./Cache/f_00002f: PNG image
./Cache/f_00003a: PNG image
./Cache/f_00008b: PNG image
./Cache/f_00008c: PNG image
./Cache/f_00008d: PNG image
./Cache/f_00008e: PNG image
./Cache/f_00008f: PNG image
./Cache/f_000090: PNG image
./Cache/f_000091: PNG image
./deafen-off-light.png: PNG image
./disconnect-light.png: PNG image
./mute-off-light.png: PNG image
./tray-connected.png: PNG image
./tray-deafened.png: PNG image
./tray-muted.png: PNG image
./tray-speaking.png: PNG image
./tray-unread.png: PNG image
./tray.png: PNG image
./video-light.png: PNG image

Discord 2

grep

$grep -r UECTF .
grep: ./Local Storage/leveldb/000004.log: binary file matches

MISC

WELCOME

割愛。

caesar

以下のコードでflagをエンコードしている。なんかあんまり細かいこと考えずに、 letter[(index+14)%len(letter)] のとこを letter[(index-14)%len(letter)] にした関数を decode() として使ったら復号できた。

from string import ascii_uppercase,ascii_lowercase,digits,punctuation

def encode(plain):
  cipher=''
  for i in plain:
    index=letter.index(i)
    cipher=cipher+letter[(index+14)%len(letter)]
  return cipher

ascii_all=''
for i in range(len(ascii_uppercase)):
  ascii_all=ascii_all+ascii_uppercase[i]+ascii_lowercase[i]
letter=ascii_all+digits+punctuation
plain_text='UECTF{SECRET}'
cipher_text=encode(plain_text)
print(cipher_text)

こういうの、読むのも嫌になってしまうというか、自分がやりたいCTFはこういうのじゃねえ!と逃げてしまう。

reduction gone wrong 1

黒塗りの箇所をコピペすると「nope」がでてきてぐぬぬ……となった。 「ctf pdf 黒塗り」でググったらLibreOfficeでなんとかしたという記事がでてきたので、そのようにしてflag。

gen-ius.hatenablog.com

reduction gone wrong 2

Windows10標準のペイントで輝度をガンガン上げまくってflag。

GIF1

GIFの中で一瞬flagが表示される。GIMPをダウンロードするのが面倒だったので、Windows+Gで起動する録画機能で録画した。

WHEREAMI

ヒントを見て、これが「plus code」なるものだということが分かった。

plus code を使用して場所を検索、共有する - Android - マップ ヘルプ

1行が1地点を示しているとすると、たくさんあるし、いくつか試すと太平洋というだだっ広いところを示しているようだったので、きっと全部にピンを打ったらflagが浮かび上がるんだろうなと想像がついた。

ので、その方法を探すと以下のページにたどり着いた。スプレッドシートに列挙した地理情報を、まとめてインポートできるみたいだ。

Googleマップ:住所録から地図に一括マークアップする方法(マイマップ作成) - Fans!Google

やってみたらflag。面白い問題だった。

OSINT

IDを変更したTwitterアカウント( https://twitter.com/__yata_nano__ )をネトストする問題。

Wayback machineアーカイブを発見。

https://web.archive.org/web/20221026140525/https://twitter.com/__yata_nano__

ツイートの中身からは、新IDに関する情報は見つからず。色々ググっていたら、ユーザーに変更不可能なIDが割り当てられていることが分かった。

gigazine.net

アーカイブのソースを見てみたら、それらしきものが書かれている。

以下のURLにアクセスすると、新ユーザーIDのアカウントへリダイレクトされる。pastebinのURLをツイートしていて、そこでflagを入手した。UECTF なんかを検索することで辿り着かせないためだと思うけど、手が込んでいるなあと思った。自分だったら適当に検索避けするとか画像とかで済ませちゃいそうだけど、こういう方法もあるんだな。

https://twitter.com/intent/user?user_id=1585261641125416961

REV

A file

うおおおお

$ strings chall | grep UECTF
UECTF{Linux_c0mm4nDs_ar3_50_h3LPFU1!}