JISCTF 2020 writeup
11/19~行われたJISCTF 2020のwriteupです。
最終得点は2050ptで、256チーム(0点以上のみ)中38位でした。飲酒しなかったら20位台行けましたね…
国内ではチームnoranecoやpwnasonicなど企業系のチームが見られましたが、ぼっちCTFerとしては善戦できたかもしれません。
Misc
Common (150pt)
クソ長テキストファイルが2つ渡されます。
2つとも似てますが、微妙に内容が異なりました。
difffで差分を比較したところ、異なる部分がフラグっぽいなーと思い抽出。
#! /bin/env python3 with open("./file2.txt") as a: ar = a.read() with open("./file3.txt") as b: br = b.read() arr_a = [] arr_b = [] for i in range(len(ar)): if ar[i] != br[i]: arr_a.append(ar[i]) arr_b.append(br[i]) print("".join(arr_a)) print("".join(arr_b))
xrzhev@xrzhev:~/works/ctf/jisctf2020/common$ python3 loader.py lfbz95eobcrtqadt7kdxz0dcis{x5kikpueriiebmavwnxdvwex9 }9102_ftcsij_s3l1f_0wt_n33t3b_4td_n0mm0c_3m0s{FTCSIJ xrzhev@xrzhev:~/works/ctf/jisctf2020/common$ echo "}9102_ftcsij_s3l1f_0wt_n33t3b_4td_n0mm0c_3m0s{FTCSIJ" | rev JISCTF{s0m3_c0mm0n_dt4_b3t33n_tw0_f1l3s_jisctf_2019}
フラグはJISCTF{s0m3_c0mm0n_dt4_b3t33n_tw0_f1l3s_jisctf_2019}
Oh my rain!!! (150pt)
渡されるzipファイルにパスワードがかかっていました。
最初にzip2johnでハッシュを抜いてhashcatでハッシュクラックを行おうと思いましたが、ハッシュの長さが少しおかしかったためjohnでzipのパスワードをクラックします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/oh_my_rain/test$ /opt/john/run/zip2john ./OH-MY-R41N.zip > OH-MY-R41N.zip.hash xrzhev@xrzhev:~/works/ctf/jisctf2020/oh_my_rain/test$ /opt/john/run/john ./OH-MY-R41N.zip.hash Using default input encoding: UTF-8 Loaded 1 password hash (ZIP, WinZip [PBKDF2-SHA1 256/256 AVX2 8x]) Will run 4 OpenMP threads Proceeding with single, rules:Single Press 'q' or Ctrl-C to abort, almost any other key for status Almost done: Processing the remaining buffered candidate passwords, if any. Proceeding with wordlist:/opt/john/run/password.lst management (OH-MY-R41N.zip/data.txt) 1g 0:00:00:00 DONE 2/3 (2020-12-01 15:47) 1.250g/s 94655p/s 94655c/s 94655C/s 123456..ferrises Use the "--show" option to display all of the cracked passwords reliably Session completed.
zipファイルのパスワードはmanagement
と判明しました。
zipファイルを解凍し、内部のdata.txtを確認します。
xrzhev@xrzhev:~/works/ctf/jisctf2020/oh_my_rain/test$ cat data.txt JJFEMRKNKJFU4S2KIZKTIUZSJNEVUS2UJFKVUU2KJZCVMVKTGJKUURSLKZKVKMSLJJNEGVSNKZFV IR2KJNKVKUSTJRFVUS2WJNGVGTCKJJHEKR2WKNHEWWSGKYFESURSJNFE4S2WJNKVGVCKKJDFMVKT GJLUUTSHKZDVIQ2LJJFEQRKLKIZFOS2OJBCVOV2TI5FVSRSFKNKVEU2KJZDEKNCTGJLUUTSLKZDV MQ2LJNFEIRSNKZFVICSHJJGFKVKUKNEEWWSEKZEVCMSMJJFEMRKRKJFUYS2JLJDE6UZSJ5FEEQ2W J5LDEVCJGVDFMU2SKNDEWTSLKZCVKMSLJJNEIRKLJZBVIR2KJRKVKVCTJRFVURCWBJGVCMSMJJHE ---- snip ---- GJFUSUSDKVLVMU2MJNHEMVIKGRJEGVSLKZFUMR2RGJGEYSSDIZGVES2WI5FEOVKVKNJU6SKWINLE KVKLJRFEUTCFK5JEWWCLKVNEKUKTKNDUUWSDKVLVMU2MJNLEMVJUKEZEMS2OJRDEOURSJQFEYSSE KZGVEMSOJNHEIRKVKNJUOSKWI5LEKUZSJ5BEURSVKVJEWVSLGVFEIRKTGJFUUSSDIVFVIMSWJJHE WRKVKJJUOS22IZKTETKTJBFEURCFJ5LFGSCLKZDFKCSXKNFTESKSIRCUOVSTJNDVMRKGJNHFGUSL KU3FIMSQJFFQU===
大文字及び数字、3文字の=でパディングされていることからbase32でエンコードされていることがわかります。 デコードを試してみます。
xrzhev@xrzhev:~/works/ctf/jisctf2020/oh_my_rain/test$ cat data.txt | base32 -d JJFEMRKNKJFU4S2KIZKTIUZSJNEVUS2UJFKVUU2KJZCVMVKTGJKUURSLKZKVKMSLJJNEGVSNKZFV IR2KJNKVKUSTJRFVUS2WJNGVGTCKJJHEKR2WKNHEWWSGKYFESURSJNFE4S2WJNKVGVCKKJDFMVKT GJLUUTSHKZDVIQ2LJJFEQRKLKIZFOS2OJBCVOV2TI5FVSRSFKNKVEU2KJZDEKNCTGJLUUTSLKZDV MQ2LJNFEIRSNKZFVICSHJJGFKVKUKNEEWWSEKZEVCMSMJJFEMRKRKJFUYS2JLJDE6UZSJ5FEEQ2W J5LDEVCJGVDFMU2SKNDEWTSLKZCVKMSLJJNEIRKLJZBVIR2KJRKVKVCTJRFVURCWBJGVCMSMJJHE ---- snip ---- 6VSTIQFEUUSGIVKVEU2HJJHEYVKXKZBUWSS2IZDEWVJSKVFU4R2VKNLFGTKLLJDFMR2VGJKUUSSG IVKVES2MJNNEEVKZKMZFGSKKJNKTEVJSKRFDKRSFKVJEGRSKGVGEKCSHKJBUWS2KIRCUWVSLKNFU 4RCVKVKFGQ2LLJCFMRKVGJGUUSSOIVCVEUKLJJLEWRKXKUZEQSSGJZCUWVSLKVFU4Q2FKNLFGR2L LJDVMR2NKNDEUSSGIVGVES2OBJFUURKVK5JDES2KJJCEKT2VJNKEURSGKZFU2MSHJJDEOVSHKVFU WSK2IRDEGVSKGVEFKNSRKU6T2PIK
またもbase32でエンコードされているようです…。
というわけでしばらくbase32のデコード作業が続きます。
xrzhev@xrzhev:~/works/ctf/jisctf2020/oh_my_rain/test$ cat data.txt | base32 -d | base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d | base32 -d| base32 -d -[------->+<]>+.-.++++++++++.--[->++++<]>-.>-[--->+<]>-.[----->+<]>++.>--[-->+++++<]>.>-[--->+<]>-.------------.[--->++<]>+.>-[--->+<]>--.+[-->+<]>+++.++++.>-[--->+<]>--.+[-->+<]>+++.---[->++<]>-.>-[----->+<]>--.+[-->+++<]>++.+++.----.-[--->++<]>+.------.-[-->+++<]>+.+++++.[++>-----<]>.[-->+++<]>--..-[--->++<]>+.+[-->+++<]>.-------.>-[----->+<]>.>--[-->+++<]>.
ようやくすべてのデコードを終えるとbrainfuckのコードが隠されていました。
オンラインインタプリタで実行してみます。
フラグはJISCTF{TH1S-1S-S1MPL3-CH4LL3NG3}
SOUND!!! (150pt)
wavファイルが渡されます。
DeepSoundにポイするとフラグっぽいものが入ってます。
FLAG.rarを抽出し、解凍を試みましたがパスワードがかかっていました。
rar2johnでハッシュを抜き出し、hashcatでハッシュクラックします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/sound$ /opt/john/run/rar2john FLAG.rar > FLAG.rar.hash PS C:\Users\hyper> .\hashcat.exe -m 13000 -a 0 -o ../found.txt ..\FLAG.rar.hash ../rockyou.txt -O PS C:\Users\hyper> cat ..\found.txt $rar5$16$f25ccea8c272c5eb60074c8c2dcc90ca$15$806fafd1344f2911f19b2c9735a56453$8$4680aa601b747f8a:!!Boom!!
!!Boom!!
がrarのパスワードになります。
というわけで中身を確認してみます。
xrzhev@xrzhev:~/works/ctf/jisctf2020/sound$ unrar x ./FLAG.rar UNRAR 5.61 beta 1 freeware Copyright (c) 1993-2018 Alexander Roshal Extracting from ./FLAG.rar Enter password (will not be echoed) for FLAG.TXT: Extracting FLAG.TXT OK All OK xrzhev@xrzhev:~/works/ctf/jisctf2020/sound$ cat FLAG.TXT JISCTF{ST3G0_1N_AUD10_F1L3_2019}
フラグはJISCTF{ST3G0_1N_AUD10_F1L3_2019}
Forensics
So Easy (100pt)
pcapngファイルが渡されます。
適当に追ってたらhttpでPOSTしてるところにフラグがありました。
フラグはJISCTF{V3RY_34SY_PC4P_F1L3}
Unknow Ransomware (150pt)
暗号化したといっている謎のファイルが渡されます。 見てみるとただbase64でエンコードしただけでした。
xrzhev@xrzhev:~/works/ctf/jisctf2020/unknow_ransom/test$ cat flag.enc Vm0wd2QyUXlVWGxXYTJoV1YwZG9WbFl3WkRSV01WbDNXa2M1VjJKSGVEQmFWVll3VjBaS2RHVkdX bFpOYm1oUVZtcEdTMk15U2tWVQpiR2hvVFdzd2VGWnRjRWRUTWsxNVUydFdWUXBpU0VKWVZtMTRk MVZXV25SalJXUmFWakZLU1ZadGRGZFZaM0JwVmxad1ZWWnRjRXRpCk1sWlhWMjVTYWxKVmNITlZi VEZUVTFaYWRHUkhkR2hhTTBKVVdXMTBTMVZHV2xoalJYUnBDazFXV2xoV01qVlRZV3hLV0ZWc1Zs VlcKTTA0MFZHeGFZVk5IVWtsVWJXaGhUVEJLVlZkWGVHdGlNbEp6VjJ0a1dHSkhVbkpEYXpGV1kw ---- snip ---- cEgKVjIxR2FFMXJXbmxVVmxwclYwZEtkVkZzYUZwaVIyaDJDbGt5ZUhOV01XUnlaRVpvVjJFeGNE WldWbVEwWWpGYU0yTkZOVTVpVjJoYQpWbXBLTUZVeFJuUldhMlJZVjBkb2FGVXdWVEZYVVhCYVlU SlNkbGxxUmxOWFIwNDJVbXhXVjJKSGR6RUtWMnRXYTAxR1VYaFRia3BYCllXeEtXRmxzVWxkV1Js cHlXa1ZrYWsxck5VZFVNVlpUWVZaS1dWRnRSbGRoTWxGM1ZHdGFTMUZ0VGtoU2JYaG9ZVEJWZUZa V1VrdGgKYXpsWFVXeEthUXBsYWtKTVEyYzlQUW89Cg==
デコードするとまたbase64になっているので、ひたすらデコードします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/unknow_ransom/test$ cat flag.enc | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d �`B�DNEI�$ӫa�_�"�針������0���z�XC�vo@ T��B��!`�y�Y�L!S ---- snip ---- �N%RDHI GNP�
なんかバイナリ形式であり、PNGファイルヘッダを逆にしたようなものがあります。 というわけでバイナリを逆から読んで正常なPNGファイルかチェックします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/unknow_ransom/test$ cat flag.enc | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 -d | base64 base64 -d | base64 -d > png.bin xrzhev@xrzhev:~/works/ctf/jisctf2020/unknow_ransom/test$ cat png.bin | xxd -p -c 1 | tac | xxd -p -r > flag.png
出力したPNGファイルを見てみます。
フラグはJISCTF{R3V3RS3_1M4G3_C0NT3NTS}
Malicious (100pt)
word形式のファイルが与えられます。(.doc)
とりあえず開くとフツーの画面。マクロ等もありませんでした。
とりあえず.docファイルを解凍してみます。
xrzhev@xrzhev:~/works/ctf/jisctf2020/milicious/test$ unzip ./malicious.doc Archive: ./malicious.doc inflating: [Content_Types].xml inflating: _rels/.rels inflating: docProps/app.xml inflating: docProps/core.xml inflating: image.png inflating: word/_rels/document.xml.rels inflating: word/document.xml inflating: word/fontTable.xml inflating: word/media/image1.jpeg inflating: word/settings.xml inflating: word/styles.xml xrzhev@xrzhev:~/works/ctf/jisctf2020/milicious/test$ ls '[Content_Types].xml' _rels docProps image.png malicious.doc word xrzhev@xrzhev:~/works/ctf/jisctf2020/milicious/test$ file image.png image.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, manufacturer=BeFunky, orientation=upper-left, xresolution=106, yresolution=114, resolutionunit=2, software=BeFunky Photo Editor], baseline, precision 8, 642x76, components 3
すると、普通のWord形式のファイルには存在しないimage.pngというファイルがありました。
しかもpngって拡張子がついてるのに実態はjpegでした。
リネームしてファイルを開きます。
二次元バーコード形式の画像ファイルになりました。
inliteでチェックします。
フラグはJISCTF{B4RC0D3_1M4G3_2019}
Malicious2 (100pt)
Maliciousと同じようにWord形式のファイルが与えられます。(.doc)
しかし、ファイルはOffice側でパスワード設定がされていました。
xrzhev@xrzhev:~/works/ctf/jisctf2020/malicious2$ file mal2.doc mal2.doc: CDFV2 Encrypted
Office2Johnでハッシュを抜き出し、hashcatでハッシュクラックします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/malicious2$ /opt/john/run/office2john.py ./mal2.doc > mal2.hash PS C:\Users\hyper> .\hashcat.exe -m 9400 -a 0 -o ../found.txt ..\hal2.hash ../rockyou.txt -O PS C:\Users\hyper> cat ..\found.txt $office$*2007*20*128*16*6054846762510f801f75d44d2d81ee98*2e39d30eac11bd4dafc83c5a197bde0a*cfa9f22cde46863f4bbed00e8fb343eb1f11da12:princess101
パスワードを入力しWordファイルを開くと…。
フラグはJISCTF{H4PPY_HUNT1NG}
Indicate (200pt)
SIEMで取得した、というハッシュ値が渡されます。
001351e2ab912ce17ce9ab2c7465f1a265aa975c879e863dea06e177b62d8750 fe1a602aadba2e52b3b2cf82139c4d10c9fc14889435e0bd9aa54d30760fd1db 352656186eb3bb7e7495fa0922a4defce93bc2213c4d37adc6e42b59debee09e d672df1dea88e3ad2159b9c7b2df1dbd39b912e648c5097800f48fbf95cadd70 352656186eb3bb7e7495fa0922a4defce93bc2213c4d37adc6e42b59debee09e 0e6957de845ce5a1b0a73e91d12383714bda0fac66b13002170c1ff73426b82a 069cf46549f856b7fc266feab68968ad1d5ec4569f6326d71e999526b721ee0c 39759c4fd7193a29cda8ea8714e690c8b5ec374b659a3a1a3bc402c1ba20364a c25b0ab2413a7b300fc06d5dc5ec9807ec21372b27a5162fa2eb9729b84dd28c 213d537d2f63c70249a4244c394d9c364476ca6fd1ee04d5dda7ddaaf60a04e7 e366a166b172f225d842c0662f5cb261c0d7b50430dbd392f3eb33249fdb375c
とりあえずこのハッシュ値でググりました。
HybridAnalysysというページでこのハッシュで登録されているファイルのデータを確認することができるようです。
とりあえず、全ハッシュぶんファイルチェックします。
すると、069cf46549f856b7fc266feab68968ad1d5ec4569f6326d71e999526b721ee0c
というハッシュで少し違う画面になりました。
このハッシュ値のファイルはPDFファイルであり、HybridAnalysys上で中身をチェックできるようです。
スクリーンショットを見ていくと...。
フラグはJISCTF{IOC-Search-Using-OSINT}
Stealthy
pcapngファイルが渡されます。
HTTPプロトコル上の通信ではフラグと思わしきパケットは確認できませんでした。
だらだら見てると、pingのTTLがフラグと判明しました。
xrzhev@xrzhev:~/works/ctf/jisctf2020/stealthy$ tshark -r ./stealty.pcapng 'icmp.type == 8' | awk '{print $13}' | sed 's/ttl=//g' 74 73 83 67 84 70 123 77 52 76 87 52 82 51 95 51 88 70 49 76 84 51 82 52 84 49 48 78 95 85 83 49 78 71 95 49 67 77 80 95 84 84 76 125
フラグはJISCTF{M4LW4R3_3XF1LT3R4T10N_US1NG_1CMP_TTL}
Crypto & Stego
Hidden (100pt)
普通のPNGファイルが渡される。
zstegでフラグが読める
########################### ########## zsteg ########## ########################### Watch out for red output. This tool shows lots of false positives... b1,r,lsb,xy .. text: "<1vQ ~]P]~" b1,rgb,lsb,xy .. text: "JISCTF{G00D_J0B_Y0U_EXTR4KT_M3!!!}"
フラグはJISCTF{G00D_J0B_Y0U_EXTR4KT_M3!!!}
Call (100pt)
以下の問題文が与えられます。
Decrypt me: 00110000910000FF2E547419646687CFA0F41CA4032993D321D5B8414D9BD348D1397C1293CE63C458753AB3915028B44901
asciiに直してもうまくいかず、悩みましたが、ググったら解決。
00110000910000で検索するとSMS送受信に使われるのPDU encodeというらしいです。
携帯回線に自信ある~とか言っておいてめちゃめちゃ恥ずかしい。
デコードした結果は以下。
フラグはJISCTF{SMS_ENCODING_FUNNY_!!!}
Upside Down!! (150pt)
以下の問題文が与えられる。
Try to decrypt me? JISCTF{fkhrwv_wldm_vmtorhs_xszizxgvih_xibkgltizksb}
atbash cipherです。
フラグはJISCTF{upside_down_english_characters_cryptography}
Logic
暗号化されたファイルが渡されます。
xrzhev@xrzhev:~/works/ctf/jisctf2020/logic/test$ xxd ./ciphertext.txt 00000000: f3f0 eafa edff c2ee 8a8d f2e6 e189 ebe6 ................ 00000010: 8af7 f2eb e0e9 ed88 89f7 e6f4 8df7 e69d ................ 00000020: 98c4 .. xrzhev@xrzhev:~/works/ctf/jisctf2020/logic/test$ xrzhev@xrzhev:~/works/ctf/jisctf2020/logic/test$ cat ciphertext.txt ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒툉▒▒▒▒杘▒
cyberchefでxor bruteforceかけてフラグゲット。
フラグはJISCTF{W34K_X0R_3NKRYPT10N_M4N_$!}
Reversing
Baby Reverse (100pt)
実行ファイルが渡されます。
とりあえず実行すると以下のようになります。
xrzhev@xrzhev:~/works/ctf/jisctf2020/baby_reverse$ ./Easy Try harder!! xrzhev@xrzhev:~/works/ctf/jisctf2020/baby_reverse$ ./Easy -h First argument must be in the format number-number-number-number
とりあえず適当に./Easy 1-2-3-4
などと引数を付けてgdbで観察しました。
するとどうやらフラグが勝手に組みあがっていくようです。
あとはmain関数が終わる直前にスタックを覗くと…。
フラグはJISCTF{Th1S_1S_4N_e4Sy_R3v3Rs1Ng}
終わってから解けた
Crypto & Stego : Not Only Images!! (200pt)
wavファイルが与えられる。
中身はモールス信号であり、文字に起こすと以下のようになります。
wavファイルのLSBやDeepSoundにもヒットしないため、開催期間中は解くことができませんでした。
しかし、wavstegというツールでファイルを抽出することができるのが後に判明しました。
python3 ./wav-steg.py -r -s ../code-data.wav -o ../output.txt -b 22000 -n 2 xrzhev@xrzhev:~/works/ctf/jisctf2020/not_only_images$ python3 ./wav-steg.py -r -s ../code-data.wav -o ../output.txt -b 22000 -n 2 xrzhev@xrzhev:~/works/ctf/jisctf2020/not_only_images$ cat ../output.txt iVBORw0KGgoAAAANSUhEUgAABZMAAAK+CAYAAADXH4CWAAAgAElEQVR4nOzd7VHjStc2UDIwGUAG JgOTAWQAGQwZ4AwgA8gAMjAZOASHoBD6/XE/5vV4JO1uqWULzlpVqjpVZ2xkqfXRV2+1LhIAAAAA AAQuzr0CAAAAAADMnzAZAAAAAICQMBkAAAAAgJAwGQAAAACAkDAZAAAAAICQMBkAAAAAgJAwGQAA AACAkDAZAAAAAICQMBkAAAAAgJAwGQAAAACAkDAZAAAAAICQMBkAAAAAgJAwGQAAAACAkDAZAAAA AICQMBkAAAAAgJAwGQAAAACAkDAZAAAAAICQMBkAAAAAgJAwGQAAAACAkDAZAAAAAICQMBkAAAAA gJAwGQAAAACAkDAZAAAAAICQMBkAAAAAgJAwGQAAAACAkDAZAAAAAICQMBkAAAAAgJAwGQAAAACA ---- snip ---- AIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZ AAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAA WDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEAAAAAWDIZAAAAAIAlkwEA AAAAWDIZAAAAAIAlkwEAAAAAWAHhxKfOpPI14gAAAABJRU5ErkJggg==
base64が隠されていました。
デコードします。
xrzhev@xrzhev:~/works/ctf/jisctf2020/not_only_images$ cat b64.txt | base64 -d �PNG � IHDR���� IDATx����Q�J�6P20@&�d � ---- snip ----
PNGファイルになっています。
確認してみると...。
フラグはJISCTF{H1DD3N_1N_W4V_F1L3_!!}
なのかな?
感想
pwnがなかった珍しいCTFだったと思います。
あとweb問がHTBみたいに実際に攻撃する感じだったのかな?と思わせるようなものでした。
なんかいつもより解けて楽しくプレイできました。
次は酒に逃げずに頑張っていきたいと思います。