taskCTF20 write-up

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">++age;<br><br>今年も, 誕生日なので明日の1日限定でCTFを開催します！<a href="https://t.co/T5sIFMdyXL">https://t.co/T5sIFMdyXL</a><br><br>バタバタしてて今回はWeb問とMisc問のみです。<br>対象者は超初心者～中級者になります。<br>お楽しみに～</p>&mdash; Tasker (@task4233) <a href="https://twitter.com/task4233/status/1334875269979537408?ref_src=twsrc%5Etfw">December 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://github.com/task4233/taskctf20

全完して6位。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/7c4c4c2e-1d1c-aaa6-461d-0ce5330e9dae.png)

## Web

### Caesar Cipher Translator

シーザー暗号をエンコードするページにXSSがあって`injected`という文字を出せばクリアらしい。

素直なXSSがある。でも、ペイロードをシーザー暗号で復号するのが面倒だったので、開発者ツールで`alert("injected")`。

`taskctf{n1ce_inject10n!}`

### Evil Eval

今度はbase64のデコードで、サーバーサイドコード実行。flag.txtを読み出せば良い。

```show.php
<?php
$result = "";
    if (isset($_GET['data'])) {
        $data = $_GET['data'];
        $raw = base64_decode($data);
        eval('$result = ' . $raw . ';');
    }
?>
<html>
<head>
    <meta charset="utf-8">
    <title>result</title>
</head>
<body>
    <h1>結果</h1>
    <p><?= $result ?></p>
</body>
</html>
```

「Base64エンコード面倒だな」と思いながら、

http://34.82.49.144:3337/flag.txt

を開いたらフラグが表示された。

`taskctf{eval_1s_b4d_h4bit}`

### Gacha

こんな実装。

```main.go
 :
func gachaHandler(w http.ResponseWriter, r *http.Request) {
    seed := r.FormValue("seed")
    if len(seed) == 0 {
        seed = "1"
    }
    seedInt, err := strconv.Atoi(seed)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // get current time(HHmmss)
    jst := time.FixedZone("Asia/Tokyo", 9*60*60)
    nowStr := time.Now().In(jst).Format("150405")
    log.Println(nowStr)
    nowInt, err := strconv.Atoi(nowStr)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    sm := (seedInt + nowInt) % 100000
    log.Println(sm)
    var flag map[string]string

    if sm == 1337 {
        flag = map[string]string{
            "flag": "taskctf{this_is_dummy_flag}",
        }
    } else {
        flag = map[string]string{
            "flag": "You might not have a luck...",
            "sum":  strconv.Itoa(sm),
        }
    }
 :
```

`(与えたシード＋現在時刻)%100000==1337`となれば良い。外れた場合でも値は教えてくれるのでそれを見ながらシードの値を変える。15時22分頃に`?seed=49120`で通った。

`taskctf{Y0u_h4ve_4_gre4t_luck}`

## Misc

### welcome

> flagはNotificationsのページに書かれているよ！

`taskctf{g00d_luck_h4ve_fun}`

### guess \`?v=\`

> `?v=t1zPpBwRbAw`
> 何やら見覚えのあるパラメータな気がするな

Videoのvか。

https://www.youtube.com/watch?v=t1zPpBwRbAw

`taskctf{h0w_w4s_it?}`

### social hacking

で、↑の動画でパスワードがどうこうと言っている。`onigiri`に誕生日の月日らしい。総当たりして`1205`だったけど、そういえばこのコンテストは誕生日記念だった。総当たりする必要無かった。おめでとうございます。

`taskctf{n0t1ce_soci4l_h4ck1ng}`

### grass flag

.gitディレクトリの入ったZIPが問題。コミットを遡ったりするのかと思ったけど何も無い。コミット日時は時刻が全部一緒で、日付は連続だったり数日空いたり。 :bulb: GitHubの草（grass）か。

日付をパースするのが面倒なので、曜日だけ見て適当に。

