MaidakeCTF2020 writeup


https://maidakectf2020.aokakes.work/
https://aokakes.work/MaidakeCTF2020/

> 大会概要
> MaidakeCTF2020はCTF初心者から中級者向けの大会です。
> 腕に自信のある方には物足りない大会かもしれませんが、タイムアタック的に楽しんでいただければ幸いです。
> 問題数はWeb5問、Misc4問、Crypt1問の計10問です。
> どの問題も「ググる力」と「基本的なIT知識（主にweb周り）」があれば解けるはずです。

1問以外解いて2000点獲得して1位でした。


### ひらがな64 (Crypt) 300pt

暗号化するスクリプトと暗号化したフラグが配布されました。
フラグを2進数に変換して6ビットごとにひらがなに置き換えて出力しているようです。
base64と全く同じことをしているだけに見えたので、ひらがなをアルファベットに置換してbase64デコードして解きました。

```py
import base64

def decrypt(m):
    table1 = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉぱぴぷぺぽがぎぐげござじず☆'
    table2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    return base64.b64decode(''.join([table2[table1.index(c)] for c in m]))

with open('./flag.txt', 'r', encoding='utf-8') as f:
    print(decrypt(f.read()))
```

`MaidakeCTF{The_mechanics_of_BASE64_are_surprisingly_simple}`

### SVG (Misc) 100pt

テキストエディタでSVGファイルを開いたら、svg要素のflag属性にフラグが書いてありました。

```xml
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   sodipodi:docname="flag.svg"
   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
   id="svg8"
   version="1.1"
   viewBox="0 0 1058.3334 396.875"
   height="396.875mm"
   width="1058.3334mm"
   flag="MaidakeCTF{SVG_images_are_composed_of_XML}">
```

`MaidakeCTF{SVG_images_are_composed_of_XML}`

### SVG 2nd (Misc) 200pt

今度はテキストエディタで開いてもフラグらしき文字は見当たりません。
明らかに怪しいpathがあるのですが、全面にrectが表示されていて見えないので、
邪魔な要素をコメントアウトしてみたらフラグが表示されました。

```xml
..
      </g>
      <!--<rect
         y="-40.065468"
         x="-388.55948"
         height="343.95834"
         width="1005.4167"
         id="rect901"
         style="fill:#ff5555;stroke-width:5.29167" />
      <text
         id="text905"
         y="259.98523"
         x="-347.32199"
         style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
         xml:space="preserve"><tspan
           id="tspan907"
           style="font-size:352.778px;stroke-width:0.264583"
           y="259.98523"
           x="-347.32199"
           sodipodi:role="line">FLAG</tspan></text>-->
    </g>
..
```

![misc_svg2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318539/1ac27eaa-5b44-e85e-3855-b9decb03e307.png)


`MaidakeCTF{SVG_images_are_chunkes_of_coordinates}`

### 🐭🐭🐭🐭 (Misc) 200pt

この問題は 1st blood 取れました。
問題名からマウスを使う問題と当たりをつけて挑戦しました。
配布されるファイルは以下のような記載になってます。

```csv
76,282
76,283
76,283,Pressed
76,281
76,278
(省略)
154,295
153,297
153,297,Released
153,295
153,293
```

数字がマウスの座標で、Pressed と Released がマウスのクリックを記録したものだと考えるのが良さそうです。
あとはこのCSVを解析してマウスの動きをシミュレートすると絵が浮かび上がりそうですね。
画像を出力するようなプログラムを書くのもいいですが、直前にSVGの問題を解いていたので、SVG画像を出力するようなプログラムを書いてみました。

```py
is_pressed = False

path = []
print('<svg width="2000" height="2000">')
with open('./flag.csv', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        row = line.strip().split(',')
        if len(row) == 3:
            if row[2] == 'Pressed':
                is_pressed = True
            elif row[2] == 'Released':
                is_pressed = False
                d = 'M' + ' '.join(path)[1:]
                print('<path d="{}" stroke="black" fill="none"></path>'.format(d))
                path = []
        if is_pressed:
            path.append('L' + ','.join(row[:2]))
print('</svg>')
```

![misc_mouse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318539/0da3726f-75b2-8512-bcd6-11f5c277bb4f.png)