```solve.py
A = [
"Wed", "Fri", "Thu", "Tue", "Mon", "Sat", "Sun", "Sat", "Sun", "Fri", "Thu", "Wed", "Sat", "Tue", "Sat", "Tue",
"Fri", "Thu", "Wed", "Sat", "Fri", "Thu", "Wed", "Sat", "Thu", "Tue", "Sat", "Thu", "Tue", "Fri", "Sat", "Fri",
"Thu", "Wed", "Tue", "Sat", "Fri", "Thu", "Wed", "Tue", "Tue", "Sat", "Fri", "Thu", "Wed", "Tue", "Sat", "Fri",
"Thu", "Wed", "Tue", "Mon", "Sun", "Sun", "Sat", "Sun", "Sat", "Sun", "Fri", "Thu", "Tue", "Mon", "Wed", "Sun",
"Tue", "Sun", "Sat", "Fri", "Thu", "Wed", "Tue", "Mon", "Tue", "Sat", "Tue", "Sat", "Tue", "Fri", "Thu", "Wed",
"Tue", "Mon", "Tue", "Fri", "Wed", "Sat", "Tue", "Sat", "Tue", "Fri", "Thu", "Wed", "Sat", "Tue", "Fri", "Wed",
"Thu", "Sat", "Fri", "Thu", "Wed", "Tue", "Mon", "Sun", "Fri", "Tue", "Sat", "Thu", "Tue", "Sat", "Thu", "Tue",
"Sat", "Wed", "Sat", "Fri", "Thu", "Wed", "Sat", "Thu", "Tue", "Sat", "Thu", "Tue", "Fri", "Sat", "Tue", "Sat",
"Tue", "Fri", "Thu", "Wed", "Tue", "Mon", "Tue",
][::-1]

D = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
C = [""]*7

p = 0
d = 0
while p<len(A):
  if A[p]==D[d]:
    C[d] += "#"
    p += 1
  else:
    C[d] += " "
  d = (d+1)%7

for c in C:
  print(c)
```

```
>py solve.py
            #             ## ####            ##
 #          #        #   #  #   #              #
#### ##  ####  # ## ####### #   ##### ##  ##   #
 #     ##   # # #  # #   # #    ## ##   ##  #   #
 #   ### ## ##  #    #   #  #   ## ## ####  #  #
 #  #  #   ## # #  # #   #  #   ## ###  ##  #  #
  ## ###### #  # ##   ## #   ## ## ## ### ## ##
```

微妙に読めない。手を抜いてはダメだったか。

手作業でちょっと手直しをして、こんな感じかな。

```
            #             ## ### #               ##
 #          #        #   #  #    #                 #
#### ##  ####  # ## ####### #    # ####   ##  ##   #
 #     ##   # # #  # #   # #     # # # #    ##  #   #
 #   ### ## ##  #    #   #  #    # # # #  ####  #  #
 #  #  #   ## # #  # #   #  #    # # # # #  ##  #  #
  ## ###### #  # ##   ## #   ##  # # # #  ### ## ##
```

`taskctf{lmao}`

### OSINT 2

![osint2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/74c81013-c4ef-065c-b62d-ad71cbdc4cd8.jpeg)

この画像の駅名。「大仏 駅前」とか「弥勒菩薩 駅前」でググっても出てこなかった。「あべ歯科」で画像検索して太陽っぽいこのマークを探して、神奈川県大船駅。なるほど、これは「観音像」か。

`taskctf{大船駅}`

### OSINT 3

このTシャツを売っているショップ名。

![osint3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/e1a659f1-0cee-0d50-d232-0b448ccf94fa.jpeg)

理不尽すぎるからと追加された画像。

![osint3-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/72449d7e-595c-8b32-6611-2422a8b62586.jpeg)

見切れているロゴの後半の文字は「広場」かな。で、「Tシャツ 広場」で検索。

https://harajukust-parisien.com/?page_id=123

`taskctf{原宿パリジャン}`

### アンケート

全完するとアンケートが出てくる。

`taskctf{Th4nk_u_f0r_pl4ying!}`