`MaidakeCTF{I_tried_to_include_a_lot_of_useless_information}`


### 焼肉W (Misc) 200pt

焼き肉を焼ける問題です。
元ネタはモンスターハンターですかね？
キモになりそうなのはこのあたりです。

```javascript
$.ajax({
    type: 'POST',
    url: 'check.php',
    data: {baking_time: bakingTime},
    timeout: 100
}).done(function(data) {
    if (data.match(/MaidakeCTF/)) alert('上手に焼けました！！\n'+data);
})
```

特にこれ以上なにかしているわけでは無かったので、check.php に対してそれらしい数字を投げつけた時だけフラグが返ってくるものと思います。
適当に5秒くらいで止めたら答えが返ってきたので、そこまで厳密な数字ではなくても良さそうです。
たまたま解けただけなので想定解なのか謎です。

`MaidakeCTF{I_want_to_try_Monster_Hunter's_Well-done_Steak}`


### 爆速 (Web) 200pt
『Get Flag!!』と書かれたボタンを押すと、一瞬別のページに遷移してすぐに元のページに戻ってきます。
ブラウザでネットワークを監視してみると、`4f1d4bda3.html` に飛ばされているのが分かります。
中身はこんな感じでフラグが入ってました。

```html
<meta http-equiv="refresh" content="0;URL='./'" flag="MaidakeCTF{Kirito_is_said_to_be_able_to_go_720km/h_when_he_uses_his_sword_skill}">
```

`MaidakeCTF{Kirito_is_said_to_be_able_to_go_720km/h_when_he_uses_his_sword_skill}`

### 残像 (Web) 200pt

ブラウザで開いてみると以下の文字が表示されます。
`PfrfhtiFOP{Fjdlfklnldj_mknmpkhjnl_ieln_ku_xeqkmjtj_om_k_djhvulhoi}`
単純な ROT13 では無さそうなので、main.js を覗いてみると、怪しい配列が見つかります。

```javascript
rgrigrjar = [0x4d, 0x61, 0x69, 0x64, 0x61, 0x6b, 0x65, 0x43, 0x54, 0x46, 0x7b, 0x44, 0x65, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x69, 0x73, 0x5f, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x7d];
```

目asciiすると [0x43, 0x54, 0x46, 0x7b] が `CTF{` っぽいので、そのまま文字に変換したらフラグになりました。

```py
s = [...] # 省略
print(''.join(map(chr, s)))
```

`MaidakeCTF{Deciphering_obfuscated_code_by_yourself_is_a_challenge}`

### 社内用検索エンジン (web) 300pt

適当に検索するとURLにbase64エンコードした文字が付与されました。
base64デコードすると、自分のIPアドレスと検索ワードが含まれていました。

```json
{"ip":"xxx.xxx.xxx.xxx","target":"test"}
```

問題タイトルにもあるように、IPアドレスを社内(?)にしたら検索できそうです。
最初は社内のアドレスというのがよく分かりませんでしたが、`aokakes.work`のipアドレスで大丈夫でした。
検索ワードはなんでもよく、ipアドレスだけ合っていればフラグが表示されるようでした。

`MaidakeCTF{It_is_difficult_to_spoof_the_global_IP_on_the_client_side}`

### やらかし (Web) 300pt

ページのソースの1行目にヒントがあり、`/?source` にアクセスしたらソースコードが表示されました。 (ここに気づくまでに時間が掛かりました…。)

```html
<!-- ?source -->
```

sqliteを使っているようですが、このデータベースファイルが`/KazutoKirigaya.db`で直接ダウンロードできるようになっていました。

```php
$pdo = new PDO('sqlite:./KazutoKirigaya.db');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
```

SQLite のデータベースファイルの中身を見れるツールでユーザー名とパスワードを抜き取ってログインしたらフラグが表示されました。
使用したツール: https://sqlitebrowser.org/

`MaidakeCTF{The_motorcycle_Kirito_is_riding_is_said_to_be_a_DT125R}`

### タスク管理 (web) 300pt

解けませんでした。
入力したものがそのまま表示されるのでXSSし放題ですが特に意味はなかったようです。
後から追加されたヒントによれば、SQLiでもXSSでもないとの事で、何も手がかりが無いまま終わりました…。